Local change: emulate a ReturnOp if the AML expects one but it isn't

present.  Some buggy BIOSs do not have a ReturnOp even though it is
required for a function to return a value.
This commit is contained in:
Nate Lawson 2003-12-09 02:55:47 +00:00
parent 552bf8f4e2
commit aba5e23de1

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Module Name: psparse - Parser top level AML parse routines
* $Revision: 139 $
* $Revision: 142 $
*
*****************************************************************************/
@ -534,7 +534,6 @@ AcpiPsParseLoop (
return_ACPI_STATUS (AE_BAD_PARAMETER);
}
ParserState = &WalkState->ParserState;
WalkState->ArgTypes = 0;
@ -604,8 +603,8 @@ AcpiPsParseLoop (
{
/* Get the next opcode from the AML stream */
WalkState->AmlOffset = ACPI_PTR_DIFF (ParserState->Aml,
ParserState->AmlStart);
WalkState->AmlOffset = (UINT32) ACPI_PTR_DIFF (ParserState->Aml,
ParserState->AmlStart);
WalkState->Opcode = AcpiPsPeekOpcode (ParserState);
/*
@ -830,16 +829,15 @@ AcpiPsParseLoop (
WalkState->ArgTypes = 0;
break;
default:
/* Op is not a constant or string, append each argument */
/* Op is not a constant or string, append each argument to the Op */
while (GET_CURRENT_ARG_TYPE (WalkState->ArgTypes) &&
!WalkState->ArgCount)
{
WalkState->AmlOffset = ACPI_PTR_DIFF (ParserState->Aml,
ParserState->AmlStart);
WalkState->AmlOffset = (UINT32) ACPI_PTR_DIFF (ParserState->Aml,
ParserState->AmlStart);
Status = AcpiPsGetNextArg (WalkState, ParserState,
GET_CURRENT_ARG_TYPE (WalkState->ArgTypes), &Arg);
if (ACPI_FAILURE (Status))
@ -855,24 +853,24 @@ AcpiPsParseLoop (
INCREMENT_ARG_LIST (WalkState->ArgTypes);
}
/* Special processing for certain opcodes */
switch (Op->Common.AmlOpcode)
{
case AML_METHOD_OP:
/* For a method, save the length and address of the body */
/*
* Skip parsing of control method or opregion body,
* Skip parsing of control method
* because we don't have enough info in the first pass
* to parse them correctly.
* to parse it correctly.
*
* Save the length and address of the body
*/
Op->Named.Data = ParserState->Aml;
Op->Named.Length = (UINT32) (ParserState->PkgEnd - ParserState->Aml);
/*
* Skip body of method. For OpRegions, we must continue
* parsing because the opregion is not a standalone
* package (We don't know where the end is).
*/
/* Skip body of method */
ParserState->Aml = ParserState->PkgEnd;
WalkState->ArgCount = 0;
break;
@ -886,15 +884,15 @@ AcpiPsParseLoop (
(WalkState->DescendingCallback != AcpiDsExecBeginOp))
{
/*
* Skip parsing of
* Skip parsing of Buffers and Packages
* because we don't have enough info in the first pass
* to parse them correctly.
*/
Op->Named.Data = AmlOpStart;
Op->Named.Length = (UINT32) (ParserState->PkgEnd - AmlOpStart);
/*
* Skip body
*/
/* Skip body */
ParserState->Aml = ParserState->PkgEnd;
WalkState->ArgCount = 0;
}
@ -909,6 +907,7 @@ AcpiPsParseLoop (
break;
default:
/* No action for all other opcodes */
break;
}
@ -1212,9 +1211,10 @@ AcpiPsParseAml (
ACPI_THREAD_STATE *Thread;
ACPI_THREAD_STATE *PrevWalkList = AcpiGbl_CurrentWalkList;
ACPI_WALK_STATE *PreviousWalkState;
#ifndef ACPICA_PEDANTIC
ACPI_OPERAND_OBJECT **CallerReturnDesc = WalkState->CallerReturnDesc;
ACPI_OPERAND_OBJECT *EffectiveReturnDesc = NULL;
#endif
ACPI_FUNCTION_TRACE ("PsParseAml");
@ -1290,6 +1290,8 @@ AcpiPsParseAml (
/* We are done with this walk, move on to the parent if any */
WalkState = AcpiDsPopWalkState (Thread);
#ifndef ACPICA_PEDANTIC
/* Save the last effective return value */
if (CallerReturnDesc && WalkState->ReturnDesc)
@ -1298,6 +1300,7 @@ AcpiPsParseAml (
EffectiveReturnDesc = WalkState->ReturnDesc;
AcpiUtAddReference (EffectiveReturnDesc);
}
#endif
/* Reset the current scope to the beginning of scope stack */
@ -1361,8 +1364,9 @@ AcpiPsParseAml (
*/
else if (PreviousWalkState->CallerReturnDesc)
{
#ifndef ACPICA_PEDANTIC
/*
* Some AML code expects return value w/o ReturnOp.
* Some AML code expects a return value without a ReturnOp.
* Return the saved effective return value instead.
*/
@ -1371,6 +1375,7 @@ AcpiPsParseAml (
PreviousWalkState->ReturnDesc = EffectiveReturnDesc;
AcpiUtAddReference (PreviousWalkState->ReturnDesc);
}
#endif
*(PreviousWalkState->CallerReturnDesc) = PreviousWalkState->ReturnDesc; /* NULL if no return value */
}
@ -1386,7 +1391,9 @@ AcpiPsParseAml (
/* Normal exit */
#ifndef ACPICA_PEDANTIC
AcpiUtRemoveReference (EffectiveReturnDesc);
#endif
AcpiExReleaseAllMutexes (Thread);
AcpiUtDeleteGenericState (ACPI_CAST_PTR (ACPI_GENERIC_STATE, Thread));
AcpiGbl_CurrentWalkList = PrevWalkList;