📄 dsmthdat.c
字号:
/*******************************************************************************
*
* Module Name: dsmthdat - control method arguments and local variables
* $Revision: 1.1 $
*
******************************************************************************/
/*
* Copyright (C) 2000, 2001 R. Byron Moore
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <acpi.h>
#define _COMPONENT ACPI_DISPATCHER
MODULE_NAME ("dsmthdat")
/*******************************************************************************
*
* FUNCTION: Acpi_ds_method_data_init
*
* PARAMETERS: Walk_state - Current walk state object
*
* RETURN: Status
*
* DESCRIPTION: Initialize the data structures that hold the method's arguments
* and locals. The data struct is an array of NTEs for each.
* This allows Ref_of and De_ref_of to work properly for these
* special data types.
*
******************************************************************************/
ACPI_STATUS
acpi_ds_method_data_init (
ACPI_WALK_STATE *walk_state)
{
u32 i;
/*
* Walk_state fields are initialized to zero by the
* Acpi_cm_callocate().
*
* An Node is assigned to each argument and local so
* that Ref_of() can return a pointer to the Node.
*/
/* Init the method arguments */
for (i = 0; i < MTH_NUM_ARGS; i++) {
MOVE_UNALIGNED32_TO_32 (&walk_state->arguments[i].name,
NAMEOF_ARG_NTE);
walk_state->arguments[i].name |= (i << 24);
walk_state->arguments[i].data_type = ACPI_DESC_TYPE_NAMED;
walk_state->arguments[i].type = ACPI_TYPE_ANY;
walk_state->arguments[i].flags = ANOBJ_END_OF_PEER_LIST | ANOBJ_METHOD_ARG;
}
/* Init the method locals */
for (i = 0; i < MTH_NUM_LOCALS; i++) {
MOVE_UNALIGNED32_TO_32 (&walk_state->local_variables[i].name,
NAMEOF_LOCAL_NTE);
walk_state->local_variables[i].name |= (i << 24);
walk_state->local_variables[i].data_type = ACPI_DESC_TYPE_NAMED;
walk_state->local_variables[i].type = ACPI_TYPE_ANY;
walk_state->local_variables[i].flags = ANOBJ_END_OF_PEER_LIST | ANOBJ_METHOD_LOCAL;
}
return (AE_OK);
}
/*******************************************************************************
*
* FUNCTION: Acpi_ds_method_data_delete_all
*
* PARAMETERS: Walk_state - Current walk state object
*
* RETURN: Status
*
* DESCRIPTION: Delete method locals and arguments. Arguments are only
* deleted if this method was called from another method.
*
******************************************************************************/
ACPI_STATUS
acpi_ds_method_data_delete_all (
ACPI_WALK_STATE *walk_state)
{
u32 index;
ACPI_OPERAND_OBJECT *object;
/* Delete the locals */
for (index = 0; index < MTH_NUM_LOCALS; index++) {
object = walk_state->local_variables[index].object;
if (object) {
/* Remove first */
walk_state->local_variables[index].object = NULL;
/* Was given a ref when stored */
acpi_cm_remove_reference (object);
}
}
/* Delete the arguments */
for (index = 0; index < MTH_NUM_ARGS; index++) {
object = walk_state->arguments[index].object;
if (object) {
/* Remove first */
walk_state->arguments[index].object = NULL;
/* Was given a ref when stored */
acpi_cm_remove_reference (object);
}
}
return (AE_OK);
}
/*******************************************************************************
*
* FUNCTION: Acpi_ds_method_data_init_args
*
* PARAMETERS: *Params - Pointer to a parameter list for the method
* Max_param_count - The arg count for this method
* Walk_state - Current walk state object
*
* RETURN: Status
*
* DESCRIPTION: Initialize arguments for a method
*
******************************************************************************/
ACPI_STATUS
acpi_ds_method_data_init_args (
ACPI_OPERAND_OBJECT **params,
u32 max_param_count,
ACPI_WALK_STATE *walk_state)
{
ACPI_STATUS status;
u32 mindex;
u32 pindex;
if (!params) {
return (AE_OK);
}
/* Copy passed parameters into the new method stack frame */
for (pindex = mindex = 0;
(mindex < MTH_NUM_ARGS) && (pindex < max_param_count);
mindex++) {
if (params[pindex]) {
/*
* A valid parameter.
* Set the current method argument to the
* Params[Pindex++] argument object descriptor
*/
status = acpi_ds_store_object_to_local (AML_ARG_OP, mindex,
params[pindex], walk_state);
if (ACPI_FAILURE (status)) {
break;
}
pindex++;
}
else {
break;
}
}
return (AE_OK);
}
/*******************************************************************************
*
* FUNCTION: Acpi_ds_method_data_get_entry
*
* PARAMETERS: Opcode - Either AML_LOCAL_OP or AML_ARG_OP
* Index - Which local_var or argument to get
* Entry - Pointer to where a pointer to the stack
* entry is returned.
* Walk_state - Current walk state object
*
* RETURN: Status
*
* DESCRIPTION: Get the address of the object entry given by Opcode:Index
*
******************************************************************************/
ACPI_STATUS
acpi_ds_method_data_get_entry (
u16 opcode,
u32 index,
ACPI_WALK_STATE *walk_state,
ACPI_OPERAND_OBJECT ***entry)
{
/*
* Get the requested object.
* The stack "Opcode" is either a Local_variable or an Argument
*/
switch (opcode) {
case AML_LOCAL_OP:
if (index > MTH_MAX_LOCAL) {
return (AE_BAD_PARAMETER);
}
*entry = (ACPI_OPERAND_OBJECT **)
&walk_state->local_variables[index].object;
break;
case AML_ARG_OP:
if (index > MTH_MAX_ARG) {
return (AE_BAD_PARAMETER);
}
*entry = (ACPI_OPERAND_OBJECT **)
&walk_state->arguments[index].object;
break;
default:
return (AE_BAD_PARAMETER);
}
return (AE_OK);
}
/*******************************************************************************
*
* FUNCTION: Acpi_ds_method_data_set_entry
*
* PARAMETERS: Opcode - Either AML_LOCAL_OP or AML_ARG_OP
* Index - Which local_var or argument to get
* Object - Object to be inserted into the stack entry
* Walk_state - Current walk state object
*
* RETURN: Status
*
* DESCRIPTION: Insert an object onto the method stack at entry Opcode:Index.
*
******************************************************************************/
ACPI_STATUS
acpi_ds_method_data_set_entry (
u16 opcode,
u32 index,
ACPI_OPERAND_OBJECT *object,
ACPI_WALK_STATE *walk_state)
{
ACPI_STATUS status;
ACPI_OPERAND_OBJECT **entry;
/* Get a pointer to the stack entry to set */
status = acpi_ds_method_data_get_entry (opcode, index, walk_state, &entry);
if (ACPI_FAILURE (status)) {
return (status);
}
/* Increment ref count so object can't be deleted while installed */
acpi_cm_add_reference (object);
/* Install the object into the stack entry */
*entry = object;
return (AE_OK);
}
/*******************************************************************************
*
* FUNCTION: Acpi_ds_method_data_get_type
*
* PARAMETERS: Opcode - Either AML_LOCAL_OP or AML_ARG_OP
* Index - Which local_var or argument whose type
* to get
* Walk_state - Current walk state object
*
* RETURN: Data type of selected Arg or Local
* Used only in Exec_monadic2()/Type_op.
*
******************************************************************************/
OBJECT_TYPE_INTERNAL
acpi_ds_method_data_get_type (
u16 opcode,
u32 index,
ACPI_WALK_STATE *walk_state)
{
ACPI_STATUS status;
ACPI_OPERAND_OBJECT **entry;
ACPI_OPERAND_OBJECT *object;
/* Get a pointer to the requested stack entry */
status = acpi_ds_method_data_get_entry (opcode, index, walk_state, &entry);
if (ACPI_FAILURE (status)) {
return ((ACPI_TYPE_NOT_FOUND));
}
/* Get the object from the method stack */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -