summaryrefslogtreecommitdiffstats
path: root/sys/contrib/dev/acpica/psparse.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/contrib/dev/acpica/psparse.c')
-rw-r--r--sys/contrib/dev/acpica/psparse.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/sys/contrib/dev/acpica/psparse.c b/sys/contrib/dev/acpica/psparse.c
index dc6c729..ce6f530 100644
--- a/sys/contrib/dev/acpica/psparse.c
+++ b/sys/contrib/dev/acpica/psparse.c
@@ -1212,6 +1212,9 @@ AcpiPsParseAml (
ACPI_THREAD_STATE *Thread;
ACPI_THREAD_STATE *PrevWalkList = AcpiGbl_CurrentWalkList;
ACPI_WALK_STATE *PreviousWalkState;
+ ACPI_OPERAND_OBJECT **CallerReturnDesc = WalkState->CallerReturnDesc;
+ ACPI_OPERAND_OBJECT *EffectiveReturnDesc = NULL;
+
ACPI_FUNCTION_TRACE ("PsParseAml");
@@ -1287,6 +1290,14 @@ AcpiPsParseAml (
/* We are done with this walk, move on to the parent if any */
WalkState = AcpiDsPopWalkState (Thread);
+ /* Save the last effective return value */
+
+ if (CallerReturnDesc && WalkState->ReturnDesc)
+ {
+ AcpiUtRemoveReference (EffectiveReturnDesc);
+ EffectiveReturnDesc = WalkState->ReturnDesc;
+ AcpiUtAddReference (EffectiveReturnDesc);
+ }
/* Reset the current scope to the beginning of scope stack */
@@ -1350,6 +1361,17 @@ AcpiPsParseAml (
*/
else if (PreviousWalkState->CallerReturnDesc)
{
+ /*
+ * Some AML code expects return value w/o ReturnOp.
+ * Return the saved effective return value instead.
+ */
+
+ if (PreviousWalkState->ReturnDesc == NULL && EffectiveReturnDesc != NULL)
+ {
+ PreviousWalkState->ReturnDesc = EffectiveReturnDesc;
+ AcpiUtAddReference (PreviousWalkState->ReturnDesc);
+ }
+
*(PreviousWalkState->CallerReturnDesc) = PreviousWalkState->ReturnDesc; /* NULL if no return value */
}
else if (PreviousWalkState->ReturnDesc)
@@ -1364,6 +1386,7 @@ AcpiPsParseAml (
/* Normal exit */
+ AcpiUtRemoveReference (EffectiveReturnDesc);
AcpiExReleaseAllMutexes (Thread);
AcpiUtDeleteGenericState (ACPI_CAST_PTR (ACPI_GENERIC_STATE, Thread));
AcpiGbl_CurrentWalkList = PrevWalkList;
OpenPOWER on IntegriCloud