📄 dswstate.c
字号:
ACPI_STATUSAcpiDsObjStackPop ( UINT32 PopCount, ACPI_WALK_STATE *WalkState){ UINT32 i; ACPI_FUNCTION_NAME (DsObjStackPop); for (i = 0; i < PopCount; i++) { /* Check for stack underflow */ if (WalkState->NumOperands == 0) { ACPI_ERROR ((AE_INFO, "Object stack underflow! Count=%X State=%p #Ops=%X", PopCount, WalkState, WalkState->NumOperands)); return (AE_STACK_UNDERFLOW); } /* Just set the stack entry to null */ WalkState->NumOperands--; WalkState->Operands [WalkState->NumOperands] = NULL; } ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Count=%X State=%p #Ops=%X\n", PopCount, WalkState, WalkState->NumOperands)); return (AE_OK);}/******************************************************************************* * * FUNCTION: AcpiDsObjStackPopAndDelete * * PARAMETERS: PopCount - Number of objects/entries to pop * WalkState - Current Walk state * * RETURN: Status * * DESCRIPTION: Pop this walk's object stack and delete each object that is * popped off. * ******************************************************************************/voidAcpiDsObjStackPopAndDelete ( UINT32 PopCount, ACPI_WALK_STATE *WalkState){ ACPI_NATIVE_INT i; ACPI_OPERAND_OBJECT *ObjDesc; ACPI_FUNCTION_NAME (DsObjStackPopAndDelete); if (PopCount == 0) { return; } for (i = (ACPI_NATIVE_INT)(PopCount - 1); i >= 0; i--) { if (WalkState->NumOperands == 0) { return; } /* Pop the stack and delete an object if present in this stack entry */ WalkState->NumOperands--; ObjDesc = WalkState->Operands [i]; if (ObjDesc) { 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));}/******************************************************************************* * * FUNCTION: AcpiDsGetCurrentWalkState * * PARAMETERS: Thread - Get current active state for this Thread * * RETURN: Pointer to the current walk state * * DESCRIPTION: Get the walk state that is at the head of the list (the "current" * walk state.) * ******************************************************************************/ACPI_WALK_STATE *AcpiDsGetCurrentWalkState ( ACPI_THREAD_STATE *Thread){ ACPI_FUNCTION_NAME (DsGetCurrentWalkState); if (!Thread) { return (NULL); } ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Current WalkState %p\n", Thread->WalkStateList)); return (Thread->WalkStateList);}/******************************************************************************* * * FUNCTION: AcpiDsPushWalkState * * PARAMETERS: WalkState - State to push * Thread - Thread state object * * RETURN: None * * DESCRIPTION: Place the Thread state at the head of the state list * ******************************************************************************/voidAcpiDsPushWalkState ( ACPI_WALK_STATE *WalkState, ACPI_THREAD_STATE *Thread){ ACPI_FUNCTION_TRACE (DsPushWalkState); WalkState->Next = Thread->WalkStateList; Thread->WalkStateList = WalkState; return_VOID;}/******************************************************************************* * * FUNCTION: AcpiDsPopWalkState * * PARAMETERS: Thread - Current thread state * * RETURN: A WalkState object popped from the thread's stack * * DESCRIPTION: Remove and return the walkstate object that is at the head of * the walk stack for the given walk list. NULL indicates that * the list is empty. * ******************************************************************************/ACPI_WALK_STATE *AcpiDsPopWalkState ( ACPI_THREAD_STATE *Thread){ ACPI_WALK_STATE *WalkState; ACPI_FUNCTION_TRACE (DsPopWalkState); WalkState = Thread->WalkStateList; if (WalkState) { /* Next walk state becomes the current walk state */ Thread->WalkStateList = WalkState->Next; /* * Don't clear the NEXT field, this serves as an indicator * that there is a parent WALK STATE * Do Not: WalkState->Next = NULL; */ } return_PTR (WalkState);}/******************************************************************************* * * FUNCTION: AcpiDsCreateWalkState * * PARAMETERS: OwnerId - ID for object creation * Origin - Starting point for this walk * MethodDesc - Method object * Thread - Current thread state * * RETURN: Pointer to the new walk state. * * DESCRIPTION: Allocate and initialize a new walk state. The current walk * state is set to this new state. * ******************************************************************************/ACPI_WALK_STATE *AcpiDsCreateWalkState ( ACPI_OWNER_ID OwnerId, ACPI_PARSE_OBJECT *Origin, ACPI_OPERAND_OBJECT *MethodDesc, ACPI_THREAD_STATE *Thread){ ACPI_WALK_STATE *WalkState; ACPI_FUNCTION_TRACE (DsCreateWalkState); WalkState = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_WALK_STATE)); if (!WalkState) { return_PTR (NULL); } WalkState->DescriptorType = ACPI_DESC_TYPE_WALK; WalkState->MethodDesc = MethodDesc; WalkState->OwnerId = OwnerId; WalkState->Origin = Origin; WalkState->Thread = Thread; WalkState->ParserState.StartOp = Origin; /* Init the method args/local */#if (!defined (ACPI_NO_METHOD_EXECUTION) && !defined (ACPI_CONSTANT_EVAL_ONLY)) AcpiDsMethodDataInit (WalkState);#endif /* Put the new state at the head of the walk list */ if (Thread) { AcpiDsPushWalkState (WalkState, Thread); } return_PTR (WalkState);}/******************************************************************************* * * FUNCTION: AcpiDsInitAmlWalk * * PARAMETERS: WalkState - New state to be initialized * Op - Current parse op * MethodNode - Control method NS node, if any * AmlStart - Start of AML * AmlLength - Length of AML * Info - Method info block (params, etc.) * PassNumber - 1, 2, or 3 * * RETURN: Status * * DESCRIPTION: Initialize a walk state for a pass 1 or 2 parse tree walk * ******************************************************************************/ACPI_STATUSAcpiDsInitAmlWalk ( ACPI_WALK_STATE *WalkState, ACPI_PARSE_OBJECT *Op, ACPI_NAMESPACE_NODE *MethodNode, UINT8 *AmlStart, UINT32 AmlLength, ACPI_EVALUATE_INFO *Info, UINT8 PassNumber){ ACPI_STATUS Status; ACPI_PARSE_STATE *ParserState = &WalkState->ParserState; ACPI_PARSE_OBJECT *ExtraOp; ACPI_FUNCTION_TRACE (DsInitAmlWalk); WalkState->ParserState.Aml = WalkState->ParserState.AmlStart = AmlStart; WalkState->ParserState.AmlEnd = WalkState->ParserState.PkgEnd = AmlStart + AmlLength; /* The NextOp of the NextWalk will be the beginning of the method */ WalkState->NextOp = NULL; WalkState->PassNumber = PassNumber; if (Info) { if (Info->ParameterType == ACPI_PARAM_GPE) { WalkState->GpeEventInfo = ACPI_CAST_PTR (ACPI_GPE_EVENT_INFO, Info->Parameters); } else { WalkState->Params = Info->Parameters; WalkState->CallerReturnDesc = &Info->ReturnObject; } } Status = AcpiPsInitScope (&WalkState->ParserState, Op); if (ACPI_FAILURE (Status)) { return_ACPI_STATUS (Status); } if (MethodNode) { WalkState->ParserState.StartNode = MethodNode; WalkState->WalkType = ACPI_WALK_METHOD; WalkState->MethodNode = MethodNode; WalkState->MethodDesc = AcpiNsGetAttachedObject (MethodNode); /* Push start scope on scope stack and make it current */ Status = AcpiDsScopeStackPush (MethodNode, ACPI_TYPE_METHOD, WalkState); if (ACPI_FAILURE (Status)) { return_ACPI_STATUS (Status); } /* Init the method arguments */ Status = AcpiDsMethodDataInitArgs (WalkState->Params, ACPI_METHOD_NUM_ARGS, WalkState); if (ACPI_FAILURE (Status)) { return_ACPI_STATUS (Status); } } else { /* * Setup the current scope. * Find a Named Op that has a namespace node associated with it. * search upwards from this Op. Current scope is the first * Op with a namespace node. */ ExtraOp = ParserState->StartOp; while (ExtraOp && !ExtraOp->Common.Node) { ExtraOp = ExtraOp->Common.Parent; } if (!ExtraOp) { ParserState->StartNode = NULL; } else { ParserState->StartNode = ExtraOp->Common.Node; } if (ParserState->StartNode) { /* Push start scope on scope stack and make it current */ Status = AcpiDsScopeStackPush (ParserState->StartNode, ParserState->StartNode->Type, WalkState); if (ACPI_FAILURE (Status)) { return_ACPI_STATUS (Status); } } } Status = AcpiDsInitCallbacks (WalkState, PassNumber); return_ACPI_STATUS (Status);}/******************************************************************************* * * FUNCTION: AcpiDsDeleteWalkState * * PARAMETERS: WalkState - State to delete * * RETURN: Status * * DESCRIPTION: Delete a walk state including all internal data structures * ******************************************************************************/voidAcpiDsDeleteWalkState ( ACPI_WALK_STATE *WalkState){ ACPI_GENERIC_STATE *State; ACPI_FUNCTION_TRACE_PTR (DsDeleteWalkState, WalkState); if (!WalkState) { return; } if (WalkState->DescriptorType != ACPI_DESC_TYPE_WALK) { 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_ERROR ((AE_INFO, "%p walk still has a scope list", WalkState)); AcpiPsCleanupScope (&WalkState->ParserState); } /* Always must free any linked control states */ while (WalkState->ControlState) { State = WalkState->ControlState; WalkState->ControlState = State->Common.Next; AcpiUtDeleteGenericState (State); } /* Always must free any linked parse states */ while (WalkState->ScopeInfo) { State = WalkState->ScopeInfo; WalkState->ScopeInfo = State->Common.Next; AcpiUtDeleteGenericState (State); } /* Always must free any stacked result states */ while (WalkState->Results) { State = WalkState->Results; WalkState->Results = State->Common.Next; AcpiUtDeleteGenericState (State); } ACPI_FREE (WalkState); return_VOID;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -