From 8d2af8820c6069a314286b9f0b670ec27390023d Mon Sep 17 00:00:00 2001 From: aystarik Date: Wed, 29 Jun 2005 17:09:49 +0000 Subject: [PATCH] Parse/dispatch support for DataTableRegion date 2001.09.21.22.15.00; author rmoore1; state Exp; --- source/components/dispatcher/dsutils.c | 26 +-- source/components/dispatcher/dswload.c | 233 +++++++++++++++---------- 2 files changed, 149 insertions(+), 110 deletions(-) diff --git a/source/components/dispatcher/dsutils.c b/source/components/dispatcher/dsutils.c index 278142b3c..8c526cee8 100644 --- a/source/components/dispatcher/dsutils.c +++ b/source/components/dispatcher/dsutils.c @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: dsutils - Dispatcher utilities - * $Revision: 1.69 $ + * $Revision: 1.73 $ * ******************************************************************************/ @@ -147,7 +147,7 @@ AcpiDsIsResultUsed ( ACPI_PARSE_OBJECT *Op, ACPI_WALK_STATE *WalkState) { - ACPI_OPCODE_INFO *ParentInfo; + const ACPI_OPCODE_INFO *ParentInfo; FUNCTION_TRACE_PTR ("DsIsResultUsed", Op); @@ -192,7 +192,6 @@ AcpiDsIsResultUsed ( * Otherwise leave it as is, it will be deleted when it is used * as an operand later. */ - switch (ACPI_GET_OP_CLASS (ParentInfo)) { /* @@ -206,7 +205,7 @@ AcpiDsIsResultUsed ( /* Never delete the return value associated with a return opcode */ - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, + ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Result used, [RETURN] opcode=%X Op=%X\n", Op->Opcode, Op)); return_VALUE (TRUE); break; @@ -218,7 +217,6 @@ AcpiDsIsResultUsed ( * If we are executing the predicate AND this is the predicate op, * we will use the return value! */ - if ((WalkState->ControlState->Common.State == CONTROL_PREDICATE_EXECUTING) && (WalkState->ControlState->Control.PredicateOp == Op)) { @@ -255,7 +253,7 @@ AcpiDsIsResultUsed ( return_VALUE (TRUE); } - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, + ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Result not used, Parent opcode=%X Op=%X\n", Op->Opcode, Op)); return_VALUE (FALSE); @@ -362,7 +360,7 @@ AcpiDsCreateOperand ( UINT16 Opcode; UINT32 Flags; OPERATING_MODE InterpreterMode; - ACPI_OPCODE_INFO *OpInfo; + const ACPI_OPCODE_INFO *OpInfo; FUNCTION_TRACE_PTR ("DsCreateOperand", Arg); @@ -429,7 +427,6 @@ AcpiDsCreateOperand ( * The only case where we pass through (ignore) a NOT_FOUND * error is for the CondRefOf opcode. */ - if (Status == AE_NOT_FOUND) { if (ParentOp->Opcode == AML_COND_REF_OF_OP) @@ -526,7 +523,7 @@ AcpiDsCreateOperand ( * Only error is underflow, and this indicates * a missing or null operand! */ - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Missing or null operand, %s\n", + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Missing or null operand, %s\n", AcpiFormatException (Status))); return_ACPI_STATUS (Status); } @@ -595,6 +592,7 @@ AcpiDsCreateOperands ( FUNCTION_TRACE_PTR ("DsCreateOperands", FirstArg); + /* For all arguments in the list... */ Arg = FirstArg; @@ -624,7 +622,6 @@ Cleanup: * pop everything off of the operand stack and delete those * objects */ - AcpiDsObjStackPopAndDelete (ArgCount, WalkState); ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "While creating Arg %d - %s\n", @@ -667,7 +664,6 @@ AcpiDsResolveOperands ( * TBD: [Investigate] Note from previous parser: * RefOf problem with AcpiExResolveToValue() conversion. */ - for (i = 0; i < WalkState->NumOperands; i++) { Status = AcpiExResolveToValue (&WalkState->Operands[i], WalkState); @@ -702,7 +698,7 @@ AcpiDsMapOpcodeToDataType ( UINT32 *OutFlags) { ACPI_OBJECT_TYPE8 DataType = INTERNAL_TYPE_INVALID; - ACPI_OPCODE_INFO *OpInfo; + const ACPI_OPCODE_INFO *OpInfo; UINT32 Flags = 0; @@ -744,7 +740,7 @@ AcpiDsMapOpcodeToDataType ( break; default: - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown (type LITERAL) AML opcode: %x\n", Opcode)); break; } @@ -856,6 +852,9 @@ AcpiDsMapNamedOpcodeToDataType ( ACPI_OBJECT_TYPE8 DataType; + FUNCTION_ENTRY (); + + /* Decode Opcode */ switch (Opcode) @@ -917,6 +916,7 @@ AcpiDsMapNamedOpcodeToDataType ( DataType = ACPI_TYPE_EVENT; break; + case AML_DATA_REGION_OP: case AML_REGION_OP: DataType = ACPI_TYPE_REGION; break; diff --git a/source/components/dispatcher/dswload.c b/source/components/dispatcher/dswload.c index 4723a2920..36c24bbb3 100644 --- a/source/components/dispatcher/dswload.c +++ b/source/components/dispatcher/dswload.c @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: dswload - Dispatcher namespace load callbacks - * $Revision: 1.41 $ + * $Revision: 1.48 $ * *****************************************************************************/ @@ -129,6 +129,42 @@ MODULE_NAME ("dswload") +ACPI_STATUS +AcpiDsInitCallbacks ( + ACPI_WALK_STATE *WalkState, + UINT32 PassNumber) +{ + + switch (PassNumber) + { + case 1: + WalkState->ParseFlags = ACPI_PARSE_LOAD_PASS1 | ACPI_PARSE_DELETE_TREE; + WalkState->DescendingCallback = AcpiDsLoad1BeginOp; + WalkState->AscendingCallback = AcpiDsLoad1EndOp; + break; + + case 2: + WalkState->ParseFlags = ACPI_PARSE_LOAD_PASS1 | ACPI_PARSE_DELETE_TREE; + WalkState->DescendingCallback = AcpiDsLoad2BeginOp; + WalkState->AscendingCallback = AcpiDsLoad2EndOp; + break; + + case 3: + WalkState->ParseFlags |= ACPI_PARSE_EXECUTE | ACPI_PARSE_DELETE_TREE; + WalkState->DescendingCallback = AcpiDsExecBeginOp; + WalkState->AscendingCallback = AcpiDsExecEndOp; + break; + + default: + return (AE_BAD_PARAMETER); + break; + } + + return (AE_OK); +} + + + /******************************************************************************* * * FUNCTION: AcpiDsLoad1BeginOp @@ -145,52 +181,53 @@ ACPI_STATUS AcpiDsLoad1BeginOp ( - UINT16 Opcode, - ACPI_PARSE_OBJECT *Op, ACPI_WALK_STATE *WalkState, ACPI_PARSE_OBJECT **OutOp) { + ACPI_PARSE_OBJECT *Op; ACPI_NAMESPACE_NODE *Node; ACPI_STATUS Status; ACPI_OBJECT_TYPE8 DataType; NATIVE_CHAR *Path; - ACPI_OPCODE_INFO *OpInfo; PROC_NAME ("DsLoad1BeginOp"); + + Op = WalkState->Op; ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op=%p State=%p\n", Op, WalkState)); /* We are only interested in opcodes that have an associated name */ - OpInfo = AcpiPsGetOpcodeInfo (Opcode); - if (!(OpInfo->Flags & AML_NAMED)) + if (WalkState->Op) { - *OutOp = Op; - return (AE_OK); + if (!(WalkState->OpInfo->Flags & AML_NAMED)) + { + *OutOp = Op; + return (AE_OK); + } + + /* Check if this object has already been installed in the namespace */ + + if (Op->Node) + { + *OutOp = Op; + return (AE_OK); + } } - - /* Check if this object has already been installed in the namespace */ - - if (Op && Op->Node) - { - *OutOp = Op; - return (AE_OK); - } - - Path = AcpiPsGetNextNamestring (WalkState->ParserState); + Path = AcpiPsGetNextNamestring (&WalkState->ParserState); /* Map the raw opcode into an internal object type */ - DataType = AcpiDsMapNamedOpcodeToDataType (Opcode); + DataType = AcpiDsMapNamedOpcodeToDataType (WalkState->Opcode); ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "State=%p Op=%p Type=%x\n", WalkState, Op, DataType)); - if (Opcode == AML_SCOPE_OP) + if (WalkState->Opcode == AML_SCOPE_OP) { ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "State=%p Op=%p Type=%x\n", WalkState, Op, DataType)); @@ -201,7 +238,7 @@ AcpiDsLoad1BeginOp ( * 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. */ - Status = AcpiNsLookup (WalkState->ScopeInfo, Path, DataType, + Status = AcpiNsLookup (WalkState->ScopeInfo, Path, DataType, IMODE_LOAD_PASS1, NS_NO_UPSEARCH, WalkState, &(Node)); if (ACPI_FAILURE (Status)) @@ -213,7 +250,7 @@ AcpiDsLoad1BeginOp ( { /* Create a new op */ - Op = AcpiPsAllocOp (Opcode); + Op = AcpiPsAllocOp (WalkState->Opcode); if (!Op) { return (AE_NO_MEMORY); @@ -229,12 +266,9 @@ AcpiDsLoad1BeginOp ( * can get it again quickly when this scope is closed */ Op->Node = Node; - - - AcpiPsAppendArg (AcpiPsGetParentScope (WalkState->ParserState), Op); + AcpiPsAppendArg (AcpiPsGetParentScope (&WalkState->ParserState), Op); *OutOp = Op; - return (Status); } @@ -256,26 +290,25 @@ AcpiDsLoad1BeginOp ( ACPI_STATUS AcpiDsLoad1EndOp ( - ACPI_WALK_STATE *WalkState, - ACPI_PARSE_OBJECT *Op) + ACPI_WALK_STATE *WalkState) { + ACPI_PARSE_OBJECT *Op; ACPI_OBJECT_TYPE8 DataType; - ACPI_OPCODE_INFO *OpInfo; PROC_NAME ("DsLoad1EndOp"); + + Op = WalkState->Op; ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op=%p State=%p\n", Op, WalkState)); /* We are only interested in opcodes that have an associated name */ - OpInfo = AcpiPsGetOpcodeInfo (Op->Opcode); - if (!(OpInfo->Flags & AML_NAMED)) + if (!(WalkState->OpInfo->Flags & AML_NAMED)) { return (AE_OK); } - /* Get the type to determine if we should pop the scope */ DataType = AcpiDsMapNamedOpcodeToDataType (Op->Opcode); @@ -293,7 +326,6 @@ AcpiDsLoad1EndOp ( } } - /* Pop the scope stack */ if (AcpiNsOpensScope (DataType)) @@ -305,7 +337,6 @@ AcpiDsLoad1EndOp ( } return (AE_OK); - } @@ -325,46 +356,44 @@ AcpiDsLoad1EndOp ( ACPI_STATUS AcpiDsLoad2BeginOp ( - UINT16 Opcode, - ACPI_PARSE_OBJECT *Op, ACPI_WALK_STATE *WalkState, ACPI_PARSE_OBJECT **OutOp) { + ACPI_PARSE_OBJECT *Op; ACPI_NAMESPACE_NODE *Node; ACPI_STATUS Status; ACPI_OBJECT_TYPE8 DataType; NATIVE_CHAR *BufferPtr; void *Original = NULL; - ACPI_OPCODE_INFO *OpInfo; PROC_NAME ("DsLoad2BeginOp"); + + Op = WalkState->Op; ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op=%p State=%p\n", Op, WalkState)); - /* We only care about Namespace opcodes here */ - - OpInfo = AcpiPsGetOpcodeInfo (Opcode); - if (!(OpInfo->Flags & AML_NSOPCODE) && - Opcode != AML_INT_NAMEPATH_OP) - { - return (AE_OK); - } - - - /* TBD: [Restructure] Temp! same code as in psparse */ - - if (!(OpInfo->Flags & AML_NAMED)) - { - return (AE_OK); - } - if (Op) { + /* We only care about Namespace opcodes here */ + + if (!(WalkState->OpInfo->Flags & AML_NSOPCODE) && + WalkState->Opcode != AML_INT_NAMEPATH_OP) + { + return (AE_OK); + } + + /* TBD: [Restructure] Temp! same code as in psparse */ + + if (!(WalkState->OpInfo->Flags & AML_NAMED)) + { + return (AE_OK); + } + /* * Get the name we are going to enter or lookup in the namespace */ - if (Opcode == AML_INT_NAMEPATH_OP) + if (WalkState->Opcode == AML_INT_NAMEPATH_OP) { /* For Namepath op, get the path string */ @@ -387,33 +416,33 @@ AcpiDsLoad2BeginOp ( else { - BufferPtr = AcpiPsGetNextNamestring (WalkState->ParserState); + BufferPtr = AcpiPsGetNextNamestring (&WalkState->ParserState); } /* Map the raw opcode into an internal object type */ - DataType = AcpiDsMapNamedOpcodeToDataType (Opcode); + DataType = AcpiDsMapNamedOpcodeToDataType (WalkState->Opcode); ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "State=%p Op=%p Type=%x\n", WalkState, Op, DataType)); - if (Opcode == AML_FIELD_OP || - Opcode == AML_BANK_FIELD_OP || - Opcode == AML_INDEX_FIELD_OP) + if (WalkState->Opcode == AML_FIELD_OP || + WalkState->Opcode == AML_BANK_FIELD_OP || + WalkState->Opcode == AML_INDEX_FIELD_OP) { Node = NULL; Status = AE_OK; } - else if (Opcode == AML_INT_NAMEPATH_OP) + else if (WalkState->Opcode == 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, DataType, + Status = AcpiNsLookup (WalkState->ScopeInfo, BufferPtr, DataType, IMODE_EXECUTE, NS_SEARCH_PARENT, WalkState, &(Node)); } @@ -441,7 +470,7 @@ AcpiDsLoad2BeginOp ( * 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. */ - Status = AcpiNsLookup (WalkState->ScopeInfo, BufferPtr, DataType, + Status = AcpiNsLookup (WalkState->ScopeInfo, BufferPtr, DataType, IMODE_EXECUTE, NS_NO_UPSEARCH, WalkState, &(Node)); } @@ -451,7 +480,7 @@ AcpiDsLoad2BeginOp ( { /* Create a new op */ - Op = AcpiPsAllocOp (Opcode); + Op = AcpiPsAllocOp (WalkState->Opcode); if (!Op) { return (AE_NO_MEMORY); @@ -463,7 +492,6 @@ AcpiDsLoad2BeginOp ( *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 @@ -503,25 +531,25 @@ AcpiDsLoad2BeginOp ( ACPI_STATUS AcpiDsLoad2EndOp ( - ACPI_WALK_STATE *WalkState, - ACPI_PARSE_OBJECT *Op) + ACPI_WALK_STATE *WalkState) { + ACPI_PARSE_OBJECT *Op; ACPI_STATUS Status = AE_OK; ACPI_OBJECT_TYPE8 DataType; ACPI_NAMESPACE_NODE *Node; ACPI_PARSE_OBJECT *Arg; ACPI_NAMESPACE_NODE *NewNode; - ACPI_OPCODE_INFO *OpInfo; PROC_NAME ("DsLoad2EndOp"); + + Op = WalkState->Op; ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op=%p State=%p\n", Op, WalkState)); /* Only interested in opcodes that have namespace objects */ - OpInfo = AcpiPsGetOpcodeInfo (Op->Opcode); - if (!(OpInfo->Flags & AML_NSOBJECT)) + if (!(WalkState->OpInfo->Flags & AML_NSOBJECT)) { return (AE_OK); } @@ -533,7 +561,7 @@ AcpiDsLoad2EndOp ( if (((ACPI_PARSE2_OBJECT *)Op)->Name == -1) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unnamed scope! Op=%p State=%p\n", + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unnamed scope! Op=%p State=%p\n", Op, WalkState)); return (AE_OK); } @@ -552,7 +580,6 @@ AcpiDsLoad2EndOp ( * Put the Node on the object stack (Contains the ACPI Name of * this object) */ - WalkState->Operands[0] = (void *) Node; WalkState->NumOperands = 1; @@ -566,32 +593,32 @@ AcpiDsLoad2EndOp ( AcpiDsScopeStackPop (WalkState); } - /* * Named operations are as follows: * - * AML_SCOPE - * AML_DEVICE - * AML_THERMALZONE - * AML_METHOD - * AML_POWERRES - * AML_PROCESSOR - * AML_FIELD - * AML_INDEXFIELD - * AML_BANKFIELD - * AML_NAMEDFIELD - * AML_NAME * AML_ALIAS - * AML_MUTEX - * AML_EVENT - * AML_OPREGION - * AML_CREATEFIELD + * AML_BANKFIELD * AML_CREATEBITFIELD * AML_CREATEBYTEFIELD - * AML_CREATEWORDFIELD * 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 */ @@ -613,9 +640,8 @@ AcpiDsLoad2EndOp ( * Create the field object, but the field buffer and index must * be evaluated later during the execution phase */ - - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "CreateXxxField: State=%p Op=%p NamedObj=%p\n", + ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, + "CreateXxxField: State=%p Op=%p NamedObj=%p\n", WalkState, Op, Node)); /* Get the NameString argument */ @@ -675,22 +701,19 @@ AcpiDsLoad2EndOp ( case AML_INT_METHODCALL_OP: - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, + 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->Value.String, ACPI_TYPE_ANY, IMODE_LOAD_PASS2, NS_SEARCH_PARENT | NS_DONT_OPEN_SCOPE, WalkState, &(NewNode)); - if (ACPI_SUCCESS (Status)) { - /* TBD: has name already been resolved by here ??*/ /* TBD: [Restructure] Make sure that what we found is indeed a method! */ @@ -849,7 +872,7 @@ AcpiDsLoad2EndOp ( } ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "LOADING-Opregion: Op=%p State=%p NamedObj=%p\n", + "LOADING-OpRegion: Op=%p State=%p NamedObj=%p\n", Op, WalkState, Node)); /* @@ -866,6 +889,22 @@ AcpiDsLoad2EndOp ( break; + case AML_DATA_REGION_OP: + + ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, + "LOADING-DataRegion: Op=%p State=%p NamedObj=%p\n", + Op, WalkState, Node)); + + Status = AcpiDsCreateOperands (WalkState, Arg); + if (ACPI_FAILURE (Status)) + { + goto Cleanup; + } + + Status = AcpiExCreateTableRegion (WalkState); + break; + + /* Namespace Modifier Opcodes */ case AML_ALIAS_OP: