summaryrefslogtreecommitdiffstats
path: root/sys/contrib/dev/acpica/dsopcode.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/contrib/dev/acpica/dsopcode.c')
-rw-r--r--sys/contrib/dev/acpica/dsopcode.c105
1 files changed, 66 insertions, 39 deletions
diff --git a/sys/contrib/dev/acpica/dsopcode.c b/sys/contrib/dev/acpica/dsopcode.c
index 6b1ed3a..7760ac6 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: 1.103 $
+ * $Revision: 1.111 $
*
*****************************************************************************/
@@ -10,7 +10,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
@@ -174,7 +174,7 @@ AcpiDsExecuteArguments (
ACPI_WALK_STATE *WalkState;
- ACPI_FUNCTION_TRACE ("DsExecuteArguments");
+ ACPI_FUNCTION_TRACE (DsExecuteArguments);
/*
@@ -200,7 +200,7 @@ AcpiDsExecuteArguments (
}
Status = AcpiDsInitAmlWalk (WalkState, Op, NULL, AmlStart,
- AmlLength, NULL, 1);
+ AmlLength, NULL, ACPI_IMODE_LOAD_PASS1);
if (ACPI_FAILURE (Status))
{
AcpiDsDeleteWalkState (WalkState);
@@ -247,7 +247,7 @@ AcpiDsExecuteArguments (
/* Execute the opcode and arguments */
Status = AcpiDsInitAmlWalk (WalkState, Op, NULL, AmlStart,
- AmlLength, NULL, 3);
+ AmlLength, NULL, ACPI_IMODE_EXECUTE);
if (ACPI_FAILURE (Status))
{
AcpiDsDeleteWalkState (WalkState);
@@ -287,7 +287,7 @@ AcpiDsGetBufferFieldArguments (
ACPI_STATUS Status;
- ACPI_FUNCTION_TRACE_PTR ("DsGetBufferFieldArguments", ObjDesc);
+ ACPI_FUNCTION_TRACE_PTR (DsGetBufferFieldArguments, ObjDesc);
if (ObjDesc->Common.Flags & AOPOBJ_DATA_VALID)
@@ -333,7 +333,7 @@ AcpiDsGetBufferArguments (
ACPI_STATUS Status;
- ACPI_FUNCTION_TRACE_PTR ("DsGetBufferArguments", ObjDesc);
+ ACPI_FUNCTION_TRACE_PTR (DsGetBufferArguments, ObjDesc);
if (ObjDesc->Common.Flags & AOPOBJ_DATA_VALID)
@@ -346,8 +346,8 @@ AcpiDsGetBufferArguments (
Node = ObjDesc->Buffer.Node;
if (!Node)
{
- ACPI_REPORT_ERROR ((
- "No pointer back to NS node in buffer obj %p\n", ObjDesc));
+ ACPI_ERROR ((AE_INFO,
+ "No pointer back to NS node in buffer obj %p", ObjDesc));
return_ACPI_STATUS (AE_AML_INTERNAL);
}
@@ -382,7 +382,7 @@ AcpiDsGetPackageArguments (
ACPI_STATUS Status;
- ACPI_FUNCTION_TRACE_PTR ("DsGetPackageArguments", ObjDesc);
+ ACPI_FUNCTION_TRACE_PTR (DsGetPackageArguments, ObjDesc);
if (ObjDesc->Common.Flags & AOPOBJ_DATA_VALID)
@@ -395,8 +395,8 @@ AcpiDsGetPackageArguments (
Node = ObjDesc->Package.Node;
if (!Node)
{
- ACPI_REPORT_ERROR ((
- "No pointer back to NS node in package %p\n", ObjDesc));
+ ACPI_ERROR ((AE_INFO,
+ "No pointer back to NS node in package %p", ObjDesc));
return_ACPI_STATUS (AE_AML_INTERNAL);
}
@@ -432,7 +432,7 @@ AcpiDsGetRegionArguments (
ACPI_OPERAND_OBJECT *ExtraDesc;
- ACPI_FUNCTION_TRACE_PTR ("DsGetRegionArguments", ObjDesc);
+ ACPI_FUNCTION_TRACE_PTR (DsGetRegionArguments, ObjDesc);
if (ObjDesc->Region.Flags & AOPOBJ_DATA_VALID)
@@ -459,6 +459,28 @@ AcpiDsGetRegionArguments (
Status = AcpiDsExecuteArguments (Node, AcpiNsGetParentNode (Node),
ExtraDesc->Extra.AmlLength, ExtraDesc->Extra.AmlStart);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Validate the region address/length via the host OS */
+
+ Status = AcpiOsValidateAddress (ObjDesc->Region.SpaceId,
+ ObjDesc->Region.Address, (ACPI_SIZE) ObjDesc->Region.Length);
+ if (ACPI_FAILURE (Status))
+ {
+ /*
+ * Invalid address/length. We will emit an error message and mark
+ * the region as invalid, so that it will cause an additional error if
+ * it is ever used. Then return AE_OK.
+ */
+ ACPI_EXCEPTION ((AE_INFO, Status,
+ "During address validation of OpRegion [%4.4s]", Node->Name.Ascii));
+ ObjDesc->Common.Flags |= AOPOBJ_INVALID;
+ Status = AE_OK;
+ }
+
return_ACPI_STATUS (Status);
}
@@ -525,15 +547,15 @@ AcpiDsInitBufferField (
ACPI_STATUS Status;
- ACPI_FUNCTION_TRACE_PTR ("DsInitBufferField", ObjDesc);
+ ACPI_FUNCTION_TRACE_PTR (DsInitBufferField, ObjDesc);
/* Host object must be a Buffer */
if (ACPI_GET_OBJECT_TYPE (BufferDesc) != ACPI_TYPE_BUFFER)
{
- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
- "Target of Create Field is not a Buffer object - %s\n",
+ ACPI_ERROR ((AE_INFO,
+ "Target of Create Field is not a Buffer object - %s",
AcpiUtGetObjectTypeName (BufferDesc)));
Status = AE_AML_OPERAND_TYPE;
@@ -547,10 +569,10 @@ AcpiDsInitBufferField (
*/
if (ACPI_GET_DESCRIPTOR_TYPE (ResultDesc) != ACPI_DESC_TYPE_NAMED)
{
- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
- "(%s) destination not a NS Node [%s]\n",
- AcpiPsGetOpcodeName (AmlOpcode),
- AcpiUtGetDescriptorName (ResultDesc)));
+ ACPI_ERROR ((AE_INFO,
+ "(%s) destination not a NS Node [%s]",
+ AcpiPsGetOpcodeName (AmlOpcode),
+ AcpiUtGetDescriptorName (ResultDesc)));
Status = AE_AML_OPERAND_TYPE;
goto Cleanup;
@@ -575,8 +597,8 @@ AcpiDsInitBufferField (
if (BitCount == 0)
{
- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
- "Attempt to CreateField of length 0\n"));
+ ACPI_ERROR ((AE_INFO,
+ "Attempt to CreateField of length zero"));
Status = AE_AML_OPERAND_VALUE;
goto Cleanup;
}
@@ -629,8 +651,8 @@ AcpiDsInitBufferField (
default:
- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
- "Unknown field creation opcode %02x\n",
+ ACPI_ERROR ((AE_INFO,
+ "Unknown field creation opcode %02x",
AmlOpcode));
Status = AE_AML_BAD_OPCODE;
goto Cleanup;
@@ -641,12 +663,12 @@ AcpiDsInitBufferField (
if ((BitOffset + BitCount) >
(8 * (UINT32) BufferDesc->Buffer.Length))
{
- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
- "Field [%4.4s] size %d exceeds Buffer [%4.4s] size %d (bits)\n",
- AcpiUtGetNodeName (ResultDesc),
- BitOffset + BitCount,
- AcpiUtGetNodeName (BufferDesc->Buffer.Node),
- 8 * (UINT32) BufferDesc->Buffer.Length));
+ ACPI_ERROR ((AE_INFO,
+ "Field [%4.4s] at %d exceeds Buffer [%4.4s] size %d (bits)",
+ AcpiUtGetNodeName (ResultDesc),
+ BitOffset + BitCount,
+ AcpiUtGetNodeName (BufferDesc->Buffer.Node),
+ 8 * (UINT32) BufferDesc->Buffer.Length));
Status = AE_AML_BUFFER_LIMIT;
goto Cleanup;
}
@@ -725,7 +747,7 @@ AcpiDsEvalBufferFieldOperands (
ACPI_PARSE_OBJECT *NextOp;
- ACPI_FUNCTION_TRACE_PTR ("DsEvalBufferFieldOperands", Op);
+ ACPI_FUNCTION_TRACE_PTR (DsEvalBufferFieldOperands, Op);
/*
@@ -763,7 +785,7 @@ AcpiDsEvalBufferFieldOperands (
if (ACPI_FAILURE (Status))
{
- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "(%s) bad operand(s) (%X)\n",
+ ACPI_ERROR ((AE_INFO, "(%s) bad operand(s) (%X)",
AcpiPsGetOpcodeName (Op->Common.AmlOpcode), Status));
return_ACPI_STATUS (Status);
@@ -818,7 +840,7 @@ AcpiDsEvalRegionOperands (
ACPI_PARSE_OBJECT *NextOp;
- ACPI_FUNCTION_TRACE_PTR ("DsEvalRegionOperands", Op);
+ ACPI_FUNCTION_TRACE_PTR (DsEvalRegionOperands, Op);
/*
@@ -920,11 +942,17 @@ AcpiDsEvalDataObjectOperands (
UINT32 Length;
- ACPI_FUNCTION_TRACE ("DsEvalDataObjectOperands");
+ ACPI_FUNCTION_TRACE (DsEvalDataObjectOperands);
/* The first operand (for all of these data objects) is the length */
+ /*
+ * Set proper index into operand stack for AcpiDsObjStackPush
+ * invoked inside AcpiDsCreateOperand.
+ */
+ WalkState->OperandIndex = WalkState->NumOperands;
+
Status = AcpiDsCreateOperand (WalkState, Op->Common.Value.Arg, 1);
if (ACPI_FAILURE (Status))
{
@@ -1017,7 +1045,7 @@ AcpiDsExecBeginControlOp (
ACPI_GENERIC_STATE *ControlState;
- ACPI_FUNCTION_NAME ("DsExecBeginControlOp");
+ ACPI_FUNCTION_NAME (DsExecBeginControlOp);
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op=%p Opcode=%2.2X State=%p\n", Op,
@@ -1100,7 +1128,7 @@ AcpiDsExecEndControlOp (
ACPI_GENERIC_STATE *ControlState;
- ACPI_FUNCTION_NAME ("DsExecEndControlOp");
+ ACPI_FUNCTION_NAME (DsExecEndControlOp);
switch (Op->Common.AmlOpcode)
@@ -1195,8 +1223,7 @@ AcpiDsExecEndControlOp (
*/
WalkState->ReturnDesc = WalkState->Operands[0];
}
- else if ((WalkState->Results) &&
- (WalkState->Results->Results.NumResults > 0))
+ else if (WalkState->ResultCount)
{
/* Since we have a real Return(), delete any implicit return */
@@ -1305,7 +1332,7 @@ AcpiDsExecEndControlOp (
default:
- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown control opcode=%X Op=%p\n",
+ ACPI_ERROR ((AE_INFO, "Unknown control opcode=%X Op=%p",
Op->Common.AmlOpcode, Op));
Status = AE_AML_BAD_OPCODE;
OpenPOWER on IntegriCloud