/drivers/devman/acpica/dispatcher/dsargs.c |
---|
0,0 → 1,502 |
/****************************************************************************** |
* |
* Module Name: dsargs - Support for execution of dynamic arguments for static |
* objects (regions, fields, buffer fields, etc.) |
* |
*****************************************************************************/ |
/****************************************************************************** |
* |
* 1. Copyright Notice |
* |
* Some or all of this work - Copyright (c) 1999 - 2011, Intel Corp. |
* All rights reserved. |
* |
* 2. License |
* |
* 2.1. This is your license from Intel Corp. under its intellectual property |
* rights. You may have additional license terms from the party that provided |
* you this software, covering your right to use that party's intellectual |
* property rights. |
* |
* 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a |
* copy of the source code appearing in this file ("Covered Code") an |
* irrevocable, perpetual, worldwide license under Intel's copyrights in the |
* base code distributed originally by Intel ("Original Intel Code") to copy, |
* make derivatives, distribute, use and display any portion of the Covered |
* Code in any form, with the right to sublicense such rights; and |
* |
* 2.3. Intel grants Licensee a non-exclusive and non-transferable patent |
* license (with the right to sublicense), under only those claims of Intel |
* patents that are infringed by the Original Intel Code, to make, use, sell, |
* offer to sell, and import the Covered Code and derivative works thereof |
* solely to the minimum extent necessary to exercise the above copyright |
* license, and in no event shall the patent license extend to any additions |
* to or modifications of the Original Intel Code. No other license or right |
* is granted directly or by implication, estoppel or otherwise; |
* |
* The above copyright and patent license is granted only if the following |
* conditions are met: |
* |
* 3. Conditions |
* |
* 3.1. Redistribution of Source with Rights to Further Distribute Source. |
* Redistribution of source code of any substantial portion of the Covered |
* Code or modification with rights to further distribute source must include |
* the above Copyright Notice, the above License, this list of Conditions, |
* and the following Disclaimer and Export Compliance provision. In addition, |
* Licensee must cause all Covered Code to which Licensee contributes to |
* contain a file documenting the changes Licensee made to create that Covered |
* Code and the date of any change. Licensee must include in that file the |
* documentation of any changes made by any predecessor Licensee. Licensee |
* must include a prominent statement that the modification is derived, |
* directly or indirectly, from Original Intel Code. |
* |
* 3.2. Redistribution of Source with no Rights to Further Distribute Source. |
* Redistribution of source code of any substantial portion of the Covered |
* Code or modification without rights to further distribute source must |
* include the following Disclaimer and Export Compliance provision in the |
* documentation and/or other materials provided with distribution. In |
* addition, Licensee may not authorize further sublicense of source of any |
* portion of the Covered Code, and must include terms to the effect that the |
* license from Licensee to its licensee is limited to the intellectual |
* property embodied in the software Licensee provides to its licensee, and |
* not to intellectual property embodied in modifications its licensee may |
* make. |
* |
* 3.3. Redistribution of Executable. Redistribution in executable form of any |
* substantial portion of the Covered Code or modification must reproduce the |
* above Copyright Notice, and the following Disclaimer and Export Compliance |
* provision in the documentation and/or other materials provided with the |
* distribution. |
* |
* 3.4. Intel retains all right, title, and interest in and to the Original |
* Intel Code. |
* |
* 3.5. Neither the name Intel nor any other trademark owned or controlled by |
* Intel shall be used in advertising or otherwise to promote the sale, use or |
* other dealings in products derived from or relating to the Covered Code |
* without prior written authorization from Intel. |
* |
* 4. Disclaimer and Export Compliance |
* |
* 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED |
* HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE |
* IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, |
* INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY |
* UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY |
* IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A |
* PARTICULAR PURPOSE. |
* |
* 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES |
* OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR |
* COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, |
* SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY |
* CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL |
* HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS |
* SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY |
* LIMITED REMEDY. |
* |
* 4.3. Licensee shall not export, either directly or indirectly, any of this |
* software or system incorporating such software without first obtaining any |
* required license or other approval from the U. S. Department of Commerce or |
* any other agency or department of the United States Government. In the |
* event Licensee exports any such software from the United States or |
* re-exports any such software from a foreign destination, Licensee shall |
* ensure that the distribution and export/re-export of the software is in |
* compliance with all laws, regulations, orders, or other restrictions of the |
* U.S. Export Administration Regulations. Licensee agrees that neither it nor |
* any of its subsidiaries will export/re-export any technical data, process, |
* software, or service, directly or indirectly, to any country for which the |
* United States government or any agency thereof requires an export license, |
* other governmental approval, or letter of assurance, without first obtaining |
* such license, approval or letter. |
* |
*****************************************************************************/ |
#define __DSARGS_C__ |
#include "acpi.h" |
#include "accommon.h" |
#include "acparser.h" |
#include "amlcode.h" |
#include "acdispat.h" |
#include "acnamesp.h" |
#define _COMPONENT ACPI_DISPATCHER |
ACPI_MODULE_NAME ("dsargs") |
/* Local prototypes */ |
static ACPI_STATUS |
AcpiDsExecuteArguments ( |
ACPI_NAMESPACE_NODE *Node, |
ACPI_NAMESPACE_NODE *ScopeNode, |
UINT32 AmlLength, |
UINT8 *AmlStart); |
/******************************************************************************* |
* |
* FUNCTION: AcpiDsExecuteArguments |
* |
* PARAMETERS: Node - Object NS node |
* ScopeNode - Parent NS node |
* AmlLength - Length of executable AML |
* AmlStart - Pointer to the AML |
* |
* RETURN: Status. |
* |
* DESCRIPTION: Late (deferred) execution of region or field arguments |
* |
******************************************************************************/ |
static ACPI_STATUS |
AcpiDsExecuteArguments ( |
ACPI_NAMESPACE_NODE *Node, |
ACPI_NAMESPACE_NODE *ScopeNode, |
UINT32 AmlLength, |
UINT8 *AmlStart) |
{ |
ACPI_STATUS Status; |
ACPI_PARSE_OBJECT *Op; |
ACPI_WALK_STATE *WalkState; |
ACPI_FUNCTION_TRACE (DsExecuteArguments); |
/* Allocate a new parser op to be the root of the parsed tree */ |
Op = AcpiPsAllocOp (AML_INT_EVAL_SUBTREE_OP); |
if (!Op) |
{ |
return_ACPI_STATUS (AE_NO_MEMORY); |
} |
/* Save the Node for use in AcpiPsParseAml */ |
Op->Common.Node = ScopeNode; |
/* Create and initialize a new parser state */ |
WalkState = AcpiDsCreateWalkState (0, NULL, NULL, NULL); |
if (!WalkState) |
{ |
Status = AE_NO_MEMORY; |
goto Cleanup; |
} |
Status = AcpiDsInitAmlWalk (WalkState, Op, NULL, AmlStart, |
AmlLength, NULL, ACPI_IMODE_LOAD_PASS1); |
if (ACPI_FAILURE (Status)) |
{ |
AcpiDsDeleteWalkState (WalkState); |
goto Cleanup; |
} |
/* Mark this parse as a deferred opcode */ |
WalkState->ParseFlags = ACPI_PARSE_DEFERRED_OP; |
WalkState->DeferredNode = Node; |
/* Pass1: Parse the entire declaration */ |
Status = AcpiPsParseAml (WalkState); |
if (ACPI_FAILURE (Status)) |
{ |
goto Cleanup; |
} |
/* Get and init the Op created above */ |
Op->Common.Node = Node; |
AcpiPsDeleteParseTree (Op); |
/* Evaluate the deferred arguments */ |
Op = AcpiPsAllocOp (AML_INT_EVAL_SUBTREE_OP); |
if (!Op) |
{ |
return_ACPI_STATUS (AE_NO_MEMORY); |
} |
Op->Common.Node = ScopeNode; |
/* Create and initialize a new parser state */ |
WalkState = AcpiDsCreateWalkState (0, NULL, NULL, NULL); |
if (!WalkState) |
{ |
Status = AE_NO_MEMORY; |
goto Cleanup; |
} |
/* Execute the opcode and arguments */ |
Status = AcpiDsInitAmlWalk (WalkState, Op, NULL, AmlStart, |
AmlLength, NULL, ACPI_IMODE_EXECUTE); |
if (ACPI_FAILURE (Status)) |
{ |
AcpiDsDeleteWalkState (WalkState); |
goto Cleanup; |
} |
/* Mark this execution as a deferred opcode */ |
WalkState->DeferredNode = Node; |
Status = AcpiPsParseAml (WalkState); |
Cleanup: |
AcpiPsDeleteParseTree (Op); |
return_ACPI_STATUS (Status); |
} |
/******************************************************************************* |
* |
* FUNCTION: AcpiDsGetBufferFieldArguments |
* |
* PARAMETERS: ObjDesc - A valid BufferField object |
* |
* RETURN: Status. |
* |
* DESCRIPTION: Get BufferField Buffer and Index. This implements the late |
* evaluation of these field attributes. |
* |
******************************************************************************/ |
ACPI_STATUS |
AcpiDsGetBufferFieldArguments ( |
ACPI_OPERAND_OBJECT *ObjDesc) |
{ |
ACPI_OPERAND_OBJECT *ExtraDesc; |
ACPI_NAMESPACE_NODE *Node; |
ACPI_STATUS Status; |
ACPI_FUNCTION_TRACE_PTR (DsGetBufferFieldArguments, ObjDesc); |
if (ObjDesc->Common.Flags & AOPOBJ_DATA_VALID) |
{ |
return_ACPI_STATUS (AE_OK); |
} |
/* Get the AML pointer (method object) and BufferField node */ |
ExtraDesc = AcpiNsGetSecondaryObject (ObjDesc); |
Node = ObjDesc->BufferField.Node; |
ACPI_DEBUG_EXEC (AcpiUtDisplayInitPathname (ACPI_TYPE_BUFFER_FIELD, |
Node, NULL)); |
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] BufferField Arg Init\n", |
AcpiUtGetNodeName (Node))); |
/* Execute the AML code for the TermArg arguments */ |
Status = AcpiDsExecuteArguments (Node, Node->Parent, |
ExtraDesc->Extra.AmlLength, ExtraDesc->Extra.AmlStart); |
return_ACPI_STATUS (Status); |
} |
/******************************************************************************* |
* |
* FUNCTION: AcpiDsGetBankFieldArguments |
* |
* PARAMETERS: ObjDesc - A valid BankField object |
* |
* RETURN: Status. |
* |
* DESCRIPTION: Get BankField BankValue. This implements the late |
* evaluation of these field attributes. |
* |
******************************************************************************/ |
ACPI_STATUS |
AcpiDsGetBankFieldArguments ( |
ACPI_OPERAND_OBJECT *ObjDesc) |
{ |
ACPI_OPERAND_OBJECT *ExtraDesc; |
ACPI_NAMESPACE_NODE *Node; |
ACPI_STATUS Status; |
ACPI_FUNCTION_TRACE_PTR (DsGetBankFieldArguments, ObjDesc); |
if (ObjDesc->Common.Flags & AOPOBJ_DATA_VALID) |
{ |
return_ACPI_STATUS (AE_OK); |
} |
/* Get the AML pointer (method object) and BankField node */ |
ExtraDesc = AcpiNsGetSecondaryObject (ObjDesc); |
Node = ObjDesc->BankField.Node; |
ACPI_DEBUG_EXEC (AcpiUtDisplayInitPathname (ACPI_TYPE_LOCAL_BANK_FIELD, |
Node, NULL)); |
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] BankField Arg Init\n", |
AcpiUtGetNodeName (Node))); |
/* Execute the AML code for the TermArg arguments */ |
Status = AcpiDsExecuteArguments (Node, Node->Parent, |
ExtraDesc->Extra.AmlLength, ExtraDesc->Extra.AmlStart); |
return_ACPI_STATUS (Status); |
} |
/******************************************************************************* |
* |
* FUNCTION: AcpiDsGetBufferArguments |
* |
* PARAMETERS: ObjDesc - A valid Buffer object |
* |
* RETURN: Status. |
* |
* DESCRIPTION: Get Buffer length and initializer byte list. This implements |
* the late evaluation of these attributes. |
* |
******************************************************************************/ |
ACPI_STATUS |
AcpiDsGetBufferArguments ( |
ACPI_OPERAND_OBJECT *ObjDesc) |
{ |
ACPI_NAMESPACE_NODE *Node; |
ACPI_STATUS Status; |
ACPI_FUNCTION_TRACE_PTR (DsGetBufferArguments, ObjDesc); |
if (ObjDesc->Common.Flags & AOPOBJ_DATA_VALID) |
{ |
return_ACPI_STATUS (AE_OK); |
} |
/* Get the Buffer node */ |
Node = ObjDesc->Buffer.Node; |
if (!Node) |
{ |
ACPI_ERROR ((AE_INFO, |
"No pointer back to namespace node in buffer object %p", ObjDesc)); |
return_ACPI_STATUS (AE_AML_INTERNAL); |
} |
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Buffer Arg Init\n")); |
/* Execute the AML code for the TermArg arguments */ |
Status = AcpiDsExecuteArguments (Node, Node, |
ObjDesc->Buffer.AmlLength, ObjDesc->Buffer.AmlStart); |
return_ACPI_STATUS (Status); |
} |
/******************************************************************************* |
* |
* FUNCTION: AcpiDsGetPackageArguments |
* |
* PARAMETERS: ObjDesc - A valid Package object |
* |
* RETURN: Status. |
* |
* DESCRIPTION: Get Package length and initializer byte list. This implements |
* the late evaluation of these attributes. |
* |
******************************************************************************/ |
ACPI_STATUS |
AcpiDsGetPackageArguments ( |
ACPI_OPERAND_OBJECT *ObjDesc) |
{ |
ACPI_NAMESPACE_NODE *Node; |
ACPI_STATUS Status; |
ACPI_FUNCTION_TRACE_PTR (DsGetPackageArguments, ObjDesc); |
if (ObjDesc->Common.Flags & AOPOBJ_DATA_VALID) |
{ |
return_ACPI_STATUS (AE_OK); |
} |
/* Get the Package node */ |
Node = ObjDesc->Package.Node; |
if (!Node) |
{ |
ACPI_ERROR ((AE_INFO, |
"No pointer back to namespace node in package %p", ObjDesc)); |
return_ACPI_STATUS (AE_AML_INTERNAL); |
} |
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Package Arg Init\n")); |
/* Execute the AML code for the TermArg arguments */ |
Status = AcpiDsExecuteArguments (Node, Node, |
ObjDesc->Package.AmlLength, ObjDesc->Package.AmlStart); |
return_ACPI_STATUS (Status); |
} |
/******************************************************************************* |
* |
* FUNCTION: AcpiDsGetRegionArguments |
* |
* PARAMETERS: ObjDesc - A valid region object |
* |
* RETURN: Status. |
* |
* DESCRIPTION: Get region address and length. This implements the late |
* evaluation of these region attributes. |
* |
******************************************************************************/ |
ACPI_STATUS |
AcpiDsGetRegionArguments ( |
ACPI_OPERAND_OBJECT *ObjDesc) |
{ |
ACPI_NAMESPACE_NODE *Node; |
ACPI_STATUS Status; |
ACPI_OPERAND_OBJECT *ExtraDesc; |
ACPI_FUNCTION_TRACE_PTR (DsGetRegionArguments, ObjDesc); |
if (ObjDesc->Region.Flags & AOPOBJ_DATA_VALID) |
{ |
return_ACPI_STATUS (AE_OK); |
} |
ExtraDesc = AcpiNsGetSecondaryObject (ObjDesc); |
if (!ExtraDesc) |
{ |
return_ACPI_STATUS (AE_NOT_EXIST); |
} |
/* Get the Region node */ |
Node = ObjDesc->Region.Node; |
ACPI_DEBUG_EXEC (AcpiUtDisplayInitPathname (ACPI_TYPE_REGION, Node, NULL)); |
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] OpRegion Arg Init at AML %p\n", |
AcpiUtGetNodeName (Node), ExtraDesc->Extra.AmlStart)); |
/* Execute the argument AML */ |
Status = AcpiDsExecuteArguments (Node, Node->Parent, |
ExtraDesc->Extra.AmlLength, ExtraDesc->Extra.AmlStart); |
return_ACPI_STATUS (Status); |
} |
/drivers/devman/acpica/dispatcher/dscontrol.c |
---|
0,0 → 1,496 |
/****************************************************************************** |
* |
* Module Name: dscontrol - Support for execution control opcodes - |
* if/else/while/return |
* |
*****************************************************************************/ |
/****************************************************************************** |
* |
* 1. Copyright Notice |
* |
* Some or all of this work - Copyright (c) 1999 - 2011, Intel Corp. |
* All rights reserved. |
* |
* 2. License |
* |
* 2.1. This is your license from Intel Corp. under its intellectual property |
* rights. You may have additional license terms from the party that provided |
* you this software, covering your right to use that party's intellectual |
* property rights. |
* |
* 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a |
* copy of the source code appearing in this file ("Covered Code") an |
* irrevocable, perpetual, worldwide license under Intel's copyrights in the |
* base code distributed originally by Intel ("Original Intel Code") to copy, |
* make derivatives, distribute, use and display any portion of the Covered |
* Code in any form, with the right to sublicense such rights; and |
* |
* 2.3. Intel grants Licensee a non-exclusive and non-transferable patent |
* license (with the right to sublicense), under only those claims of Intel |
* patents that are infringed by the Original Intel Code, to make, use, sell, |
* offer to sell, and import the Covered Code and derivative works thereof |
* solely to the minimum extent necessary to exercise the above copyright |
* license, and in no event shall the patent license extend to any additions |
* to or modifications of the Original Intel Code. No other license or right |
* is granted directly or by implication, estoppel or otherwise; |
* |
* The above copyright and patent license is granted only if the following |
* conditions are met: |
* |
* 3. Conditions |
* |
* 3.1. Redistribution of Source with Rights to Further Distribute Source. |
* Redistribution of source code of any substantial portion of the Covered |
* Code or modification with rights to further distribute source must include |
* the above Copyright Notice, the above License, this list of Conditions, |
* and the following Disclaimer and Export Compliance provision. In addition, |
* Licensee must cause all Covered Code to which Licensee contributes to |
* contain a file documenting the changes Licensee made to create that Covered |
* Code and the date of any change. Licensee must include in that file the |
* documentation of any changes made by any predecessor Licensee. Licensee |
* must include a prominent statement that the modification is derived, |
* directly or indirectly, from Original Intel Code. |
* |
* 3.2. Redistribution of Source with no Rights to Further Distribute Source. |
* Redistribution of source code of any substantial portion of the Covered |
* Code or modification without rights to further distribute source must |
* include the following Disclaimer and Export Compliance provision in the |
* documentation and/or other materials provided with distribution. In |
* addition, Licensee may not authorize further sublicense of source of any |
* portion of the Covered Code, and must include terms to the effect that the |
* license from Licensee to its licensee is limited to the intellectual |
* property embodied in the software Licensee provides to its licensee, and |
* not to intellectual property embodied in modifications its licensee may |
* make. |
* |
* 3.3. Redistribution of Executable. Redistribution in executable form of any |
* substantial portion of the Covered Code or modification must reproduce the |
* above Copyright Notice, and the following Disclaimer and Export Compliance |
* provision in the documentation and/or other materials provided with the |
* distribution. |
* |
* 3.4. Intel retains all right, title, and interest in and to the Original |
* Intel Code. |
* |
* 3.5. Neither the name Intel nor any other trademark owned or controlled by |
* Intel shall be used in advertising or otherwise to promote the sale, use or |
* other dealings in products derived from or relating to the Covered Code |
* without prior written authorization from Intel. |
* |
* 4. Disclaimer and Export Compliance |
* |
* 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED |
* HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE |
* IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, |
* INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY |
* UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY |
* IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A |
* PARTICULAR PURPOSE. |
* |
* 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES |
* OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR |
* COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, |
* SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY |
* CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL |
* HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS |
* SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY |
* LIMITED REMEDY. |
* |
* 4.3. Licensee shall not export, either directly or indirectly, any of this |
* software or system incorporating such software without first obtaining any |
* required license or other approval from the U. S. Department of Commerce or |
* any other agency or department of the United States Government. In the |
* event Licensee exports any such software from the United States or |
* re-exports any such software from a foreign destination, Licensee shall |
* ensure that the distribution and export/re-export of the software is in |
* compliance with all laws, regulations, orders, or other restrictions of the |
* U.S. Export Administration Regulations. Licensee agrees that neither it nor |
* any of its subsidiaries will export/re-export any technical data, process, |
* software, or service, directly or indirectly, to any country for which the |
* United States government or any agency thereof requires an export license, |
* other governmental approval, or letter of assurance, without first obtaining |
* such license, approval or letter. |
* |
*****************************************************************************/ |
#define __DSCONTROL_C__ |
#include "acpi.h" |
#include "accommon.h" |
#include "amlcode.h" |
#include "acdispat.h" |
#include "acinterp.h" |
#define _COMPONENT ACPI_DISPATCHER |
ACPI_MODULE_NAME ("dscontrol") |
/******************************************************************************* |
* |
* FUNCTION: AcpiDsExecBeginControlOp |
* |
* PARAMETERS: WalkList - The list that owns the walk stack |
* Op - The control Op |
* |
* RETURN: Status |
* |
* DESCRIPTION: Handles all control ops encountered during control method |
* execution. |
* |
******************************************************************************/ |
ACPI_STATUS |
AcpiDsExecBeginControlOp ( |
ACPI_WALK_STATE *WalkState, |
ACPI_PARSE_OBJECT *Op) |
{ |
ACPI_STATUS Status = AE_OK; |
ACPI_GENERIC_STATE *ControlState; |
ACPI_FUNCTION_NAME (DsExecBeginControlOp); |
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op=%p Opcode=%2.2X State=%p\n", |
Op, Op->Common.AmlOpcode, WalkState)); |
switch (Op->Common.AmlOpcode) |
{ |
case AML_WHILE_OP: |
/* |
* If this is an additional iteration of a while loop, continue. |
* There is no need to allocate a new control state. |
*/ |
if (WalkState->ControlState) |
{ |
if (WalkState->ControlState->Control.AmlPredicateStart == |
(WalkState->ParserState.Aml - 1)) |
{ |
/* Reset the state to start-of-loop */ |
WalkState->ControlState->Common.State = |
ACPI_CONTROL_CONDITIONAL_EXECUTING; |
break; |
} |
} |
/*lint -fallthrough */ |
case AML_IF_OP: |
/* |
* IF/WHILE: Create a new control state to manage these |
* constructs. We need to manage these as a stack, in order |
* to handle nesting. |
*/ |
ControlState = AcpiUtCreateControlState (); |
if (!ControlState) |
{ |
Status = AE_NO_MEMORY; |
break; |
} |
/* |
* Save a pointer to the predicate for multiple executions |
* of a loop |
*/ |
ControlState->Control.AmlPredicateStart = WalkState->ParserState.Aml - 1; |
ControlState->Control.PackageEnd = WalkState->ParserState.PkgEnd; |
ControlState->Control.Opcode = Op->Common.AmlOpcode; |
/* Push the control state on this walk's control stack */ |
AcpiUtPushGenericState (&WalkState->ControlState, ControlState); |
break; |
case AML_ELSE_OP: |
/* Predicate is in the state object */ |
/* If predicate is true, the IF was executed, ignore ELSE part */ |
if (WalkState->LastPredicate) |
{ |
Status = AE_CTRL_TRUE; |
} |
break; |
case AML_RETURN_OP: |
break; |
default: |
break; |
} |
return (Status); |
} |
/******************************************************************************* |
* |
* FUNCTION: AcpiDsExecEndControlOp |
* |
* PARAMETERS: WalkList - The list that owns the walk stack |
* Op - The control Op |
* |
* RETURN: Status |
* |
* DESCRIPTION: Handles all control ops encountered during control method |
* execution. |
* |
******************************************************************************/ |
ACPI_STATUS |
AcpiDsExecEndControlOp ( |
ACPI_WALK_STATE *WalkState, |
ACPI_PARSE_OBJECT *Op) |
{ |
ACPI_STATUS Status = AE_OK; |
ACPI_GENERIC_STATE *ControlState; |
ACPI_FUNCTION_NAME (DsExecEndControlOp); |
switch (Op->Common.AmlOpcode) |
{ |
case AML_IF_OP: |
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "[IF_OP] Op=%p\n", Op)); |
/* |
* Save the result of the predicate in case there is an |
* ELSE to come |
*/ |
WalkState->LastPredicate = |
(BOOLEAN) WalkState->ControlState->Common.Value; |
/* |
* Pop the control state that was created at the start |
* of the IF and free it |
*/ |
ControlState = AcpiUtPopGenericState (&WalkState->ControlState); |
AcpiUtDeleteGenericState (ControlState); |
break; |
case AML_ELSE_OP: |
break; |
case AML_WHILE_OP: |
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "[WHILE_OP] Op=%p\n", Op)); |
ControlState = WalkState->ControlState; |
if (ControlState->Common.Value) |
{ |
/* Predicate was true, the body of the loop was just executed */ |
/* |
* This loop counter mechanism allows the interpreter to escape |
* possibly infinite loops. This can occur in poorly written AML |
* when the hardware does not respond within a while loop and the |
* loop does not implement a timeout. |
*/ |
ControlState->Control.LoopCount++; |
if (ControlState->Control.LoopCount > ACPI_MAX_LOOP_ITERATIONS) |
{ |
Status = AE_AML_INFINITE_LOOP; |
break; |
} |
/* |
* Go back and evaluate the predicate and maybe execute the loop |
* another time |
*/ |
Status = AE_CTRL_PENDING; |
WalkState->AmlLastWhile = ControlState->Control.AmlPredicateStart; |
break; |
} |
/* Predicate was false, terminate this while loop */ |
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, |
"[WHILE_OP] termination! Op=%p\n",Op)); |
/* Pop this control state and free it */ |
ControlState = AcpiUtPopGenericState (&WalkState->ControlState); |
AcpiUtDeleteGenericState (ControlState); |
break; |
case AML_RETURN_OP: |
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, |
"[RETURN_OP] Op=%p Arg=%p\n",Op, Op->Common.Value.Arg)); |
/* |
* One optional operand -- the return value |
* It can be either an immediate operand or a result that |
* has been bubbled up the tree |
*/ |
if (Op->Common.Value.Arg) |
{ |
/* Since we have a real Return(), delete any implicit return */ |
AcpiDsClearImplicitReturn (WalkState); |
/* Return statement has an immediate operand */ |
Status = AcpiDsCreateOperands (WalkState, Op->Common.Value.Arg); |
if (ACPI_FAILURE (Status)) |
{ |
return (Status); |
} |
/* |
* If value being returned is a Reference (such as |
* an arg or local), resolve it now because it may |
* cease to exist at the end of the method. |
*/ |
Status = AcpiExResolveToValue (&WalkState->Operands [0], WalkState); |
if (ACPI_FAILURE (Status)) |
{ |
return (Status); |
} |
/* |
* Get the return value and save as the last result |
* value. This is the only place where WalkState->ReturnDesc |
* is set to anything other than zero! |
*/ |
WalkState->ReturnDesc = WalkState->Operands[0]; |
} |
else if (WalkState->ResultCount) |
{ |
/* Since we have a real Return(), delete any implicit return */ |
AcpiDsClearImplicitReturn (WalkState); |
/* |
* The return value has come from a previous calculation. |
* |
* If value being returned is a Reference (such as |
* an arg or local), resolve it now because it may |
* cease to exist at the end of the method. |
* |
* Allow references created by the Index operator to return |
* unchanged. |
*/ |
if ((ACPI_GET_DESCRIPTOR_TYPE (WalkState->Results->Results.ObjDesc[0]) == ACPI_DESC_TYPE_OPERAND) && |
((WalkState->Results->Results.ObjDesc [0])->Common.Type == ACPI_TYPE_LOCAL_REFERENCE) && |
((WalkState->Results->Results.ObjDesc [0])->Reference.Class != ACPI_REFCLASS_INDEX)) |
{ |
Status = AcpiExResolveToValue (&WalkState->Results->Results.ObjDesc [0], WalkState); |
if (ACPI_FAILURE (Status)) |
{ |
return (Status); |
} |
} |
WalkState->ReturnDesc = WalkState->Results->Results.ObjDesc [0]; |
} |
else |
{ |
/* No return operand */ |
if (WalkState->NumOperands) |
{ |
AcpiUtRemoveReference (WalkState->Operands [0]); |
} |
WalkState->Operands [0] = NULL; |
WalkState->NumOperands = 0; |
WalkState->ReturnDesc = NULL; |
} |
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, |
"Completed RETURN_OP State=%p, RetVal=%p\n", |
WalkState, WalkState->ReturnDesc)); |
/* End the control method execution right now */ |
Status = AE_CTRL_TERMINATE; |
break; |
case AML_NOOP_OP: |
/* Just do nothing! */ |
break; |
case AML_BREAK_POINT_OP: |
/* |
* Set the single-step flag. This will cause the debugger (if present) |
* to break to the console within the AML debugger at the start of the |
* next AML instruction. |
*/ |
ACPI_DEBUGGER_EXEC ( |
AcpiGbl_CmSingleStep = TRUE); |
ACPI_DEBUGGER_EXEC ( |
AcpiOsPrintf ("**break** Executed AML BreakPoint opcode\n")); |
/* Call to the OSL in case OS wants a piece of the action */ |
Status = AcpiOsSignal (ACPI_SIGNAL_BREAKPOINT, |
"Executed AML Breakpoint opcode"); |
break; |
case AML_BREAK_OP: |
case AML_CONTINUE_OP: /* ACPI 2.0 */ |
/* Pop and delete control states until we find a while */ |
while (WalkState->ControlState && |
(WalkState->ControlState->Control.Opcode != AML_WHILE_OP)) |
{ |
ControlState = AcpiUtPopGenericState (&WalkState->ControlState); |
AcpiUtDeleteGenericState (ControlState); |
} |
/* No while found? */ |
if (!WalkState->ControlState) |
{ |
return (AE_AML_NO_WHILE); |
} |
/* Was: WalkState->AmlLastWhile = WalkState->ControlState->Control.AmlPredicateStart; */ |
WalkState->AmlLastWhile = WalkState->ControlState->Control.PackageEnd; |
/* Return status depending on opcode */ |
if (Op->Common.AmlOpcode == AML_BREAK_OP) |
{ |
Status = AE_CTRL_BREAK; |
} |
else |
{ |
Status = AE_CTRL_CONTINUE; |
} |
break; |
default: |
ACPI_ERROR ((AE_INFO, "Unknown control opcode=0x%X Op=%p", |
Op->Common.AmlOpcode, Op)); |
Status = AE_AML_BAD_OPCODE; |
break; |
} |
return (Status); |
} |
/drivers/devman/acpica/dispatcher/dsfield.c |
---|
8,7 → 8,7 |
* |
* 1. Copyright Notice |
* |
* Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. |
* Some or all of this work - Copyright (c) 1999 - 2011, Intel Corp. |
* All rights reserved. |
* |
* 2. License |
/drivers/devman/acpica/dispatcher/dsinit.c |
---|
8,7 → 8,7 |
* |
* 1. Copyright Notice |
* |
* Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. |
* Some or all of this work - Copyright (c) 1999 - 2011, Intel Corp. |
* All rights reserved. |
* |
* 2. License |
/drivers/devman/acpica/dispatcher/dsmethod.c |
---|
8,7 → 8,7 |
* |
* 1. Copyright Notice |
* |
* Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. |
* Some or all of this work - Copyright (c) 1999 - 2011, Intel Corp. |
* All rights reserved. |
* |
* 2. License |
117,7 → 117,6 |
#include "acpi.h" |
#include "accommon.h" |
#include "amlcode.h" |
#include "acdispat.h" |
#include "acinterp.h" |
#include "acnamesp.h" |
291,7 → 290,7 |
/* |
* If this method is serialized, we need to acquire the method mutex. |
*/ |
if (ObjDesc->Method.MethodFlags & AML_METHOD_SERIALIZED) |
if (ObjDesc->Method.InfoFlags & ACPI_METHOD_SERIALIZED) |
{ |
/* |
* Create a mutex for the method if it is defined to be Serialized |
517,9 → 516,9 |
/* Invoke an internal method if necessary */ |
if (ObjDesc->Method.MethodFlags & AML_METHOD_INTERNAL_ONLY) |
if (ObjDesc->Method.InfoFlags & ACPI_METHOD_INTERNAL_ONLY) |
{ |
Status = ObjDesc->Method.Extra.Implementation (NextWalkState); |
Status = ObjDesc->Method.Dispatch.Implementation (NextWalkState); |
if (Status == AE_OK) |
{ |
Status = AE_CTRL_TERMINATE; |
694,11 → 693,14 |
/* |
* Delete any namespace objects created anywhere within the |
* namespace by the execution of this method. Unless this method |
* is a module-level executable code method, in which case we |
* want make the objects permanent. |
* namespace by the execution of this method. Unless: |
* 1) This method is a module-level executable code method, in which |
* case we want make the objects permanent. |
* 2) There are other threads executing the method, in which case we |
* will wait until the last thread has completed. |
*/ |
if (!(MethodDesc->Method.Flags & AOPOBJ_MODULE_LEVEL)) |
if (!(MethodDesc->Method.InfoFlags & ACPI_METHOD_MODULE_LEVEL) && |
(MethodDesc->Method.ThreadCount == 1)) |
{ |
/* Delete any direct children of (created by) this method */ |
707,10 → 709,14 |
/* |
* Delete any objects that were created by this method |
* elsewhere in the namespace (if any were created). |
* Use of the ACPI_METHOD_MODIFIED_NAMESPACE optimizes the |
* deletion such that we don't have to perform an entire |
* namespace walk for every control method execution. |
*/ |
if (MethodDesc->Method.Flags & AOPOBJ_MODIFIED_NAMESPACE) |
if (MethodDesc->Method.InfoFlags & ACPI_METHOD_MODIFIED_NAMESPACE) |
{ |
AcpiNsDeleteNamespaceByOwner (MethodDesc->Method.OwnerId); |
MethodDesc->Method.InfoFlags &= ~ACPI_METHOD_MODIFIED_NAMESPACE; |
} |
} |
} |
748,20 → 754,39 |
* Serialized if it appears that the method is incorrectly written and |
* does not support multiple thread execution. The best example of this |
* is if such a method creates namespace objects and blocks. A second |
* thread will fail with an AE_ALREADY_EXISTS exception |
* thread will fail with an AE_ALREADY_EXISTS exception. |
* |
* This code is here because we must wait until the last thread exits |
* before creating the synchronization semaphore. |
* before marking the method as serialized. |
*/ |
if ((MethodDesc->Method.MethodFlags & AML_METHOD_SERIALIZED) && |
(!MethodDesc->Method.Mutex)) |
if (MethodDesc->Method.InfoFlags & ACPI_METHOD_SERIALIZED_PENDING) |
{ |
(void) AcpiDsCreateMethodMutex (MethodDesc); |
if (WalkState) |
{ |
ACPI_INFO ((AE_INFO, |
"Marking method %4.4s as Serialized because of AE_ALREADY_EXISTS error", |
WalkState->MethodNode->Name.Ascii)); |
} |
/* |
* Method tried to create an object twice and was marked as |
* "pending serialized". The probable cause is that the method |
* cannot handle reentrancy. |
* |
* The method was created as NotSerialized, but it tried to create |
* a named object and then blocked, causing the second thread |
* entrance to begin and then fail. Workaround this problem by |
* marking the method permanently as Serialized when the last |
* thread exits here. |
*/ |
MethodDesc->Method.InfoFlags &= ~ACPI_METHOD_SERIALIZED_PENDING; |
MethodDesc->Method.InfoFlags |= ACPI_METHOD_SERIALIZED; |
MethodDesc->Method.SyncLevel = 0; |
} |
/* No more threads, we can free the OwnerId */ |
if (!(MethodDesc->Method.Flags & AOPOBJ_MODULE_LEVEL)) |
if (!(MethodDesc->Method.InfoFlags & ACPI_METHOD_MODULE_LEVEL)) |
{ |
AcpiUtReleaseOwnerId (&MethodDesc->Method.OwnerId); |
} |
/drivers/devman/acpica/dispatcher/dsmthdat.c |
---|
8,7 → 8,7 |
* |
* 1. Copyright Notice |
* |
* Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. |
* Some or all of this work - Copyright (c) 1999 - 2011, Intel Corp. |
* All rights reserved. |
* |
* 2. License |
/drivers/devman/acpica/dispatcher/dsobject.c |
---|
8,7 → 8,7 |
* |
* 1. Copyright Notice |
* |
* Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. |
* Some or all of this work - Copyright (c) 1999 - 2011, Intel Corp. |
* All rights reserved. |
* |
* 2. License |
159,6 → 159,7 |
{ |
ACPI_OPERAND_OBJECT *ObjDesc; |
ACPI_STATUS Status; |
ACPI_OBJECT_TYPE Type; |
ACPI_FUNCTION_TRACE (DsBuildInternalObject); |
241,8 → 242,21 |
return_ACPI_STATUS (Status); |
} |
switch (Op->Common.Node->Type) |
/* |
* Special handling for Alias objects. We need to setup the type |
* and the Op->Common.Node to point to the Alias target. Note, |
* Alias has at most one level of indirection internally. |
*/ |
Type = Op->Common.Node->Type; |
if (Type == ACPI_TYPE_LOCAL_ALIAS) |
{ |
Type = ObjDesc->Common.Type; |
Op->Common.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, |
Op->Common.Node->Object); |
} |
switch (Type) |
{ |
/* |
* For these types, we need the actual node, not the subobject. |
* However, the subobject did not get an extra reference count above. |
/drivers/devman/acpica/dispatcher/dsopcode.c |
---|
1,7 → 1,6 |
/****************************************************************************** |
* |
* Module Name: dsopcode - Dispatcher Op Region support and handling of |
* "control" opcodes |
* Module Name: dsopcode - Dispatcher suport for regions and fields |
* |
*****************************************************************************/ |
9,7 → 8,7 |
* |
* 1. Copyright Notice |
* |
* Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. |
* Some or all of this work - Copyright (c) 1999 - 2011, Intel Corp. |
* All rights reserved. |
* |
* 2. License |
132,13 → 131,6 |
/* Local prototypes */ |
static ACPI_STATUS |
AcpiDsExecuteArguments ( |
ACPI_NAMESPACE_NODE *Node, |
ACPI_NAMESPACE_NODE *ScopeNode, |
UINT32 AmlLength, |
UINT8 *AmlStart); |
static ACPI_STATUS |
AcpiDsInitBufferField ( |
UINT16 AmlOpcode, |
ACPI_OPERAND_OBJECT *ObjDesc, |
150,369 → 142,6 |
/******************************************************************************* |
* |
* FUNCTION: AcpiDsExecuteArguments |
* |
* PARAMETERS: Node - Object NS node |
* ScopeNode - Parent NS node |
* AmlLength - Length of executable AML |
* AmlStart - Pointer to the AML |
* |
* RETURN: Status. |
* |
* DESCRIPTION: Late (deferred) execution of region or field arguments |
* |
******************************************************************************/ |
static ACPI_STATUS |
AcpiDsExecuteArguments ( |
ACPI_NAMESPACE_NODE *Node, |
ACPI_NAMESPACE_NODE *ScopeNode, |
UINT32 AmlLength, |
UINT8 *AmlStart) |
{ |
ACPI_STATUS Status; |
ACPI_PARSE_OBJECT *Op; |
ACPI_WALK_STATE *WalkState; |
ACPI_FUNCTION_TRACE (DsExecuteArguments); |
/* |
* Allocate a new parser op to be the root of the parsed tree |
*/ |
Op = AcpiPsAllocOp (AML_INT_EVAL_SUBTREE_OP); |
if (!Op) |
{ |
return_ACPI_STATUS (AE_NO_MEMORY); |
} |
/* Save the Node for use in AcpiPsParseAml */ |
Op->Common.Node = ScopeNode; |
/* Create and initialize a new parser state */ |
WalkState = AcpiDsCreateWalkState (0, NULL, NULL, NULL); |
if (!WalkState) |
{ |
Status = AE_NO_MEMORY; |
goto Cleanup; |
} |
Status = AcpiDsInitAmlWalk (WalkState, Op, NULL, AmlStart, |
AmlLength, NULL, ACPI_IMODE_LOAD_PASS1); |
if (ACPI_FAILURE (Status)) |
{ |
AcpiDsDeleteWalkState (WalkState); |
goto Cleanup; |
} |
/* Mark this parse as a deferred opcode */ |
WalkState->ParseFlags = ACPI_PARSE_DEFERRED_OP; |
WalkState->DeferredNode = Node; |
/* Pass1: Parse the entire declaration */ |
Status = AcpiPsParseAml (WalkState); |
if (ACPI_FAILURE (Status)) |
{ |
goto Cleanup; |
} |
/* Get and init the Op created above */ |
Op->Common.Node = Node; |
AcpiPsDeleteParseTree (Op); |
/* Evaluate the deferred arguments */ |
Op = AcpiPsAllocOp (AML_INT_EVAL_SUBTREE_OP); |
if (!Op) |
{ |
return_ACPI_STATUS (AE_NO_MEMORY); |
} |
Op->Common.Node = ScopeNode; |
/* Create and initialize a new parser state */ |
WalkState = AcpiDsCreateWalkState (0, NULL, NULL, NULL); |
if (!WalkState) |
{ |
Status = AE_NO_MEMORY; |
goto Cleanup; |
} |
/* Execute the opcode and arguments */ |
Status = AcpiDsInitAmlWalk (WalkState, Op, NULL, AmlStart, |
AmlLength, NULL, ACPI_IMODE_EXECUTE); |
if (ACPI_FAILURE (Status)) |
{ |
AcpiDsDeleteWalkState (WalkState); |
goto Cleanup; |
} |
/* Mark this execution as a deferred opcode */ |
WalkState->DeferredNode = Node; |
Status = AcpiPsParseAml (WalkState); |
Cleanup: |
AcpiPsDeleteParseTree (Op); |
return_ACPI_STATUS (Status); |
} |
/******************************************************************************* |
* |
* FUNCTION: AcpiDsGetBufferFieldArguments |
* |
* PARAMETERS: ObjDesc - A valid BufferField object |
* |
* RETURN: Status. |
* |
* DESCRIPTION: Get BufferField Buffer and Index. This implements the late |
* evaluation of these field attributes. |
* |
******************************************************************************/ |
ACPI_STATUS |
AcpiDsGetBufferFieldArguments ( |
ACPI_OPERAND_OBJECT *ObjDesc) |
{ |
ACPI_OPERAND_OBJECT *ExtraDesc; |
ACPI_NAMESPACE_NODE *Node; |
ACPI_STATUS Status; |
ACPI_FUNCTION_TRACE_PTR (DsGetBufferFieldArguments, ObjDesc); |
if (ObjDesc->Common.Flags & AOPOBJ_DATA_VALID) |
{ |
return_ACPI_STATUS (AE_OK); |
} |
/* Get the AML pointer (method object) and BufferField node */ |
ExtraDesc = AcpiNsGetSecondaryObject (ObjDesc); |
Node = ObjDesc->BufferField.Node; |
ACPI_DEBUG_EXEC(AcpiUtDisplayInitPathname (ACPI_TYPE_BUFFER_FIELD, Node, NULL)); |
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] BufferField Arg Init\n", |
AcpiUtGetNodeName (Node))); |
/* Execute the AML code for the TermArg arguments */ |
Status = AcpiDsExecuteArguments (Node, Node->Parent, |
ExtraDesc->Extra.AmlLength, ExtraDesc->Extra.AmlStart); |
return_ACPI_STATUS (Status); |
} |
/******************************************************************************* |
* |
* FUNCTION: AcpiDsGetBankFieldArguments |
* |
* PARAMETERS: ObjDesc - A valid BankField object |
* |
* RETURN: Status. |
* |
* DESCRIPTION: Get BankField BankValue. This implements the late |
* evaluation of these field attributes. |
* |
******************************************************************************/ |
ACPI_STATUS |
AcpiDsGetBankFieldArguments ( |
ACPI_OPERAND_OBJECT *ObjDesc) |
{ |
ACPI_OPERAND_OBJECT *ExtraDesc; |
ACPI_NAMESPACE_NODE *Node; |
ACPI_STATUS Status; |
ACPI_FUNCTION_TRACE_PTR (DsGetBankFieldArguments, ObjDesc); |
if (ObjDesc->Common.Flags & AOPOBJ_DATA_VALID) |
{ |
return_ACPI_STATUS (AE_OK); |
} |
/* Get the AML pointer (method object) and BankField node */ |
ExtraDesc = AcpiNsGetSecondaryObject (ObjDesc); |
Node = ObjDesc->BankField.Node; |
ACPI_DEBUG_EXEC(AcpiUtDisplayInitPathname (ACPI_TYPE_LOCAL_BANK_FIELD, Node, NULL)); |
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] BankField Arg Init\n", |
AcpiUtGetNodeName (Node))); |
/* Execute the AML code for the TermArg arguments */ |
Status = AcpiDsExecuteArguments (Node, Node->Parent, |
ExtraDesc->Extra.AmlLength, ExtraDesc->Extra.AmlStart); |
return_ACPI_STATUS (Status); |
} |
/******************************************************************************* |
* |
* FUNCTION: AcpiDsGetBufferArguments |
* |
* PARAMETERS: ObjDesc - A valid Buffer object |
* |
* RETURN: Status. |
* |
* DESCRIPTION: Get Buffer length and initializer byte list. This implements |
* the late evaluation of these attributes. |
* |
******************************************************************************/ |
ACPI_STATUS |
AcpiDsGetBufferArguments ( |
ACPI_OPERAND_OBJECT *ObjDesc) |
{ |
ACPI_NAMESPACE_NODE *Node; |
ACPI_STATUS Status; |
ACPI_FUNCTION_TRACE_PTR (DsGetBufferArguments, ObjDesc); |
if (ObjDesc->Common.Flags & AOPOBJ_DATA_VALID) |
{ |
return_ACPI_STATUS (AE_OK); |
} |
/* Get the Buffer node */ |
Node = ObjDesc->Buffer.Node; |
if (!Node) |
{ |
ACPI_ERROR ((AE_INFO, |
"No pointer back to namespace node in buffer object %p", ObjDesc)); |
return_ACPI_STATUS (AE_AML_INTERNAL); |
} |
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Buffer Arg Init\n")); |
/* Execute the AML code for the TermArg arguments */ |
Status = AcpiDsExecuteArguments (Node, Node, |
ObjDesc->Buffer.AmlLength, ObjDesc->Buffer.AmlStart); |
return_ACPI_STATUS (Status); |
} |
/******************************************************************************* |
* |
* FUNCTION: AcpiDsGetPackageArguments |
* |
* PARAMETERS: ObjDesc - A valid Package object |
* |
* RETURN: Status. |
* |
* DESCRIPTION: Get Package length and initializer byte list. This implements |
* the late evaluation of these attributes. |
* |
******************************************************************************/ |
ACPI_STATUS |
AcpiDsGetPackageArguments ( |
ACPI_OPERAND_OBJECT *ObjDesc) |
{ |
ACPI_NAMESPACE_NODE *Node; |
ACPI_STATUS Status; |
ACPI_FUNCTION_TRACE_PTR (DsGetPackageArguments, ObjDesc); |
if (ObjDesc->Common.Flags & AOPOBJ_DATA_VALID) |
{ |
return_ACPI_STATUS (AE_OK); |
} |
/* Get the Package node */ |
Node = ObjDesc->Package.Node; |
if (!Node) |
{ |
ACPI_ERROR ((AE_INFO, |
"No pointer back to namespace node in package %p", ObjDesc)); |
return_ACPI_STATUS (AE_AML_INTERNAL); |
} |
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Package Arg Init\n")); |
/* Execute the AML code for the TermArg arguments */ |
Status = AcpiDsExecuteArguments (Node, Node, |
ObjDesc->Package.AmlLength, ObjDesc->Package.AmlStart); |
return_ACPI_STATUS (Status); |
} |
/***************************************************************************** |
* |
* FUNCTION: AcpiDsGetRegionArguments |
* |
* PARAMETERS: ObjDesc - A valid region object |
* |
* RETURN: Status. |
* |
* DESCRIPTION: Get region address and length. This implements the late |
* evaluation of these region attributes. |
* |
****************************************************************************/ |
ACPI_STATUS |
AcpiDsGetRegionArguments ( |
ACPI_OPERAND_OBJECT *ObjDesc) |
{ |
ACPI_NAMESPACE_NODE *Node; |
ACPI_STATUS Status; |
ACPI_OPERAND_OBJECT *ExtraDesc; |
ACPI_FUNCTION_TRACE_PTR (DsGetRegionArguments, ObjDesc); |
if (ObjDesc->Region.Flags & AOPOBJ_DATA_VALID) |
{ |
return_ACPI_STATUS (AE_OK); |
} |
ExtraDesc = AcpiNsGetSecondaryObject (ObjDesc); |
if (!ExtraDesc) |
{ |
return_ACPI_STATUS (AE_NOT_EXIST); |
} |
/* Get the Region node */ |
Node = ObjDesc->Region.Node; |
ACPI_DEBUG_EXEC (AcpiUtDisplayInitPathname (ACPI_TYPE_REGION, Node, NULL)); |
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] OpRegion Arg Init at AML %p\n", |
AcpiUtGetNodeName (Node), ExtraDesc->Extra.AmlStart)); |
/* Execute the argument AML */ |
Status = AcpiDsExecuteArguments (Node, Node->Parent, |
ExtraDesc->Extra.AmlLength, ExtraDesc->Extra.AmlStart); |
return_ACPI_STATUS (Status); |
} |
/******************************************************************************* |
* |
* FUNCTION: AcpiDsInitializeRegion |
* |
* PARAMETERS: ObjHandle - Region namespace node |
942,8 → 571,9 |
* |
* RETURN: Status |
* |
* DESCRIPTION: Get region address and length |
* Called from AcpiDsExecEndOp during DataTableRegion parse tree walk |
* DESCRIPTION: Get region address and length. |
* Called from AcpiDsExecEndOp during DataTableRegion parse |
* tree walk. |
* |
******************************************************************************/ |
1249,371 → 879,3 |
return_ACPI_STATUS (Status); |
} |
/******************************************************************************* |
* |
* FUNCTION: AcpiDsExecBeginControlOp |
* |
* PARAMETERS: WalkList - The list that owns the walk stack |
* Op - The control Op |
* |
* RETURN: Status |
* |
* DESCRIPTION: Handles all control ops encountered during control method |
* execution. |
* |
******************************************************************************/ |
ACPI_STATUS |
AcpiDsExecBeginControlOp ( |
ACPI_WALK_STATE *WalkState, |
ACPI_PARSE_OBJECT *Op) |
{ |
ACPI_STATUS Status = AE_OK; |
ACPI_GENERIC_STATE *ControlState; |
ACPI_FUNCTION_NAME (DsExecBeginControlOp); |
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op=%p Opcode=%2.2X State=%p\n", Op, |
Op->Common.AmlOpcode, WalkState)); |
switch (Op->Common.AmlOpcode) |
{ |
case AML_WHILE_OP: |
/* |
* If this is an additional iteration of a while loop, continue. |
* There is no need to allocate a new control state. |
*/ |
if (WalkState->ControlState) |
{ |
if (WalkState->ControlState->Control.AmlPredicateStart == |
(WalkState->ParserState.Aml - 1)) |
{ |
/* Reset the state to start-of-loop */ |
WalkState->ControlState->Common.State = ACPI_CONTROL_CONDITIONAL_EXECUTING; |
break; |
} |
} |
/*lint -fallthrough */ |
case AML_IF_OP: |
/* |
* IF/WHILE: Create a new control state to manage these |
* constructs. We need to manage these as a stack, in order |
* to handle nesting. |
*/ |
ControlState = AcpiUtCreateControlState (); |
if (!ControlState) |
{ |
Status = AE_NO_MEMORY; |
break; |
} |
/* |
* Save a pointer to the predicate for multiple executions |
* of a loop |
*/ |
ControlState->Control.AmlPredicateStart = WalkState->ParserState.Aml - 1; |
ControlState->Control.PackageEnd = WalkState->ParserState.PkgEnd; |
ControlState->Control.Opcode = Op->Common.AmlOpcode; |
/* Push the control state on this walk's control stack */ |
AcpiUtPushGenericState (&WalkState->ControlState, ControlState); |
break; |
case AML_ELSE_OP: |
/* Predicate is in the state object */ |
/* If predicate is true, the IF was executed, ignore ELSE part */ |
if (WalkState->LastPredicate) |
{ |
Status = AE_CTRL_TRUE; |
} |
break; |
case AML_RETURN_OP: |
break; |
default: |
break; |
} |
return (Status); |
} |
/******************************************************************************* |
* |
* FUNCTION: AcpiDsExecEndControlOp |
* |
* PARAMETERS: WalkList - The list that owns the walk stack |
* Op - The control Op |
* |
* RETURN: Status |
* |
* DESCRIPTION: Handles all control ops encountered during control method |
* execution. |
* |
******************************************************************************/ |
ACPI_STATUS |
AcpiDsExecEndControlOp ( |
ACPI_WALK_STATE *WalkState, |
ACPI_PARSE_OBJECT *Op) |
{ |
ACPI_STATUS Status = AE_OK; |
ACPI_GENERIC_STATE *ControlState; |
ACPI_FUNCTION_NAME (DsExecEndControlOp); |
switch (Op->Common.AmlOpcode) |
{ |
case AML_IF_OP: |
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "[IF_OP] Op=%p\n", Op)); |
/* |
* Save the result of the predicate in case there is an |
* ELSE to come |
*/ |
WalkState->LastPredicate = |
(BOOLEAN) WalkState->ControlState->Common.Value; |
/* |
* Pop the control state that was created at the start |
* of the IF and free it |
*/ |
ControlState = AcpiUtPopGenericState (&WalkState->ControlState); |
AcpiUtDeleteGenericState (ControlState); |
break; |
case AML_ELSE_OP: |
break; |
case AML_WHILE_OP: |
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "[WHILE_OP] Op=%p\n", Op)); |
ControlState = WalkState->ControlState; |
if (ControlState->Common.Value) |
{ |
/* Predicate was true, the body of the loop was just executed */ |
/* |
* This loop counter mechanism allows the interpreter to escape |
* possibly infinite loops. This can occur in poorly written AML |
* when the hardware does not respond within a while loop and the |
* loop does not implement a timeout. |
*/ |
ControlState->Control.LoopCount++; |
if (ControlState->Control.LoopCount > ACPI_MAX_LOOP_ITERATIONS) |
{ |
Status = AE_AML_INFINITE_LOOP; |
break; |
} |
/* |
* Go back and evaluate the predicate and maybe execute the loop |
* another time |
*/ |
Status = AE_CTRL_PENDING; |
WalkState->AmlLastWhile = ControlState->Control.AmlPredicateStart; |
break; |
} |
/* Predicate was false, terminate this while loop */ |
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, |
"[WHILE_OP] termination! Op=%p\n",Op)); |
/* Pop this control state and free it */ |
ControlState = AcpiUtPopGenericState (&WalkState->ControlState); |
AcpiUtDeleteGenericState (ControlState); |
break; |
case AML_RETURN_OP: |
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, |
"[RETURN_OP] Op=%p Arg=%p\n",Op, Op->Common.Value.Arg)); |
/* |
* One optional operand -- the return value |
* It can be either an immediate operand or a result that |
* has been bubbled up the tree |
*/ |
if (Op->Common.Value.Arg) |
{ |
/* Since we have a real Return(), delete any implicit return */ |
AcpiDsClearImplicitReturn (WalkState); |
/* Return statement has an immediate operand */ |
Status = AcpiDsCreateOperands (WalkState, Op->Common.Value.Arg); |
if (ACPI_FAILURE (Status)) |
{ |
return (Status); |
} |
/* |
* If value being returned is a Reference (such as |
* an arg or local), resolve it now because it may |
* cease to exist at the end of the method. |
*/ |
Status = AcpiExResolveToValue (&WalkState->Operands [0], WalkState); |
if (ACPI_FAILURE (Status)) |
{ |
return (Status); |
} |
/* |
* Get the return value and save as the last result |
* value. This is the only place where WalkState->ReturnDesc |
* is set to anything other than zero! |
*/ |
WalkState->ReturnDesc = WalkState->Operands[0]; |
} |
else if (WalkState->ResultCount) |
{ |
/* Since we have a real Return(), delete any implicit return */ |
AcpiDsClearImplicitReturn (WalkState); |
/* |
* The return value has come from a previous calculation. |
* |
* If value being returned is a Reference (such as |
* an arg or local), resolve it now because it may |
* cease to exist at the end of the method. |
* |
* Allow references created by the Index operator to return unchanged. |
*/ |
if ((ACPI_GET_DESCRIPTOR_TYPE (WalkState->Results->Results.ObjDesc[0]) == ACPI_DESC_TYPE_OPERAND) && |
((WalkState->Results->Results.ObjDesc [0])->Common.Type == ACPI_TYPE_LOCAL_REFERENCE) && |
((WalkState->Results->Results.ObjDesc [0])->Reference.Class != ACPI_REFCLASS_INDEX)) |
{ |
Status = AcpiExResolveToValue (&WalkState->Results->Results.ObjDesc [0], WalkState); |
if (ACPI_FAILURE (Status)) |
{ |
return (Status); |
} |
} |
WalkState->ReturnDesc = WalkState->Results->Results.ObjDesc [0]; |
} |
else |
{ |
/* No return operand */ |
if (WalkState->NumOperands) |
{ |
AcpiUtRemoveReference (WalkState->Operands [0]); |
} |
WalkState->Operands [0] = NULL; |
WalkState->NumOperands = 0; |
WalkState->ReturnDesc = NULL; |
} |
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, |
"Completed RETURN_OP State=%p, RetVal=%p\n", |
WalkState, WalkState->ReturnDesc)); |
/* End the control method execution right now */ |
Status = AE_CTRL_TERMINATE; |
break; |
case AML_NOOP_OP: |
/* Just do nothing! */ |
break; |
case AML_BREAK_POINT_OP: |
/* |
* Set the single-step flag. This will cause the debugger (if present) |
* to break to the console within the AML debugger at the start of the |
* next AML instruction. |
*/ |
ACPI_DEBUGGER_EXEC ( |
AcpiGbl_CmSingleStep = TRUE); |
ACPI_DEBUGGER_EXEC ( |
AcpiOsPrintf ("**break** Executed AML BreakPoint opcode\n")); |
/* Call to the OSL in case OS wants a piece of the action */ |
Status = AcpiOsSignal (ACPI_SIGNAL_BREAKPOINT, |
"Executed AML Breakpoint opcode"); |
break; |
case AML_BREAK_OP: |
case AML_CONTINUE_OP: /* ACPI 2.0 */ |
/* Pop and delete control states until we find a while */ |
while (WalkState->ControlState && |
(WalkState->ControlState->Control.Opcode != AML_WHILE_OP)) |
{ |
ControlState = AcpiUtPopGenericState (&WalkState->ControlState); |
AcpiUtDeleteGenericState (ControlState); |
} |
/* No while found? */ |
if (!WalkState->ControlState) |
{ |
return (AE_AML_NO_WHILE); |
} |
/* Was: WalkState->AmlLastWhile = WalkState->ControlState->Control.AmlPredicateStart; */ |
WalkState->AmlLastWhile = WalkState->ControlState->Control.PackageEnd; |
/* Return status depending on opcode */ |
if (Op->Common.AmlOpcode == AML_BREAK_OP) |
{ |
Status = AE_CTRL_BREAK; |
} |
else |
{ |
Status = AE_CTRL_CONTINUE; |
} |
break; |
default: |
ACPI_ERROR ((AE_INFO, "Unknown control opcode=0x%X Op=%p", |
Op->Common.AmlOpcode, Op)); |
Status = AE_AML_BAD_OPCODE; |
break; |
} |
return (Status); |
} |
/drivers/devman/acpica/dispatcher/dsutils.c |
---|
8,7 → 8,7 |
* |
* 1. Copyright Notice |
* |
* Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. |
* Some or all of this work - Copyright (c) 1999 - 2011, Intel Corp. |
* All rights reserved. |
* |
* 2. License |
/drivers/devman/acpica/dispatcher/dswexec.c |
---|
9,7 → 9,7 |
* |
* 1. Copyright Notice |
* |
* Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. |
* Some or all of this work - Copyright (c) 1999 - 2011, Intel Corp. |
* All rights reserved. |
* |
* 2. License |
400,10 → 400,26 |
* we must enter this object into the namespace. The created |
* object is temporary and will be deleted upon completion of |
* the execution of this method. |
* |
* Note 10/2010: Except for the Scope() op. This opcode does |
* not actually create a new object, it refers to an existing |
* object. However, for Scope(), we want to indeed open a |
* new scope. |
*/ |
if (Op->Common.AmlOpcode != AML_SCOPE_OP) |
{ |
Status = AcpiDsLoad2BeginOp (WalkState, NULL); |
} |
else |
{ |
Status = AcpiDsScopeStackPush (Op->Named.Node, |
Op->Named.Node->Type, WalkState); |
if (ACPI_FAILURE (Status)) |
{ |
return_ACPI_STATUS (Status); |
} |
} |
} |
break; |
/drivers/devman/acpica/dispatcher/dswload.c |
---|
1,6 → 1,6 |
/****************************************************************************** |
* |
* Module Name: dswload - Dispatcher namespace load callbacks |
* Module Name: dswload - Dispatcher first pass namespace load callbacks |
* |
*****************************************************************************/ |
8,7 → 8,7 |
* |
* 1. Copyright Notice |
* |
* Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. |
* Some or all of this work - Copyright (c) 1999 - 2011, Intel Corp. |
* All rights reserved. |
* |
* 2. License |
122,7 → 122,6 |
#include "acdispat.h" |
#include "acinterp.h" |
#include "acnamesp.h" |
#include "acevents.h" |
#ifdef ACPI_ASL_COMPILER |
#include "acdisasm.h" |
539,7 → 538,7 |
else if (Op->Common.AmlOpcode == AML_DATA_REGION_OP) |
{ |
Status = AcpiExCreateRegion (Op->Named.Data, Op->Named.Length, |
REGION_DATA_TABLE, WalkState); |
ACPI_ADR_SPACE_DATA_TABLE, WalkState); |
if (ACPI_FAILURE (Status)) |
{ |
return_ACPI_STATUS (Status); |
622,695 → 621,3 |
return_ACPI_STATUS (Status); |
} |
/******************************************************************************* |
* |
* FUNCTION: AcpiDsLoad2BeginOp |
* |
* PARAMETERS: WalkState - Current state of the parse tree walk |
* OutOp - Wher to return op if a new one is created |
* |
* RETURN: Status |
* |
* DESCRIPTION: Descending callback used during the loading of ACPI tables. |
* |
******************************************************************************/ |
ACPI_STATUS |
AcpiDsLoad2BeginOp ( |
ACPI_WALK_STATE *WalkState, |
ACPI_PARSE_OBJECT **OutOp) |
{ |
ACPI_PARSE_OBJECT *Op; |
ACPI_NAMESPACE_NODE *Node; |
ACPI_STATUS Status; |
ACPI_OBJECT_TYPE ObjectType; |
char *BufferPtr; |
UINT32 Flags; |
ACPI_FUNCTION_TRACE (DsLoad2BeginOp); |
Op = WalkState->Op; |
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op=%p State=%p\n", Op, WalkState)); |
if (Op) |
{ |
if ((WalkState->ControlState) && |
(WalkState->ControlState->Common.State == |
ACPI_CONTROL_CONDITIONAL_EXECUTING)) |
{ |
/* We are executing a while loop outside of a method */ |
Status = AcpiDsExecBeginOp (WalkState, OutOp); |
return_ACPI_STATUS (Status); |
} |
/* We only care about Namespace opcodes here */ |
if ((!(WalkState->OpInfo->Flags & AML_NSOPCODE) && |
(WalkState->Opcode != AML_INT_NAMEPATH_OP)) || |
(!(WalkState->OpInfo->Flags & AML_NAMED))) |
{ |
return_ACPI_STATUS (AE_OK); |
} |
/* Get the name we are going to enter or lookup in the namespace */ |
if (WalkState->Opcode == AML_INT_NAMEPATH_OP) |
{ |
/* For Namepath op, get the path string */ |
BufferPtr = Op->Common.Value.String; |
if (!BufferPtr) |
{ |
/* No name, just exit */ |
return_ACPI_STATUS (AE_OK); |
} |
} |
else |
{ |
/* Get name from the op */ |
BufferPtr = ACPI_CAST_PTR (char, &Op->Named.Name); |
} |
} |
else |
{ |
/* Get the namestring from the raw AML */ |
BufferPtr = AcpiPsGetNextNamestring (&WalkState->ParserState); |
} |
/* Map the opcode into an internal object type */ |
ObjectType = WalkState->OpInfo->ObjectType; |
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, |
"State=%p Op=%p Type=%X\n", WalkState, Op, ObjectType)); |
switch (WalkState->Opcode) |
{ |
case AML_FIELD_OP: |
case AML_BANK_FIELD_OP: |
case AML_INDEX_FIELD_OP: |
Node = NULL; |
Status = AE_OK; |
break; |
case AML_INT_NAMEPATH_OP: |
/* |
* The NamePath is an object reference to an existing object. |
* Don't enter the name into the namespace, but look it up |
* for use later. |
*/ |
Status = AcpiNsLookup (WalkState->ScopeInfo, BufferPtr, ObjectType, |
ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, |
WalkState, &(Node)); |
break; |
case AML_SCOPE_OP: |
/* Special case for Scope(\) -> refers to the Root node */ |
if (Op && (Op->Named.Node == AcpiGbl_RootNode)) |
{ |
Node = Op->Named.Node; |
Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState); |
if (ACPI_FAILURE (Status)) |
{ |
return_ACPI_STATUS (Status); |
} |
} |
else |
{ |
/* |
* The Path is an object reference to an existing object. |
* Don't enter the name into the namespace, but look it up |
* for use later. |
*/ |
Status = AcpiNsLookup (WalkState->ScopeInfo, BufferPtr, ObjectType, |
ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, |
WalkState, &(Node)); |
if (ACPI_FAILURE (Status)) |
{ |
#ifdef ACPI_ASL_COMPILER |
if (Status == AE_NOT_FOUND) |
{ |
Status = AE_OK; |
} |
else |
{ |
ACPI_ERROR_NAMESPACE (BufferPtr, Status); |
} |
#else |
ACPI_ERROR_NAMESPACE (BufferPtr, Status); |
#endif |
return_ACPI_STATUS (Status); |
} |
} |
/* |
* We must check to make sure that the target is |
* one of the opcodes that actually opens a scope |
*/ |
switch (Node->Type) |
{ |
case ACPI_TYPE_ANY: |
case ACPI_TYPE_LOCAL_SCOPE: /* Scope */ |
case ACPI_TYPE_DEVICE: |
case ACPI_TYPE_POWER: |
case ACPI_TYPE_PROCESSOR: |
case ACPI_TYPE_THERMAL: |
/* These are acceptable types */ |
break; |
case ACPI_TYPE_INTEGER: |
case ACPI_TYPE_STRING: |
case ACPI_TYPE_BUFFER: |
/* |
* These types we will allow, but we will change the type. |
* This enables some existing code of the form: |
* |
* Name (DEB, 0) |
* Scope (DEB) { ... } |
*/ |
ACPI_WARNING ((AE_INFO, |
"Type override - [%4.4s] had invalid type (%s) " |
"for Scope operator, changed to type ANY\n", |
AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Node->Type))); |
Node->Type = ACPI_TYPE_ANY; |
WalkState->ScopeInfo->Common.Value = ACPI_TYPE_ANY; |
break; |
default: |
/* All other types are an error */ |
ACPI_ERROR ((AE_INFO, |
"Invalid type (%s) for target of " |
"Scope operator [%4.4s] (Cannot override)", |
AcpiUtGetTypeName (Node->Type), AcpiUtGetNodeName (Node))); |
return (AE_AML_OPERAND_TYPE); |
} |
break; |
default: |
/* All other opcodes */ |
if (Op && Op->Common.Node) |
{ |
/* This op/node was previously entered into the namespace */ |
Node = Op->Common.Node; |
if (AcpiNsOpensScope (ObjectType)) |
{ |
Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState); |
if (ACPI_FAILURE (Status)) |
{ |
return_ACPI_STATUS (Status); |
} |
} |
return_ACPI_STATUS (AE_OK); |
} |
/* |
* Enter the named type into the internal namespace. We enter the name |
* as we go downward in the parse tree. Any necessary subobjects that |
* involve arguments to the opcode must be created as we go back up the |
* parse tree later. |
* |
* Note: Name may already exist if we are executing a deferred opcode. |
*/ |
if (WalkState->DeferredNode) |
{ |
/* This name is already in the namespace, get the node */ |
Node = WalkState->DeferredNode; |
Status = AE_OK; |
break; |
} |
Flags = ACPI_NS_NO_UPSEARCH; |
if (WalkState->PassNumber == ACPI_IMODE_EXECUTE) |
{ |
/* Execution mode, node cannot already exist, node is temporary */ |
Flags |= ACPI_NS_ERROR_IF_FOUND; |
if (!(WalkState->ParseFlags & ACPI_PARSE_MODULE_LEVEL)) |
{ |
Flags |= ACPI_NS_TEMPORARY; |
} |
} |
/* Add new entry or lookup existing entry */ |
Status = AcpiNsLookup (WalkState->ScopeInfo, BufferPtr, ObjectType, |
ACPI_IMODE_LOAD_PASS2, Flags, WalkState, &Node); |
if (ACPI_SUCCESS (Status) && (Flags & ACPI_NS_TEMPORARY)) |
{ |
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, |
"***New Node [%4.4s] %p is temporary\n", |
AcpiUtGetNodeName (Node), Node)); |
} |
break; |
} |
if (ACPI_FAILURE (Status)) |
{ |
ACPI_ERROR_NAMESPACE (BufferPtr, Status); |
return_ACPI_STATUS (Status); |
} |
if (!Op) |
{ |
/* Create a new op */ |
Op = AcpiPsAllocOp (WalkState->Opcode); |
if (!Op) |
{ |
return_ACPI_STATUS (AE_NO_MEMORY); |
} |
/* Initialize the new op */ |
if (Node) |
{ |
Op->Named.Name = Node->Name.Integer; |
} |
*OutOp = Op; |
} |
/* |
* Put the Node in the "op" object that the parser uses, so we |
* can get it again quickly when this scope is closed |
*/ |
Op->Common.Node = Node; |
return_ACPI_STATUS (Status); |
} |
/******************************************************************************* |
* |
* FUNCTION: AcpiDsLoad2EndOp |
* |
* PARAMETERS: WalkState - Current state of the parse tree walk |
* |
* RETURN: Status |
* |
* DESCRIPTION: Ascending callback used during the loading of the namespace, |
* both control methods and everything else. |
* |
******************************************************************************/ |
ACPI_STATUS |
AcpiDsLoad2EndOp ( |
ACPI_WALK_STATE *WalkState) |
{ |
ACPI_PARSE_OBJECT *Op; |
ACPI_STATUS Status = AE_OK; |
ACPI_OBJECT_TYPE ObjectType; |
ACPI_NAMESPACE_NODE *Node; |
ACPI_PARSE_OBJECT *Arg; |
ACPI_NAMESPACE_NODE *NewNode; |
#ifndef ACPI_NO_METHOD_EXECUTION |
UINT32 i; |
UINT8 RegionSpace; |
#endif |
ACPI_FUNCTION_TRACE (DsLoad2EndOp); |
Op = WalkState->Op; |
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Opcode [%s] Op %p State %p\n", |
WalkState->OpInfo->Name, Op, WalkState)); |
/* Check if opcode had an associated namespace object */ |
if (!(WalkState->OpInfo->Flags & AML_NSOBJECT)) |
{ |
return_ACPI_STATUS (AE_OK); |
} |
if (Op->Common.AmlOpcode == AML_SCOPE_OP) |
{ |
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, |
"Ending scope Op=%p State=%p\n", Op, WalkState)); |
} |
ObjectType = WalkState->OpInfo->ObjectType; |
/* |
* Get the Node/name from the earlier lookup |
* (It was saved in the *op structure) |
*/ |
Node = Op->Common.Node; |
/* |
* Put the Node on the object stack (Contains the ACPI Name of |
* this object) |
*/ |
WalkState->Operands[0] = (void *) Node; |
WalkState->NumOperands = 1; |
/* Pop the scope stack */ |
if (AcpiNsOpensScope (ObjectType) && |
(Op->Common.AmlOpcode != AML_INT_METHODCALL_OP)) |
{ |
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "(%s) Popping scope for Op %p\n", |
AcpiUtGetTypeName (ObjectType), Op)); |
Status = AcpiDsScopeStackPop (WalkState); |
if (ACPI_FAILURE (Status)) |
{ |
goto Cleanup; |
} |
} |
/* |
* Named operations are as follows: |
* |
* AML_ALIAS |
* AML_BANKFIELD |
* AML_CREATEBITFIELD |
* AML_CREATEBYTEFIELD |
* AML_CREATEDWORDFIELD |
* AML_CREATEFIELD |
* AML_CREATEQWORDFIELD |
* AML_CREATEWORDFIELD |
* AML_DATA_REGION |
* AML_DEVICE |
* AML_EVENT |
* AML_FIELD |
* AML_INDEXFIELD |
* AML_METHOD |
* AML_METHODCALL |
* AML_MUTEX |
* AML_NAME |
* AML_NAMEDFIELD |
* AML_OPREGION |
* AML_POWERRES |
* AML_PROCESSOR |
* AML_SCOPE |
* AML_THERMALZONE |
*/ |
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, |
"Create-Load [%s] State=%p Op=%p NamedObj=%p\n", |
AcpiPsGetOpcodeName (Op->Common.AmlOpcode), WalkState, Op, Node)); |
/* Decode the opcode */ |
Arg = Op->Common.Value.Arg; |
switch (WalkState->OpInfo->Type) |
{ |
#ifndef ACPI_NO_METHOD_EXECUTION |
case AML_TYPE_CREATE_FIELD: |
/* |
* Create the field object, but the field buffer and index must |
* be evaluated later during the execution phase |
*/ |
Status = AcpiDsCreateBufferField (Op, WalkState); |
break; |
case AML_TYPE_NAMED_FIELD: |
/* |
* If we are executing a method, initialize the field |
*/ |
if (WalkState->MethodNode) |
{ |
Status = AcpiDsInitFieldObjects (Op, WalkState); |
} |
switch (Op->Common.AmlOpcode) |
{ |
case AML_INDEX_FIELD_OP: |
Status = AcpiDsCreateIndexField (Op, (ACPI_HANDLE) Arg->Common.Node, |
WalkState); |
break; |
case AML_BANK_FIELD_OP: |
Status = AcpiDsCreateBankField (Op, Arg->Common.Node, WalkState); |
break; |
case AML_FIELD_OP: |
Status = AcpiDsCreateField (Op, Arg->Common.Node, WalkState); |
break; |
default: |
/* All NAMED_FIELD opcodes must be handled above */ |
break; |
} |
break; |
case AML_TYPE_NAMED_SIMPLE: |
Status = AcpiDsCreateOperands (WalkState, Arg); |
if (ACPI_FAILURE (Status)) |
{ |
goto Cleanup; |
} |
switch (Op->Common.AmlOpcode) |
{ |
case AML_PROCESSOR_OP: |
Status = AcpiExCreateProcessor (WalkState); |
break; |
case AML_POWER_RES_OP: |
Status = AcpiExCreatePowerResource (WalkState); |
break; |
case AML_MUTEX_OP: |
Status = AcpiExCreateMutex (WalkState); |
break; |
case AML_EVENT_OP: |
Status = AcpiExCreateEvent (WalkState); |
break; |
case AML_ALIAS_OP: |
Status = AcpiExCreateAlias (WalkState); |
break; |
default: |
/* Unknown opcode */ |
Status = AE_OK; |
goto Cleanup; |
} |
/* Delete operands */ |
for (i = 1; i < WalkState->NumOperands; i++) |
{ |
AcpiUtRemoveReference (WalkState->Operands[i]); |
WalkState->Operands[i] = NULL; |
} |
break; |
#endif /* ACPI_NO_METHOD_EXECUTION */ |
case AML_TYPE_NAMED_COMPLEX: |
switch (Op->Common.AmlOpcode) |
{ |
#ifndef ACPI_NO_METHOD_EXECUTION |
case AML_REGION_OP: |
case AML_DATA_REGION_OP: |
if (Op->Common.AmlOpcode == AML_REGION_OP) |
{ |
RegionSpace = (ACPI_ADR_SPACE_TYPE) |
((Op->Common.Value.Arg)->Common.Value.Integer); |
} |
else |
{ |
RegionSpace = REGION_DATA_TABLE; |
} |
/* |
* The OpRegion is not fully parsed at this time. The only valid |
* argument is the SpaceId. (We must save the address of the |
* AML of the address and length operands) |
* |
* If we have a valid region, initialize it. The namespace is |
* unlocked at this point. |
* |
* Need to unlock interpreter if it is locked (if we are running |
* a control method), in order to allow _REG methods to be run |
* during AcpiEvInitializeRegion. |
*/ |
if (WalkState->MethodNode) |
{ |
/* |
* Executing a method: initialize the region and unlock |
* the interpreter |
*/ |
Status = AcpiExCreateRegion (Op->Named.Data, Op->Named.Length, |
RegionSpace, WalkState); |
if (ACPI_FAILURE (Status)) |
{ |
return (Status); |
} |
AcpiExExitInterpreter (); |
} |
Status = AcpiEvInitializeRegion (AcpiNsGetAttachedObject (Node), |
FALSE); |
if (WalkState->MethodNode) |
{ |
AcpiExEnterInterpreter (); |
} |
if (ACPI_FAILURE (Status)) |
{ |
/* |
* If AE_NOT_EXIST is returned, it is not fatal |
* because many regions get created before a handler |
* is installed for said region. |
*/ |
if (AE_NOT_EXIST == Status) |
{ |
Status = AE_OK; |
} |
} |
break; |
case AML_NAME_OP: |
Status = AcpiDsCreateNode (WalkState, Node, Op); |
break; |
case AML_METHOD_OP: |
/* |
* MethodOp PkgLength NameString MethodFlags TermList |
* |
* Note: We must create the method node/object pair as soon as we |
* see the method declaration. This allows later pass1 parsing |
* of invocations of the method (need to know the number of |
* arguments.) |
*/ |
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, |
"LOADING-Method: State=%p Op=%p NamedObj=%p\n", |
WalkState, Op, Op->Named.Node)); |
if (!AcpiNsGetAttachedObject (Op->Named.Node)) |
{ |
WalkState->Operands[0] = ACPI_CAST_PTR (void, Op->Named.Node); |
WalkState->NumOperands = 1; |
Status = AcpiDsCreateOperands (WalkState, Op->Common.Value.Arg); |
if (ACPI_SUCCESS (Status)) |
{ |
Status = AcpiExCreateMethod (Op->Named.Data, |
Op->Named.Length, WalkState); |
} |
WalkState->Operands[0] = NULL; |
WalkState->NumOperands = 0; |
if (ACPI_FAILURE (Status)) |
{ |
return_ACPI_STATUS (Status); |
} |
} |
break; |
#endif /* ACPI_NO_METHOD_EXECUTION */ |
default: |
/* All NAMED_COMPLEX opcodes must be handled above */ |
break; |
} |
break; |
case AML_CLASS_INTERNAL: |
/* case AML_INT_NAMEPATH_OP: */ |
break; |
case AML_CLASS_METHOD_CALL: |
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, |
"RESOLVING-MethodCall: State=%p Op=%p NamedObj=%p\n", |
WalkState, Op, Node)); |
/* |
* Lookup the method name and save the Node |
*/ |
Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.String, |
ACPI_TYPE_ANY, ACPI_IMODE_LOAD_PASS2, |
ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, |
WalkState, &(NewNode)); |
if (ACPI_SUCCESS (Status)) |
{ |
/* |
* Make sure that what we found is indeed a method |
* We didn't search for a method on purpose, to see if the name |
* would resolve |
*/ |
if (NewNode->Type != ACPI_TYPE_METHOD) |
{ |
Status = AE_AML_OPERAND_TYPE; |
} |
/* We could put the returned object (Node) on the object stack for |
* later, but for now, we will put it in the "op" object that the |
* parser uses, so we can get it again at the end of this scope |
*/ |
Op->Common.Node = NewNode; |
} |
else |
{ |
ACPI_ERROR_NAMESPACE (Arg->Common.Value.String, Status); |
} |
break; |
default: |
break; |
} |
Cleanup: |
/* Remove the Node pushed at the very beginning */ |
WalkState->Operands[0] = NULL; |
WalkState->NumOperands = 0; |
return_ACPI_STATUS (Status); |
} |
/drivers/devman/acpica/dispatcher/dswload2.c |
---|
0,0 → 1,819 |
/****************************************************************************** |
* |
* Module Name: dswload2 - Dispatcher second pass namespace load callbacks |
* |
*****************************************************************************/ |
/****************************************************************************** |
* |
* 1. Copyright Notice |
* |
* Some or all of this work - Copyright (c) 1999 - 2011, Intel Corp. |
* All rights reserved. |
* |
* 2. License |
* |
* 2.1. This is your license from Intel Corp. under its intellectual property |
* rights. You may have additional license terms from the party that provided |
* you this software, covering your right to use that party's intellectual |
* property rights. |
* |
* 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a |
* copy of the source code appearing in this file ("Covered Code") an |
* irrevocable, perpetual, worldwide license under Intel's copyrights in the |
* base code distributed originally by Intel ("Original Intel Code") to copy, |
* make derivatives, distribute, use and display any portion of the Covered |
* Code in any form, with the right to sublicense such rights; and |
* |
* 2.3. Intel grants Licensee a non-exclusive and non-transferable patent |
* license (with the right to sublicense), under only those claims of Intel |
* patents that are infringed by the Original Intel Code, to make, use, sell, |
* offer to sell, and import the Covered Code and derivative works thereof |
* solely to the minimum extent necessary to exercise the above copyright |
* license, and in no event shall the patent license extend to any additions |
* to or modifications of the Original Intel Code. No other license or right |
* is granted directly or by implication, estoppel or otherwise; |
* |
* The above copyright and patent license is granted only if the following |
* conditions are met: |
* |
* 3. Conditions |
* |
* 3.1. Redistribution of Source with Rights to Further Distribute Source. |
* Redistribution of source code of any substantial portion of the Covered |
* Code or modification with rights to further distribute source must include |
* the above Copyright Notice, the above License, this list of Conditions, |
* and the following Disclaimer and Export Compliance provision. In addition, |
* Licensee must cause all Covered Code to which Licensee contributes to |
* contain a file documenting the changes Licensee made to create that Covered |
* Code and the date of any change. Licensee must include in that file the |
* documentation of any changes made by any predecessor Licensee. Licensee |
* must include a prominent statement that the modification is derived, |
* directly or indirectly, from Original Intel Code. |
* |
* 3.2. Redistribution of Source with no Rights to Further Distribute Source. |
* Redistribution of source code of any substantial portion of the Covered |
* Code or modification without rights to further distribute source must |
* include the following Disclaimer and Export Compliance provision in the |
* documentation and/or other materials provided with distribution. In |
* addition, Licensee may not authorize further sublicense of source of any |
* portion of the Covered Code, and must include terms to the effect that the |
* license from Licensee to its licensee is limited to the intellectual |
* property embodied in the software Licensee provides to its licensee, and |
* not to intellectual property embodied in modifications its licensee may |
* make. |
* |
* 3.3. Redistribution of Executable. Redistribution in executable form of any |
* substantial portion of the Covered Code or modification must reproduce the |
* above Copyright Notice, and the following Disclaimer and Export Compliance |
* provision in the documentation and/or other materials provided with the |
* distribution. |
* |
* 3.4. Intel retains all right, title, and interest in and to the Original |
* Intel Code. |
* |
* 3.5. Neither the name Intel nor any other trademark owned or controlled by |
* Intel shall be used in advertising or otherwise to promote the sale, use or |
* other dealings in products derived from or relating to the Covered Code |
* without prior written authorization from Intel. |
* |
* 4. Disclaimer and Export Compliance |
* |
* 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED |
* HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE |
* IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, |
* INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY |
* UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY |
* IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A |
* PARTICULAR PURPOSE. |
* |
* 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES |
* OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR |
* COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, |
* SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY |
* CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL |
* HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS |
* SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY |
* LIMITED REMEDY. |
* |
* 4.3. Licensee shall not export, either directly or indirectly, any of this |
* software or system incorporating such software without first obtaining any |
* required license or other approval from the U. S. Department of Commerce or |
* any other agency or department of the United States Government. In the |
* event Licensee exports any such software from the United States or |
* re-exports any such software from a foreign destination, Licensee shall |
* ensure that the distribution and export/re-export of the software is in |
* compliance with all laws, regulations, orders, or other restrictions of the |
* U.S. Export Administration Regulations. Licensee agrees that neither it nor |
* any of its subsidiaries will export/re-export any technical data, process, |
* software, or service, directly or indirectly, to any country for which the |
* United States government or any agency thereof requires an export license, |
* other governmental approval, or letter of assurance, without first obtaining |
* such license, approval or letter. |
* |
*****************************************************************************/ |
#define __DSWLOAD2_C__ |
#include "acpi.h" |
#include "accommon.h" |
#include "acparser.h" |
#include "amlcode.h" |
#include "acdispat.h" |
#include "acinterp.h" |
#include "acnamesp.h" |
#include "acevents.h" |
#define _COMPONENT ACPI_DISPATCHER |
ACPI_MODULE_NAME ("dswload2") |
/******************************************************************************* |
* |
* FUNCTION: AcpiDsLoad2BeginOp |
* |
* PARAMETERS: WalkState - Current state of the parse tree walk |
* OutOp - Wher to return op if a new one is created |
* |
* RETURN: Status |
* |
* DESCRIPTION: Descending callback used during the loading of ACPI tables. |
* |
******************************************************************************/ |
ACPI_STATUS |
AcpiDsLoad2BeginOp ( |
ACPI_WALK_STATE *WalkState, |
ACPI_PARSE_OBJECT **OutOp) |
{ |
ACPI_PARSE_OBJECT *Op; |
ACPI_NAMESPACE_NODE *Node; |
ACPI_STATUS Status; |
ACPI_OBJECT_TYPE ObjectType; |
char *BufferPtr; |
UINT32 Flags; |
ACPI_FUNCTION_TRACE (DsLoad2BeginOp); |
Op = WalkState->Op; |
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op=%p State=%p\n", Op, WalkState)); |
if (Op) |
{ |
if ((WalkState->ControlState) && |
(WalkState->ControlState->Common.State == |
ACPI_CONTROL_CONDITIONAL_EXECUTING)) |
{ |
/* We are executing a while loop outside of a method */ |
Status = AcpiDsExecBeginOp (WalkState, OutOp); |
return_ACPI_STATUS (Status); |
} |
/* We only care about Namespace opcodes here */ |
if ((!(WalkState->OpInfo->Flags & AML_NSOPCODE) && |
(WalkState->Opcode != AML_INT_NAMEPATH_OP)) || |
(!(WalkState->OpInfo->Flags & AML_NAMED))) |
{ |
return_ACPI_STATUS (AE_OK); |
} |
/* Get the name we are going to enter or lookup in the namespace */ |
if (WalkState->Opcode == AML_INT_NAMEPATH_OP) |
{ |
/* For Namepath op, get the path string */ |
BufferPtr = Op->Common.Value.String; |
if (!BufferPtr) |
{ |
/* No name, just exit */ |
return_ACPI_STATUS (AE_OK); |
} |
} |
else |
{ |
/* Get name from the op */ |
BufferPtr = ACPI_CAST_PTR (char, &Op->Named.Name); |
} |
} |
else |
{ |
/* Get the namestring from the raw AML */ |
BufferPtr = AcpiPsGetNextNamestring (&WalkState->ParserState); |
} |
/* Map the opcode into an internal object type */ |
ObjectType = WalkState->OpInfo->ObjectType; |
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, |
"State=%p Op=%p Type=%X\n", WalkState, Op, ObjectType)); |
switch (WalkState->Opcode) |
{ |
case AML_FIELD_OP: |
case AML_BANK_FIELD_OP: |
case AML_INDEX_FIELD_OP: |
Node = NULL; |
Status = AE_OK; |
break; |
case AML_INT_NAMEPATH_OP: |
/* |
* The NamePath is an object reference to an existing object. |
* Don't enter the name into the namespace, but look it up |
* for use later. |
*/ |
Status = AcpiNsLookup (WalkState->ScopeInfo, BufferPtr, ObjectType, |
ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, |
WalkState, &(Node)); |
break; |
case AML_SCOPE_OP: |
/* Special case for Scope(\) -> refers to the Root node */ |
if (Op && (Op->Named.Node == AcpiGbl_RootNode)) |
{ |
Node = Op->Named.Node; |
Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState); |
if (ACPI_FAILURE (Status)) |
{ |
return_ACPI_STATUS (Status); |
} |
} |
else |
{ |
/* |
* The Path is an object reference to an existing object. |
* Don't enter the name into the namespace, but look it up |
* for use later. |
*/ |
Status = AcpiNsLookup (WalkState->ScopeInfo, BufferPtr, ObjectType, |
ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, |
WalkState, &(Node)); |
if (ACPI_FAILURE (Status)) |
{ |
#ifdef ACPI_ASL_COMPILER |
if (Status == AE_NOT_FOUND) |
{ |
Status = AE_OK; |
} |
else |
{ |
ACPI_ERROR_NAMESPACE (BufferPtr, Status); |
} |
#else |
ACPI_ERROR_NAMESPACE (BufferPtr, Status); |
#endif |
return_ACPI_STATUS (Status); |
} |
} |
/* |
* We must check to make sure that the target is |
* one of the opcodes that actually opens a scope |
*/ |
switch (Node->Type) |
{ |
case ACPI_TYPE_ANY: |
case ACPI_TYPE_LOCAL_SCOPE: /* Scope */ |
case ACPI_TYPE_DEVICE: |
case ACPI_TYPE_POWER: |
case ACPI_TYPE_PROCESSOR: |
case ACPI_TYPE_THERMAL: |
/* These are acceptable types */ |
break; |
case ACPI_TYPE_INTEGER: |
case ACPI_TYPE_STRING: |
case ACPI_TYPE_BUFFER: |
/* |
* These types we will allow, but we will change the type. |
* This enables some existing code of the form: |
* |
* Name (DEB, 0) |
* Scope (DEB) { ... } |
*/ |
ACPI_WARNING ((AE_INFO, |
"Type override - [%4.4s] had invalid type (%s) " |
"for Scope operator, changed to type ANY\n", |
AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Node->Type))); |
Node->Type = ACPI_TYPE_ANY; |
WalkState->ScopeInfo->Common.Value = ACPI_TYPE_ANY; |
break; |
default: |
/* All other types are an error */ |
ACPI_ERROR ((AE_INFO, |
"Invalid type (%s) for target of " |
"Scope operator [%4.4s] (Cannot override)", |
AcpiUtGetTypeName (Node->Type), AcpiUtGetNodeName (Node))); |
return (AE_AML_OPERAND_TYPE); |
} |
break; |
default: |
/* All other opcodes */ |
if (Op && Op->Common.Node) |
{ |
/* This op/node was previously entered into the namespace */ |
Node = Op->Common.Node; |
if (AcpiNsOpensScope (ObjectType)) |
{ |
Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState); |
if (ACPI_FAILURE (Status)) |
{ |
return_ACPI_STATUS (Status); |
} |
} |
return_ACPI_STATUS (AE_OK); |
} |
/* |
* Enter the named type into the internal namespace. We enter the name |
* as we go downward in the parse tree. Any necessary subobjects that |
* involve arguments to the opcode must be created as we go back up the |
* parse tree later. |
* |
* Note: Name may already exist if we are executing a deferred opcode. |
*/ |
if (WalkState->DeferredNode) |
{ |
/* This name is already in the namespace, get the node */ |
Node = WalkState->DeferredNode; |
Status = AE_OK; |
break; |
} |
Flags = ACPI_NS_NO_UPSEARCH; |
if (WalkState->PassNumber == ACPI_IMODE_EXECUTE) |
{ |
/* Execution mode, node cannot already exist, node is temporary */ |
Flags |= ACPI_NS_ERROR_IF_FOUND; |
if (!(WalkState->ParseFlags & ACPI_PARSE_MODULE_LEVEL)) |
{ |
Flags |= ACPI_NS_TEMPORARY; |
} |
} |
/* Add new entry or lookup existing entry */ |
Status = AcpiNsLookup (WalkState->ScopeInfo, BufferPtr, ObjectType, |
ACPI_IMODE_LOAD_PASS2, Flags, WalkState, &Node); |
if (ACPI_SUCCESS (Status) && (Flags & ACPI_NS_TEMPORARY)) |
{ |
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, |
"***New Node [%4.4s] %p is temporary\n", |
AcpiUtGetNodeName (Node), Node)); |
} |
break; |
} |
if (ACPI_FAILURE (Status)) |
{ |
ACPI_ERROR_NAMESPACE (BufferPtr, Status); |
return_ACPI_STATUS (Status); |
} |
if (!Op) |
{ |
/* Create a new op */ |
Op = AcpiPsAllocOp (WalkState->Opcode); |
if (!Op) |
{ |
return_ACPI_STATUS (AE_NO_MEMORY); |
} |
/* Initialize the new op */ |
if (Node) |
{ |
Op->Named.Name = Node->Name.Integer; |
} |
*OutOp = Op; |
} |
/* |
* Put the Node in the "op" object that the parser uses, so we |
* can get it again quickly when this scope is closed |
*/ |
Op->Common.Node = Node; |
return_ACPI_STATUS (Status); |
} |
/******************************************************************************* |
* |
* FUNCTION: AcpiDsLoad2EndOp |
* |
* PARAMETERS: WalkState - Current state of the parse tree walk |
* |
* RETURN: Status |
* |
* DESCRIPTION: Ascending callback used during the loading of the namespace, |
* both control methods and everything else. |
* |
******************************************************************************/ |
ACPI_STATUS |
AcpiDsLoad2EndOp ( |
ACPI_WALK_STATE *WalkState) |
{ |
ACPI_PARSE_OBJECT *Op; |
ACPI_STATUS Status = AE_OK; |
ACPI_OBJECT_TYPE ObjectType; |
ACPI_NAMESPACE_NODE *Node; |
ACPI_PARSE_OBJECT *Arg; |
ACPI_NAMESPACE_NODE *NewNode; |
#ifndef ACPI_NO_METHOD_EXECUTION |
UINT32 i; |
UINT8 RegionSpace; |
#endif |
ACPI_FUNCTION_TRACE (DsLoad2EndOp); |
Op = WalkState->Op; |
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Opcode [%s] Op %p State %p\n", |
WalkState->OpInfo->Name, Op, WalkState)); |
/* Check if opcode had an associated namespace object */ |
if (!(WalkState->OpInfo->Flags & AML_NSOBJECT)) |
{ |
return_ACPI_STATUS (AE_OK); |
} |
if (Op->Common.AmlOpcode == AML_SCOPE_OP) |
{ |
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, |
"Ending scope Op=%p State=%p\n", Op, WalkState)); |
} |
ObjectType = WalkState->OpInfo->ObjectType; |
/* |
* Get the Node/name from the earlier lookup |
* (It was saved in the *op structure) |
*/ |
Node = Op->Common.Node; |
/* |
* Put the Node on the object stack (Contains the ACPI Name of |
* this object) |
*/ |
WalkState->Operands[0] = (void *) Node; |
WalkState->NumOperands = 1; |
/* Pop the scope stack */ |
if (AcpiNsOpensScope (ObjectType) && |
(Op->Common.AmlOpcode != AML_INT_METHODCALL_OP)) |
{ |
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "(%s) Popping scope for Op %p\n", |
AcpiUtGetTypeName (ObjectType), Op)); |
Status = AcpiDsScopeStackPop (WalkState); |
if (ACPI_FAILURE (Status)) |
{ |
goto Cleanup; |
} |
} |
/* |
* Named operations are as follows: |
* |
* AML_ALIAS |
* AML_BANKFIELD |
* AML_CREATEBITFIELD |
* AML_CREATEBYTEFIELD |
* AML_CREATEDWORDFIELD |
* AML_CREATEFIELD |
* AML_CREATEQWORDFIELD |
* AML_CREATEWORDFIELD |
* AML_DATA_REGION |
* AML_DEVICE |
* AML_EVENT |
* AML_FIELD |
* AML_INDEXFIELD |
* AML_METHOD |
* AML_METHODCALL |
* AML_MUTEX |
* AML_NAME |
* AML_NAMEDFIELD |
* AML_OPREGION |
* AML_POWERRES |
* AML_PROCESSOR |
* AML_SCOPE |
* AML_THERMALZONE |
*/ |
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, |
"Create-Load [%s] State=%p Op=%p NamedObj=%p\n", |
AcpiPsGetOpcodeName (Op->Common.AmlOpcode), WalkState, Op, Node)); |
/* Decode the opcode */ |
Arg = Op->Common.Value.Arg; |
switch (WalkState->OpInfo->Type) |
{ |
#ifndef ACPI_NO_METHOD_EXECUTION |
case AML_TYPE_CREATE_FIELD: |
/* |
* Create the field object, but the field buffer and index must |
* be evaluated later during the execution phase |
*/ |
Status = AcpiDsCreateBufferField (Op, WalkState); |
break; |
case AML_TYPE_NAMED_FIELD: |
/* |
* If we are executing a method, initialize the field |
*/ |
if (WalkState->MethodNode) |
{ |
Status = AcpiDsInitFieldObjects (Op, WalkState); |
} |
switch (Op->Common.AmlOpcode) |
{ |
case AML_INDEX_FIELD_OP: |
Status = AcpiDsCreateIndexField (Op, (ACPI_HANDLE) Arg->Common.Node, |
WalkState); |
break; |
case AML_BANK_FIELD_OP: |
Status = AcpiDsCreateBankField (Op, Arg->Common.Node, WalkState); |
break; |
case AML_FIELD_OP: |
Status = AcpiDsCreateField (Op, Arg->Common.Node, WalkState); |
break; |
default: |
/* All NAMED_FIELD opcodes must be handled above */ |
break; |
} |
break; |
case AML_TYPE_NAMED_SIMPLE: |
Status = AcpiDsCreateOperands (WalkState, Arg); |
if (ACPI_FAILURE (Status)) |
{ |
goto Cleanup; |
} |
switch (Op->Common.AmlOpcode) |
{ |
case AML_PROCESSOR_OP: |
Status = AcpiExCreateProcessor (WalkState); |
break; |
case AML_POWER_RES_OP: |
Status = AcpiExCreatePowerResource (WalkState); |
break; |
case AML_MUTEX_OP: |
Status = AcpiExCreateMutex (WalkState); |
break; |
case AML_EVENT_OP: |
Status = AcpiExCreateEvent (WalkState); |
break; |
case AML_ALIAS_OP: |
Status = AcpiExCreateAlias (WalkState); |
break; |
default: |
/* Unknown opcode */ |
Status = AE_OK; |
goto Cleanup; |
} |
/* Delete operands */ |
for (i = 1; i < WalkState->NumOperands; i++) |
{ |
AcpiUtRemoveReference (WalkState->Operands[i]); |
WalkState->Operands[i] = NULL; |
} |
break; |
#endif /* ACPI_NO_METHOD_EXECUTION */ |
case AML_TYPE_NAMED_COMPLEX: |
switch (Op->Common.AmlOpcode) |
{ |
#ifndef ACPI_NO_METHOD_EXECUTION |
case AML_REGION_OP: |
case AML_DATA_REGION_OP: |
if (Op->Common.AmlOpcode == AML_REGION_OP) |
{ |
RegionSpace = (ACPI_ADR_SPACE_TYPE) |
((Op->Common.Value.Arg)->Common.Value.Integer); |
} |
else |
{ |
RegionSpace = ACPI_ADR_SPACE_DATA_TABLE; |
} |
/* |
* The OpRegion is not fully parsed at this time. The only valid |
* argument is the SpaceId. (We must save the address of the |
* AML of the address and length operands) |
* |
* If we have a valid region, initialize it. The namespace is |
* unlocked at this point. |
* |
* Need to unlock interpreter if it is locked (if we are running |
* a control method), in order to allow _REG methods to be run |
* during AcpiEvInitializeRegion. |
*/ |
if (WalkState->MethodNode) |
{ |
/* |
* Executing a method: initialize the region and unlock |
* the interpreter |
*/ |
Status = AcpiExCreateRegion (Op->Named.Data, Op->Named.Length, |
RegionSpace, WalkState); |
if (ACPI_FAILURE (Status)) |
{ |
return (Status); |
} |
AcpiExExitInterpreter (); |
} |
Status = AcpiEvInitializeRegion (AcpiNsGetAttachedObject (Node), |
FALSE); |
if (WalkState->MethodNode) |
{ |
AcpiExEnterInterpreter (); |
} |
if (ACPI_FAILURE (Status)) |
{ |
/* |
* If AE_NOT_EXIST is returned, it is not fatal |
* because many regions get created before a handler |
* is installed for said region. |
*/ |
if (AE_NOT_EXIST == Status) |
{ |
Status = AE_OK; |
} |
} |
break; |
case AML_NAME_OP: |
Status = AcpiDsCreateNode (WalkState, Node, Op); |
break; |
case AML_METHOD_OP: |
/* |
* MethodOp PkgLength NameString MethodFlags TermList |
* |
* Note: We must create the method node/object pair as soon as we |
* see the method declaration. This allows later pass1 parsing |
* of invocations of the method (need to know the number of |
* arguments.) |
*/ |
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, |
"LOADING-Method: State=%p Op=%p NamedObj=%p\n", |
WalkState, Op, Op->Named.Node)); |
if (!AcpiNsGetAttachedObject (Op->Named.Node)) |
{ |
WalkState->Operands[0] = ACPI_CAST_PTR (void, Op->Named.Node); |
WalkState->NumOperands = 1; |
Status = AcpiDsCreateOperands (WalkState, Op->Common.Value.Arg); |
if (ACPI_SUCCESS (Status)) |
{ |
Status = AcpiExCreateMethod (Op->Named.Data, |
Op->Named.Length, WalkState); |
} |
WalkState->Operands[0] = NULL; |
WalkState->NumOperands = 0; |
if (ACPI_FAILURE (Status)) |
{ |
return_ACPI_STATUS (Status); |
} |
} |
break; |
#endif /* ACPI_NO_METHOD_EXECUTION */ |
default: |
/* All NAMED_COMPLEX opcodes must be handled above */ |
break; |
} |
break; |
case AML_CLASS_INTERNAL: |
/* case AML_INT_NAMEPATH_OP: */ |
break; |
case AML_CLASS_METHOD_CALL: |
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, |
"RESOLVING-MethodCall: State=%p Op=%p NamedObj=%p\n", |
WalkState, Op, Node)); |
/* |
* Lookup the method name and save the Node |
*/ |
Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.String, |
ACPI_TYPE_ANY, ACPI_IMODE_LOAD_PASS2, |
ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, |
WalkState, &(NewNode)); |
if (ACPI_SUCCESS (Status)) |
{ |
/* |
* Make sure that what we found is indeed a method |
* We didn't search for a method on purpose, to see if the name |
* would resolve |
*/ |
if (NewNode->Type != ACPI_TYPE_METHOD) |
{ |
Status = AE_AML_OPERAND_TYPE; |
} |
/* We could put the returned object (Node) on the object stack for |
* later, but for now, we will put it in the "op" object that the |
* parser uses, so we can get it again at the end of this scope |
*/ |
Op->Common.Node = NewNode; |
} |
else |
{ |
ACPI_ERROR_NAMESPACE (Arg->Common.Value.String, Status); |
} |
break; |
default: |
break; |
} |
Cleanup: |
/* Remove the Node pushed at the very beginning */ |
WalkState->Operands[0] = NULL; |
WalkState->NumOperands = 0; |
return_ACPI_STATUS (Status); |
} |
/drivers/devman/acpica/dispatcher/dswscope.c |
---|
8,7 → 8,7 |
* |
* 1. Copyright Notice |
* |
* Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. |
* Some or all of this work - Copyright (c) 1999 - 2011, Intel Corp. |
* All rights reserved. |
* |
* 2. License |
/drivers/devman/acpica/dispatcher/dswstate.c |
---|
8,7 → 8,7 |
* |
* 1. Copyright Notice |
* |
* Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. |
* Some or all of this work - Copyright (c) 1999 - 2011, Intel Corp. |
* All rights reserved. |
* |
* 2. License |