summaryrefslogtreecommitdiffstats
path: root/sys/contrib/dev/acpica/dswexec.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/contrib/dev/acpica/dswexec.c')
-rw-r--r--sys/contrib/dev/acpica/dswexec.c48
1 files changed, 33 insertions, 15 deletions
diff --git a/sys/contrib/dev/acpica/dswexec.c b/sys/contrib/dev/acpica/dswexec.c
index 276514c..25e1a63 100644
--- a/sys/contrib/dev/acpica/dswexec.c
+++ b/sys/contrib/dev/acpica/dswexec.c
@@ -2,7 +2,7 @@
*
* Module Name: dswexec - Dispatcher method execution callbacks;
* dispatch to interpreter.
- * $Revision: 106 $
+ * $Revision: 113 $
*
*****************************************************************************/
@@ -134,17 +134,18 @@
* Dispatch table for opcode classes
*/
static ACPI_EXECUTE_OP AcpiGbl_OpTypeDispatch [] = {
- AcpiExOpcode_1A_0T_0R,
- AcpiExOpcode_1A_0T_1R,
- AcpiExOpcode_1A_1T_0R,
- AcpiExOpcode_1A_1T_1R,
- AcpiExOpcode_2A_0T_0R,
- AcpiExOpcode_2A_0T_1R,
- AcpiExOpcode_2A_1T_1R,
- AcpiExOpcode_2A_2T_1R,
- AcpiExOpcode_3A_0T_0R,
- AcpiExOpcode_3A_1T_1R,
- AcpiExOpcode_6A_0T_1R};
+ AcpiExOpcode_0A_0T_1R,
+ AcpiExOpcode_1A_0T_0R,
+ AcpiExOpcode_1A_0T_1R,
+ AcpiExOpcode_1A_1T_0R,
+ AcpiExOpcode_1A_1T_1R,
+ AcpiExOpcode_2A_0T_0R,
+ AcpiExOpcode_2A_0T_1R,
+ AcpiExOpcode_2A_1T_1R,
+ AcpiExOpcode_2A_2T_1R,
+ AcpiExOpcode_3A_0T_0R,
+ AcpiExOpcode_3A_1T_1R,
+ AcpiExOpcode_6A_0T_1R};
/*****************************************************************************
*
@@ -514,7 +515,7 @@ AcpiDsExecEndOp (
* routine. There is one routine per opcode "type" based upon the
* number of opcode arguments and return type.
*/
- Status = AcpiGbl_OpTypeDispatch [OpType] (WalkState);
+ Status = AcpiGbl_OpTypeDispatch[OpType] (WalkState);
}
else
{
@@ -527,7 +528,9 @@ AcpiDsExecEndOp (
(WalkState->Operands[0]->Common.Type == ACPI_TYPE_LOCAL_REFERENCE) &&
(WalkState->Operands[1]->Common.Type == ACPI_TYPE_LOCAL_REFERENCE) &&
(WalkState->Operands[0]->Reference.Opcode ==
- WalkState->Operands[1]->Reference.Opcode))
+ WalkState->Operands[1]->Reference.Opcode) &&
+ (WalkState->Operands[0]->Reference.Offset ==
+ WalkState->Operands[1]->Reference.Offset))
{
Status = AE_OK;
}
@@ -755,7 +758,8 @@ AcpiDsExecEndOp (
* conditional predicate
*/
- if ((WalkState->ControlState) &&
+ if ((ACPI_SUCCESS (Status)) &&
+ (WalkState->ControlState) &&
(WalkState->ControlState->Common.State ==
ACPI_CONTROL_PREDICATE_EXECUTING) &&
(WalkState->ControlState->Control.PredicateOp == Op))
@@ -766,6 +770,20 @@ AcpiDsExecEndOp (
Cleanup:
+
+ /* Invoke exception handler on error */
+
+ if (ACPI_FAILURE (Status) &&
+ AcpiGbl_ExceptionHandler &&
+ !(Status & AE_CODE_CONTROL))
+ {
+ AcpiExExitInterpreter ();
+ Status = AcpiGbl_ExceptionHandler (Status,
+ WalkState->MethodNode->Name.Integer, WalkState->Opcode,
+ WalkState->AmlOffset, NULL);
+ AcpiExEnterInterpreter ();
+ }
+
if (WalkState->ResultObj)
{
/* Break to debugger to display result */
OpenPOWER on IntegriCloud