diff options
-rw-r--r-- | sys/contrib/dev/acpica/Subsystem/Parser/psparse.c | 19 | ||||
-rw-r--r-- | sys/contrib/dev/acpica/psparse.c | 19 |
2 files changed, 38 insertions, 0 deletions
diff --git a/sys/contrib/dev/acpica/Subsystem/Parser/psparse.c b/sys/contrib/dev/acpica/Subsystem/Parser/psparse.c index 4951b7a..74a8cb6 100644 --- a/sys/contrib/dev/acpica/Subsystem/Parser/psparse.c +++ b/sys/contrib/dev/acpica/Subsystem/Parser/psparse.c @@ -1280,6 +1280,7 @@ AcpiPsParseAml ( ACPI_NAMESPACE_NODE *Node = NULL; ACPI_WALK_LIST *PrevWalkList = AcpiGbl_CurrentWalkList; ACPI_OPERAND_OBJECT *ReturnDesc; + ACPI_OPERAND_OBJECT *EffectiveReturnDesc = NULL; ACPI_OPERAND_OBJECT *MthDesc = NULL; ACPI_NAMESPACE_NODE *StartNode; @@ -1424,6 +1425,14 @@ AcpiPsParseAml ( ReturnDesc = WalkState->ReturnDesc; + /* Save the last effective return value */ + + if (CallerReturnDesc && ReturnDesc) + { + EffectiveReturnDesc = ReturnDesc; + AcpiCmAddReference (EffectiveReturnDesc); + } + DEBUG_PRINT (TRACE_PARSE, ("PsParseAml: ReturnValue=%p, State=%p\n", WalkState->ReturnDesc, WalkState)); @@ -1472,6 +1481,16 @@ AcpiPsParseAml ( else if (CallerReturnDesc) { + /* + * Some AML code expects return value w/o ReturnOp. + * Return the saved effective return value instead. + */ + + if (ReturnDesc == NULL && EffectiveReturnDesc != NULL) + { + AcpiCmRemoveReference (ReturnDesc); + ReturnDesc = EffectiveReturnDesc; + } *CallerReturnDesc = ReturnDesc; /* NULL if no return value */ } diff --git a/sys/contrib/dev/acpica/psparse.c b/sys/contrib/dev/acpica/psparse.c index 4951b7a..74a8cb6 100644 --- a/sys/contrib/dev/acpica/psparse.c +++ b/sys/contrib/dev/acpica/psparse.c @@ -1280,6 +1280,7 @@ AcpiPsParseAml ( ACPI_NAMESPACE_NODE *Node = NULL; ACPI_WALK_LIST *PrevWalkList = AcpiGbl_CurrentWalkList; ACPI_OPERAND_OBJECT *ReturnDesc; + ACPI_OPERAND_OBJECT *EffectiveReturnDesc = NULL; ACPI_OPERAND_OBJECT *MthDesc = NULL; ACPI_NAMESPACE_NODE *StartNode; @@ -1424,6 +1425,14 @@ AcpiPsParseAml ( ReturnDesc = WalkState->ReturnDesc; + /* Save the last effective return value */ + + if (CallerReturnDesc && ReturnDesc) + { + EffectiveReturnDesc = ReturnDesc; + AcpiCmAddReference (EffectiveReturnDesc); + } + DEBUG_PRINT (TRACE_PARSE, ("PsParseAml: ReturnValue=%p, State=%p\n", WalkState->ReturnDesc, WalkState)); @@ -1472,6 +1481,16 @@ AcpiPsParseAml ( else if (CallerReturnDesc) { + /* + * Some AML code expects return value w/o ReturnOp. + * Return the saved effective return value instead. + */ + + if (ReturnDesc == NULL && EffectiveReturnDesc != NULL) + { + AcpiCmRemoveReference (ReturnDesc); + ReturnDesc = EffectiveReturnDesc; + } *CallerReturnDesc = ReturnDesc; /* NULL if no return value */ } |