diff options
Diffstat (limited to 'sys/contrib/dev/acpica/dswstate.c')
-rw-r--r-- | sys/contrib/dev/acpica/dswstate.c | 642 |
1 files changed, 168 insertions, 474 deletions
diff --git a/sys/contrib/dev/acpica/dswstate.c b/sys/contrib/dev/acpica/dswstate.c index f611d9d..f6f7bd2 100644 --- a/sys/contrib/dev/acpica/dswstate.c +++ b/sys/contrib/dev/acpica/dswstate.c @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: dswstate - Dispatcher parse tree walk management routines - * $Revision: 1.90 $ + * $Revision: 1.101 $ * *****************************************************************************/ @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2005, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp. * All rights reserved. * * 2. License @@ -127,290 +127,170 @@ /* Local prototypes */ -#ifdef ACPI_OBSOLETE_FUNCTIONS -ACPI_STATUS -AcpiDsResultInsert ( - void *Object, - UINT32 Index, - ACPI_WALK_STATE *WalkState); - -ACPI_STATUS -AcpiDsObjStackDeleteAll ( - ACPI_WALK_STATE *WalkState); - -ACPI_STATUS -AcpiDsObjStackPopObject ( - ACPI_OPERAND_OBJECT **Object, +static ACPI_STATUS +AcpiDsResultStackPush ( ACPI_WALK_STATE *WalkState); -void * -AcpiDsObjStackGetValue ( - UINT32 Index, +static ACPI_STATUS +AcpiDsResultStackPop ( ACPI_WALK_STATE *WalkState); -#endif /******************************************************************************* * - * FUNCTION: AcpiDsResultRemove + * FUNCTION: AcpiDsResultPop * * PARAMETERS: Object - Where to return the popped object - * Index - Where to extract the object * WalkState - Current Walk state * * RETURN: Status * - * DESCRIPTION: Pop an object off the bottom of this walk's result stack. In - * other words, this is a FIFO. + * DESCRIPTION: Pop an object off the top of this walk's result stack * ******************************************************************************/ ACPI_STATUS -AcpiDsResultRemove ( +AcpiDsResultPop ( ACPI_OPERAND_OBJECT **Object, - UINT32 Index, ACPI_WALK_STATE *WalkState) { + ACPI_NATIVE_UINT Index; ACPI_GENERIC_STATE *State; + ACPI_STATUS Status; - ACPI_FUNCTION_NAME ("DsResultRemove"); + ACPI_FUNCTION_NAME (DsResultPop); State = WalkState->Results; - if (!State) + + /* Incorrect state of result stack */ + + if (State && !WalkState->ResultCount) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "No result object pushed! State=%p\n", - WalkState)); - return (AE_NOT_EXIST); + ACPI_ERROR ((AE_INFO, "No results on result stack")); + return (AE_AML_INTERNAL); } - if (Index >= ACPI_OBJ_MAX_OPERAND) + if (!State && WalkState->ResultCount) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, - "Index out of range: %X State=%p Num=%X\n", - Index, WalkState, State->Results.NumResults)); + ACPI_ERROR ((AE_INFO, "No result state for result stack")); + return (AE_AML_INTERNAL); } - /* Check for a valid result object */ + /* Empty result stack */ - if (!State->Results.ObjDesc [Index]) + if (!State) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, - "Null operand! State=%p #Ops=%X, Index=%X\n", - WalkState, State->Results.NumResults, Index)); + ACPI_ERROR ((AE_INFO, "Result stack is empty! State=%p", WalkState)); return (AE_AML_NO_RETURN_VALUE); } - /* Remove the object */ + /* Return object of the top element and clean that top element result stack */ - State->Results.NumResults--; + WalkState->ResultCount--; + Index = WalkState->ResultCount % ACPI_RESULTS_FRAME_OBJ_NUM; *Object = State->Results.ObjDesc [Index]; - State->Results.ObjDesc [Index] = NULL; - - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, - "Obj=%p [%s] Index=%X State=%p Num=%X\n", - *Object, (*Object) ? AcpiUtGetObjectTypeName (*Object) : "NULL", - Index, WalkState, State->Results.NumResults)); - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: AcpiDsResultPop - * - * PARAMETERS: Object - Where to return the popped object - * WalkState - Current Walk state - * - * RETURN: Status - * - * DESCRIPTION: Pop an object off the bottom of this walk's result stack. In - * other words, this is a FIFO. - * - ******************************************************************************/ - -ACPI_STATUS -AcpiDsResultPop ( - ACPI_OPERAND_OBJECT **Object, - ACPI_WALK_STATE *WalkState) -{ - ACPI_NATIVE_UINT Index; - ACPI_GENERIC_STATE *State; - - - ACPI_FUNCTION_NAME ("DsResultPop"); - - - State = WalkState->Results; - if (!State) - { - return (AE_OK); - } - - if (!State->Results.NumResults) + if (!*Object) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Result stack is empty! State=%p\n", + ACPI_ERROR ((AE_INFO, "No result objects on result stack, State=%p", WalkState)); return (AE_AML_NO_RETURN_VALUE); } - /* Remove top element */ - - State->Results.NumResults--; - - for (Index = ACPI_OBJ_NUM_OPERANDS; Index; Index--) + State->Results.ObjDesc [Index] = NULL; + if (Index == 0) { - /* Check for a valid result object */ - - if (State->Results.ObjDesc [Index -1]) + Status = AcpiDsResultStackPop (WalkState); + if (ACPI_FAILURE (Status)) { - *Object = State->Results.ObjDesc [Index -1]; - State->Results.ObjDesc [Index -1] = NULL; - - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, - "Obj=%p [%s] Index=%X State=%p Num=%X\n", - *Object, - (*Object) ? AcpiUtGetObjectTypeName (*Object) : "NULL", - (UINT32) Index -1, WalkState, State->Results.NumResults)); - - return (AE_OK); + return (Status); } } - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, - "No result objects! State=%p\n", WalkState)); - return (AE_AML_NO_RETURN_VALUE); + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, + "Obj=%p [%s] Index=%X State=%p Num=%X\n", *Object, + AcpiUtGetObjectTypeName (*Object), + (UINT32) Index, WalkState, WalkState->ResultCount)); + + return (AE_OK); } /******************************************************************************* * - * FUNCTION: AcpiDsResultPopFromBottom + * FUNCTION: AcpiDsResultPush * * PARAMETERS: Object - Where to return the popped object * WalkState - Current Walk state * * RETURN: Status * - * DESCRIPTION: Pop an object off the bottom of this walk's result stack. In - * other words, this is a FIFO. + * DESCRIPTION: Push an object onto the current result stack * ******************************************************************************/ ACPI_STATUS -AcpiDsResultPopFromBottom ( - ACPI_OPERAND_OBJECT **Object, +AcpiDsResultPush ( + ACPI_OPERAND_OBJECT *Object, ACPI_WALK_STATE *WalkState) { - ACPI_NATIVE_UINT Index; ACPI_GENERIC_STATE *State; + ACPI_STATUS Status; + ACPI_NATIVE_UINT Index; - ACPI_FUNCTION_NAME ("DsResultPopFromBottom"); + ACPI_FUNCTION_NAME (DsResultPush); - State = WalkState->Results; - if (!State) + if (WalkState->ResultCount > WalkState->ResultSize) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, - "Warning: No result object pushed! State=%p\n", WalkState)); - return (AE_NOT_EXIST); + ACPI_ERROR ((AE_INFO, "Result stack is full")); + return (AE_AML_INTERNAL); } - - if (!State->Results.NumResults) + else if (WalkState->ResultCount == WalkState->ResultSize) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "No result objects! State=%p\n", - WalkState)); - return (AE_AML_NO_RETURN_VALUE); - } - - /* Remove Bottom element */ - - *Object = State->Results.ObjDesc [0]; + /* Extend the result stack */ - /* Push entire stack down one element */ - - for (Index = 0; Index < State->Results.NumResults; Index++) - { - State->Results.ObjDesc [Index] = State->Results.ObjDesc [Index + 1]; + Status = AcpiDsResultStackPush (WalkState); + if (ACPI_FAILURE (Status)) + { + ACPI_ERROR ((AE_INFO, "Failed to extend the result stack")); + return (Status); + } } - State->Results.NumResults--; - - /* Check for a valid result object */ - - if (!*Object) + if (!(WalkState->ResultCount < WalkState->ResultSize)) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, - "Null operand! State=%p #Ops=%X Index=%X\n", - WalkState, State->Results.NumResults, (UINT32) Index)); - return (AE_AML_NO_RETURN_VALUE); + ACPI_ERROR ((AE_INFO, "No free elements in result stack")); + return (AE_AML_INTERNAL); } - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Obj=%p [%s] Results=%p State=%p\n", - *Object, (*Object) ? AcpiUtGetObjectTypeName (*Object) : "NULL", - State, WalkState)); - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: AcpiDsResultPush - * - * PARAMETERS: Object - Where to return the popped object - * WalkState - Current Walk state - * - * RETURN: Status - * - * DESCRIPTION: Push an object onto the current result stack - * - ******************************************************************************/ - -ACPI_STATUS -AcpiDsResultPush ( - ACPI_OPERAND_OBJECT *Object, - ACPI_WALK_STATE *WalkState) -{ - ACPI_GENERIC_STATE *State; - - - ACPI_FUNCTION_NAME ("DsResultPush"); - - State = WalkState->Results; if (!State) { - ACPI_REPORT_ERROR (("No result stack frame during push\n")); + ACPI_ERROR ((AE_INFO, "No result stack frame during push")); return (AE_AML_INTERNAL); } - if (State->Results.NumResults == ACPI_OBJ_NUM_OPERANDS) - { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, - "Result stack overflow: Obj=%p State=%p Num=%X\n", - Object, WalkState, State->Results.NumResults)); - return (AE_STACK_OVERFLOW); - } - if (!Object) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, - "Null Object! Obj=%p State=%p Num=%X\n", - Object, WalkState, State->Results.NumResults)); + ACPI_ERROR ((AE_INFO, + "Null Object! Obj=%p State=%p Num=%X", + Object, WalkState, WalkState->ResultCount)); return (AE_BAD_PARAMETER); } - State->Results.ObjDesc [State->Results.NumResults] = Object; - State->Results.NumResults++; + /* Assign the address of object to the top free element of result stack */ + + Index = WalkState->ResultCount % ACPI_RESULTS_FRAME_OBJ_NUM; + State->Results.ObjDesc [Index] = Object; + WalkState->ResultCount++; ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Obj=%p [%s] State=%p Num=%X Cur=%X\n", - Object, Object ? AcpiUtGetObjectTypeName ((ACPI_OPERAND_OBJECT *) Object) : "NULL", - WalkState, State->Results.NumResults, WalkState->CurrentResult)); + Object, AcpiUtGetObjectTypeName ((ACPI_OPERAND_OBJECT *) Object), + WalkState, WalkState->ResultCount, WalkState->CurrentResult)); return (AE_OK); } @@ -424,18 +304,29 @@ AcpiDsResultPush ( * * RETURN: Status * - * DESCRIPTION: Push an object onto the WalkState result stack. + * DESCRIPTION: Push an object onto the WalkState result stack * ******************************************************************************/ -ACPI_STATUS +static ACPI_STATUS AcpiDsResultStackPush ( ACPI_WALK_STATE *WalkState) { ACPI_GENERIC_STATE *State; - ACPI_FUNCTION_NAME ("DsResultStackPush"); + ACPI_FUNCTION_NAME (DsResultStackPush); + + + /* Check for stack overflow */ + + if ((WalkState->ResultSize + ACPI_RESULTS_FRAME_OBJ_NUM) > + ACPI_RESULTS_OBJ_NUM_MAX) + { + ACPI_ERROR ((AE_INFO, "Result stack overflow: State=%p Num=%X", + WalkState, WalkState->ResultSize)); + return (AE_STACK_OVERFLOW); + } State = AcpiUtCreateGenericState (); if (!State) @@ -443,9 +334,13 @@ AcpiDsResultStackPush ( return (AE_NO_MEMORY); } - State->Common.DataType = ACPI_DESC_TYPE_STATE_RESULT; + State->Common.DescriptorType = ACPI_DESC_TYPE_STATE_RESULT; AcpiUtPushGenericState (&WalkState->Results, State); + /* Increase the length of the result stack by the length of frame */ + + WalkState->ResultSize += ACPI_RESULTS_FRAME_OBJ_NUM; + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Results=%p State=%p\n", State, WalkState)); @@ -461,35 +356,45 @@ AcpiDsResultStackPush ( * * RETURN: Status * - * DESCRIPTION: Pop an object off of the WalkState result stack. + * DESCRIPTION: Pop an object off of the WalkState result stack * ******************************************************************************/ -ACPI_STATUS +static ACPI_STATUS AcpiDsResultStackPop ( ACPI_WALK_STATE *WalkState) { ACPI_GENERIC_STATE *State; - ACPI_FUNCTION_NAME ("DsResultStackPop"); + + ACPI_FUNCTION_NAME (DsResultStackPop); /* Check for stack underflow */ if (WalkState->Results == NULL) { - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Underflow - State=%p\n", + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Result stack underflow - State=%p\n", WalkState)); return (AE_AML_NO_OPERAND); } + if (WalkState->ResultSize < ACPI_RESULTS_FRAME_OBJ_NUM) + { + ACPI_ERROR ((AE_INFO, "Insufficient result stack size")); + return (AE_AML_INTERNAL); + } + State = AcpiUtPopGenericState (&WalkState->Results); + AcpiUtDeleteGenericState (State); + + /* Decrease the length of result stack by the length of frame */ + + WalkState->ResultSize -= ACPI_RESULTS_FRAME_OBJ_NUM; ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Result=%p RemainingResults=%X State=%p\n", - State, State->Results.NumResults, WalkState)); - - AcpiUtDeleteGenericState (State); + State, WalkState->ResultCount, WalkState)); return (AE_OK); } @@ -513,27 +418,31 @@ AcpiDsObjStackPush ( void *Object, ACPI_WALK_STATE *WalkState) { - ACPI_FUNCTION_NAME ("DsObjStackPush"); + ACPI_FUNCTION_NAME (DsObjStackPush); /* Check for stack overflow */ if (WalkState->NumOperands >= ACPI_OBJ_NUM_OPERANDS) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, - "overflow! Obj=%p State=%p #Ops=%X\n", + ACPI_ERROR ((AE_INFO, + "Object stack overflow! Obj=%p State=%p #Ops=%X", Object, WalkState, WalkState->NumOperands)); return (AE_STACK_OVERFLOW); } /* Put the object onto the stack */ - WalkState->Operands [WalkState->NumOperands] = Object; + WalkState->Operands [WalkState->OperandIndex] = Object; WalkState->NumOperands++; + /* For the usual order of filling the operand stack */ + + WalkState->OperandIndex++; + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Obj=%p [%s] State=%p #Ops=%X\n", - Object, AcpiUtGetObjectTypeName ((ACPI_OPERAND_OBJECT *) Object), - WalkState, WalkState->NumOperands)); + Object, AcpiUtGetObjectTypeName ((ACPI_OPERAND_OBJECT *) Object), + WalkState, WalkState->NumOperands)); return (AE_OK); } @@ -560,7 +469,8 @@ AcpiDsObjStackPop ( { UINT32 i; - ACPI_FUNCTION_NAME ("DsObjStackPop"); + + ACPI_FUNCTION_NAME (DsObjStackPop); for (i = 0; i < PopCount; i++) @@ -569,8 +479,8 @@ AcpiDsObjStackPop ( if (WalkState->NumOperands == 0) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, - "Underflow! Count=%X State=%p #Ops=%X\n", + ACPI_ERROR ((AE_INFO, + "Object stack underflow! Count=%X State=%p #Ops=%X", PopCount, WalkState, WalkState->NumOperands)); return (AE_STACK_UNDERFLOW); } @@ -582,7 +492,7 @@ AcpiDsObjStackPop ( } ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Count=%X State=%p #Ops=%X\n", - PopCount, WalkState, WalkState->NumOperands)); + PopCount, WalkState, WalkState->NumOperands)); return (AE_OK); } @@ -602,7 +512,7 @@ AcpiDsObjStackPop ( * ******************************************************************************/ -ACPI_STATUS +void AcpiDsObjStackPopAndDelete ( UINT32 PopCount, ACPI_WALK_STATE *WalkState) @@ -611,36 +521,34 @@ AcpiDsObjStackPopAndDelete ( ACPI_OPERAND_OBJECT *ObjDesc; - ACPI_FUNCTION_NAME ("DsObjStackPopAndDelete"); + ACPI_FUNCTION_NAME (DsObjStackPopAndDelete); - for (i = 0; i < PopCount; i++) + if (PopCount == 0) { - /* Check for stack underflow */ + return; + } + for (i = (PopCount - 1); i >= 0; i--) + { if (WalkState->NumOperands == 0) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, - "Underflow! Count=%X State=%p #Ops=%X\n", - PopCount, WalkState, WalkState->NumOperands)); - return (AE_STACK_UNDERFLOW); + return; } /* Pop the stack and delete an object if present in this stack entry */ WalkState->NumOperands--; - ObjDesc = WalkState->Operands [WalkState->NumOperands]; + ObjDesc = WalkState->Operands [i]; if (ObjDesc) { - AcpiUtRemoveReference (WalkState->Operands [WalkState->NumOperands]); - WalkState->Operands [WalkState->NumOperands] = NULL; + AcpiUtRemoveReference (WalkState->Operands [i]); + WalkState->Operands [i] = NULL; } } ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Count=%X State=%p #Ops=%X\n", - PopCount, WalkState, WalkState->NumOperands)); - - return (AE_OK); + PopCount, WalkState, WalkState->NumOperands)); } @@ -660,9 +568,8 @@ AcpiDsObjStackPopAndDelete ( ACPI_WALK_STATE * AcpiDsGetCurrentWalkState ( ACPI_THREAD_STATE *Thread) - { - ACPI_FUNCTION_NAME ("DsGetCurrentWalkState"); + ACPI_FUNCTION_NAME (DsGetCurrentWalkState); if (!Thread) @@ -686,7 +593,7 @@ AcpiDsGetCurrentWalkState ( * * RETURN: None * - * DESCRIPTION: Place the Thread state at the head of the state list. + * DESCRIPTION: Place the Thread state at the head of the state list * ******************************************************************************/ @@ -695,10 +602,10 @@ AcpiDsPushWalkState ( ACPI_WALK_STATE *WalkState, ACPI_THREAD_STATE *Thread) { - ACPI_FUNCTION_TRACE ("DsPushWalkState"); + ACPI_FUNCTION_TRACE (DsPushWalkState); - WalkState->Next = Thread->WalkStateList; + WalkState->Next = Thread->WalkStateList; Thread->WalkStateList = WalkState; return_VOID; @@ -726,7 +633,7 @@ AcpiDsPopWalkState ( ACPI_WALK_STATE *WalkState; - ACPI_FUNCTION_TRACE ("DsPopWalkState"); + ACPI_FUNCTION_TRACE (DsPopWalkState); WalkState = Thread->WalkStateList; @@ -754,7 +661,7 @@ AcpiDsPopWalkState ( * * PARAMETERS: OwnerId - ID for object creation * Origin - Starting point for this walk - * MthDesc - Method object + * MethodDesc - Method object * Thread - Current thread state * * RETURN: Pointer to the new walk state. @@ -768,27 +675,26 @@ ACPI_WALK_STATE * AcpiDsCreateWalkState ( ACPI_OWNER_ID OwnerId, ACPI_PARSE_OBJECT *Origin, - ACPI_OPERAND_OBJECT *MthDesc, + ACPI_OPERAND_OBJECT *MethodDesc, ACPI_THREAD_STATE *Thread) { ACPI_WALK_STATE *WalkState; - ACPI_STATUS Status; - ACPI_FUNCTION_TRACE ("DsCreateWalkState"); + ACPI_FUNCTION_TRACE (DsCreateWalkState); - WalkState = ACPI_MEM_CALLOCATE (sizeof (ACPI_WALK_STATE)); + WalkState = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_WALK_STATE)); if (!WalkState) { return_PTR (NULL); } - WalkState->DataType = ACPI_DESC_TYPE_WALK; - WalkState->OwnerId = OwnerId; - WalkState->Origin = Origin; - WalkState->MethodDesc = MthDesc; - WalkState->Thread = Thread; + WalkState->DescriptorType = ACPI_DESC_TYPE_WALK; + WalkState->MethodDesc = MethodDesc; + WalkState->OwnerId = OwnerId; + WalkState->Origin = Origin; + WalkState->Thread = Thread; WalkState->ParserState.StartOp = Origin; @@ -798,15 +704,6 @@ AcpiDsCreateWalkState ( AcpiDsMethodDataInit (WalkState); #endif - /* Create an initial result stack entry */ - - Status = AcpiDsResultStackPush (WalkState); - if (ACPI_FAILURE (Status)) - { - ACPI_MEM_FREE (WalkState); - return_PTR (NULL); - } - /* Put the new state at the head of the walk list */ if (Thread) @@ -843,7 +740,7 @@ AcpiDsInitAmlWalk ( ACPI_NAMESPACE_NODE *MethodNode, UINT8 *AmlStart, UINT32 AmlLength, - ACPI_PARAMETER_INFO *Info, + ACPI_EVALUATE_INFO *Info, UINT8 PassNumber) { ACPI_STATUS Status; @@ -851,13 +748,13 @@ AcpiDsInitAmlWalk ( ACPI_PARSE_OBJECT *ExtraOp; - ACPI_FUNCTION_TRACE ("DsInitAmlWalk"); + ACPI_FUNCTION_TRACE (DsInitAmlWalk); - WalkState->ParserState.Aml = + WalkState->ParserState.Aml = WalkState->ParserState.AmlStart = AmlStart; - WalkState->ParserState.AmlEnd = - WalkState->ParserState.PkgEnd = AmlStart + AmlLength; + WalkState->ParserState.AmlEnd = + WalkState->ParserState.PkgEnd = AmlStart + AmlLength; /* The NextOp of the NextWalk will be the beginning of the method */ @@ -868,12 +765,12 @@ AcpiDsInitAmlWalk ( { if (Info->ParameterType == ACPI_PARAM_GPE) { - WalkState->GpeEventInfo = ACPI_CAST_PTR (ACPI_GPE_EVENT_INFO, - Info->Parameters); + WalkState->GpeEventInfo = + ACPI_CAST_PTR (ACPI_GPE_EVENT_INFO, Info->Parameters); } else { - WalkState->Params = Info->Parameters; + WalkState->Params = Info->Parameters; WalkState->CallerReturnDesc = &Info->ReturnObject; } } @@ -887,9 +784,9 @@ AcpiDsInitAmlWalk ( if (MethodNode) { WalkState->ParserState.StartNode = MethodNode; - WalkState->WalkType = ACPI_WALK_METHOD; - WalkState->MethodNode = MethodNode; - WalkState->MethodDesc = AcpiNsGetAttachedObject (MethodNode); + WalkState->WalkType = ACPI_WALK_METHOD; + WalkState->MethodNode = MethodNode; + WalkState->MethodDesc = AcpiNsGetAttachedObject (MethodNode); /* Push start scope on scope stack and make it current */ @@ -968,7 +865,7 @@ AcpiDsDeleteWalkState ( ACPI_GENERIC_STATE *State; - ACPI_FUNCTION_TRACE_PTR ("DsDeleteWalkState", WalkState); + ACPI_FUNCTION_TRACE_PTR (DsDeleteWalkState, WalkState); if (!WalkState) @@ -976,17 +873,20 @@ AcpiDsDeleteWalkState ( return; } - if (WalkState->DataType != ACPI_DESC_TYPE_WALK) + if (WalkState->DescriptorType != ACPI_DESC_TYPE_WALK) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "%p is not a valid walk state\n", + ACPI_ERROR ((AE_INFO, "%p is not a valid walk state", WalkState)); return; } + /* There should not be any open scopes */ + if (WalkState->ParserState.Scope) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "%p walk still has a scope list\n", + ACPI_ERROR ((AE_INFO, "%p walk still has a scope list", WalkState)); + AcpiPsCleanupScope (&WalkState->ParserState); } /* Always must free any linked control states */ @@ -1019,214 +919,8 @@ AcpiDsDeleteWalkState ( AcpiUtDeleteGenericState (State); } - ACPI_MEM_FREE (WalkState); + ACPI_FREE (WalkState); return_VOID; } -#ifdef ACPI_OBSOLETE_FUNCTIONS -/******************************************************************************* - * - * FUNCTION: AcpiDsResultInsert - * - * PARAMETERS: Object - Object to push - * Index - Where to insert the object - * WalkState - Current Walk state - * - * RETURN: Status - * - * DESCRIPTION: Insert an object onto this walk's result stack - * - ******************************************************************************/ - -ACPI_STATUS -AcpiDsResultInsert ( - void *Object, - UINT32 Index, - ACPI_WALK_STATE *WalkState) -{ - ACPI_GENERIC_STATE *State; - - - ACPI_FUNCTION_NAME ("DsResultInsert"); - - - State = WalkState->Results; - if (!State) - { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "No result object pushed! State=%p\n", - WalkState)); - return (AE_NOT_EXIST); - } - - if (Index >= ACPI_OBJ_NUM_OPERANDS) - { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, - "Index out of range: %X Obj=%p State=%p Num=%X\n", - Index, Object, WalkState, State->Results.NumResults)); - return (AE_BAD_PARAMETER); - } - - if (!Object) - { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, - "Null Object! Index=%X Obj=%p State=%p Num=%X\n", - Index, Object, WalkState, State->Results.NumResults)); - return (AE_BAD_PARAMETER); - } - - State->Results.ObjDesc [Index] = Object; - State->Results.NumResults++; - - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, - "Obj=%p [%s] State=%p Num=%X Cur=%X\n", - Object, Object ? AcpiUtGetObjectTypeName ((ACPI_OPERAND_OBJECT *) Object) : "NULL", - WalkState, State->Results.NumResults, WalkState->CurrentResult)); - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: AcpiDsObjStackDeleteAll - * - * PARAMETERS: WalkState - Current Walk state - * - * RETURN: Status - * - * DESCRIPTION: Clear the object stack by deleting all objects that are on it. - * Should be used with great care, if at all! - * - ******************************************************************************/ - -ACPI_STATUS -AcpiDsObjStackDeleteAll ( - ACPI_WALK_STATE *WalkState) -{ - UINT32 i; - - - ACPI_FUNCTION_TRACE_PTR ("DsObjStackDeleteAll", WalkState); - - - /* The stack size is configurable, but fixed */ - - for (i = 0; i < ACPI_OBJ_NUM_OPERANDS; i++) - { - if (WalkState->Operands[i]) - { - AcpiUtRemoveReference (WalkState->Operands[i]); - WalkState->Operands[i] = NULL; - } - } - - return_ACPI_STATUS (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: AcpiDsObjStackPopObject - * - * PARAMETERS: Object - Where to return the popped object - * WalkState - Current Walk state - * - * RETURN: Status - * - * DESCRIPTION: Pop this walk's object stack. Objects on the stack are NOT - * deleted by this routine. - * - ******************************************************************************/ - -ACPI_STATUS -AcpiDsObjStackPopObject ( - ACPI_OPERAND_OBJECT **Object, - ACPI_WALK_STATE *WalkState) -{ - ACPI_FUNCTION_NAME ("DsObjStackPopObject"); - - - /* Check for stack underflow */ - - if (WalkState->NumOperands == 0) - { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, - "Missing operand/stack empty! State=%p #Ops=%X\n", - WalkState, WalkState->NumOperands)); - *Object = NULL; - return (AE_AML_NO_OPERAND); - } - - /* Pop the stack */ - - WalkState->NumOperands--; - - /* Check for a valid operand */ - - if (!WalkState->Operands [WalkState->NumOperands]) - { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, - "Null operand! State=%p #Ops=%X\n", - WalkState, WalkState->NumOperands)); - *Object = NULL; - return (AE_AML_NO_OPERAND); - } - - /* Get operand and set stack entry to null */ - - *Object = WalkState->Operands [WalkState->NumOperands]; - WalkState->Operands [WalkState->NumOperands] = NULL; - - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Obj=%p [%s] State=%p #Ops=%X\n", - *Object, AcpiUtGetObjectTypeName (*Object), - WalkState, WalkState->NumOperands)); - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: AcpiDsObjStackGetValue - * - * PARAMETERS: Index - Stack index whose value is desired. Based - * on the top of the stack (index=0 == top) - * WalkState - Current Walk state - * - * RETURN: Pointer to the requested operand - * - * DESCRIPTION: Retrieve an object from this walk's operand stack. Index must - * be within the range of the current stack pointer. - * - ******************************************************************************/ - -void * -AcpiDsObjStackGetValue ( - UINT32 Index, - ACPI_WALK_STATE *WalkState) -{ - - ACPI_FUNCTION_TRACE_PTR ("DsObjStackGetValue", WalkState); - - - /* Can't do it if the stack is empty */ - - if (WalkState->NumOperands == 0) - { - return_PTR (NULL); - } - - /* or if the index is past the top of the stack */ - - if (Index > (WalkState->NumOperands - (UINT32) 1)) - { - return_PTR (NULL); - } - - return_PTR (WalkState->Operands[(ACPI_NATIVE_UINT)(WalkState->NumOperands - 1) - - Index]); -} -#endif - - |