diff options
Diffstat (limited to 'sys/contrib/dev/acpica/dsopcode.c')
-rw-r--r-- | sys/contrib/dev/acpica/dsopcode.c | 300 |
1 files changed, 85 insertions, 215 deletions
diff --git a/sys/contrib/dev/acpica/dsopcode.c b/sys/contrib/dev/acpica/dsopcode.c index 52dec60..1787efd 100644 --- a/sys/contrib/dev/acpica/dsopcode.c +++ b/sys/contrib/dev/acpica/dsopcode.c @@ -2,7 +2,7 @@ * * Module Name: dsopcode - Dispatcher Op Region support and handling of * "control" opcodes - * $Revision: 56 $ + * $Revision: 66 $ * *****************************************************************************/ @@ -132,90 +132,61 @@ /***************************************************************************** * - * FUNCTION: AcpiDsGetBufferFieldArguments + * FUNCTION: AcpiDsExecuteArguments * - * PARAMETERS: ObjDesc - A valid BufferField object + * PARAMETERS: Node - Parent NS node + * ExtraDesc - Has AML pointer and length * * RETURN: Status. * - * DESCRIPTION: Get BufferField Buffer and Index. This implements the late - * evaluation of these field attributes. + * DESCRIPTION: Late execution of region or field arguments * ****************************************************************************/ ACPI_STATUS -AcpiDsGetBufferFieldArguments ( - ACPI_OPERAND_OBJECT *ObjDesc) +AcpiDsExecuteArguments ( + ACPI_NAMESPACE_NODE *Node, + ACPI_OPERAND_OBJECT *ExtraDesc) { - ACPI_OPERAND_OBJECT *ExtraDesc; - ACPI_NAMESPACE_NODE *Node; - ACPI_PARSE_OBJECT *Op; - ACPI_PARSE_OBJECT *FieldOp; ACPI_STATUS Status; - ACPI_TABLE_DESC *TableDesc; + ACPI_PARSE_OBJECT *Op; ACPI_WALK_STATE *WalkState; + ACPI_PARSE_OBJECT *Arg; - 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 = ObjDesc->BufferField.Extra; - Node = ObjDesc->BufferField.Node; - - DEBUG_EXEC(AcpiUtDisplayInitPathname (Node, " [Field]")); - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] BufferField JIT Init\n", - (char*)&Node->Name)); + FUNCTION_TRACE ("AcpiDsExecuteArguments"); /* * Allocate a new parser op to be the root of the parsed - * OpRegion tree + * BufferField tree */ Op = AcpiPsAllocOp (AML_SCOPE_OP); if (!Op) { - return (AE_NO_MEMORY); + return_ACPI_STATUS (AE_NO_MEMORY); } /* Save the Node for use in AcpiPsParseAml */ Op->Node = AcpiNsGetParentObject (Node); - /* Get a handle to the parent ACPI table */ - - Status = AcpiTbHandleToObject (Node->OwnerId, &TableDesc); - if (ACPI_FAILURE (Status)) - { - return_ACPI_STATUS (Status); - } - /* Create and initialize a new parser state */ - WalkState = AcpiDsCreateWalkState (TABLE_ID_DSDT, - NULL, NULL, NULL); + WalkState = AcpiDsCreateWalkState (TABLE_ID_DSDT, NULL, NULL, NULL); if (!WalkState) { return_ACPI_STATUS (AE_NO_MEMORY); } - Status = AcpiDsInitAmlWalk (WalkState, Op, NULL, ExtraDesc->Extra.AmlStart, + Status = AcpiDsInitAmlWalk (WalkState, Op, NULL, ExtraDesc->Extra.AmlStart, ExtraDesc->Extra.AmlLength, NULL, NULL, 1); if (ACPI_FAILURE (Status)) { - /* TBD: delete walk state */ + AcpiDsDeleteWalkState (WalkState); return_ACPI_STATUS (Status); } - /* TBD: No Walk flags?? */ - WalkState->ParseFlags = 0; /* Pass1: Parse the entire BufferField declaration */ @@ -229,28 +200,24 @@ AcpiDsGetBufferFieldArguments ( /* Get and init the actual FieldUnit Op created above */ - FieldOp = Op->Value.Arg; + Arg = Op->Value.Arg; Op->Node = Node; - - - FieldOp = Op->Value.Arg; - FieldOp->Node = Node; + Arg->Node = Node; AcpiPsDeleteParseTree (Op); - /* Evaluate the address and length arguments for the OpRegion */ + /* Evaluate the address and length arguments for the Buffer Field */ Op = AcpiPsAllocOp (AML_SCOPE_OP); if (!Op) { - return (AE_NO_MEMORY); + return_ACPI_STATUS (AE_NO_MEMORY); } Op->Node = AcpiNsGetParentObject (Node); /* Create and initialize a new parser state */ - WalkState = AcpiDsCreateWalkState (TABLE_ID_DSDT, - NULL, NULL, NULL); + WalkState = AcpiDsCreateWalkState (TABLE_ID_DSDT, NULL, NULL, NULL); if (!WalkState) { return_ACPI_STATUS (AE_NO_MEMORY); @@ -260,160 +227,110 @@ AcpiDsGetBufferFieldArguments ( ExtraDesc->Extra.AmlLength, NULL, NULL, 3); if (ACPI_FAILURE (Status)) { - /* TBD: delete walk state */ + AcpiDsDeleteWalkState (WalkState); return_ACPI_STATUS (Status); } Status = AcpiPsParseAml (WalkState); AcpiPsDeleteParseTree (Op); - /* - * The pseudo-method object is no longer needed since the region is - * now initialized - */ - AcpiUtRemoveReference (ObjDesc->BufferField.Extra); - ObjDesc->BufferField.Extra = NULL; - return_ACPI_STATUS (Status); } /***************************************************************************** * - * FUNCTION: AcpiDsGetRegionArguments + * FUNCTION: AcpiDsGetBufferFieldArguments * - * PARAMETERS: ObjDesc - A valid region object + * PARAMETERS: ObjDesc - A valid BufferField object * * RETURN: Status. * - * DESCRIPTION: Get region address and length. This implements the late - * evaluation of these region attributes. + * DESCRIPTION: Get BufferField Buffer and Index. This implements the late + * evaluation of these field attributes. * ****************************************************************************/ ACPI_STATUS -AcpiDsGetRegionArguments ( +AcpiDsGetBufferFieldArguments ( ACPI_OPERAND_OBJECT *ObjDesc) { - ACPI_OPERAND_OBJECT *ExtraDesc = NULL; + ACPI_OPERAND_OBJECT *ExtraDesc; ACPI_NAMESPACE_NODE *Node; - ACPI_PARSE_OBJECT *Op; - ACPI_PARSE_OBJECT *RegionOp; ACPI_STATUS Status; - ACPI_TABLE_DESC *TableDesc; - ACPI_WALK_STATE *WalkState; - FUNCTION_TRACE_PTR ("DsGetRegionArguments", ObjDesc); + FUNCTION_TRACE_PTR ("DsGetBufferFieldArguments", ObjDesc); - if (ObjDesc->Region.Flags & AOPOBJ_DATA_VALID) + if (ObjDesc->Common.Flags & AOPOBJ_DATA_VALID) { return_ACPI_STATUS (AE_OK); } + /* Get the AML pointer (method object) and BufferField node */ - /* Get the AML pointer (method object) and region node */ - - ExtraDesc = ObjDesc->Region.Extra; - Node = ObjDesc->Region.Node; + ExtraDesc = AcpiNsGetSecondaryObject (ObjDesc); + Node = ObjDesc->BufferField.Node; - DEBUG_EXEC(AcpiUtDisplayInitPathname (Node, " [Operation Region]")); + DEBUG_EXEC(AcpiUtDisplayInitPathname (Node, " [Field]")); + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] BufferField JIT Init\n", + (char *) &Node->Name)); - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] OpRegion Init at AML %p\n", - (char*)&Node->Name, ExtraDesc->Extra.AmlStart)); + /* Execute the AML code for the TermArg arguments */ - /* - * Allocate a new parser op to be the root of the parsed - * OpRegion tree - */ - Op = AcpiPsAllocOp (AML_SCOPE_OP); - if (!Op) - { - return (AE_NO_MEMORY); - } + Status = AcpiDsExecuteArguments (Node, ExtraDesc); + return_ACPI_STATUS (Status); +} - /* Save the Node for use in AcpiPsParseAml */ - Op->Node = AcpiNsGetParentObject (Node); +/***************************************************************************** + * + * 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. + * + ****************************************************************************/ - /* Get a handle to the parent ACPI table */ +ACPI_STATUS +AcpiDsGetRegionArguments ( + ACPI_OPERAND_OBJECT *ObjDesc) +{ + ACPI_NAMESPACE_NODE *Node; + ACPI_STATUS Status; + ACPI_OPERAND_OBJECT *RegionObj2; - Status = AcpiTbHandleToObject (Node->OwnerId, &TableDesc); - if (ACPI_FAILURE (Status)) - { - return_ACPI_STATUS (Status); - } - /* Create and initialize a new parser state */ + FUNCTION_TRACE_PTR ("DsGetRegionArguments", ObjDesc); - WalkState = AcpiDsCreateWalkState (TABLE_ID_DSDT, - Op, NULL, NULL); - if (!WalkState) - { - return_ACPI_STATUS (AE_NO_MEMORY); - } - Status = AcpiDsInitAmlWalk (WalkState, Op, NULL, ExtraDesc->Extra.AmlStart, - ExtraDesc->Extra.AmlLength, NULL, NULL, 1); - if (ACPI_FAILURE (Status)) + if (ObjDesc->Region.Flags & AOPOBJ_DATA_VALID) { - /* TBD: delete walk state */ - return_ACPI_STATUS (Status); + return_ACPI_STATUS (AE_OK); } - /* TBD: No Walk flags?? */ - - WalkState->ParseFlags = 0; - - /* Parse the entire OpRegion declaration, creating a parse tree */ - - Status = AcpiPsParseAml (WalkState); - if (ACPI_FAILURE (Status)) + RegionObj2 = AcpiNsGetSecondaryObject (ObjDesc); + if (!RegionObj2) { - AcpiPsDeleteParseTree (Op); - return_ACPI_STATUS (Status); + return_ACPI_STATUS (AE_NOT_EXIST); } - /* Get and init the actual RegionOp created above */ - - RegionOp = Op->Value.Arg; - Op->Node = Node; - - - RegionOp = Op->Value.Arg; - RegionOp->Node = Node; - AcpiPsDeleteParseTree (Op); - - /* Evaluate the address and length arguments for the OpRegion */ - - Op = AcpiPsAllocOp (AML_SCOPE_OP); - if (!Op) - { - return (AE_NO_MEMORY); - } + /* Get the AML pointer (method object) and region node */ - Op->Node = AcpiNsGetParentObject (Node); + Node = ObjDesc->Region.Node; - /* Create and initialize a new parser state */ + DEBUG_EXEC(AcpiUtDisplayInitPathname (Node, " [Operation Region]")); - WalkState = AcpiDsCreateWalkState (TABLE_ID_DSDT, - Op, NULL, NULL); - if (!WalkState) - { - return_ACPI_STATUS (AE_NO_MEMORY); - } + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] OpRegion Init at AML %p\n", + (char *) &Node->Name, RegionObj2->Extra.AmlStart)); - Status = AcpiDsInitAmlWalk (WalkState, Op, NULL, ExtraDesc->Extra.AmlStart, - ExtraDesc->Extra.AmlLength, NULL, NULL, 3); - if (ACPI_FAILURE (Status)) - { - /* TBD: delete walk state */ - return_ACPI_STATUS (Status); - } - Status = AcpiPsParseAml (WalkState); - AcpiPsDeleteParseTree (Op); + Status = AcpiDsExecuteArguments (Node, RegionObj2); return_ACPI_STATUS (Status); } @@ -460,21 +377,6 @@ AcpiDsInitializeRegion ( * DESCRIPTION: Get BufferField Buffer and Index * Called from AcpiDsExecEndOp during BufferField parse tree walk * - * ACPI SPECIFICATION REFERENCES: - * Each of the Buffer Field opcodes is defined as specified in in-line - * comments below. For each one, use the following definitions. - * - * DefBitField := BitFieldOp SrcBuf BitIdx Destination - * DefByteField := ByteFieldOp SrcBuf ByteIdx Destination - * DefCreateField := CreateFieldOp SrcBuf BitIdx NumBits NameString - * DefDWordField := DWordFieldOp SrcBuf ByteIdx Destination - * DefWordField := WordFieldOp SrcBuf ByteIdx Destination - * BitIndex := TermArg=>Integer - * ByteIndex := TermArg=>Integer - * Destination := NameString - * NumBits := TermArg=>Integer - * SourceBuf := TermArg=>Buffer - * ****************************************************************************/ ACPI_STATUS @@ -523,7 +425,6 @@ AcpiDsEvalBufferFieldOperands ( return_ACPI_STATUS (AE_NOT_EXIST); } - /* Resolve the operands */ Status = AcpiExResolveOperands (Op->Opcode, WALK_OPERANDS, WalkState); @@ -552,10 +453,7 @@ AcpiDsEvalBufferFieldOperands ( OffDesc = WalkState->Operands[1]; SrcDesc = WalkState->Operands[0]; - - - - Offset = (UINT32) OffDesc->Integer.Value; + Offset = (UINT32) OffDesc->Integer.Value; /* * If ResDesc is a Name, it will be a direct name pointer after @@ -576,78 +474,60 @@ AcpiDsEvalBufferFieldOperands ( switch (Op->Opcode) { - /* DefCreateField */ - case AML_CREATE_FIELD_OP: /* Offset is in bits, count is in bits */ BitOffset = Offset; BitCount = (UINT32) CntDesc->Integer.Value; - FieldFlags = ACCESS_BYTE_ACC; + FieldFlags = AML_FIELD_ACCESS_BYTE; break; - - /* DefCreateBitField */ - case AML_CREATE_BIT_FIELD_OP: /* Offset is in bits, Field is one bit */ BitOffset = Offset; BitCount = 1; - FieldFlags = ACCESS_BYTE_ACC; + FieldFlags = AML_FIELD_ACCESS_BYTE; break; - - /* DefCreateByteField */ - case AML_CREATE_BYTE_FIELD_OP: /* Offset is in bytes, field is one byte */ BitOffset = 8 * Offset; BitCount = 8; - FieldFlags = ACCESS_BYTE_ACC; + FieldFlags = AML_FIELD_ACCESS_BYTE; break; - - /* DefCreateWordField */ - case AML_CREATE_WORD_FIELD_OP: /* Offset is in bytes, field is one word */ BitOffset = 8 * Offset; BitCount = 16; - FieldFlags = ACCESS_WORD_ACC; + FieldFlags = AML_FIELD_ACCESS_WORD; break; - - /* DefCreateDWordField */ - case AML_CREATE_DWORD_FIELD_OP: /* Offset is in bytes, field is one dword */ BitOffset = 8 * Offset; BitCount = 32; - FieldFlags = ACCESS_DWORD_ACC; + FieldFlags = AML_FIELD_ACCESS_DWORD; break; - - /* DefCreateQWordField */ - case AML_CREATE_QWORD_FIELD_OP: /* Offset is in bytes, field is one qword */ BitOffset = 8 * Offset; BitCount = 64; - FieldFlags = ACCESS_QWORD_ACC; + FieldFlags = AML_FIELD_ACCESS_QWORD; break; - default: ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, @@ -657,7 +537,6 @@ AcpiDsEvalBufferFieldOperands ( goto Cleanup; } - /* * Setup field according to the object type */ @@ -678,12 +557,11 @@ AcpiDsEvalBufferFieldOperands ( goto Cleanup; } - /* * Initialize areas of the field object that are common to all fields * For FieldFlags, use LOCK_RULE = 0 (NO_LOCK), UPDATE_RULE = 0 (UPDATE_PRESERVE) */ - Status = AcpiExPrepCommonFieldObject (ObjDesc, FieldFlags, + Status = AcpiExPrepCommonFieldObject (ObjDesc, FieldFlags, 0, BitOffset, BitCount); if (ACPI_FAILURE (Status)) { @@ -696,7 +574,6 @@ AcpiDsEvalBufferFieldOperands ( SrcDesc->Common.ReferenceCount = (UINT16) (SrcDesc->Common.ReferenceCount + ObjDesc->Common.ReferenceCount); - break; @@ -704,7 +581,7 @@ AcpiDsEvalBufferFieldOperands ( default: - if ((SrcDesc->Common.Type > (UINT8) INTERNAL_TYPE_REFERENCE) || !AcpiUtValidObjectType (SrcDesc->Common.Type)) /* TBD: This line MUST be a single line until AcpiSrc can handle it (block deletion) */ + if ((SrcDesc->Common.Type > (UINT8) INTERNAL_TYPE_REFERENCE) || !AcpiUtValidObjectType (SrcDesc->Common.Type)) /* This line MUST be a single line until AcpiSrc can handle it (block deletion) */ { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Tried to create field in invalid object type %X\n", @@ -915,11 +792,8 @@ AcpiDsExecBeginControlOp ( */ WalkState->ControlState->Control.AmlPredicateStart = WalkState->ParserState.Aml - 1; - /* TBD: can this be removed? */ - /*AcpiPsPkgLengthEncodingSize (GET8 (WalkState->ParserState->Aml));*/ break; - case AML_ELSE_OP: /* Predicate is in the state object */ @@ -932,12 +806,10 @@ AcpiDsExecBeginControlOp ( break; - case AML_RETURN_OP: break; - default: break; } @@ -958,7 +830,6 @@ AcpiDsExecBeginControlOp ( * DESCRIPTION: Handles all control ops encountered during control method * execution. * - * ******************************************************************************/ ACPI_STATUS @@ -1077,11 +948,11 @@ AcpiDsExecEndControlOp ( ((WalkState->Results->Results.ObjDesc [0])->Common.Type == INTERNAL_TYPE_REFERENCE) && ((WalkState->Results->Results.ObjDesc [0])->Reference.Opcode != AML_INDEX_OP)) { - Status = AcpiExResolveToValue (&WalkState->Results->Results.ObjDesc [0], WalkState); - if (ACPI_FAILURE (Status)) - { - return (Status); - } + Status = AcpiExResolveToValue (&WalkState->Results->Results.ObjDesc [0], WalkState); + if (ACPI_FAILURE (Status)) + { + return (Status); + } } WalkState->ReturnDesc = WalkState->Results->Results.ObjDesc [0]; @@ -1166,7 +1037,6 @@ AcpiDsExecEndControlOp ( break; } - return (Status); } |