- Update to version 20151218
CORE-10765

svn path=/trunk/; revision=70472
This commit is contained in:
Thomas Faber 2015-12-31 14:25:35 +00:00
parent 7655453180
commit e6491c8051
160 changed files with 2955 additions and 2735 deletions

View file

@ -61,6 +61,7 @@ list(APPEND ACPICA_SOURCE
acpica/executer/exstoren.c acpica/executer/exstoren.c
acpica/executer/exstorob.c acpica/executer/exstorob.c
acpica/executer/exsystem.c acpica/executer/exsystem.c
acpica/executer/extrace.c
acpica/executer/exutils.c acpica/executer/exutils.c
acpica/hardware/hwacpi.c acpica/hardware/hwacpi.c
acpica/hardware/hwesleep.c acpica/hardware/hwesleep.c

View file

@ -286,8 +286,8 @@ AcpiDsGetBufferFieldArguments (
ExtraDesc = AcpiNsGetSecondaryObject (ObjDesc); ExtraDesc = AcpiNsGetSecondaryObject (ObjDesc);
Node = ObjDesc->BufferField.Node; Node = ObjDesc->BufferField.Node;
ACPI_DEBUG_EXEC (AcpiUtDisplayInitPathname (ACPI_TYPE_BUFFER_FIELD, ACPI_DEBUG_EXEC (AcpiUtDisplayInitPathname (
Node, NULL)); ACPI_TYPE_BUFFER_FIELD, Node, NULL));
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] BufferField Arg Init\n", ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] BufferField Arg Init\n",
AcpiUtGetNodeName (Node))); AcpiUtGetNodeName (Node)));
@ -335,8 +335,8 @@ AcpiDsGetBankFieldArguments (
ExtraDesc = AcpiNsGetSecondaryObject (ObjDesc); ExtraDesc = AcpiNsGetSecondaryObject (ObjDesc);
Node = ObjDesc->BankField.Node; Node = ObjDesc->BankField.Node;
ACPI_DEBUG_EXEC (AcpiUtDisplayInitPathname (ACPI_TYPE_LOCAL_BANK_FIELD, ACPI_DEBUG_EXEC (AcpiUtDisplayInitPathname (
Node, NULL)); ACPI_TYPE_LOCAL_BANK_FIELD, Node, NULL));
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] BankField Arg Init\n", ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] BankField Arg Init\n",
AcpiUtGetNodeName (Node))); AcpiUtGetNodeName (Node)));
@ -384,7 +384,8 @@ AcpiDsGetBufferArguments (
if (!Node) if (!Node)
{ {
ACPI_ERROR ((AE_INFO, ACPI_ERROR ((AE_INFO,
"No pointer back to namespace node in buffer object %p", ObjDesc)); "No pointer back to namespace node in buffer object %p",
ObjDesc));
return_ACPI_STATUS (AE_AML_INTERNAL); return_ACPI_STATUS (AE_AML_INTERNAL);
} }
@ -487,9 +488,11 @@ AcpiDsGetRegionArguments (
Node = ObjDesc->Region.Node; Node = ObjDesc->Region.Node;
ACPI_DEBUG_EXEC (AcpiUtDisplayInitPathname (ACPI_TYPE_REGION, Node, NULL)); ACPI_DEBUG_EXEC (AcpiUtDisplayInitPathname (
ACPI_TYPE_REGION, Node, NULL));
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] OpRegion Arg Init at AML %p\n", ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
"[%4.4s] OpRegion Arg Init at AML %p\n",
AcpiUtGetNodeName (Node), ExtraDesc->Extra.AmlStart)); AcpiUtGetNodeName (Node), ExtraDesc->Extra.AmlStart));
/* Execute the argument AML */ /* Execute the argument AML */
@ -502,7 +505,6 @@ AcpiDsGetRegionArguments (
} }
Status = AcpiUtAddAddressRange (ObjDesc->Region.SpaceId, Status = AcpiUtAddAddressRange (ObjDesc->Region.SpaceId,
ObjDesc->Region.Address, ObjDesc->Region.Length, ObjDesc->Region.Address, ObjDesc->Region.Length, Node);
Node);
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);
} }

View file

@ -119,6 +119,7 @@
#include "amlcode.h" #include "amlcode.h"
#include "acdispat.h" #include "acdispat.h"
#include "acinterp.h" #include "acinterp.h"
#include "acdebug.h"
#define _COMPONENT ACPI_DISPATCHER #define _COMPONENT ACPI_DISPATCHER
ACPI_MODULE_NAME ("dscontrol") ACPI_MODULE_NAME ("dscontrol")
@ -191,9 +192,12 @@ AcpiDsExecBeginControlOp (
* Save a pointer to the predicate for multiple executions * Save a pointer to the predicate for multiple executions
* of a loop * of a loop
*/ */
ControlState->Control.AmlPredicateStart = WalkState->ParserState.Aml - 1; ControlState->Control.AmlPredicateStart =
ControlState->Control.PackageEnd = WalkState->ParserState.PkgEnd; WalkState->ParserState.Aml - 1;
ControlState->Control.Opcode = Op->Common.AmlOpcode; ControlState->Control.PackageEnd =
WalkState->ParserState.PkgEnd;
ControlState->Control.Opcode =
Op->Common.AmlOpcode;
/* Push the control state on this walk's control stack */ /* Push the control state on this walk's control stack */
@ -304,7 +308,8 @@ AcpiDsExecEndControlOp (
* another time * another time
*/ */
Status = AE_CTRL_PENDING; Status = AE_CTRL_PENDING;
WalkState->AmlLastWhile = ControlState->Control.AmlPredicateStart; WalkState->AmlLastWhile =
ControlState->Control.AmlPredicateStart;
break; break;
} }
@ -348,7 +353,8 @@ AcpiDsExecEndControlOp (
* an arg or local), resolve it now because it may * an arg or local), resolve it now because it may
* cease to exist at the end of the method. * cease to exist at the end of the method.
*/ */
Status = AcpiExResolveToValue (&WalkState->Operands [0], WalkState); Status = AcpiExResolveToValue (
&WalkState->Operands [0], WalkState);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
return (Status); return (Status);
@ -377,11 +383,15 @@ AcpiDsExecEndControlOp (
* Allow references created by the Index operator to return * Allow references created by the Index operator to return
* unchanged. * unchanged.
*/ */
if ((ACPI_GET_DESCRIPTOR_TYPE (WalkState->Results->Results.ObjDesc[0]) == ACPI_DESC_TYPE_OPERAND) && if ((ACPI_GET_DESCRIPTOR_TYPE (WalkState->Results->Results.ObjDesc[0]) ==
((WalkState->Results->Results.ObjDesc [0])->Common.Type == ACPI_TYPE_LOCAL_REFERENCE) && ACPI_DESC_TYPE_OPERAND) &&
((WalkState->Results->Results.ObjDesc [0])->Reference.Class != ACPI_REFCLASS_INDEX)) ((WalkState->Results->Results.ObjDesc [0])->Common.Type ==
ACPI_TYPE_LOCAL_REFERENCE) &&
((WalkState->Results->Results.ObjDesc [0])->Reference.Class !=
ACPI_REFCLASS_INDEX))
{ {
Status = AcpiExResolveToValue (&WalkState->Results->Results.ObjDesc [0], WalkState); Status = AcpiExResolveToValue (
&WalkState->Results->Results.ObjDesc [0], WalkState);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
return (Status); return (Status);
@ -399,7 +409,7 @@ AcpiDsExecEndControlOp (
AcpiUtRemoveReference (WalkState->Operands [0]); AcpiUtRemoveReference (WalkState->Operands [0]);
} }
WalkState->Operands [0] = NULL; WalkState->Operands[0] = NULL;
WalkState->NumOperands = 0; WalkState->NumOperands = 0;
WalkState->ReturnDesc = NULL; WalkState->ReturnDesc = NULL;
} }
@ -422,15 +432,7 @@ AcpiDsExecEndControlOp (
case AML_BREAK_POINT_OP: case AML_BREAK_POINT_OP:
/* AcpiDbSignalBreakPoint (WalkState);
* Set the single-step flag. This will cause the debugger (if present)
* to break to the console within the AML debugger at the start of the
* next AML instruction.
*/
ACPI_DEBUGGER_EXEC (
AcpiGbl_CmSingleStep = TRUE);
ACPI_DEBUGGER_EXEC (
AcpiOsPrintf ("**break** Executed AML BreakPoint opcode\n"));
/* Call to the OSL in case OS wants a piece of the action */ /* Call to the OSL in case OS wants a piece of the action */
@ -459,7 +461,8 @@ AcpiDsExecEndControlOp (
/* Was: WalkState->AmlLastWhile = WalkState->ControlState->Control.AmlPredicateStart; */ /* Was: WalkState->AmlLastWhile = WalkState->ControlState->Control.AmlPredicateStart; */
WalkState->AmlLastWhile = WalkState->ControlState->Control.PackageEnd; WalkState->AmlLastWhile =
WalkState->ControlState->Control.PackageEnd;
/* Return status depending on opcode */ /* Return status depending on opcode */

View file

@ -247,6 +247,7 @@ AcpiDsDumpMethodStack (
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
"\n**** Exception %s during execution of method ", "\n**** Exception %s during execution of method ",
AcpiFormatException (Status))); AcpiFormatException (Status)));
AcpiDsPrintNodePathname (WalkState->MethodNode, NULL); AcpiDsPrintNodePathname (WalkState->MethodNode, NULL);
/* Display stack of executing methods */ /* Display stack of executing methods */
@ -292,8 +293,8 @@ AcpiDsDumpMethodStack (
{ {
/* /*
* This method has called another method * This method has called another method
* NOTE: the method call parse subtree is already deleted at this * NOTE: the method call parse subtree is already deleted at
* point, so we cannot disassemble the method invocation. * this point, so we cannot disassemble the method invocation.
*/ */
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DISPATCH, "Call to method ")); ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DISPATCH, "Call to method "));
AcpiDsPrintNodePathname (PreviousMethod, NULL); AcpiDsPrintNodePathname (PreviousMethod, NULL);

View file

@ -187,6 +187,7 @@ AcpiDsCreateExternalRegion (
* insert the name into the namespace. * insert the name into the namespace.
*/ */
AcpiDmAddOpToExternalList (Op, Path, ACPI_TYPE_REGION, 0, 0); AcpiDmAddOpToExternalList (Op, Path, ACPI_TYPE_REGION, 0, 0);
Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_REGION, Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_REGION,
ACPI_IMODE_LOAD_PASS1, ACPI_NS_SEARCH_PARENT, WalkState, Node); ACPI_IMODE_LOAD_PASS1, ACPI_NS_SEARCH_PARENT, WalkState, Node);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
@ -296,9 +297,9 @@ AcpiDsCreateBufferField (
/* Enter the NameString into the namespace */ /* Enter the NameString into the namespace */
Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.String, Status = AcpiNsLookup (WalkState->ScopeInfo,
ACPI_TYPE_ANY, ACPI_IMODE_LOAD_PASS1, Arg->Common.Value.String, ACPI_TYPE_ANY,
Flags, WalkState, &Node); ACPI_IMODE_LOAD_PASS1, Flags, WalkState, &Node);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
ACPI_ERROR_NAMESPACE (Arg->Common.Value.String, Status); ACPI_ERROR_NAMESPACE (Arg->Common.Value.String, Status);
@ -339,8 +340,8 @@ AcpiDsCreateBufferField (
} }
/* /*
* Remember location in AML stream of the field unit opcode and operands -- * Remember location in AML stream of the field unit opcode and operands
* since the buffer and index operands must be evaluated. * -- since the buffer and index operands must be evaluated.
*/ */
SecondDesc = ObjDesc->Common.NextObject; SecondDesc = ObjDesc->Common.NextObject;
SecondDesc->Extra.AmlStart = Op->Named.Data; SecondDesc->Extra.AmlStart = Op->Named.Data;
@ -413,8 +414,8 @@ AcpiDsGetFieldNames (
{ {
case AML_INT_RESERVEDFIELD_OP: case AML_INT_RESERVEDFIELD_OP:
Position = (UINT64) Info->FieldBitPosition Position = (UINT64) Info->FieldBitPosition +
+ (UINT64) Arg->Common.Value.Size; (UINT64) Arg->Common.Value.Size;
if (Position > ACPI_UINT32_MAX) if (Position > ACPI_UINT32_MAX)
{ {
@ -447,11 +448,13 @@ AcpiDsGetFieldNames (
/* AccessAttribute (AttribQuick, AttribByte, etc.) */ /* AccessAttribute (AttribQuick, AttribByte, etc.) */
Info->Attribute = (UINT8) ((Arg->Common.Value.Integer >> 8) & 0xFF); Info->Attribute = (UINT8)
((Arg->Common.Value.Integer >> 8) & 0xFF);
/* AccessLength (for serial/buffer protocols) */ /* AccessLength (for serial/buffer protocols) */
Info->AccessLength = (UINT8) ((Arg->Common.Value.Integer >> 16) & 0xFF); Info->AccessLength = (UINT8)
((Arg->Common.Value.Integer >> 16) & 0xFF);
break; break;
case AML_INT_CONNECTION_OP: case AML_INT_CONNECTION_OP:
@ -525,8 +528,8 @@ AcpiDsGetFieldNames (
/* Keep track of bit position for the next field */ /* Keep track of bit position for the next field */
Position = (UINT64) Info->FieldBitPosition Position = (UINT64) Info->FieldBitPosition +
+ (UINT64) Arg->Common.Value.Size; (UINT64) Arg->Common.Value.Size;
if (Position > ACPI_UINT32_MAX) if (Position > ACPI_UINT32_MAX)
{ {
@ -543,7 +546,8 @@ AcpiDsGetFieldNames (
default: default:
ACPI_ERROR ((AE_INFO, ACPI_ERROR ((AE_INFO,
"Invalid opcode in field list: 0x%X", Arg->Common.AmlOpcode)); "Invalid opcode in field list: 0x%X",
Arg->Common.AmlOpcode));
return_ACPI_STATUS (AE_AML_BAD_OPCODE); return_ACPI_STATUS (AE_AML_BAD_OPCODE);
} }
@ -826,11 +830,12 @@ AcpiDsCreateBankField (
/* /*
* Use Info.DataRegisterNode to store BankField Op * Use Info.DataRegisterNode to store BankField Op
* It's safe because DataRegisterNode will never be used when create bank field * It's safe because DataRegisterNode will never be used when create
* We store AmlStart and AmlLength in the BankField Op for late evaluation * bank field \we store AmlStart and AmlLength in the BankField Op for
* Used in AcpiExPrepFieldValue(Info) * late evaluation. Used in AcpiExPrepFieldValue(Info)
* *
* TBD: Or, should we add a field in ACPI_CREATE_FIELD_INFO, like "void *ParentOp"? * TBD: Or, should we add a field in ACPI_CREATE_FIELD_INFO, like
* "void *ParentOp"?
*/ */
Info.DataRegisterNode = (ACPI_NAMESPACE_NODE*) Op; Info.DataRegisterNode = (ACPI_NAMESPACE_NODE*) Op;

View file

@ -331,17 +331,19 @@ AcpiDsInitializeObjects (
if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_DSDT)) if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_DSDT))
{ {
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT, "\nInitializing Namespace objects:\n")); ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT,
"\nInitializing Namespace objects:\n"));
} }
/* Summary of objects initialized */ /* Summary of objects initialized */
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT, ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT,
"Table [%4.4s:%8.8s] (id %.2X) - %4u Objects with %3u Devices, " "Table [%4.4s: %-8.8s] (id %.2X) - %4u Objects with %3u Devices, "
"%3u Regions, %4u Methods (%u/%u/%u Serial/Non/Cvt)\n", "%3u Regions, %4u Methods (%u/%u/%u Serial/Non/Cvt)\n",
Table->Signature, Table->OemTableId, OwnerId, Info.ObjectCount, Info.DeviceCount, Table->Signature, Table->OemTableId, OwnerId, Info.ObjectCount,
Info.OpRegionCount, Info.MethodCount, Info.SerialMethodCount, Info.DeviceCount,Info.OpRegionCount, Info.MethodCount,
Info.NonSerialMethodCount, Info.SerializedMethodCount)); Info.SerialMethodCount, Info.NonSerialMethodCount,
Info.SerializedMethodCount));
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "%u Methods, %u Regions\n", ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "%u Methods, %u Regions\n",
Info.MethodCount, Info.OpRegionCount)); Info.MethodCount, Info.OpRegionCount));

View file

@ -199,8 +199,8 @@ AcpiDsAutoSerializeMethod (
return_ACPI_STATUS (AE_NO_MEMORY); return_ACPI_STATUS (AE_NO_MEMORY);
} }
Status = AcpiDsInitAmlWalk (WalkState, Op, Node, ObjDesc->Method.AmlStart, Status = AcpiDsInitAmlWalk (WalkState, Op, Node,
ObjDesc->Method.AmlLength, NULL, 0); ObjDesc->Method.AmlStart, ObjDesc->Method.AmlLength, NULL, 0);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
AcpiDsDeleteWalkState (WalkState); AcpiDsDeleteWalkState (WalkState);
@ -472,10 +472,12 @@ AcpiDsBeginMethodExecution (
*/ */
if (WalkState && if (WalkState &&
(!(ObjDesc->Method.InfoFlags & ACPI_METHOD_IGNORE_SYNC_LEVEL)) && (!(ObjDesc->Method.InfoFlags & ACPI_METHOD_IGNORE_SYNC_LEVEL)) &&
(WalkState->Thread->CurrentSyncLevel > ObjDesc->Method.Mutex->Mutex.SyncLevel)) (WalkState->Thread->CurrentSyncLevel >
ObjDesc->Method.Mutex->Mutex.SyncLevel))
{ {
ACPI_ERROR ((AE_INFO, ACPI_ERROR ((AE_INFO,
"Cannot acquire Mutex for method [%4.4s], current SyncLevel is too large (%u)", "Cannot acquire Mutex for method [%4.4s]"
", current SyncLevel is too large (%u)",
AcpiUtGetNodeName (MethodNode), AcpiUtGetNodeName (MethodNode),
WalkState->Thread->CurrentSyncLevel)); WalkState->Thread->CurrentSyncLevel));
@ -488,14 +490,15 @@ AcpiDsBeginMethodExecution (
*/ */
if (!WalkState || if (!WalkState ||
!ObjDesc->Method.Mutex->Mutex.ThreadId || !ObjDesc->Method.Mutex->Mutex.ThreadId ||
(WalkState->Thread->ThreadId != ObjDesc->Method.Mutex->Mutex.ThreadId)) (WalkState->Thread->ThreadId !=
ObjDesc->Method.Mutex->Mutex.ThreadId))
{ {
/* /*
* Acquire the method mutex. This releases the interpreter if we * Acquire the method mutex. This releases the interpreter if we
* block (and reacquires it before it returns) * block (and reacquires it before it returns)
*/ */
Status = AcpiExSystemWaitMutex (ObjDesc->Method.Mutex->Mutex.OsMutex, Status = AcpiExSystemWaitMutex (
ACPI_WAIT_FOREVER); ObjDesc->Method.Mutex->Mutex.OsMutex, ACPI_WAIT_FOREVER);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);
@ -508,8 +511,22 @@ AcpiDsBeginMethodExecution (
ObjDesc->Method.Mutex->Mutex.OriginalSyncLevel = ObjDesc->Method.Mutex->Mutex.OriginalSyncLevel =
WalkState->Thread->CurrentSyncLevel; WalkState->Thread->CurrentSyncLevel;
ObjDesc->Method.Mutex->Mutex.ThreadId = WalkState->Thread->ThreadId; ObjDesc->Method.Mutex->Mutex.ThreadId =
WalkState->Thread->CurrentSyncLevel = ObjDesc->Method.SyncLevel; WalkState->Thread->ThreadId;
/*
* Update the current SyncLevel only if this is not an auto-
* serialized method. In the auto case, we have to ignore
* the sync level for the method mutex (created for the
* auto-serialization) because we have no idea of what the
* sync level should be. Therefore, just ignore it.
*/
if (!(ObjDesc->Method.InfoFlags &
ACPI_METHOD_IGNORE_SYNC_LEVEL))
{
WalkState->Thread->CurrentSyncLevel =
ObjDesc->Method.SyncLevel;
}
} }
else else
{ {
@ -587,7 +604,8 @@ AcpiDsCallControlMethod (
ACPI_FUNCTION_TRACE_PTR (DsCallControlMethod, ThisWalkState); ACPI_FUNCTION_TRACE_PTR (DsCallControlMethod, ThisWalkState);
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Calling method %p, currentstate=%p\n", ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
"Calling method %p, currentstate=%p\n",
ThisWalkState->PrevOp, ThisWalkState)); ThisWalkState->PrevOp, ThisWalkState));
/* /*
@ -607,8 +625,8 @@ AcpiDsCallControlMethod (
/* Init for new method, possibly wait on method mutex */ /* Init for new method, possibly wait on method mutex */
Status = AcpiDsBeginMethodExecution (MethodNode, ObjDesc, Status = AcpiDsBeginMethodExecution (
ThisWalkState); MethodNode, ObjDesc, ThisWalkState);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);
@ -616,8 +634,8 @@ AcpiDsCallControlMethod (
/* Begin method parse/execution. Create a new walk state */ /* Begin method parse/execution. Create a new walk state */
NextWalkState = AcpiDsCreateWalkState (ObjDesc->Method.OwnerId, NextWalkState = AcpiDsCreateWalkState (
NULL, ObjDesc, Thread); ObjDesc->Method.OwnerId, NULL, ObjDesc, Thread);
if (!NextWalkState) if (!NextWalkState)
{ {
Status = AE_NO_MEMORY; Status = AE_NO_MEMORY;
@ -842,7 +860,8 @@ AcpiDsTerminateControlMethod (
WalkState->Thread->CurrentSyncLevel = WalkState->Thread->CurrentSyncLevel =
MethodDesc->Method.Mutex->Mutex.OriginalSyncLevel; MethodDesc->Method.Mutex->Mutex.OriginalSyncLevel;
AcpiOsReleaseMutex (MethodDesc->Method.Mutex->Mutex.OsMutex); AcpiOsReleaseMutex (
MethodDesc->Method.Mutex->Mutex.OsMutex);
MethodDesc->Method.Mutex->Mutex.ThreadId = 0; MethodDesc->Method.Mutex->Mutex.ThreadId = 0;
} }
} }
@ -872,7 +891,8 @@ AcpiDsTerminateControlMethod (
if (MethodDesc->Method.InfoFlags & ACPI_METHOD_MODIFIED_NAMESPACE) if (MethodDesc->Method.InfoFlags & ACPI_METHOD_MODIFIED_NAMESPACE)
{ {
AcpiNsDeleteNamespaceByOwner (MethodDesc->Method.OwnerId); AcpiNsDeleteNamespaceByOwner (MethodDesc->Method.OwnerId);
MethodDesc->Method.InfoFlags &= ~ACPI_METHOD_MODIFIED_NAMESPACE; MethodDesc->Method.InfoFlags &=
~ACPI_METHOD_MODIFIED_NAMESPACE;
} }
} }
} }
@ -920,7 +940,8 @@ AcpiDsTerminateControlMethod (
if (WalkState) if (WalkState)
{ {
ACPI_INFO ((AE_INFO, ACPI_INFO ((AE_INFO,
"Marking method %4.4s as Serialized because of AE_ALREADY_EXISTS error", "Marking method %4.4s as Serialized "
"because of AE_ALREADY_EXISTS error",
WalkState->MethodNode->Name.Ascii)); WalkState->MethodNode->Name.Ascii));
} }
@ -935,7 +956,9 @@ AcpiDsTerminateControlMethod (
* marking the method permanently as Serialized when the last * marking the method permanently as Serialized when the last
* thread exits here. * thread exits here.
*/ */
MethodDesc->Method.InfoFlags &= ~ACPI_METHOD_SERIALIZED_PENDING; MethodDesc->Method.InfoFlags &=
~ACPI_METHOD_SERIALIZED_PENDING;
MethodDesc->Method.InfoFlags |= MethodDesc->Method.InfoFlags |=
(ACPI_METHOD_SERIALIZED | ACPI_METHOD_IGNORE_SYNC_LEVEL); (ACPI_METHOD_SERIALIZED | ACPI_METHOD_IGNORE_SYNC_LEVEL);
MethodDesc->Method.SyncLevel = 0; MethodDesc->Method.SyncLevel = 0;

View file

@ -182,7 +182,9 @@ AcpiDsMethodDataInit (
for (i = 0; i < ACPI_METHOD_NUM_ARGS; i++) for (i = 0; i < ACPI_METHOD_NUM_ARGS; i++)
{ {
ACPI_MOVE_32_TO_32 (&WalkState->Arguments[i].Name, NAMEOF_ARG_NTE); ACPI_MOVE_32_TO_32 (&WalkState->Arguments[i].Name,
NAMEOF_ARG_NTE);
WalkState->Arguments[i].Name.Integer |= (i << 24); WalkState->Arguments[i].Name.Integer |= (i << 24);
WalkState->Arguments[i].DescriptorType = ACPI_DESC_TYPE_NAMED; WalkState->Arguments[i].DescriptorType = ACPI_DESC_TYPE_NAMED;
WalkState->Arguments[i].Type = ACPI_TYPE_ANY; WalkState->Arguments[i].Type = ACPI_TYPE_ANY;
@ -193,7 +195,8 @@ AcpiDsMethodDataInit (
for (i = 0; i < ACPI_METHOD_NUM_LOCALS; i++) for (i = 0; i < ACPI_METHOD_NUM_LOCALS; i++)
{ {
ACPI_MOVE_32_TO_32 (&WalkState->LocalVariables[i].Name, NAMEOF_LOCAL_NTE); ACPI_MOVE_32_TO_32 (&WalkState->LocalVariables[i].Name,
NAMEOF_LOCAL_NTE);
WalkState->LocalVariables[i].Name.Integer |= (i << 24); WalkState->LocalVariables[i].Name.Integer |= (i << 24);
WalkState->LocalVariables[i].DescriptorType = ACPI_DESC_TYPE_NAMED; WalkState->LocalVariables[i].DescriptorType = ACPI_DESC_TYPE_NAMED;
@ -293,7 +296,8 @@ AcpiDsMethodDataInitArgs (
if (!Params) if (!Params)
{ {
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "No param list passed to method\n")); ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
"No parameter list passed to method\n"));
return_ACPI_STATUS (AE_OK); return_ACPI_STATUS (AE_OK);
} }
@ -308,8 +312,8 @@ AcpiDsMethodDataInitArgs (
* Store the argument in the method/walk descriptor. * Store the argument in the method/walk descriptor.
* Do not copy the arg in order to implement call by reference * Do not copy the arg in order to implement call by reference
*/ */
Status = AcpiDsMethodDataSetValue (ACPI_REFCLASS_ARG, Index, Status = AcpiDsMethodDataSetValue (
Params[Index], WalkState); ACPI_REFCLASS_ARG, Index, Params[Index], WalkState);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);
@ -699,7 +703,8 @@ AcpiDsStoreObjectToLocal (
NewObjDesc = ObjDesc; NewObjDesc = ObjDesc;
if (ObjDesc->Common.ReferenceCount > 1) if (ObjDesc->Common.ReferenceCount > 1)
{ {
Status = AcpiUtCopyIobjectToIobject (ObjDesc, &NewObjDesc, WalkState); Status = AcpiUtCopyIobjectToIobject (
ObjDesc, &NewObjDesc, WalkState);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);
@ -736,9 +741,12 @@ AcpiDsStoreObjectToLocal (
* If we have a valid reference object that came from RefOf(), * If we have a valid reference object that came from RefOf(),
* do the indirect store * do the indirect store
*/ */
if ((ACPI_GET_DESCRIPTOR_TYPE (CurrentObjDesc) == ACPI_DESC_TYPE_OPERAND) && if ((ACPI_GET_DESCRIPTOR_TYPE (CurrentObjDesc) ==
(CurrentObjDesc->Common.Type == ACPI_TYPE_LOCAL_REFERENCE) && ACPI_DESC_TYPE_OPERAND) &&
(CurrentObjDesc->Reference.Class == ACPI_REFCLASS_REFOF)) (CurrentObjDesc->Common.Type ==
ACPI_TYPE_LOCAL_REFERENCE) &&
(CurrentObjDesc->Reference.Class ==
ACPI_REFCLASS_REFOF))
{ {
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
"Arg (%p) is an ObjRef(Node), storing in node %p\n", "Arg (%p) is an ObjRef(Node), storing in node %p\n",
@ -759,6 +767,7 @@ AcpiDsStoreObjectToLocal (
{ {
AcpiUtRemoveReference (NewObjDesc); AcpiUtRemoveReference (NewObjDesc);
} }
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);
} }
} }

View file

@ -300,8 +300,8 @@ AcpiDsBuildInternalObject (
return_ACPI_STATUS (AE_NO_MEMORY); return_ACPI_STATUS (AE_NO_MEMORY);
} }
Status = AcpiDsInitObjectFromOp (WalkState, Op, Op->Common.AmlOpcode, Status = AcpiDsInitObjectFromOp (
&ObjDesc); WalkState, Op, Op->Common.AmlOpcode, &ObjDesc);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
AcpiUtRemoveReference (ObjDesc); AcpiUtRemoveReference (ObjDesc);
@ -408,8 +408,8 @@ AcpiDsBuildInternalBufferObj (
} }
else else
{ {
ObjDesc->Buffer.Pointer = ACPI_ALLOCATE_ZEROED ( ObjDesc->Buffer.Pointer =
ObjDesc->Buffer.Length); ACPI_ALLOCATE_ZEROED (ObjDesc->Buffer.Length);
if (!ObjDesc->Buffer.Pointer) if (!ObjDesc->Buffer.Pointer)
{ {
AcpiUtDeleteObjectDesc (ObjDesc); AcpiUtDeleteObjectDesc (ObjDesc);
@ -540,8 +540,8 @@ AcpiDsBuildInternalPackageObj (
* invocation, so we special case it here * invocation, so we special case it here
*/ */
Arg->Common.AmlOpcode = AML_INT_NAMEPATH_OP; Arg->Common.AmlOpcode = AML_INT_NAMEPATH_OP;
Status = AcpiDsBuildInternalObject (WalkState, Arg, Status = AcpiDsBuildInternalObject (
&ObjDesc->Package.Elements[i]); WalkState, Arg, &ObjDesc->Package.Elements[i]);
} }
else else
{ {
@ -553,8 +553,8 @@ AcpiDsBuildInternalPackageObj (
} }
else else
{ {
Status = AcpiDsBuildInternalObject (WalkState, Arg, Status = AcpiDsBuildInternalObject (
&ObjDesc->Package.Elements[i]); WalkState, Arg, &ObjDesc->Package.Elements[i]);
} }
if (*ObjDescPtr) if (*ObjDescPtr)
@ -611,7 +611,8 @@ AcpiDsBuildInternalPackageObj (
} }
ACPI_INFO ((AE_INFO, ACPI_INFO ((AE_INFO,
"Actual Package length (%u) is larger than NumElements field (%u), truncated", "Actual Package length (%u) is larger than "
"NumElements field (%u), truncated",
i, ElementCount)); i, ElementCount));
} }
else if (i < ElementCount) else if (i < ElementCount)
@ -621,7 +622,8 @@ AcpiDsBuildInternalPackageObj (
* Note: this is not an error, the package is padded out with NULLs. * Note: this is not an error, the package is padded out with NULLs.
*/ */
ACPI_DEBUG_PRINT ((ACPI_DB_INFO, ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
"Package List length (%u) smaller than NumElements count (%u), padded with null elements\n", "Package List length (%u) smaller than NumElements "
"count (%u), padded with null elements\n",
i, ElementCount)); i, ElementCount));
} }
@ -677,8 +679,8 @@ AcpiDsCreateNode (
/* Build an internal object for the argument(s) */ /* Build an internal object for the argument(s) */
Status = AcpiDsBuildInternalObject (WalkState, Op->Common.Value.Arg, Status = AcpiDsBuildInternalObject (
&ObjDesc); WalkState, Op->Common.Value.Arg, &ObjDesc);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);
@ -750,8 +752,8 @@ AcpiDsInitObjectFromOp (
/* /*
* Defer evaluation of Buffer TermArg operand * Defer evaluation of Buffer TermArg operand
*/ */
ObjDesc->Buffer.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjDesc->Buffer.Node = ACPI_CAST_PTR (
WalkState->Operands[0]); ACPI_NAMESPACE_NODE, WalkState->Operands[0]);
ObjDesc->Buffer.AmlStart = Op->Named.Data; ObjDesc->Buffer.AmlStart = Op->Named.Data;
ObjDesc->Buffer.AmlLength = Op->Named.Length; ObjDesc->Buffer.AmlLength = Op->Named.Length;
break; break;
@ -760,8 +762,8 @@ AcpiDsInitObjectFromOp (
/* /*
* Defer evaluation of Package TermArg operand * Defer evaluation of Package TermArg operand
*/ */
ObjDesc->Package.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjDesc->Package.Node = ACPI_CAST_PTR (
WalkState->Operands[0]); ACPI_NAMESPACE_NODE, WalkState->Operands[0]);
ObjDesc->Package.AmlStart = Op->Named.Data; ObjDesc->Package.AmlStart = Op->Named.Data;
ObjDesc->Package.AmlLength = Op->Named.Length; ObjDesc->Package.AmlLength = Op->Named.Length;
break; break;

View file

@ -331,8 +331,8 @@ AcpiDsInitBufferField (
* For FieldFlags, use LOCK_RULE = 0 (NO_LOCK), * For FieldFlags, use LOCK_RULE = 0 (NO_LOCK),
* UPDATE_RULE = 0 (UPDATE_PRESERVE) * UPDATE_RULE = 0 (UPDATE_PRESERVE)
*/ */
Status = AcpiExPrepCommonFieldObject (ObjDesc, FieldFlags, 0, Status = AcpiExPrepCommonFieldObject (
BitOffset, BitCount); ObjDesc, FieldFlags, 0, BitOffset, BitCount);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
goto Cleanup; goto Cleanup;
@ -429,8 +429,8 @@ AcpiDsEvalBufferFieldOperands (
/* Resolve the operands */ /* Resolve the operands */
Status = AcpiExResolveOperands (Op->Common.AmlOpcode, Status = AcpiExResolveOperands (
ACPI_WALK_OPERANDS, WalkState); Op->Common.AmlOpcode, ACPI_WALK_OPERANDS, WalkState);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
ACPI_ERROR ((AE_INFO, "(%s) bad operand(s), status 0x%X", ACPI_ERROR ((AE_INFO, "(%s) bad operand(s), status 0x%X",
@ -515,8 +515,8 @@ AcpiDsEvalRegionOperands (
/* Resolve the length and address operands to numbers */ /* Resolve the length and address operands to numbers */
Status = AcpiExResolveOperands (Op->Common.AmlOpcode, Status = AcpiExResolveOperands (
ACPI_WALK_OPERANDS, WalkState); Op->Common.AmlOpcode, ACPI_WALK_OPERANDS, WalkState);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);
@ -548,14 +548,12 @@ AcpiDsEvalRegionOperands (
AcpiUtRemoveReference (OperandDesc); AcpiUtRemoveReference (OperandDesc);
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "RgnObj %p Addr %8.8X%8.8X Len %X\n", ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "RgnObj %p Addr %8.8X%8.8X Len %X\n",
ObjDesc, ObjDesc, ACPI_FORMAT_UINT64 (ObjDesc->Region.Address),
ACPI_FORMAT_UINT64 (ObjDesc->Region.Address),
ObjDesc->Region.Length)); ObjDesc->Region.Length));
/* Now the address and length are valid for this opregion */ /* Now the address and length are valid for this opregion */
ObjDesc->Region.Flags |= AOPOBJ_DATA_VALID; ObjDesc->Region.Flags |= AOPOBJ_DATA_VALID;
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);
} }
@ -618,8 +616,8 @@ AcpiDsEvalTableRegionOperands (
* Resolve the Signature string, OemId string, * Resolve the Signature string, OemId string,
* and OemTableId string operands * and OemTableId string operands
*/ */
Status = AcpiExResolveOperands (Op->Common.AmlOpcode, Status = AcpiExResolveOperands (
ACPI_WALK_OPERANDS, WalkState); Op->Common.AmlOpcode, ACPI_WALK_OPERANDS, WalkState);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
goto Cleanup; goto Cleanup;
@ -750,13 +748,15 @@ AcpiDsEvalDataObjectOperands (
{ {
case AML_BUFFER_OP: case AML_BUFFER_OP:
Status = AcpiDsBuildInternalBufferObj (WalkState, Op, Length, &ObjDesc); Status = AcpiDsBuildInternalBufferObj (
WalkState, Op, Length, &ObjDesc);
break; break;
case AML_PACKAGE_OP: case AML_PACKAGE_OP:
case AML_VAR_PACKAGE_OP: case AML_VAR_PACKAGE_OP:
Status = AcpiDsBuildInternalPackageObj (WalkState, Op, Length, &ObjDesc); Status = AcpiDsBuildInternalPackageObj (
WalkState, Op, Length, &ObjDesc);
break; break;
default: default:

View file

@ -338,7 +338,8 @@ AcpiDsIsResultUsed (
* If we are executing the predicate AND this is the predicate op, * If we are executing the predicate AND this is the predicate op,
* we will use the return value * we will use the return value
*/ */
if ((WalkState->ControlState->Common.State == ACPI_CONTROL_PREDICATE_EXECUTING) && if ((WalkState->ControlState->Common.State ==
ACPI_CONTROL_PREDICATE_EXECUTING) &&
(WalkState->ControlState->Control.PredicateOp == Op)) (WalkState->ControlState->Control.PredicateOp == Op))
{ {
goto ResultUsed; goto ResultUsed;
@ -595,8 +596,8 @@ AcpiDsCreateOperand (
/* Get the entire name string from the AML stream */ /* Get the entire name string from the AML stream */
Status = AcpiExGetNameString (ACPI_TYPE_ANY, Arg->Common.Value.Buffer, Status = AcpiExGetNameString (ACPI_TYPE_ANY,
&NameString, &NameLength); Arg->Common.Value.Buffer, &NameString, &NameLength);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
@ -616,7 +617,8 @@ AcpiDsCreateOperand (
*/ */
if ((WalkState->DeferredNode) && if ((WalkState->DeferredNode) &&
(WalkState->DeferredNode->Type == ACPI_TYPE_BUFFER_FIELD) && (WalkState->DeferredNode->Type == ACPI_TYPE_BUFFER_FIELD) &&
(ArgIndex == (UINT32) ((WalkState->Opcode == AML_CREATE_FIELD_OP) ? 3 : 2))) (ArgIndex == (UINT32)
((WalkState->Opcode == AML_CREATE_FIELD_OP) ? 3 : 2)))
{ {
ObjDesc = ACPI_CAST_PTR ( ObjDesc = ACPI_CAST_PTR (
ACPI_OPERAND_OBJECT, WalkState->DeferredNode); ACPI_OPERAND_OBJECT, WalkState->DeferredNode);
@ -632,6 +634,7 @@ AcpiDsCreateOperand (
*/ */
ParentOp = Arg->Common.Parent; ParentOp = Arg->Common.Parent;
OpInfo = AcpiPsGetOpcodeInfo (ParentOp->Common.AmlOpcode); OpInfo = AcpiPsGetOpcodeInfo (ParentOp->Common.AmlOpcode);
if ((OpInfo->Flags & AML_NSNODE) && if ((OpInfo->Flags & AML_NSNODE) &&
(ParentOp->Common.AmlOpcode != AML_INT_METHODCALL_OP) && (ParentOp->Common.AmlOpcode != AML_INT_METHODCALL_OP) &&
(ParentOp->Common.AmlOpcode != AML_REGION_OP) && (ParentOp->Common.AmlOpcode != AML_REGION_OP) &&
@ -650,8 +653,7 @@ AcpiDsCreateOperand (
Status = AcpiNsLookup (WalkState->ScopeInfo, NameString, Status = AcpiNsLookup (WalkState->ScopeInfo, NameString,
ACPI_TYPE_ANY, InterpreterMode, ACPI_TYPE_ANY, InterpreterMode,
ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, WalkState,
WalkState,
ACPI_CAST_INDIRECT_PTR (ACPI_NAMESPACE_NODE, &ObjDesc)); ACPI_CAST_INDIRECT_PTR (ACPI_NAMESPACE_NODE, &ObjDesc));
/* /*
* The only case where we pass through (ignore) a NOT_FOUND * The only case where we pass through (ignore) a NOT_FOUND
@ -714,7 +716,8 @@ AcpiDsCreateOperand (
{ {
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);
} }
ACPI_DEBUGGER_EXEC (AcpiDbDisplayArgumentObject (ObjDesc, WalkState));
AcpiDbDisplayArgumentObject (ObjDesc, WalkState);
} }
else else
{ {
@ -747,13 +750,14 @@ AcpiDsCreateOperand (
return_ACPI_STATUS (AE_NOT_IMPLEMENTED); return_ACPI_STATUS (AE_NOT_IMPLEMENTED);
} }
if ((OpInfo->Flags & AML_HAS_RETVAL) || (Arg->Common.Flags & ACPI_PARSEOP_IN_STACK)) if ((OpInfo->Flags & AML_HAS_RETVAL) ||
(Arg->Common.Flags & ACPI_PARSEOP_IN_STACK))
{ {
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
"Argument previously created, already stacked\n")); "Argument previously created, already stacked\n"));
ACPI_DEBUGGER_EXEC (AcpiDbDisplayArgumentObject ( AcpiDbDisplayArgumentObject (
WalkState->Operands [WalkState->NumOperands - 1], WalkState)); WalkState->Operands [WalkState->NumOperands - 1], WalkState);
/* /*
* Use value that was already previously returned * Use value that was already previously returned
@ -800,7 +804,7 @@ AcpiDsCreateOperand (
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);
} }
ACPI_DEBUGGER_EXEC (AcpiDbDisplayArgumentObject (ObjDesc, WalkState)); AcpiDbDisplayArgumentObject (ObjDesc, WalkState);
} }
return_ACPI_STATUS (AE_OK); return_ACPI_STATUS (AE_OK);
@ -970,7 +974,8 @@ AcpiDsEvaluateNamePath (
AcpiUtRemoveReference (*Operand); AcpiUtRemoveReference (*Operand);
Status = AcpiUtCopyIobjectToIobject (*Operand, &NewObjDesc, WalkState); Status = AcpiUtCopyIobjectToIobject (
*Operand, &NewObjDesc, WalkState);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
goto Exit; goto Exit;

View file

@ -261,12 +261,13 @@ AcpiDsGetPredicateValue (
Cleanup: Cleanup:
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Completed a predicate eval=%X Op=%p\n", ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
"Completed a predicate eval=%X Op=%p\n",
WalkState->ControlState->Common.Value, WalkState->Op)); WalkState->ControlState->Common.Value, WalkState->Op));
/* Break to debugger to display result */ /* Break to debugger to display result */
ACPI_DEBUGGER_EXEC (AcpiDbDisplayResultObject (LocalObjDesc, WalkState)); AcpiDbDisplayResultObject (LocalObjDesc, WalkState);
/* /*
* Delete the predicate result object (we know that * Delete the predicate result object (we know that
@ -358,10 +359,12 @@ AcpiDsExecBeginOp (
(WalkState->ControlState->Common.State == (WalkState->ControlState->Common.State ==
ACPI_CONTROL_CONDITIONAL_EXECUTING)) ACPI_CONTROL_CONDITIONAL_EXECUTING))
{ {
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Exec predicate Op=%p State=%p\n", ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
"Exec predicate Op=%p State=%p\n",
Op, WalkState)); Op, WalkState));
WalkState->ControlState->Common.State = ACPI_CONTROL_PREDICATE_EXECUTING; WalkState->ControlState->Common.State =
ACPI_CONTROL_PREDICATE_EXECUTING;
/* Save start of predicate */ /* Save start of predicate */
@ -409,8 +412,8 @@ AcpiDsExecBeginOp (
} }
else else
{ {
Status = AcpiDsScopeStackPush (Op->Named.Node, Status = AcpiDsScopeStackPush (
Op->Named.Node->Type, WalkState); Op->Named.Node, Op->Named.Node->Type, WalkState);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);
@ -490,8 +493,11 @@ AcpiDsExecEndOp (
/* Call debugger for single step support (DEBUG build only) */ /* Call debugger for single step support (DEBUG build only) */
ACPI_DEBUGGER_EXEC (Status = AcpiDbSingleStep (WalkState, Op, OpClass)); Status = AcpiDbSingleStep (WalkState, Op, OpClass);
ACPI_DEBUGGER_EXEC (if (ACPI_FAILURE (Status)) {return_ACPI_STATUS (Status);}); if (ACPI_FAILURE (Status))
{
return_ACPI_STATUS (Status);
}
/* Decode the Opcode Class */ /* Decode the Opcode Class */
@ -606,7 +612,8 @@ AcpiDsExecEndOp (
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
"Method Reference in a Package, Op=%p\n", Op)); "Method Reference in a Package, Op=%p\n", Op));
Op->Common.Node = (ACPI_NAMESPACE_NODE *) Op->Asl.Value.Arg->Asl.Node; Op->Common.Node = (ACPI_NAMESPACE_NODE *)
Op->Asl.Value.Arg->Asl.Node;
AcpiUtAddReference (Op->Asl.Value.Arg->Asl.Node->Object); AcpiUtAddReference (Op->Asl.Value.Arg->Asl.Node->Object);
return_ACPI_STATUS (AE_OK); return_ACPI_STATUS (AE_OK);
} }
@ -688,12 +695,12 @@ AcpiDsExecEndOp (
* Put the Node on the object stack (Contains the ACPI Name * Put the Node on the object stack (Contains the ACPI Name
* of this object) * of this object)
*/ */
WalkState->Operands[0] = (void *) Op->Common.Parent->Common.Node; WalkState->Operands[0] = (void *)
Op->Common.Parent->Common.Node;
WalkState->NumOperands = 1; WalkState->NumOperands = 1;
Status = AcpiDsCreateNode (WalkState, Status = AcpiDsCreateNode (WalkState,
Op->Common.Parent->Common.Node, Op->Common.Parent->Common.Node, Op->Common.Parent);
Op->Common.Parent);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
break; break;
@ -786,7 +793,8 @@ AcpiDsExecEndOp (
default: default:
ACPI_ERROR ((AE_INFO, ACPI_ERROR ((AE_INFO,
"Unimplemented opcode, class=0x%X type=0x%X Opcode=0x%X Op=%p", "Unimplemented opcode, class=0x%X "
"type=0x%X Opcode=0x%X Op=%p",
OpClass, OpType, Op->Common.AmlOpcode, Op)); OpClass, OpType, Op->Common.AmlOpcode, Op));
Status = AE_NOT_IMPLEMENTED; Status = AE_NOT_IMPLEMENTED;
@ -821,8 +829,7 @@ Cleanup:
{ {
/* Break to debugger to display result */ /* Break to debugger to display result */
ACPI_DEBUGGER_EXEC (AcpiDbDisplayResultObject (WalkState->ResultObj, AcpiDbDisplayResultObject (WalkState->ResultObj,WalkState);
WalkState));
/* /*
* Delete the result op if and only if: * Delete the result op if and only if:

View file

@ -260,7 +260,8 @@ AcpiDsLoad1BeginOp (
ObjectType = WalkState->OpInfo->ObjectType; ObjectType = WalkState->OpInfo->ObjectType;
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
"State=%p Op=%p [%s]\n", WalkState, Op, AcpiUtGetTypeName (ObjectType))); "State=%p Op=%p [%s]\n", WalkState, Op,
AcpiUtGetTypeName (ObjectType)));
switch (WalkState->Opcode) switch (WalkState->Opcode)
{ {
@ -444,7 +445,8 @@ AcpiDsLoad1BeginOp (
if (AcpiNsOpensScope (ObjectType)) if (AcpiNsOpensScope (ObjectType))
{ {
Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState); Status = AcpiDsScopeStackPush (
Node, ObjectType, WalkState);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);
@ -566,7 +568,8 @@ AcpiDsLoad1EndOp (
if (Op->Common.AmlOpcode == AML_REGION_OP) if (Op->Common.AmlOpcode == AML_REGION_OP)
{ {
Status = AcpiExCreateRegion (Op->Named.Data, Op->Named.Length, Status = AcpiExCreateRegion (Op->Named.Data, Op->Named.Length,
(ACPI_ADR_SPACE_TYPE) ((Op->Common.Value.Arg)->Common.Value.Integer), (ACPI_ADR_SPACE_TYPE)
((Op->Common.Value.Arg)->Common.Value.Integer),
WalkState); WalkState);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
@ -628,7 +631,8 @@ AcpiDsLoad1EndOp (
WalkState->Operands[0] = ACPI_CAST_PTR (void, Op->Named.Node); WalkState->Operands[0] = ACPI_CAST_PTR (void, Op->Named.Node);
WalkState->NumOperands = 1; WalkState->NumOperands = 1;
Status = AcpiDsCreateOperands (WalkState, Op->Common.Value.Arg); Status = AcpiDsCreateOperands (
WalkState, Op->Common.Value.Arg);
if (ACPI_SUCCESS (Status)) if (ACPI_SUCCESS (Status))
{ {
Status = AcpiExCreateMethod (Op->Named.Data, Status = AcpiExCreateMethod (Op->Named.Data,

View file

@ -579,8 +579,8 @@ AcpiDsLoad2EndOp (
{ {
case AML_INDEX_FIELD_OP: case AML_INDEX_FIELD_OP:
Status = AcpiDsCreateIndexField (Op, (ACPI_HANDLE) Arg->Common.Node, Status = AcpiDsCreateIndexField (
WalkState); Op, (ACPI_HANDLE) Arg->Common.Node, WalkState);
break; break;
case AML_BANK_FIELD_OP: case AML_BANK_FIELD_OP:
@ -690,8 +690,8 @@ AcpiDsLoad2EndOp (
* Executing a method: initialize the region and unlock * Executing a method: initialize the region and unlock
* the interpreter * the interpreter
*/ */
Status = AcpiExCreateRegion (Op->Named.Data, Op->Named.Length, Status = AcpiExCreateRegion (Op->Named.Data,
RegionSpace, WalkState); Op->Named.Length, RegionSpace, WalkState);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);
@ -700,8 +700,8 @@ AcpiDsLoad2EndOp (
AcpiExExitInterpreter (); AcpiExExitInterpreter ();
} }
Status = AcpiEvInitializeRegion (AcpiNsGetAttachedObject (Node), Status = AcpiEvInitializeRegion (
FALSE); AcpiNsGetAttachedObject (Node), FALSE);
if (WalkState->MethodNode) if (WalkState->MethodNode)
{ {
AcpiExEnterInterpreter (); AcpiExEnterInterpreter ();
@ -744,12 +744,14 @@ AcpiDsLoad2EndOp (
WalkState->Operands[0] = ACPI_CAST_PTR (void, Op->Named.Node); WalkState->Operands[0] = ACPI_CAST_PTR (void, Op->Named.Node);
WalkState->NumOperands = 1; WalkState->NumOperands = 1;
Status = AcpiDsCreateOperands (WalkState, Op->Common.Value.Arg); Status = AcpiDsCreateOperands (
WalkState, Op->Common.Value.Arg);
if (ACPI_SUCCESS (Status)) if (ACPI_SUCCESS (Status))
{ {
Status = AcpiExCreateMethod (Op->Named.Data, Status = AcpiExCreateMethod (
Op->Named.Length, WalkState); Op->Named.Data, Op->Named.Length, WalkState);
} }
WalkState->Operands[0] = NULL; WalkState->Operands[0] = NULL;
WalkState->NumOperands = 0; WalkState->NumOperands = 0;

View file

@ -154,6 +154,7 @@ AcpiDsScopeStackClear (
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
"Popped object type (%s)\n", "Popped object type (%s)\n",
AcpiUtGetTypeName (ScopeInfo->Common.Value))); AcpiUtGetTypeName (ScopeInfo->Common.Value)));
AcpiUtDeleteGenericState (ScopeInfo); AcpiUtDeleteGenericState (ScopeInfo);
} }
} }

View file

@ -371,8 +371,8 @@ AcpiDsResultStackPop (
if (WalkState->Results == NULL) if (WalkState->Results == NULL)
{ {
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Result stack underflow - State=%p\n", ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
WalkState)); "Result stack underflow - State=%p\n", WalkState));
return (AE_AML_NO_OPERAND); return (AE_AML_NO_OPERAND);
} }
@ -779,7 +779,8 @@ AcpiDsInitAmlWalk (
/* Push start scope on scope stack and make it current */ /* Push start scope on scope stack and make it current */
Status = AcpiDsScopeStackPush (MethodNode, ACPI_TYPE_METHOD, WalkState); Status = AcpiDsScopeStackPush (
MethodNode, ACPI_TYPE_METHOD, WalkState);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);

View file

@ -212,6 +212,7 @@ AcpiEvRemoveGlobalLockHandler (
ACPI_FUNCTION_TRACE (EvRemoveGlobalLockHandler); ACPI_FUNCTION_TRACE (EvRemoveGlobalLockHandler);
AcpiGbl_GlobalLockPresent = FALSE; AcpiGbl_GlobalLockPresent = FALSE;
Status = AcpiRemoveFixedEventHandler (ACPI_EVENT_GLOBAL, Status = AcpiRemoveFixedEventHandler (ACPI_EVENT_GLOBAL,
AcpiEvGlobalLockHandler); AcpiEvGlobalLockHandler);
@ -374,8 +375,8 @@ AcpiEvAcquireGlobalLock (
* Wait for handshake with the global lock interrupt handler. * Wait for handshake with the global lock interrupt handler.
* This interface releases the interpreter if we must wait. * This interface releases the interpreter if we must wait.
*/ */
Status = AcpiExSystemWaitSemaphore (AcpiGbl_GlobalLockSemaphore, Status = AcpiExSystemWaitSemaphore (
ACPI_WAIT_FOREVER); AcpiGbl_GlobalLockSemaphore, ACPI_WAIT_FOREVER);
Flags = AcpiOsAcquireLock (AcpiGbl_GlobalLockPendingLock); Flags = AcpiOsAcquireLock (AcpiGbl_GlobalLockPendingLock);

View file

@ -176,8 +176,8 @@ AcpiEvUpdateGpeEnableMask (
{ {
ACPI_SET_BIT (GpeRegisterInfo->EnableForRun, (UINT8) RegisterBit); ACPI_SET_BIT (GpeRegisterInfo->EnableForRun, (UINT8) RegisterBit);
} }
GpeRegisterInfo->EnableMask = GpeRegisterInfo->EnableForRun;
GpeRegisterInfo->EnableMask = GpeRegisterInfo->EnableForRun;
return_ACPI_STATUS (AE_OK); return_ACPI_STATUS (AE_OK);
} }
@ -660,8 +660,8 @@ AcpiEvAsynchExecuteGpeMethod (
Notify = GpeEventInfo->Dispatch.NotifyList; Notify = GpeEventInfo->Dispatch.NotifyList;
while (ACPI_SUCCESS (Status) && Notify) while (ACPI_SUCCESS (Status) && Notify)
{ {
Status = AcpiEvQueueNotifyRequest (Notify->DeviceNode, Status = AcpiEvQueueNotifyRequest (
ACPI_NOTIFY_DEVICE_WAKE); Notify->DeviceNode, ACPI_NOTIFY_DEVICE_WAKE);
Notify = Notify->Next; Notify = Notify->Next;
} }
@ -850,8 +850,8 @@ AcpiEvGpeDispatch (
{ {
ACPI_EXCEPTION ((AE_INFO, Status, ACPI_EXCEPTION ((AE_INFO, Status,
"Unable to clear GPE %02X", GpeNumber)); "Unable to clear GPE %02X", GpeNumber));
(void) AcpiHwLowSetGpe (GpeEventInfo, (void) AcpiHwLowSetGpe (
ACPI_GPE_CONDITIONAL_ENABLE); GpeEventInfo, ACPI_GPE_CONDITIONAL_ENABLE);
return_UINT32 (ACPI_INTERRUPT_NOT_HANDLED); return_UINT32 (ACPI_INTERRUPT_NOT_HANDLED);
} }
} }

View file

@ -265,6 +265,7 @@ AcpiEvDeleteGpeBlock (
{ {
GpeBlock->Next->Previous = GpeBlock->Previous; GpeBlock->Next->Previous = GpeBlock->Previous;
} }
AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags); AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);
} }

View file

@ -457,6 +457,7 @@ AcpiEvDeleteGpeHandlers (
ACPI_FREE (Notify); ACPI_FREE (Notify);
Notify = Next; Notify = Next;
} }
GpeEventInfo->Dispatch.NotifyList = NULL; GpeEventInfo->Dispatch.NotifyList = NULL;
GpeEventInfo->Flags &= ~ACPI_GPE_DISPATCH_MASK; GpeEventInfo->Flags &= ~ACPI_GPE_DISPATCH_MASK;
} }

View file

@ -132,6 +132,7 @@ AcpiEvInstallHandler (
void *Context, void *Context,
void **ReturnValue); void **ReturnValue);
/* These are the address spaces that will get default handlers */ /* These are the address spaces that will get default handlers */
UINT8 AcpiGbl_DefaultAddressSpaces[ACPI_NUM_DEFAULT_SPACES] = UINT8 AcpiGbl_DefaultAddressSpaces[ACPI_NUM_DEFAULT_SPACES] =
@ -247,7 +248,7 @@ AcpiEvHasDefaultHandler (
ObjDesc = AcpiNsGetAttachedObject (Node); ObjDesc = AcpiNsGetAttachedObject (Node);
if (ObjDesc) if (ObjDesc)
{ {
HandlerObj = ObjDesc->Device.Handler; HandlerObj = ObjDesc->CommonNotify.Handler;
/* Walk the linked list of handlers for this object */ /* Walk the linked list of handlers for this object */
@ -348,35 +349,27 @@ AcpiEvInstallHandler (
{ {
/* Check if this Device already has a handler for this address space */ /* Check if this Device already has a handler for this address space */
NextHandlerObj = ObjDesc->Device.Handler; NextHandlerObj = AcpiEvFindRegionHandler (
while (NextHandlerObj) HandlerObj->AddressSpace.SpaceId, ObjDesc->CommonNotify.Handler);
if (NextHandlerObj)
{ {
/* Found a handler, is it for the same address space? */ /* Found a handler, is it for the same address space? */
if (NextHandlerObj->AddressSpace.SpaceId ==
HandlerObj->AddressSpace.SpaceId)
{
ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION, ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
"Found handler for region [%s] in device %p(%p) " "Found handler for region [%s] in device %p(%p) handler %p\n",
"handler %p\n",
AcpiUtGetRegionName (HandlerObj->AddressSpace.SpaceId), AcpiUtGetRegionName (HandlerObj->AddressSpace.SpaceId),
ObjDesc, NextHandlerObj, HandlerObj)); ObjDesc, NextHandlerObj, HandlerObj));
/* /*
* Since the object we found it on was a device, then it * Since the object we found it on was a device, then it means
* means that someone has already installed a handler for * that someone has already installed a handler for the branch
* the branch of the namespace from this device on. Just * of the namespace from this device on. Just bail out telling
* bail out telling the walk routine to not traverse this * the walk routine to not traverse this branch. This preserves
* branch. This preserves the scoping rule for handlers. * the scoping rule for handlers.
*/ */
return (AE_CTRL_DEPTH); return (AE_CTRL_DEPTH);
} }
/* Walk the linked list of handlers attached to this device */
NextHandlerObj = NextHandlerObj->AddressSpace.Next;
}
/* /*
* As long as the device didn't have a handler for this space we * As long as the device didn't have a handler for this space we
* don't care about it. We just ignore it and proceed. * don't care about it. We just ignore it and proceed.
@ -407,6 +400,46 @@ AcpiEvInstallHandler (
} }
/*******************************************************************************
*
* FUNCTION: AcpiEvFindRegionHandler
*
* PARAMETERS: SpaceId - The address space ID
* HandlerObj - Head of the handler object list
*
* RETURN: Matching handler object. NULL if space ID not matched
*
* DESCRIPTION: Search a handler object list for a match on the address
* space ID.
*
******************************************************************************/
ACPI_OPERAND_OBJECT *
AcpiEvFindRegionHandler (
ACPI_ADR_SPACE_TYPE SpaceId,
ACPI_OPERAND_OBJECT *HandlerObj)
{
/* Walk the handler list for this device */
while (HandlerObj)
{
/* Same SpaceId indicates a handler is installed */
if (HandlerObj->AddressSpace.SpaceId == SpaceId)
{
return (HandlerObj);
}
/* Next handler object */
HandlerObj = HandlerObj->AddressSpace.Next;
}
return (NULL);
}
/******************************************************************************* /*******************************************************************************
* *
* FUNCTION: AcpiEvInstallSpaceHandler * FUNCTION: AcpiEvInstallSpaceHandler
@ -434,7 +467,7 @@ AcpiEvInstallSpaceHandler (
{ {
ACPI_OPERAND_OBJECT *ObjDesc; ACPI_OPERAND_OBJECT *ObjDesc;
ACPI_OPERAND_OBJECT *HandlerObj; ACPI_OPERAND_OBJECT *HandlerObj;
ACPI_STATUS Status; ACPI_STATUS Status = AE_OK;
ACPI_OBJECT_TYPE Type; ACPI_OBJECT_TYPE Type;
UINT8 Flags = 0; UINT8 Flags = 0;
@ -443,8 +476,8 @@ AcpiEvInstallSpaceHandler (
/* /*
* This registration is valid for only the types below and the root. This * This registration is valid for only the types below and the root.
* is where the default handlers get placed. * The root node is where the default handlers get installed.
*/ */
if ((Node->Type != ACPI_TYPE_DEVICE) && if ((Node->Type != ACPI_TYPE_DEVICE) &&
(Node->Type != ACPI_TYPE_PROCESSOR) && (Node->Type != ACPI_TYPE_PROCESSOR) &&
@ -517,18 +550,13 @@ AcpiEvInstallSpaceHandler (
if (ObjDesc) if (ObjDesc)
{ {
/* /*
* The attached device object already exists. Make sure the handler * The attached device object already exists. Now make sure
* is not already installed. * the handler is not already installed.
*/ */
HandlerObj = ObjDesc->Device.Handler; HandlerObj = AcpiEvFindRegionHandler (SpaceId,
ObjDesc->CommonNotify.Handler);
/* Walk the handler list for this device */ if (HandlerObj)
while (HandlerObj)
{
/* Same SpaceId indicates a handler already installed */
if (HandlerObj->AddressSpace.SpaceId == SpaceId)
{ {
if (HandlerObj->AddressSpace.Handler == Handler) if (HandlerObj->AddressSpace.Handler == Handler)
{ {
@ -546,18 +574,15 @@ AcpiEvInstallSpaceHandler (
Status = AE_ALREADY_EXISTS; Status = AE_ALREADY_EXISTS;
} }
goto UnlockAndExit; goto UnlockAndExit;
} }
/* Walk the linked list of handlers */
HandlerObj = HandlerObj->AddressSpace.Next;
}
} }
else else
{ {
ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION, ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
"Creating object on Device %p while installing handler\n", Node)); "Creating object on Device %p while installing handler\n",
Node));
/* ObjDesc does not exist, create one */ /* ObjDesc does not exist, create one */
@ -596,7 +621,8 @@ AcpiEvInstallSpaceHandler (
} }
ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION, ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
"Installing address handler for region %s(%X) on Device %4.4s %p(%p)\n", "Installing address handler for region %s(%X) "
"on Device %4.4s %p(%p)\n",
AcpiUtGetRegionName (SpaceId), SpaceId, AcpiUtGetRegionName (SpaceId), SpaceId,
AcpiUtGetNodeName (Node), Node, ObjDesc)); AcpiUtGetNodeName (Node), Node, ObjDesc));
@ -625,29 +651,27 @@ AcpiEvInstallSpaceHandler (
/* Install at head of Device.AddressSpace list */ /* Install at head of Device.AddressSpace list */
HandlerObj->AddressSpace.Next = ObjDesc->Device.Handler; HandlerObj->AddressSpace.Next = ObjDesc->CommonNotify.Handler;
/* /*
* The Device object is the first reference on the HandlerObj. * The Device object is the first reference on the HandlerObj.
* Each region that uses the handler adds a reference. * Each region that uses the handler adds a reference.
*/ */
ObjDesc->Device.Handler = HandlerObj; ObjDesc->CommonNotify.Handler = HandlerObj;
/* /*
* Walk the namespace finding all of the regions this * Walk the namespace finding all of the regions this handler will
* handler will manage. * manage.
* *
* Start at the device and search the branch toward * Start at the device and search the branch toward the leaf nodes
* the leaf nodes until either the leaf is encountered or * until either the leaf is encountered or a device is detected that
* a device is detected that has an address handler of the * has an address handler of the same type.
* same type.
* *
* In either case, back up and search down the remainder * In either case, back up and search down the remainder of the branch
* of the branch
*/ */
Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, Node, ACPI_UINT32_MAX, Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, Node,
ACPI_NS_WALK_UNLOCK, AcpiEvInstallHandler, NULL, ACPI_UINT32_MAX, ACPI_NS_WALK_UNLOCK,
HandlerObj, NULL); AcpiEvInstallHandler, NULL, HandlerObj, NULL);
UnlockAndExit: UnlockAndExit:
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);

View file

@ -147,6 +147,7 @@ BOOLEAN
AcpiEvIsNotifyObject ( AcpiEvIsNotifyObject (
ACPI_NAMESPACE_NODE *Node) ACPI_NAMESPACE_NODE *Node)
{ {
switch (Node->Type) switch (Node->Type)
{ {
case ACPI_TYPE_DEVICE: case ACPI_TYPE_DEVICE:
@ -255,8 +256,8 @@ AcpiEvQueueNotifyRequest (
AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Node->Type), AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Node->Type),
NotifyValue, AcpiUtGetNotifyName (NotifyValue, ACPI_TYPE_ANY), Node)); NotifyValue, AcpiUtGetNotifyName (NotifyValue, ACPI_TYPE_ANY), Node));
Status = AcpiOsExecute (OSL_NOTIFY_HANDLER, AcpiEvNotifyDispatch, Status = AcpiOsExecute (OSL_NOTIFY_HANDLER,
Info); AcpiEvNotifyDispatch, Info);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
AcpiUtDeleteGenericState (Info); AcpiUtDeleteGenericState (Info);

View file

@ -171,6 +171,7 @@ AcpiEvInitializeOpRegions (
/* Run the _REG methods for OpRegions in each default address space */ /* Run the _REG methods for OpRegions in each default address space */
AcpiGbl_RegMethodsEnabled = TRUE;
for (i = 0; i < ACPI_NUM_DEFAULT_SPACES; i++) for (i = 0; i < ACPI_NUM_DEFAULT_SPACES; i++)
{ {
/* /*
@ -181,13 +182,11 @@ AcpiEvInitializeOpRegions (
if (AcpiEvHasDefaultHandler (AcpiGbl_RootNode, if (AcpiEvHasDefaultHandler (AcpiGbl_RootNode,
AcpiGbl_DefaultAddressSpaces[i])) AcpiGbl_DefaultAddressSpaces[i]))
{ {
Status = AcpiEvExecuteRegMethods (AcpiGbl_RootNode, AcpiEvExecuteRegMethods (AcpiGbl_RootNode,
AcpiGbl_DefaultAddressSpaces[i]); AcpiGbl_DefaultAddressSpaces[i], ACPI_REG_CONNECT);
} }
} }
AcpiGbl_RegMethodsExecuted = TRUE;
(void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);
} }
@ -210,6 +209,12 @@ AcpiEvInitializeOpRegions (
* DESCRIPTION: Dispatch an address space or operation region access to * DESCRIPTION: Dispatch an address space or operation region access to
* a previously installed handler. * a previously installed handler.
* *
* NOTE: During early initialization, we always install the default region
* handlers for Memory, I/O and PCI_Config. This ensures that these operation
* region address spaces are always available as per the ACPI specification.
* This is especially needed in order to support the execution of
* module-level AML code during loading of the ACPI tables.
*
******************************************************************************/ ******************************************************************************/
ACPI_STATUS ACPI_STATUS
@ -414,7 +419,7 @@ AcpiEvAddressSpaceDispatch (
******************************************************************************/ ******************************************************************************/
void void
AcpiEvDetachRegion( AcpiEvDetachRegion (
ACPI_OPERAND_OBJECT *RegionObj, ACPI_OPERAND_OBJECT *RegionObj,
BOOLEAN AcpiNsIsLocked) BOOLEAN AcpiNsIsLocked)
{ {
@ -593,6 +598,13 @@ AcpiEvAttachRegion (
ACPI_FUNCTION_TRACE (EvAttachRegion); ACPI_FUNCTION_TRACE (EvAttachRegion);
/* Install the region's handler */
if (RegionObj->Region.Handler)
{
return_ACPI_STATUS (AE_ALREADY_EXISTS);
}
ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION, ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
"Adding Region [%4.4s] %p to address handler %p [%s]\n", "Adding Region [%4.4s] %p to address handler %p [%s]\n",
AcpiUtGetNodeName (RegionObj->Region.Node), AcpiUtGetNodeName (RegionObj->Region.Node),
@ -603,14 +615,6 @@ AcpiEvAttachRegion (
RegionObj->Region.Next = HandlerObj->AddressSpace.RegionList; RegionObj->Region.Next = HandlerObj->AddressSpace.RegionList;
HandlerObj->AddressSpace.RegionList = RegionObj; HandlerObj->AddressSpace.RegionList = RegionObj;
/* Install the region's handler */
if (RegionObj->Region.Handler)
{
return_ACPI_STATUS (AE_ALREADY_EXISTS);
}
RegionObj->Region.Handler = HandlerObj; RegionObj->Region.Handler = HandlerObj;
AcpiUtAddReference (HandlerObj); AcpiUtAddReference (HandlerObj);
@ -618,6 +622,58 @@ AcpiEvAttachRegion (
} }
/*******************************************************************************
*
* FUNCTION: AcpiEvAssociateRegMethod
*
* PARAMETERS: RegionObj - Region object
*
* RETURN: Status
*
* DESCRIPTION: Find and associate _REG method to a region
*
******************************************************************************/
void
AcpiEvAssociateRegMethod (
ACPI_OPERAND_OBJECT *RegionObj)
{
ACPI_NAME *RegNamePtr = (ACPI_NAME *) METHOD_NAME__REG;
ACPI_NAMESPACE_NODE *MethodNode;
ACPI_NAMESPACE_NODE *Node;
ACPI_OPERAND_OBJECT *RegionObj2;
ACPI_STATUS Status;
ACPI_FUNCTION_TRACE (EvAssociateRegMethod);
RegionObj2 = AcpiNsGetSecondaryObject (RegionObj);
if (!RegionObj2)
{
return_VOID;
}
Node = RegionObj->Region.Node->Parent;
/* Find any "_REG" method associated with this region definition */
Status = AcpiNsSearchOneScope (
*RegNamePtr, Node, ACPI_TYPE_METHOD, &MethodNode);
if (ACPI_SUCCESS (Status))
{
/*
* The _REG method is optional and there can be only one per region
* definition. This will be executed when the handler is attached
* or removed
*/
RegionObj2->Extra.Method_REG = MethodNode;
}
return_VOID;
}
/******************************************************************************* /*******************************************************************************
* *
* FUNCTION: AcpiEvExecuteRegMethod * FUNCTION: AcpiEvExecuteRegMethod
@ -651,7 +707,19 @@ AcpiEvExecuteRegMethod (
return_ACPI_STATUS (AE_NOT_EXIST); return_ACPI_STATUS (AE_NOT_EXIST);
} }
if (RegionObj2->Extra.Method_REG == NULL) if (RegionObj2->Extra.Method_REG == NULL ||
RegionObj->Region.Handler == NULL ||
!AcpiGbl_RegMethodsEnabled)
{
return_ACPI_STATUS (AE_OK);
}
/* _REG(DISCONNECT) should be paired with _REG(CONNECT) */
if ((Function == ACPI_REG_CONNECT &&
RegionObj->Common.Flags & AOPOBJ_REG_CONNECTED) ||
(Function == ACPI_REG_DISCONNECT &&
!(RegionObj->Common.Flags & AOPOBJ_REG_CONNECTED)))
{ {
return_ACPI_STATUS (AE_OK); return_ACPI_STATUS (AE_OK);
} }
@ -703,6 +771,20 @@ AcpiEvExecuteRegMethod (
Status = AcpiNsEvaluate (Info); Status = AcpiNsEvaluate (Info);
AcpiUtRemoveReference (Args[1]); AcpiUtRemoveReference (Args[1]);
if (ACPI_FAILURE (Status))
{
goto Cleanup2;
}
if (Function == ACPI_REG_CONNECT)
{
RegionObj->Common.Flags |= AOPOBJ_REG_CONNECTED;
}
else
{
RegionObj->Common.Flags &= ~AOPOBJ_REG_CONNECTED;
}
Cleanup2: Cleanup2:
AcpiUtRemoveReference (Args[0]); AcpiUtRemoveReference (Args[0]);
@ -718,26 +800,28 @@ Cleanup1:
* *
* PARAMETERS: Node - Namespace node for the device * PARAMETERS: Node - Namespace node for the device
* SpaceId - The address space ID * SpaceId - The address space ID
* Function - Passed to _REG: On (1) or Off (0)
* *
* RETURN: Status * RETURN: None
* *
* DESCRIPTION: Run all _REG methods for the input Space ID; * DESCRIPTION: Run all _REG methods for the input Space ID;
* Note: assumes namespace is locked, or system init time. * Note: assumes namespace is locked, or system init time.
* *
******************************************************************************/ ******************************************************************************/
ACPI_STATUS void
AcpiEvExecuteRegMethods ( AcpiEvExecuteRegMethods (
ACPI_NAMESPACE_NODE *Node, ACPI_NAMESPACE_NODE *Node,
ACPI_ADR_SPACE_TYPE SpaceId) ACPI_ADR_SPACE_TYPE SpaceId,
UINT32 Function)
{ {
ACPI_STATUS Status;
ACPI_REG_WALK_INFO Info; ACPI_REG_WALK_INFO Info;
ACPI_FUNCTION_TRACE (EvExecuteRegMethods); ACPI_FUNCTION_TRACE (EvExecuteRegMethods);
Info.SpaceId = SpaceId; Info.SpaceId = SpaceId;
Info.Function = Function;
Info.RegRunCount = 0; Info.RegRunCount = 0;
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_NAMES, ACPI_DEBUG_PRINT_RAW ((ACPI_DB_NAMES,
@ -750,7 +834,7 @@ AcpiEvExecuteRegMethods (
* regions and _REG methods. (i.e. handlers must be installed for all * regions and _REG methods. (i.e. handlers must be installed for all
* regions of this Space ID before we can run any _REG methods) * regions of this Space ID before we can run any _REG methods)
*/ */
Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, Node, ACPI_UINT32_MAX, (void) AcpiNsWalkNamespace (ACPI_TYPE_ANY, Node, ACPI_UINT32_MAX,
ACPI_NS_WALK_UNLOCK, AcpiEvRegRun, NULL, &Info, NULL); ACPI_NS_WALK_UNLOCK, AcpiEvRegRun, NULL, &Info, NULL);
/* Special case for EC: handle "orphan" _REG methods with no region */ /* Special case for EC: handle "orphan" _REG methods with no region */
@ -764,7 +848,7 @@ AcpiEvExecuteRegMethods (
" Executed %u _REG methods for SpaceId %s\n", " Executed %u _REG methods for SpaceId %s\n",
Info.RegRunCount, AcpiUtGetRegionName (Info.SpaceId))); Info.RegRunCount, AcpiUtGetRegionName (Info.SpaceId)));
return_ACPI_STATUS (Status); return_VOID;
} }
@ -831,7 +915,7 @@ AcpiEvRegRun (
} }
Info->RegRunCount++; Info->RegRunCount++;
Status = AcpiEvExecuteRegMethod (ObjDesc, ACPI_REG_CONNECT); Status = AcpiEvExecuteRegMethod (ObjDesc, Info->Function);
return (Status); return (Status);
} }

View file

@ -639,9 +639,6 @@ AcpiEvInitializeRegion (
ACPI_ADR_SPACE_TYPE SpaceId; ACPI_ADR_SPACE_TYPE SpaceId;
ACPI_NAMESPACE_NODE *Node; ACPI_NAMESPACE_NODE *Node;
ACPI_STATUS Status; ACPI_STATUS Status;
ACPI_NAMESPACE_NODE *MethodNode;
ACPI_NAME *RegNamePtr = (ACPI_NAME *) METHOD_NAME__REG;
ACPI_OPERAND_OBJECT *RegionObj2;
ACPI_FUNCTION_TRACE_U32 (EvInitializeRegion, AcpiNsLocked); ACPI_FUNCTION_TRACE_U32 (EvInitializeRegion, AcpiNsLocked);
@ -657,39 +654,15 @@ AcpiEvInitializeRegion (
return_ACPI_STATUS (AE_OK); return_ACPI_STATUS (AE_OK);
} }
RegionObj2 = AcpiNsGetSecondaryObject (RegionObj); AcpiEvAssociateRegMethod (RegionObj);
if (!RegionObj2) RegionObj->Common.Flags |= AOPOBJ_OBJECT_INITIALIZED;
{
return_ACPI_STATUS (AE_NOT_EXIST);
}
Node = RegionObj->Region.Node->Parent; Node = RegionObj->Region.Node->Parent;
SpaceId = RegionObj->Region.SpaceId; SpaceId = RegionObj->Region.SpaceId;
/* Setup defaults */
RegionObj->Region.Handler = NULL;
RegionObj2->Extra.Method_REG = NULL;
RegionObj->Common.Flags &= ~(AOPOBJ_SETUP_COMPLETE);
RegionObj->Common.Flags |= AOPOBJ_OBJECT_INITIALIZED;
/* Find any "_REG" method associated with this region definition */
Status = AcpiNsSearchOneScope (
*RegNamePtr, Node, ACPI_TYPE_METHOD, &MethodNode);
if (ACPI_SUCCESS (Status))
{
/*
* The _REG method is optional and there can be only one per region
* definition. This will be executed when the handler is attached
* or removed
*/
RegionObj2->Extra.Method_REG = MethodNode;
}
/* /*
* The following loop depends upon the root Node having no parent * The following loop depends upon the root Node having no parent
* ie: AcpiGbl_RootNode->ParentEntry being set to NULL * ie: AcpiGbl_RootNode->Parent being set to NULL
*/ */
while (Node) while (Node)
{ {
@ -704,18 +677,10 @@ AcpiEvInitializeRegion (
switch (Node->Type) switch (Node->Type)
{ {
case ACPI_TYPE_DEVICE: case ACPI_TYPE_DEVICE:
HandlerObj = ObjDesc->Device.Handler;
break;
case ACPI_TYPE_PROCESSOR: case ACPI_TYPE_PROCESSOR:
HandlerObj = ObjDesc->Processor.Handler;
break;
case ACPI_TYPE_THERMAL: case ACPI_TYPE_THERMAL:
HandlerObj = ObjDesc->ThermalZone.Handler; HandlerObj = ObjDesc->CommonNotify.Handler;
break; break;
case ACPI_TYPE_METHOD: case ACPI_TYPE_METHOD:
@ -739,11 +704,8 @@ AcpiEvInitializeRegion (
break; break;
} }
while (HandlerObj) HandlerObj = AcpiEvFindRegionHandler (SpaceId, HandlerObj);
{ if (HandlerObj)
/* Is this handler of the correct type? */
if (HandlerObj->AddressSpace.SpaceId == SpaceId)
{ {
/* Found correct handler */ /* Found correct handler */
@ -780,11 +742,6 @@ AcpiEvInitializeRegion (
return_ACPI_STATUS (AE_OK); return_ACPI_STATUS (AE_OK);
} }
/* Try next handler in the list */
HandlerObj = HandlerObj->AddressSpace.Next;
}
} }
/* This node does not have the handler we need; Pop up one level */ /* This node does not have the handler we need; Pop up one level */

View file

@ -1074,8 +1074,8 @@ AcpiInstallGpeHandler (
ACPI_FUNCTION_TRACE (AcpiInstallGpeHandler); ACPI_FUNCTION_TRACE (AcpiInstallGpeHandler);
Status = AcpiEvInstallGpeHandler (GpeDevice, GpeNumber, Type, FALSE, Status = AcpiEvInstallGpeHandler (GpeDevice, GpeNumber, Type,
Address, Context); FALSE, Address, Context);
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);
} }
@ -1115,8 +1115,8 @@ AcpiInstallGpeRawHandler (
ACPI_FUNCTION_TRACE (AcpiInstallGpeRawHandler); ACPI_FUNCTION_TRACE (AcpiInstallGpeRawHandler);
Status = AcpiEvInstallGpeHandler (GpeDevice, GpeNumber, Type, TRUE, Status = AcpiEvInstallGpeHandler (GpeDevice, GpeNumber, Type,
Address, Context); TRUE, Address, Context);
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);
} }

View file

@ -148,7 +148,7 @@ AcpiEnable (
/* ACPI tables must be present */ /* ACPI tables must be present */
if (!AcpiTbTablesLoaded ()) if (AcpiGbl_FadtIndex == ACPI_INVALID_TABLE_INDEX)
{ {
return_ACPI_STATUS (AE_NO_ACPI_TABLES); return_ACPI_STATUS (AE_NO_ACPI_TABLES);
} }
@ -164,7 +164,8 @@ AcpiEnable (
if (AcpiHwGetMode() == ACPI_SYS_MODE_ACPI) if (AcpiHwGetMode() == ACPI_SYS_MODE_ACPI)
{ {
ACPI_DEBUG_PRINT ((ACPI_DB_INIT, "System is already in ACPI mode\n")); ACPI_DEBUG_PRINT ((ACPI_DB_INIT,
"System is already in ACPI mode\n"));
} }
else else
{ {
@ -234,7 +235,8 @@ AcpiDisable (
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);
} }
ACPI_DEBUG_PRINT ((ACPI_DB_INIT, "ACPI mode disabled\n")); ACPI_DEBUG_PRINT ((ACPI_DB_INIT,
"ACPI mode disabled\n"));
} }
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);

View file

@ -186,48 +186,16 @@ AcpiInstallAddressSpaceHandler (
/* Install the handler for all Regions for this Space ID */ /* Install the handler for all Regions for this Space ID */
Status = AcpiEvInstallSpaceHandler (Node, SpaceId, Handler, Setup, Context); Status = AcpiEvInstallSpaceHandler (
Node, SpaceId, Handler, Setup, Context);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
goto UnlockAndExit; goto UnlockAndExit;
} }
/*
* For the default SpaceIDs, (the IDs for which there are default region handlers
* installed) Only execute the _REG methods if the global initialization _REG
* methods have already been run (via AcpiInitializeObjects). In other words,
* we will defer the execution of the _REG methods for these SpaceIDs until
* execution of AcpiInitializeObjects. This is done because we need the handlers
* for the default spaces (mem/io/pci/table) to be installed before we can run
* any control methods (or _REG methods). There is known BIOS code that depends
* on this.
*
* For all other SpaceIDs, we can safely execute the _REG methods immediately.
* This means that for IDs like EmbeddedController, this function should be called
* only after AcpiEnableSubsystem has been called.
*/
switch (SpaceId)
{
case ACPI_ADR_SPACE_SYSTEM_MEMORY:
case ACPI_ADR_SPACE_SYSTEM_IO:
case ACPI_ADR_SPACE_PCI_CONFIG:
case ACPI_ADR_SPACE_DATA_TABLE:
if (!AcpiGbl_RegMethodsExecuted)
{
/* We will defer execution of the _REG methods for this space */
goto UnlockAndExit;
}
break;
default:
break;
}
/* Run all _REG methods for this address space */ /* Run all _REG methods for this address space */
Status = AcpiEvExecuteRegMethods (Node, SpaceId); AcpiEvExecuteRegMethods (Node, SpaceId, ACPI_REG_CONNECT);
UnlockAndExit: UnlockAndExit:
@ -306,8 +274,8 @@ AcpiRemoveAddressSpaceHandler (
/* Find the address handler the user requested */ /* Find the address handler the user requested */
HandlerObj = ObjDesc->Device.Handler; HandlerObj = ObjDesc->CommonNotify.Handler;
LastObjPtr = &ObjDesc->Device.Handler; LastObjPtr = &ObjDesc->CommonNotify.Handler;
while (HandlerObj) while (HandlerObj)
{ {
/* We have a handler, see if user requested this one */ /* We have a handler, see if user requested this one */

View file

@ -336,8 +336,7 @@ AcpiExLoadTableOp (
/* Store the parameter data into the optional parameter object */ /* Store the parameter data into the optional parameter object */
Status = AcpiExStore (Operand[5], Status = AcpiExStore (Operand[5],
ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, ParameterNode), ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, ParameterNode), WalkState);
WalkState);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
(void) AcpiExUnloadTable (DdbHandle); (void) AcpiExUnloadTable (DdbHandle);
@ -469,8 +468,8 @@ AcpiExLoadOp (
} }
/* /*
* If the Region Address and Length have not been previously evaluated, * If the Region Address and Length have not been previously
* evaluate them now and save the results. * evaluated, evaluate them now and save the results.
*/ */
if (!(ObjDesc->Common.Flags & AOPOBJ_DATA_VALID)) if (!(ObjDesc->Common.Flags & AOPOBJ_DATA_VALID))
{ {
@ -555,7 +554,8 @@ AcpiExLoadOp (
/* Get the actual table length from the table header */ /* Get the actual table length from the table header */
TableHeader = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ObjDesc->Buffer.Pointer); TableHeader = ACPI_CAST_PTR (
ACPI_TABLE_HEADER, ObjDesc->Buffer.Pointer);
Length = TableHeader->Length; Length = TableHeader->Length;
/* Table cannot extend beyond the buffer */ /* Table cannot extend beyond the buffer */
@ -570,8 +570,8 @@ AcpiExLoadOp (
} }
/* /*
* Copy the table from the buffer because the buffer could be modified * Copy the table from the buffer because the buffer could be
* or even deleted in the future * modified or even deleted in the future
*/ */
Table = ACPI_ALLOCATE (Length); Table = ACPI_ALLOCATE (Length);
if (!Table) if (!Table)
@ -609,7 +609,8 @@ AcpiExLoadOp (
* Note: Now table is "INSTALLED", it must be validated before * Note: Now table is "INSTALLED", it must be validated before
* loading. * loading.
*/ */
Status = AcpiTbValidateTable (&AcpiGbl_RootTableList.Tables[TableIndex]); Status = AcpiTbValidateTable (
&AcpiGbl_RootTableList.Tables[TableIndex]);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);

View file

@ -323,9 +323,7 @@ AcpiExConvertToBuffer (
/* Copy the integer to the buffer, LSB first */ /* Copy the integer to the buffer, LSB first */
NewBuf = ReturnDesc->Buffer.Pointer; NewBuf = ReturnDesc->Buffer.Pointer;
memcpy (NewBuf, memcpy (NewBuf, &ObjDesc->Integer.Value, AcpiGbl_IntegerByteWidth);
&ObjDesc->Integer.Value,
AcpiGbl_IntegerByteWidth);
break; break;
case ACPI_TYPE_STRING: case ACPI_TYPE_STRING:
@ -338,8 +336,8 @@ AcpiExConvertToBuffer (
* ASL/AML code that depends on the null being transferred to the new * ASL/AML code that depends on the null being transferred to the new
* buffer. * buffer.
*/ */
ReturnDesc = AcpiUtCreateBufferObject ( ReturnDesc = AcpiUtCreateBufferObject ((ACPI_SIZE)
(ACPI_SIZE) ObjDesc->String.Length + 1); ObjDesc->String.Length + 1);
if (!ReturnDesc) if (!ReturnDesc)
{ {
return_ACPI_STATUS (AE_NO_MEMORY); return_ACPI_STATUS (AE_NO_MEMORY);
@ -462,7 +460,8 @@ AcpiExConvertToAscii (
{ {
/* Get one hex digit, most significant digits first */ /* Get one hex digit, most significant digits first */
String[k] = (UINT8) AcpiUtHexToAsciiChar (Integer, ACPI_MUL_4 (j)); String[k] = (UINT8)
AcpiUtHexToAsciiChar (Integer, ACPI_MUL_4 (j));
k++; k++;
} }
break; break;
@ -563,8 +562,8 @@ AcpiExConvertToString (
/* Convert integer to string */ /* Convert integer to string */
StringLength = AcpiExConvertToAscii (ObjDesc->Integer.Value, Base, StringLength = AcpiExConvertToAscii (
NewBuf, AcpiGbl_IntegerByteWidth); ObjDesc->Integer.Value, Base, NewBuf, AcpiGbl_IntegerByteWidth);
/* Null terminate at the correct place */ /* Null terminate at the correct place */
@ -653,8 +652,7 @@ AcpiExConvertToString (
for (i = 0; i < ObjDesc->Buffer.Length; i++) for (i = 0; i < ObjDesc->Buffer.Length; i++)
{ {
NewBuf += AcpiExConvertToAscii ( NewBuf += AcpiExConvertToAscii (
(UINT64) ObjDesc->Buffer.Pointer[i], Base, (UINT64) ObjDesc->Buffer.Pointer[i], Base, NewBuf, 1);
NewBuf, 1);
*NewBuf++ = Separator; /* each separated by a comma or space */ *NewBuf++ = Separator; /* each separated by a comma or space */
} }
@ -757,8 +755,7 @@ AcpiExConvertToTargetType (
* These types require an Integer operand. We can convert * These types require an Integer operand. We can convert
* a Buffer or a String to an Integer if necessary. * a Buffer or a String to an Integer if necessary.
*/ */
Status = AcpiExConvertToInteger (SourceDesc, ResultDesc, Status = AcpiExConvertToInteger (SourceDesc, ResultDesc, 16);
16);
break; break;
case ACPI_TYPE_STRING: case ACPI_TYPE_STRING:
@ -780,7 +777,8 @@ AcpiExConvertToTargetType (
default: default:
ACPI_ERROR ((AE_INFO, "Bad destination type during conversion: 0x%X", ACPI_ERROR ((AE_INFO,
"Bad destination type during conversion: 0x%X",
DestinationType)); DestinationType));
Status = AE_AML_INTERNAL; Status = AE_AML_INTERNAL;
break; break;

View file

@ -273,7 +273,8 @@ AcpiExCreateEvent (
/* Attach object to the Node */ /* Attach object to the Node */
Status = AcpiNsAttachObject ((ACPI_NAMESPACE_NODE *) WalkState->Operands[0], Status = AcpiNsAttachObject (
(ACPI_NAMESPACE_NODE *) WalkState->Operands[0],
ObjDesc, ACPI_TYPE_EVENT); ObjDesc, ACPI_TYPE_EVENT);
Cleanup: Cleanup:
@ -333,7 +334,8 @@ AcpiExCreateMutex (
ObjDesc->Mutex.SyncLevel = (UINT8) WalkState->Operands[1]->Integer.Value; ObjDesc->Mutex.SyncLevel = (UINT8) WalkState->Operands[1]->Integer.Value;
ObjDesc->Mutex.Node = (ACPI_NAMESPACE_NODE *) WalkState->Operands[0]; ObjDesc->Mutex.Node = (ACPI_NAMESPACE_NODE *) WalkState->Operands[0];
Status = AcpiNsAttachObject (ObjDesc->Mutex.Node, ObjDesc, ACPI_TYPE_MUTEX); Status = AcpiNsAttachObject (
ObjDesc->Mutex.Node, ObjDesc, ACPI_TYPE_MUTEX);
Cleanup: Cleanup:
@ -401,7 +403,8 @@ AcpiExCreateRegion (
* a table load for this exception. Instead, if the region is * a table load for this exception. Instead, if the region is
* actually used at runtime, abort the executing method. * actually used at runtime, abort the executing method.
*/ */
ACPI_ERROR ((AE_INFO, "Invalid/unknown Address Space ID: 0x%2.2X", SpaceId)); ACPI_ERROR ((AE_INFO,
"Invalid/unknown Address Space ID: 0x%2.2X", SpaceId));
} }
ACPI_DEBUG_PRINT ((ACPI_DB_LOAD, "Region Type - %s (0x%X)\n", ACPI_DEBUG_PRINT ((ACPI_DB_LOAD, "Region Type - %s (0x%X)\n",
@ -420,9 +423,10 @@ AcpiExCreateRegion (
* Remember location in AML stream of address & length * Remember location in AML stream of address & length
* operands since they need to be evaluated at run time. * operands since they need to be evaluated at run time.
*/ */
RegionObj2 = ObjDesc->Common.NextObject; RegionObj2 = AcpiNsGetSecondaryObject (ObjDesc);
RegionObj2->Extra.AmlStart = AmlStart; RegionObj2->Extra.AmlStart = AmlStart;
RegionObj2->Extra.AmlLength = AmlLength; RegionObj2->Extra.AmlLength = AmlLength;
RegionObj2->Extra.Method_REG = NULL;
if (WalkState->ScopeInfo) if (WalkState->ScopeInfo)
{ {
RegionObj2->Extra.ScopeNode = WalkState->ScopeInfo->Scope.Node; RegionObj2->Extra.ScopeNode = WalkState->ScopeInfo->Scope.Node;
@ -438,6 +442,10 @@ AcpiExCreateRegion (
ObjDesc->Region.Address = 0; ObjDesc->Region.Address = 0;
ObjDesc->Region.Length = 0; ObjDesc->Region.Length = 0;
ObjDesc->Region.Node = Node; ObjDesc->Region.Node = Node;
ObjDesc->Region.Handler = NULL;
ObjDesc->Common.Flags &=
~(AOPOBJ_SETUP_COMPLETE | AOPOBJ_REG_CONNECTED |
AOPOBJ_OBJECT_INITIALIZED);
/* Install the new region object in the parent Node */ /* Install the new region object in the parent Node */
@ -606,7 +614,8 @@ AcpiExCreateMethod (
* flag, and SyncLevel for efficiency. * flag, and SyncLevel for efficiency.
*/ */
MethodFlags = (UINT8) Operand[1]->Integer.Value; MethodFlags = (UINT8) Operand[1]->Integer.Value;
ObjDesc->Method.ParamCount = (UINT8) (MethodFlags & AML_METHOD_ARG_COUNT); ObjDesc->Method.ParamCount = (UINT8)
(MethodFlags & AML_METHOD_ARG_COUNT);
/* /*
* Get the SyncLevel. If method is serialized, a mutex will be * Get the SyncLevel. If method is serialized, a mutex will be

View file

@ -115,26 +115,13 @@
#include "acpi.h" #include "acpi.h"
#include "accommon.h" #include "accommon.h"
#include "acnamesp.h"
#include "acinterp.h" #include "acinterp.h"
#include "acparser.h"
#define _COMPONENT ACPI_EXECUTER #define _COMPONENT ACPI_EXECUTER
ACPI_MODULE_NAME ("exdebug") ACPI_MODULE_NAME ("exdebug")
static ACPI_OPERAND_OBJECT *AcpiGbl_TraceMethodObject = NULL;
/* Local prototypes */
#ifdef ACPI_DEBUG_OUTPUT
static const char *
AcpiExGetTraceEventName (
ACPI_TRACE_EVENT_TYPE Type);
#endif
#ifndef ACPI_NO_ERROR_MESSAGES #ifndef ACPI_NO_ERROR_MESSAGES
/******************************************************************************* /*******************************************************************************
* *
@ -181,13 +168,20 @@ AcpiExDoDebugObject (
return_VOID; return_VOID;
} }
/* /* Null string or newline -- don't emit the line header */
* We will emit the current timer value (in microseconds) with each
* debug output. Only need the lower 26 bits. This allows for 67 if (SourceDesc &&
* million microseconds or 67 seconds before rollover. (ACPI_GET_DESCRIPTOR_TYPE (SourceDesc) == ACPI_DESC_TYPE_OPERAND) &&
*/ (SourceDesc->Common.Type == ACPI_TYPE_STRING))
Timer = ((UINT32) AcpiOsGetTimer () / 10); /* (100 nanoseconds to microseconds) */ {
Timer &= 0x03FFFFFF; if ((SourceDesc->String.Length == 0) ||
((SourceDesc->String.Length == 1) &&
(*SourceDesc->String.Pointer == '\n')))
{
AcpiOsPrintf ("\n");
return_VOID;
}
}
/* /*
* Print line header as long as we are not in the middle of an * Print line header as long as we are not in the middle of an
@ -195,14 +189,31 @@ AcpiExDoDebugObject (
*/ */
if (!((Level > 0) && Index == 0)) if (!((Level > 0) && Index == 0))
{ {
AcpiOsPrintf ("[ACPI Debug %.8u] %*s", Timer, Level, " "); if (AcpiGbl_DisplayDebugTimer)
{
/*
* We will emit the current timer value (in microseconds) with each
* debug output. Only need the lower 26 bits. This allows for 67
* million microseconds or 67 seconds before rollover.
*
* Convert 100 nanosecond units to microseconds
*/
Timer = ((UINT32) AcpiOsGetTimer () / 10);
Timer &= 0x03FFFFFF;
AcpiOsPrintf ("[ACPI Debug T=0x%8.8X] %*s", Timer, Level, " ");
}
else
{
AcpiOsPrintf ("[ACPI Debug] %*s", Level, " ");
}
} }
/* Display the index for package output only */ /* Display the index for package output only */
if (Index > 0) if (Index > 0)
{ {
AcpiOsPrintf ("(%.2u) ", Index-1); AcpiOsPrintf ("(%.2u) ", Index - 1);
} }
if (!SourceDesc) if (!SourceDesc)
@ -212,8 +223,14 @@ AcpiExDoDebugObject (
} }
if (ACPI_GET_DESCRIPTOR_TYPE (SourceDesc) == ACPI_DESC_TYPE_OPERAND) if (ACPI_GET_DESCRIPTOR_TYPE (SourceDesc) == ACPI_DESC_TYPE_OPERAND)
{
/* No object type prefix needed for integers and strings */
if ((SourceDesc->Common.Type != ACPI_TYPE_INTEGER) &&
(SourceDesc->Common.Type != ACPI_TYPE_STRING))
{ {
AcpiOsPrintf ("%s ", AcpiUtGetObjectTypeName (SourceDesc)); AcpiOsPrintf ("%s ", AcpiUtGetObjectTypeName (SourceDesc));
}
if (!AcpiUtValidInternalObject (SourceDesc)) if (!AcpiUtValidInternalObject (SourceDesc))
{ {
@ -223,7 +240,7 @@ AcpiExDoDebugObject (
} }
else if (ACPI_GET_DESCRIPTOR_TYPE (SourceDesc) == ACPI_DESC_TYPE_NAMED) else if (ACPI_GET_DESCRIPTOR_TYPE (SourceDesc) == ACPI_DESC_TYPE_NAMED)
{ {
AcpiOsPrintf ("%s: %p\n", AcpiOsPrintf ("%s (Node %p)\n",
AcpiUtGetTypeName (((ACPI_NAMESPACE_NODE *) SourceDesc)->Type), AcpiUtGetTypeName (((ACPI_NAMESPACE_NODE *) SourceDesc)->Type),
SourceDesc); SourceDesc);
return_VOID; return_VOID;
@ -263,13 +280,12 @@ AcpiExDoDebugObject (
case ACPI_TYPE_STRING: case ACPI_TYPE_STRING:
AcpiOsPrintf ("[0x%.2X] \"%s\"\n", AcpiOsPrintf ("\"%s\"\n", SourceDesc->String.Pointer);
SourceDesc->String.Length, SourceDesc->String.Pointer);
break; break;
case ACPI_TYPE_PACKAGE: case ACPI_TYPE_PACKAGE:
AcpiOsPrintf ("[Contains 0x%.2X Elements]\n", AcpiOsPrintf ("(Contains 0x%.2X Elements):\n",
SourceDesc->Package.Count); SourceDesc->Package.Count);
/* Output the entire contents of the package */ /* Output the entire contents of the package */
@ -277,7 +293,7 @@ AcpiExDoDebugObject (
for (i = 0; i < SourceDesc->Package.Count; i++) for (i = 0; i < SourceDesc->Package.Count; i++)
{ {
AcpiExDoDebugObject (SourceDesc->Package.Elements[i], AcpiExDoDebugObject (SourceDesc->Package.Elements[i],
Level+4, i+1); Level + 4, i + 1);
} }
break; break;
@ -338,7 +354,7 @@ AcpiExDoDebugObject (
default: default:
AcpiExDoDebugObject ((SourceDesc->Reference.Node)->Object, AcpiExDoDebugObject ((SourceDesc->Reference.Node)->Object,
Level+4, 0); Level + 4, 0);
break; break;
} }
} }
@ -348,9 +364,11 @@ AcpiExDoDebugObject (
if (ACPI_GET_DESCRIPTOR_TYPE (SourceDesc->Reference.Object) == if (ACPI_GET_DESCRIPTOR_TYPE (SourceDesc->Reference.Object) ==
ACPI_DESC_TYPE_NAMED) ACPI_DESC_TYPE_NAMED)
{ {
AcpiExDoDebugObject (((ACPI_NAMESPACE_NODE *) /* Reference object is a namespace node */
SourceDesc->Reference.Object)->Object,
Level+4, 0); AcpiExDoDebugObject (ACPI_CAST_PTR (ACPI_OPERAND_OBJECT,
SourceDesc->Reference.Object),
Level + 4, 0);
} }
else else
{ {
@ -375,8 +393,15 @@ AcpiExDoDebugObject (
case ACPI_TYPE_PACKAGE: case ACPI_TYPE_PACKAGE:
AcpiOsPrintf ("Package[%u] = ", Value); AcpiOsPrintf ("Package[%u] = ", Value);
if (!(*SourceDesc->Reference.Where))
{
AcpiOsPrintf ("[Uninitialized Package Element]\n");
}
else
{
AcpiExDoDebugObject (*SourceDesc->Reference.Where, AcpiExDoDebugObject (*SourceDesc->Reference.Where,
Level+4, 0); Level+4, 0);
}
break; break;
default: default:
@ -391,7 +416,7 @@ AcpiExDoDebugObject (
default: default:
AcpiOsPrintf ("%p\n", SourceDesc); AcpiOsPrintf ("(Descriptor %p)\n", SourceDesc);
break; break;
} }
@ -399,362 +424,3 @@ AcpiExDoDebugObject (
return_VOID; return_VOID;
} }
#endif #endif
/*******************************************************************************
*
* FUNCTION: AcpiExInterpreterTraceEnabled
*
* PARAMETERS: Name - Whether method name should be matched,
* this should be checked before starting
* the tracer
*
* RETURN: TRUE if interpreter trace is enabled.
*
* DESCRIPTION: Check whether interpreter trace is enabled
*
******************************************************************************/
static BOOLEAN
AcpiExInterpreterTraceEnabled (
char *Name)
{
/* Check if tracing is enabled */
if (!(AcpiGbl_TraceFlags & ACPI_TRACE_ENABLED))
{
return (FALSE);
}
/*
* Check if tracing is filtered:
*
* 1. If the tracer is started, AcpiGbl_TraceMethodObject should have
* been filled by the trace starter
* 2. If the tracer is not started, AcpiGbl_TraceMethodName should be
* matched if it is specified
* 3. If the tracer is oneshot style, AcpiGbl_TraceMethodName should
* not be cleared by the trace stopper during the first match
*/
if (AcpiGbl_TraceMethodObject)
{
return (TRUE);
}
if (Name &&
(AcpiGbl_TraceMethodName &&
strcmp (AcpiGbl_TraceMethodName, Name)))
{
return (FALSE);
}
if ((AcpiGbl_TraceFlags & ACPI_TRACE_ONESHOT) &&
!AcpiGbl_TraceMethodName)
{
return (FALSE);
}
return (TRUE);
}
/*******************************************************************************
*
* FUNCTION: AcpiExGetTraceEventName
*
* PARAMETERS: Type - Trace event type
*
* RETURN: Trace event name.
*
* DESCRIPTION: Used to obtain the full trace event name.
*
******************************************************************************/
#ifdef ACPI_DEBUG_OUTPUT
static const char *
AcpiExGetTraceEventName (
ACPI_TRACE_EVENT_TYPE Type)
{
switch (Type)
{
case ACPI_TRACE_AML_METHOD:
return "Method";
case ACPI_TRACE_AML_OPCODE:
return "Opcode";
case ACPI_TRACE_AML_REGION:
return "Region";
default:
return "";
}
}
#endif
/*******************************************************************************
*
* FUNCTION: AcpiExTracePoint
*
* PARAMETERS: Type - Trace event type
* Begin - TRUE if before execution
* Aml - Executed AML address
* Pathname - Object path
*
* RETURN: None
*
* DESCRIPTION: Internal interpreter execution trace.
*
******************************************************************************/
void
AcpiExTracePoint (
ACPI_TRACE_EVENT_TYPE Type,
BOOLEAN Begin,
UINT8 *Aml,
char *Pathname)
{
ACPI_FUNCTION_NAME (ExTracePoint);
if (Pathname)
{
ACPI_DEBUG_PRINT ((ACPI_DB_TRACE_POINT,
"%s %s [0x%p:%s] execution.\n",
AcpiExGetTraceEventName (Type), Begin ? "Begin" : "End",
Aml, Pathname));
}
else
{
ACPI_DEBUG_PRINT ((ACPI_DB_TRACE_POINT,
"%s %s [0x%p] execution.\n",
AcpiExGetTraceEventName (Type), Begin ? "Begin" : "End",
Aml));
}
}
/*******************************************************************************
*
* FUNCTION: AcpiExStartTraceMethod
*
* PARAMETERS: MethodNode - Node of the method
* ObjDesc - The method object
* WalkState - current state, NULL if not yet executing
* a method.
*
* RETURN: None
*
* DESCRIPTION: Start control method execution trace
*
******************************************************************************/
void
AcpiExStartTraceMethod (
ACPI_NAMESPACE_NODE *MethodNode,
ACPI_OPERAND_OBJECT *ObjDesc,
ACPI_WALK_STATE *WalkState)
{
ACPI_STATUS Status;
char *Pathname = NULL;
BOOLEAN Enabled = FALSE;
ACPI_FUNCTION_NAME (ExStartTraceMethod);
if (MethodNode)
{
Pathname = AcpiNsGetNormalizedPathname (MethodNode, TRUE);
}
Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
if (ACPI_FAILURE (Status))
{
goto Exit;
}
Enabled = AcpiExInterpreterTraceEnabled (Pathname);
if (Enabled && !AcpiGbl_TraceMethodObject)
{
AcpiGbl_TraceMethodObject = ObjDesc;
AcpiGbl_OriginalDbgLevel = AcpiDbgLevel;
AcpiGbl_OriginalDbgLayer = AcpiDbgLayer;
AcpiDbgLevel = ACPI_TRACE_LEVEL_ALL;
AcpiDbgLayer = ACPI_TRACE_LAYER_ALL;
if (AcpiGbl_TraceDbgLevel)
{
AcpiDbgLevel = AcpiGbl_TraceDbgLevel;
}
if (AcpiGbl_TraceDbgLayer)
{
AcpiDbgLayer = AcpiGbl_TraceDbgLayer;
}
}
(void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
Exit:
if (Enabled)
{
ACPI_TRACE_POINT (ACPI_TRACE_AML_METHOD, TRUE,
ObjDesc ? ObjDesc->Method.AmlStart : NULL, Pathname);
}
if (Pathname)
{
ACPI_FREE (Pathname);
}
}
/*******************************************************************************
*
* FUNCTION: AcpiExStopTraceMethod
*
* PARAMETERS: MethodNode - Node of the method
* ObjDesc - The method object
* WalkState - current state, NULL if not yet executing
* a method.
*
* RETURN: None
*
* DESCRIPTION: Stop control method execution trace
*
******************************************************************************/
void
AcpiExStopTraceMethod (
ACPI_NAMESPACE_NODE *MethodNode,
ACPI_OPERAND_OBJECT *ObjDesc,
ACPI_WALK_STATE *WalkState)
{
ACPI_STATUS Status;
char *Pathname = NULL;
BOOLEAN Enabled;
ACPI_FUNCTION_NAME (ExStopTraceMethod);
if (MethodNode)
{
Pathname = AcpiNsGetNormalizedPathname (MethodNode, TRUE);
}
Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
if (ACPI_FAILURE (Status))
{
goto ExitPath;
}
Enabled = AcpiExInterpreterTraceEnabled (NULL);
(void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
if (Enabled)
{
ACPI_TRACE_POINT (ACPI_TRACE_AML_METHOD, FALSE,
ObjDesc ? ObjDesc->Method.AmlStart : NULL, Pathname);
}
Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
if (ACPI_FAILURE (Status))
{
goto ExitPath;
}
/* Check whether the tracer should be stopped */
if (AcpiGbl_TraceMethodObject == ObjDesc)
{
/* Disable further tracing if type is one-shot */
if (AcpiGbl_TraceFlags & ACPI_TRACE_ONESHOT)
{
AcpiGbl_TraceMethodName = NULL;
}
AcpiDbgLevel = AcpiGbl_OriginalDbgLevel;
AcpiDbgLayer = AcpiGbl_OriginalDbgLayer;
AcpiGbl_TraceMethodObject = NULL;
}
(void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
ExitPath:
if (Pathname)
{
ACPI_FREE (Pathname);
}
}
/*******************************************************************************
*
* FUNCTION: AcpiExStartTraceOpcode
*
* PARAMETERS: Op - The parser opcode object
* WalkState - current state, NULL if not yet executing
* a method.
*
* RETURN: None
*
* DESCRIPTION: Start opcode execution trace
*
******************************************************************************/
void
AcpiExStartTraceOpcode (
ACPI_PARSE_OBJECT *Op,
ACPI_WALK_STATE *WalkState)
{
ACPI_FUNCTION_NAME (ExStartTraceOpcode);
if (AcpiExInterpreterTraceEnabled (NULL) &&
(AcpiGbl_TraceFlags & ACPI_TRACE_OPCODE))
{
ACPI_TRACE_POINT (ACPI_TRACE_AML_OPCODE, TRUE,
Op->Common.Aml, Op->Common.AmlOpName);
}
}
/*******************************************************************************
*
* FUNCTION: AcpiExStopTraceOpcode
*
* PARAMETERS: Op - The parser opcode object
* WalkState - current state, NULL if not yet executing
* a method.
*
* RETURN: None
*
* DESCRIPTION: Stop opcode execution trace
*
******************************************************************************/
void
AcpiExStopTraceOpcode (
ACPI_PARSE_OBJECT *Op,
ACPI_WALK_STATE *WalkState)
{
ACPI_FUNCTION_NAME (ExStopTraceOpcode);
if (AcpiExInterpreterTraceEnabled (NULL) &&
(AcpiGbl_TraceFlags & ACPI_TRACE_OPCODE))
{
ACPI_TRACE_POINT (ACPI_TRACE_AML_OPCODE, FALSE,
Op->Common.Aml, Op->Common.AmlOpName);
}
}

View file

@ -525,7 +525,8 @@ AcpiExDumpObject (
case ACPI_EXD_BUFFER: case ACPI_EXD_BUFFER:
ACPI_DUMP_BUFFER (ObjDesc->Buffer.Pointer, ObjDesc->Buffer.Length); ACPI_DUMP_BUFFER (
ObjDesc->Buffer.Pointer, ObjDesc->Buffer.Length);
break; break;
case ACPI_EXD_PACKAGE: case ACPI_EXD_PACKAGE:
@ -544,7 +545,8 @@ AcpiExDumpObject (
case ACPI_EXD_REFERENCE: case ACPI_EXD_REFERENCE:
ReferenceName = AcpiUtGetReferenceName (ObjDesc); ReferenceName = AcpiUtGetReferenceName (ObjDesc);
AcpiExOutString ("Class Name", ACPI_CAST_PTR (char, ReferenceName)); AcpiExOutString (
"Class Name", ACPI_CAST_PTR (char, ReferenceName));
AcpiExDumpReferenceObj (ObjDesc); AcpiExDumpReferenceObj (ObjDesc);
break; break;
@ -573,7 +575,8 @@ AcpiExDumpObject (
if ((Next == Start) || (Next == Data)) if ((Next == Start) || (Next == Data))
{ {
AcpiOsPrintf ("\n**** Error: Object list appears to be circular linked"); AcpiOsPrintf (
"\n**** Error: Object list appears to be circular linked");
break; break;
} }
} }
@ -591,7 +594,8 @@ AcpiExDumpObject (
if (Next) if (Next)
{ {
AcpiOsPrintf ("(%s %2.2X)", AcpiOsPrintf ("(%s %2.2X)",
AcpiUtGetObjectTypeName (Next), Next->Common.Type); AcpiUtGetObjectTypeName (Next),
Next->AddressSpace.SpaceId);
while (Next->AddressSpace.Next) while (Next->AddressSpace.Next)
{ {
@ -603,11 +607,13 @@ AcpiExDumpObject (
Next = Next->AddressSpace.Next; Next = Next->AddressSpace.Next;
AcpiOsPrintf ("->%p(%s %2.2X)", Next, AcpiOsPrintf ("->%p(%s %2.2X)", Next,
AcpiUtGetObjectTypeName (Next), Next->Common.Type); AcpiUtGetObjectTypeName (Next),
Next->AddressSpace.SpaceId);
if ((Next == Start) || (Next == Data)) if ((Next == Start) || (Next == Data))
{ {
AcpiOsPrintf ("\n**** Error: Handler list appears to be circular linked"); AcpiOsPrintf (
"\n**** Error: Handler list appears to be circular linked");
break; break;
} }
} }
@ -641,7 +647,8 @@ AcpiExDumpObject (
if ((Next == Start) || (Next == Data)) if ((Next == Start) || (Next == Data))
{ {
AcpiOsPrintf ("\n**** Error: Region list appears to be circular linked"); AcpiOsPrintf (
"\n**** Error: Region list appears to be circular linked");
break; break;
} }
} }
@ -749,7 +756,8 @@ AcpiExDumpOperand (
{ {
case ACPI_TYPE_LOCAL_REFERENCE: case ACPI_TYPE_LOCAL_REFERENCE:
AcpiOsPrintf ("Reference: [%s] ", AcpiUtGetReferenceName (ObjDesc)); AcpiOsPrintf ("Reference: [%s] ",
AcpiUtGetReferenceName (ObjDesc));
switch (ObjDesc->Reference.Class) switch (ObjDesc->Reference.Class)
{ {
@ -777,7 +785,8 @@ AcpiExDumpOperand (
case ACPI_REFCLASS_NAME: case ACPI_REFCLASS_NAME:
AcpiOsPrintf ("- [%4.4s]\n", ObjDesc->Reference.Node->Name.Ascii); AcpiOsPrintf ("- [%4.4s]\n",
ObjDesc->Reference.Node->Name.Ascii);
break; break;
case ACPI_REFCLASS_ARG: case ACPI_REFCLASS_ARG:
@ -808,8 +817,8 @@ AcpiExDumpOperand (
Length = 128; Length = 128;
} }
AcpiOsPrintf ("Buffer Contents: (displaying length 0x%.2X)\n", AcpiOsPrintf (
Length); "Buffer Contents: (displaying length 0x%.2X)\n", Length);
ACPI_DUMP_BUFFER (ObjDesc->Buffer.Pointer, Length); ACPI_DUMP_BUFFER (ObjDesc->Buffer.Pointer, Length);
} }
break; break;
@ -835,7 +844,8 @@ AcpiExDumpOperand (
{ {
for (Index = 0; Index < ObjDesc->Package.Count; Index++) for (Index = 0; Index < ObjDesc->Package.Count; Index++)
{ {
AcpiExDumpOperand (ObjDesc->Package.Elements[Index], Depth+1); AcpiExDumpOperand (
ObjDesc->Package.Elements[Index], Depth + 1);
} }
} }
break; break;
@ -888,7 +898,7 @@ AcpiExDumpOperand (
ObjDesc->Field.BaseByteOffset, ObjDesc->Field.BaseByteOffset,
ObjDesc->Field.StartFieldBitOffset); ObjDesc->Field.StartFieldBitOffset);
AcpiExDumpOperand (ObjDesc->Field.RegionObj, Depth+1); AcpiExDumpOperand (ObjDesc->Field.RegionObj, Depth + 1);
break; break;
case ACPI_TYPE_LOCAL_INDEX_FIELD: case ACPI_TYPE_LOCAL_INDEX_FIELD:
@ -914,7 +924,7 @@ AcpiExDumpOperand (
} }
else else
{ {
AcpiExDumpOperand (ObjDesc->BufferField.BufferObj, Depth+1); AcpiExDumpOperand (ObjDesc->BufferField.BufferObj, Depth + 1);
} }
break; break;
@ -1214,7 +1224,8 @@ AcpiExDumpPackageObj (
AcpiOsPrintf ("[Buffer] Length %.2X = ", ObjDesc->Buffer.Length); AcpiOsPrintf ("[Buffer] Length %.2X = ", ObjDesc->Buffer.Length);
if (ObjDesc->Buffer.Length) if (ObjDesc->Buffer.Length)
{ {
AcpiUtDebugDumpBuffer (ACPI_CAST_PTR (UINT8, ObjDesc->Buffer.Pointer), AcpiUtDebugDumpBuffer (
ACPI_CAST_PTR (UINT8, ObjDesc->Buffer.Pointer),
ObjDesc->Buffer.Length, DB_DWORD_DISPLAY, _COMPONENT); ObjDesc->Buffer.Length, DB_DWORD_DISPLAY, _COMPONENT);
} }
else else
@ -1230,7 +1241,8 @@ AcpiExDumpPackageObj (
for (i = 0; i < ObjDesc->Package.Count; i++) for (i = 0; i < ObjDesc->Package.Count; i++)
{ {
AcpiExDumpPackageObj (ObjDesc->Package.Elements[i], Level+1, i); AcpiExDumpPackageObj (
ObjDesc->Package.Elements[i], Level + 1, i);
} }
break; break;
@ -1328,7 +1340,8 @@ DumpObject:
ObjDesc = ObjDesc->Common.NextObject; ObjDesc = ObjDesc->Common.NextObject;
if (ObjDesc->Common.Type > ACPI_TYPE_LOCAL_MAX) if (ObjDesc->Common.Type > ACPI_TYPE_LOCAL_MAX)
{ {
AcpiOsPrintf ("Secondary object is not a known object type: %2.2X\n", AcpiOsPrintf (
"Secondary object is not a known object type: %2.2X\n",
ObjDesc->Common.Type); ObjDesc->Common.Type);
return_VOID; return_VOID;

View file

@ -256,28 +256,31 @@ AcpiExReadDataFromField (
ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_IPMI)) ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_IPMI))
{ {
/* /*
* This is an SMBus, GSBus or IPMI read. We must create a buffer to hold * This is an SMBus, GSBus or IPMI read. We must create a buffer to
* the data and then directly access the region handler. * hold the data and then directly access the region handler.
* *
* Note: SMBus and GSBus protocol value is passed in upper 16-bits of Function * Note: SMBus and GSBus protocol value is passed in upper 16-bits
* of Function
*/ */
if (ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_SMBUS) if (ObjDesc->Field.RegionObj->Region.SpaceId ==
ACPI_ADR_SPACE_SMBUS)
{ {
Length = ACPI_SMBUS_BUFFER_SIZE; Length = ACPI_SMBUS_BUFFER_SIZE;
Function = ACPI_READ | (ObjDesc->Field.Attribute << 16); Function = ACPI_READ | (ObjDesc->Field.Attribute << 16);
} }
else if (ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_GSBUS) else if (ObjDesc->Field.RegionObj->Region.SpaceId ==
ACPI_ADR_SPACE_GSBUS)
{ {
AccessorType = ObjDesc->Field.Attribute; AccessorType = ObjDesc->Field.Attribute;
Length = AcpiExGetSerialAccessLength (AccessorType, Length = AcpiExGetSerialAccessLength (
ObjDesc->Field.AccessLength); AccessorType, ObjDesc->Field.AccessLength);
/* /*
* Add additional 2 bytes for the GenericSerialBus data buffer: * Add additional 2 bytes for the GenericSerialBus data buffer:
* *
* Status; (Byte 0 of the data buffer) * Status; (Byte 0 of the data buffer)
* Length; (Byte 1 of the data buffer) * Length; (Byte 1 of the data buffer)
* Data[x-1]; (Bytes 2-x of the arbitrary length data buffer) * Data[x-1]: (Bytes 2-x of the arbitrary length data buffer)
*/ */
Length += 2; Length += 2;
Function = ACPI_READ | (AccessorType << 16); Function = ACPI_READ | (AccessorType << 16);
@ -301,8 +304,8 @@ AcpiExReadDataFromField (
/* Call the region handler for the read */ /* Call the region handler for the read */
Status = AcpiExAccessRegion (ObjDesc, 0, Status = AcpiExAccessRegion (ObjDesc, 0,
ACPI_CAST_PTR (UINT64, BufferDesc->Buffer.Pointer), ACPI_CAST_PTR (UINT64, BufferDesc->Buffer.Pointer), Function);
Function);
AcpiExReleaseGlobalLock (ObjDesc->CommonField.FieldFlags); AcpiExReleaseGlobalLock (ObjDesc->CommonField.FieldFlags);
goto Exit; goto Exit;
} }
@ -317,7 +320,9 @@ AcpiExReadDataFromField (
* *
* Note: Field.length is in bits. * Note: Field.length is in bits.
*/ */
Length = (ACPI_SIZE) ACPI_ROUND_BITS_UP_TO_BYTES (ObjDesc->Field.BitLength); Length = (ACPI_SIZE) ACPI_ROUND_BITS_UP_TO_BYTES (
ObjDesc->Field.BitLength);
if (Length > AcpiGbl_IntegerByteWidth) if (Length > AcpiGbl_IntegerByteWidth)
{ {
/* Field is too large for an Integer, create a Buffer instead */ /* Field is too large for an Integer, create a Buffer instead */
@ -362,8 +367,9 @@ AcpiExReadDataFromField (
/* Perform the write */ /* Perform the write */
Status = AcpiExAccessRegion (ObjDesc, 0, Status = AcpiExAccessRegion (
(UINT64 *) Buffer, ACPI_READ); ObjDesc, 0, (UINT64 *) Buffer, ACPI_READ);
AcpiExReleaseGlobalLock (ObjDesc->CommonField.FieldFlags); AcpiExReleaseGlobalLock (ObjDesc->CommonField.FieldFlags);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
@ -468,42 +474,47 @@ AcpiExWriteDataToField (
ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_IPMI)) ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_IPMI))
{ {
/* /*
* This is an SMBus, GSBus or IPMI write. We will bypass the entire field * This is an SMBus, GSBus or IPMI write. We will bypass the entire
* mechanism and handoff the buffer directly to the handler. For * field mechanism and handoff the buffer directly to the handler.
* these address spaces, the buffer is bi-directional; on a write, * For these address spaces, the buffer is bi-directional; on a
* return data is returned in the same buffer. * write, return data is returned in the same buffer.
* *
* Source must be a buffer of sufficient size: * Source must be a buffer of sufficient size:
* ACPI_SMBUS_BUFFER_SIZE, ACPI_GSBUS_BUFFER_SIZE, or ACPI_IPMI_BUFFER_SIZE. * ACPI_SMBUS_BUFFER_SIZE, ACPI_GSBUS_BUFFER_SIZE, or
* ACPI_IPMI_BUFFER_SIZE.
* *
* Note: SMBus and GSBus protocol type is passed in upper 16-bits of Function * Note: SMBus and GSBus protocol type is passed in upper 16-bits
* of Function
*/ */
if (SourceDesc->Common.Type != ACPI_TYPE_BUFFER) if (SourceDesc->Common.Type != ACPI_TYPE_BUFFER)
{ {
ACPI_ERROR ((AE_INFO, ACPI_ERROR ((AE_INFO,
"SMBus/IPMI/GenericSerialBus write requires Buffer, found type %s", "SMBus/IPMI/GenericSerialBus write requires "
"Buffer, found type %s",
AcpiUtGetObjectTypeName (SourceDesc))); AcpiUtGetObjectTypeName (SourceDesc)));
return_ACPI_STATUS (AE_AML_OPERAND_TYPE); return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
} }
if (ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_SMBUS) if (ObjDesc->Field.RegionObj->Region.SpaceId ==
ACPI_ADR_SPACE_SMBUS)
{ {
Length = ACPI_SMBUS_BUFFER_SIZE; Length = ACPI_SMBUS_BUFFER_SIZE;
Function = ACPI_WRITE | (ObjDesc->Field.Attribute << 16); Function = ACPI_WRITE | (ObjDesc->Field.Attribute << 16);
} }
else if (ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_GSBUS) else if (ObjDesc->Field.RegionObj->Region.SpaceId ==
ACPI_ADR_SPACE_GSBUS)
{ {
AccessorType = ObjDesc->Field.Attribute; AccessorType = ObjDesc->Field.Attribute;
Length = AcpiExGetSerialAccessLength (AccessorType, Length = AcpiExGetSerialAccessLength (
ObjDesc->Field.AccessLength); AccessorType, ObjDesc->Field.AccessLength);
/* /*
* Add additional 2 bytes for the GenericSerialBus data buffer: * Add additional 2 bytes for the GenericSerialBus data buffer:
* *
* Status; (Byte 0 of the data buffer) * Status; (Byte 0 of the data buffer)
* Length; (Byte 1 of the data buffer) * Length; (Byte 1 of the data buffer)
* Data[x-1]; (Bytes 2-x of the arbitrary length data buffer) * Data[x-1]: (Bytes 2-x of the arbitrary length data buffer)
*/ */
Length += 2; Length += 2;
Function = ACPI_WRITE | (AccessorType << 16); Function = ACPI_WRITE | (AccessorType << 16);
@ -517,7 +528,8 @@ AcpiExWriteDataToField (
if (SourceDesc->Buffer.Length < Length) if (SourceDesc->Buffer.Length < Length)
{ {
ACPI_ERROR ((AE_INFO, ACPI_ERROR ((AE_INFO,
"SMBus/IPMI/GenericSerialBus write requires Buffer of length %u, found length %u", "SMBus/IPMI/GenericSerialBus write requires "
"Buffer of length %u, found length %u",
Length, SourceDesc->Buffer.Length)); Length, SourceDesc->Buffer.Length));
return_ACPI_STATUS (AE_AML_BUFFER_LIMIT); return_ACPI_STATUS (AE_AML_BUFFER_LIMIT);
@ -542,8 +554,8 @@ AcpiExWriteDataToField (
* Perform the write (returns status and perhaps data in the * Perform the write (returns status and perhaps data in the
* same buffer) * same buffer)
*/ */
Status = AcpiExAccessRegion (ObjDesc, 0, Status = AcpiExAccessRegion (
(UINT64 *) Buffer, Function); ObjDesc, 0, (UINT64 *) Buffer, Function);
AcpiExReleaseGlobalLock (ObjDesc->CommonField.FieldFlags); AcpiExReleaseGlobalLock (ObjDesc->CommonField.FieldFlags);
*ResultDesc = BufferDesc; *ResultDesc = BufferDesc;
@ -579,8 +591,8 @@ AcpiExWriteDataToField (
/* Perform the write */ /* Perform the write */
Status = AcpiExAccessRegion (ObjDesc, 0, Status = AcpiExAccessRegion (
(UINT64 *) Buffer, ACPI_WRITE); ObjDesc, 0, (UINT64 *) Buffer, ACPI_WRITE);
AcpiExReleaseGlobalLock (ObjDesc->CommonField.FieldFlags); AcpiExReleaseGlobalLock (ObjDesc->CommonField.FieldFlags);
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);
} }

View file

@ -192,7 +192,8 @@ AcpiExSetupRegion (
if (!AcpiIsValidSpaceId (SpaceId)) if (!AcpiIsValidSpaceId (SpaceId))
{ {
ACPI_ERROR ((AE_INFO, "Invalid/unknown Address Space ID: 0x%2.2X", SpaceId)); ACPI_ERROR ((AE_INFO,
"Invalid/unknown Address Space ID: 0x%2.2X", SpaceId));
return_ACPI_STATUS (AE_AML_INVALID_SPACE_ID); return_ACPI_STATUS (AE_AML_INVALID_SPACE_ID);
} }
@ -270,7 +271,8 @@ AcpiExSetupRegion (
* byte, and a field with Dword access specified. * byte, and a field with Dword access specified.
*/ */
ACPI_ERROR ((AE_INFO, ACPI_ERROR ((AE_INFO,
"Field [%4.4s] access width (%u bytes) too large for region [%4.4s] (length %u)", "Field [%4.4s] access width (%u bytes) "
"too large for region [%4.4s] (length %u)",
AcpiUtGetNodeName (ObjDesc->CommonField.Node), AcpiUtGetNodeName (ObjDesc->CommonField.Node),
ObjDesc->CommonField.AccessByteWidth, ObjDesc->CommonField.AccessByteWidth,
AcpiUtGetNodeName (RgnDesc->Region.Node), AcpiUtGetNodeName (RgnDesc->Region.Node),
@ -282,7 +284,8 @@ AcpiExSetupRegion (
* exceeds region length, indicate an error * exceeds region length, indicate an error
*/ */
ACPI_ERROR ((AE_INFO, ACPI_ERROR ((AE_INFO,
"Field [%4.4s] Base+Offset+Width %u+%u+%u is beyond end of region [%4.4s] (length %u)", "Field [%4.4s] Base+Offset+Width %u+%u+%u "
"is beyond end of region [%4.4s] (length %u)",
AcpiUtGetNodeName (ObjDesc->CommonField.Node), AcpiUtGetNodeName (ObjDesc->CommonField.Node),
ObjDesc->CommonField.BaseByteOffset, ObjDesc->CommonField.BaseByteOffset,
FieldDatumByteOffset, ObjDesc->CommonField.AccessByteWidth, FieldDatumByteOffset, ObjDesc->CommonField.AccessByteWidth,
@ -584,8 +587,8 @@ AcpiExFieldDatumIo (
* For simple RegionFields, we just directly access the owning * For simple RegionFields, we just directly access the owning
* Operation Region. * Operation Region.
*/ */
Status = AcpiExAccessRegion (ObjDesc, FieldDatumByteOffset, Value, Status = AcpiExAccessRegion (
ReadWrite); ObjDesc, FieldDatumByteOffset, Value, ReadWrite);
break; break;
case ACPI_TYPE_LOCAL_INDEX_FIELD: case ACPI_TYPE_LOCAL_INDEX_FIELD:
@ -608,8 +611,7 @@ AcpiExFieldDatumIo (
FieldDatumByteOffset)); FieldDatumByteOffset));
Status = AcpiExInsertIntoField (ObjDesc->IndexField.IndexObj, Status = AcpiExInsertIntoField (ObjDesc->IndexField.IndexObj,
&FieldDatumByteOffset, &FieldDatumByteOffset, sizeof (FieldDatumByteOffset));
sizeof (FieldDatumByteOffset));
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);
@ -622,8 +624,8 @@ AcpiExFieldDatumIo (
ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
"Read from Data Register\n")); "Read from Data Register\n"));
Status = AcpiExExtractFromField (ObjDesc->IndexField.DataObj, Status = AcpiExExtractFromField (
Value, sizeof (UINT64)); ObjDesc->IndexField.DataObj, Value, sizeof (UINT64));
} }
else else
{ {
@ -633,8 +635,8 @@ AcpiExFieldDatumIo (
"Write to Data Register: Value %8.8X%8.8X\n", "Write to Data Register: Value %8.8X%8.8X\n",
ACPI_FORMAT_UINT64 (*Value))); ACPI_FORMAT_UINT64 (*Value)));
Status = AcpiExInsertIntoField (ObjDesc->IndexField.DataObj, Status = AcpiExInsertIntoField (
Value, sizeof (UINT64)); ObjDesc->IndexField.DataObj, Value, sizeof (UINT64));
} }
break; break;
@ -722,8 +724,8 @@ AcpiExWriteWithUpdateRule (
* Read the current contents of the byte/word/dword containing * Read the current contents of the byte/word/dword containing
* the field, and merge with the new field value. * the field, and merge with the new field value.
*/ */
Status = AcpiExFieldDatumIo (ObjDesc, FieldDatumByteOffset, Status = AcpiExFieldDatumIo (
&CurrentValue, ACPI_READ); ObjDesc, FieldDatumByteOffset, &CurrentValue, ACPI_READ);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);
@ -751,13 +753,15 @@ AcpiExWriteWithUpdateRule (
ACPI_ERROR ((AE_INFO, ACPI_ERROR ((AE_INFO,
"Unknown UpdateRule value: 0x%X", "Unknown UpdateRule value: 0x%X",
(ObjDesc->CommonField.FieldFlags & AML_FIELD_UPDATE_RULE_MASK))); (ObjDesc->CommonField.FieldFlags &
AML_FIELD_UPDATE_RULE_MASK)));
return_ACPI_STATUS (AE_AML_OPERAND_VALUE); return_ACPI_STATUS (AE_AML_OPERAND_VALUE);
} }
} }
ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
"Mask %8.8X%8.8X, DatumOffset %X, Width %X, Value %8.8X%8.8X, MergedValue %8.8X%8.8X\n", "Mask %8.8X%8.8X, DatumOffset %X, Width %X, "
"Value %8.8X%8.8X, MergedValue %8.8X%8.8X\n",
ACPI_FORMAT_UINT64 (Mask), ACPI_FORMAT_UINT64 (Mask),
FieldDatumByteOffset, FieldDatumByteOffset,
ObjDesc->CommonField.AccessByteWidth, ObjDesc->CommonField.AccessByteWidth,
@ -766,8 +770,8 @@ AcpiExWriteWithUpdateRule (
/* Write the merged value */ /* Write the merged value */
Status = AcpiExFieldDatumIo (ObjDesc, FieldDatumByteOffset, Status = AcpiExFieldDatumIo (
&MergedValue, ACPI_WRITE); ObjDesc, FieldDatumByteOffset, &MergedValue, ACPI_WRITE);
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);
} }
@ -878,8 +882,8 @@ AcpiExExtractFromField (
/* Get next input datum from the field */ /* Get next input datum from the field */
FieldOffset += ObjDesc->CommonField.AccessByteWidth; FieldOffset += ObjDesc->CommonField.AccessByteWidth;
Status = AcpiExFieldDatumIo (ObjDesc, FieldOffset, Status = AcpiExFieldDatumIo (
&RawDatum, ACPI_READ); ObjDesc, FieldOffset, &RawDatum, ACPI_READ);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);
@ -977,6 +981,7 @@ AcpiExInsertIntoField (
NewBuffer = NULL; NewBuffer = NULL;
RequiredLength = ACPI_ROUND_BITS_UP_TO_BYTES ( RequiredLength = ACPI_ROUND_BITS_UP_TO_BYTES (
ObjDesc->CommonField.BitLength); ObjDesc->CommonField.BitLength);
/* /*
* We must have a buffer that is at least as long as the field * We must have a buffer that is at least as long as the field
* we are writing to. This is because individual fields are * we are writing to. This is because individual fields are
@ -1054,8 +1059,8 @@ AcpiExInsertIntoField (
/* Write merged datum to the target field */ /* Write merged datum to the target field */
MergedDatum &= Mask; MergedDatum &= Mask;
Status = AcpiExWriteWithUpdateRule (ObjDesc, Mask, Status = AcpiExWriteWithUpdateRule (
MergedDatum, FieldOffset); ObjDesc, Mask, MergedDatum, FieldOffset);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
goto Exit; goto Exit;
@ -1112,8 +1117,8 @@ AcpiExInsertIntoField (
/* Write the last datum to the field */ /* Write the last datum to the field */
MergedDatum &= Mask; MergedDatum &= Mask;
Status = AcpiExWriteWithUpdateRule (ObjDesc, Status = AcpiExWriteWithUpdateRule (
Mask, MergedDatum, FieldOffset); ObjDesc, Mask, MergedDatum, FieldOffset);
Exit: Exit:
/* Free temporary buffer if we used one */ /* Free temporary buffer if we used one */

View file

@ -180,9 +180,9 @@ AcpiExGetObjectReference (
default: default:
ACPI_ERROR ((AE_INFO, "Unknown Reference Class 0x%2.2X", ACPI_ERROR ((AE_INFO, "Invalid Reference Class 0x%2.2X",
ObjDesc->Reference.Class)); ObjDesc->Reference.Class));
return_ACPI_STATUS (AE_AML_INTERNAL); return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
} }
break; break;
@ -338,6 +338,7 @@ AcpiExDoConcatenate (
ACPI_OPERAND_OBJECT *LocalOperand1 = Operand1; ACPI_OPERAND_OBJECT *LocalOperand1 = Operand1;
ACPI_OPERAND_OBJECT *ReturnDesc; ACPI_OPERAND_OBJECT *ReturnDesc;
char *NewBuf; char *NewBuf;
const char *TypeString;
ACPI_STATUS Status; ACPI_STATUS Status;
@ -359,9 +360,42 @@ AcpiExDoConcatenate (
break; break;
case ACPI_TYPE_STRING: case ACPI_TYPE_STRING:
/*
* Per the ACPI spec, Concatenate only supports int/str/buf.
* However, we support all objects here as an extension.
* This improves the usefulness of the Printf() macro.
* 12/2015.
*/
switch (Operand1->Common.Type)
{
case ACPI_TYPE_INTEGER:
case ACPI_TYPE_STRING:
case ACPI_TYPE_BUFFER:
Status = AcpiExConvertToString (Operand1, &LocalOperand1, Status = AcpiExConvertToString (
ACPI_IMPLICIT_CONVERT_HEX); Operand1, &LocalOperand1, ACPI_IMPLICIT_CONVERT_HEX);
break;
default:
/*
* Just emit a string containing the object type.
*/
TypeString = AcpiUtGetTypeName (Operand1->Common.Type);
LocalOperand1 = AcpiUtCreateStringObject (
((ACPI_SIZE) strlen (TypeString) + 9)); /* 9 For "[Object]" */
if (!LocalOperand1)
{
Status = AE_NO_MEMORY;
goto Cleanup;
}
strcpy (LocalOperand1->String.Pointer, "[");
strcat (LocalOperand1->String.Pointer, TypeString);
strcat (LocalOperand1->String.Pointer, " Object]");
Status = AE_OK;
break;
}
break; break;
case ACPI_TYPE_BUFFER: case ACPI_TYPE_BUFFER:
@ -401,8 +435,8 @@ AcpiExDoConcatenate (
/* Result of two Integers is a Buffer */ /* Result of two Integers is a Buffer */
/* Need enough buffer space for two integers */ /* Need enough buffer space for two integers */
ReturnDesc = AcpiUtCreateBufferObject ((ACPI_SIZE) ReturnDesc = AcpiUtCreateBufferObject (
ACPI_MUL_2 (AcpiGbl_IntegerByteWidth)); (ACPI_SIZE) ACPI_MUL_2 (AcpiGbl_IntegerByteWidth));
if (!ReturnDesc) if (!ReturnDesc)
{ {
Status = AE_NO_MEMORY; Status = AE_NO_MEMORY;
@ -419,8 +453,7 @@ AcpiExDoConcatenate (
/* Copy the second integer (LSB first) after the first */ /* Copy the second integer (LSB first) after the first */
memcpy (NewBuf + AcpiGbl_IntegerByteWidth, memcpy (NewBuf + AcpiGbl_IntegerByteWidth,
&LocalOperand1->Integer.Value, &LocalOperand1->Integer.Value, AcpiGbl_IntegerByteWidth);
AcpiGbl_IntegerByteWidth);
break; break;
case ACPI_TYPE_STRING: case ACPI_TYPE_STRING:
@ -441,8 +474,7 @@ AcpiExDoConcatenate (
/* Concatenate the strings */ /* Concatenate the strings */
strcpy (NewBuf, Operand0->String.Pointer); strcpy (NewBuf, Operand0->String.Pointer);
strcpy (NewBuf + Operand0->String.Length, strcat (NewBuf, LocalOperand1->String.Pointer);
LocalOperand1->String.Pointer);
break; break;
case ACPI_TYPE_BUFFER: case ACPI_TYPE_BUFFER:
@ -708,8 +740,8 @@ AcpiExDoLogicalOp (
case ACPI_TYPE_STRING: case ACPI_TYPE_STRING:
Status = AcpiExConvertToString (Operand1, &LocalOperand1, Status = AcpiExConvertToString (
ACPI_IMPLICIT_CONVERT_HEX); Operand1, &LocalOperand1, ACPI_IMPLICIT_CONVERT_HEX);
break; break;
case ACPI_TYPE_BUFFER: case ACPI_TYPE_BUFFER:

View file

@ -281,8 +281,7 @@ AcpiExAcquireMutexObject (
} }
else else
{ {
Status = AcpiExSystemWaitMutex (ObjDesc->Mutex.OsMutex, Status = AcpiExSystemWaitMutex (ObjDesc->Mutex.OsMutex, Timeout);
Timeout);
} }
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
@ -345,33 +344,48 @@ AcpiExAcquireMutex (
} }
/* /*
* Current sync level must be less than or equal to the sync level of the * Current sync level must be less than or equal to the sync level
* mutex. This mechanism provides some deadlock prevention * of the mutex. This mechanism provides some deadlock prevention.
*/ */
if (WalkState->Thread->CurrentSyncLevel > ObjDesc->Mutex.SyncLevel) if (WalkState->Thread->CurrentSyncLevel > ObjDesc->Mutex.SyncLevel)
{ {
ACPI_ERROR ((AE_INFO, ACPI_ERROR ((AE_INFO,
"Cannot acquire Mutex [%4.4s], current SyncLevel is too large (%u)", "Cannot acquire Mutex [%4.4s], "
"current SyncLevel is too large (%u)",
AcpiUtGetNodeName (ObjDesc->Mutex.Node), AcpiUtGetNodeName (ObjDesc->Mutex.Node),
WalkState->Thread->CurrentSyncLevel)); WalkState->Thread->CurrentSyncLevel));
return_ACPI_STATUS (AE_AML_MUTEX_ORDER); return_ACPI_STATUS (AE_AML_MUTEX_ORDER);
} }
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
"Acquiring: Mutex SyncLevel %u, Thread SyncLevel %u, "
"Depth %u TID %p\n",
ObjDesc->Mutex.SyncLevel, WalkState->Thread->CurrentSyncLevel,
ObjDesc->Mutex.AcquisitionDepth, WalkState->Thread));
Status = AcpiExAcquireMutexObject ((UINT16) TimeDesc->Integer.Value, Status = AcpiExAcquireMutexObject ((UINT16) TimeDesc->Integer.Value,
ObjDesc, WalkState->Thread->ThreadId); ObjDesc, WalkState->Thread->ThreadId);
if (ACPI_SUCCESS (Status) && ObjDesc->Mutex.AcquisitionDepth == 1) if (ACPI_SUCCESS (Status) && ObjDesc->Mutex.AcquisitionDepth == 1)
{ {
/* Save Thread object, original/current sync levels */ /* Save Thread object, original/current sync levels */
ObjDesc->Mutex.OwnerThread = WalkState->Thread; ObjDesc->Mutex.OwnerThread = WalkState->Thread;
ObjDesc->Mutex.OriginalSyncLevel = WalkState->Thread->CurrentSyncLevel; ObjDesc->Mutex.OriginalSyncLevel =
WalkState->Thread->CurrentSyncLevel = ObjDesc->Mutex.SyncLevel; WalkState->Thread->CurrentSyncLevel;
WalkState->Thread->CurrentSyncLevel =
ObjDesc->Mutex.SyncLevel;
/* Link the mutex to the current thread for force-unlock at method exit */ /* Link the mutex to the current thread for force-unlock at method exit */
AcpiExLinkMutex (ObjDesc, WalkState->Thread); AcpiExLinkMutex (ObjDesc, WalkState->Thread);
} }
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
"Acquired: Mutex SyncLevel %u, Thread SyncLevel %u, Depth %u\n",
ObjDesc->Mutex.SyncLevel, WalkState->Thread->CurrentSyncLevel,
ObjDesc->Mutex.AcquisitionDepth));
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);
} }
@ -467,9 +481,9 @@ AcpiExReleaseMutex (
ACPI_OPERAND_OBJECT *ObjDesc, ACPI_OPERAND_OBJECT *ObjDesc,
ACPI_WALK_STATE *WalkState) ACPI_WALK_STATE *WalkState)
{ {
ACPI_STATUS Status = AE_OK;
UINT8 PreviousSyncLevel; UINT8 PreviousSyncLevel;
ACPI_THREAD_STATE *OwnerThread; ACPI_THREAD_STATE *OwnerThread;
ACPI_STATUS Status = AE_OK;
ACPI_FUNCTION_TRACE (ExReleaseMutex); ACPI_FUNCTION_TRACE (ExReleaseMutex);
@ -527,7 +541,8 @@ AcpiExReleaseMutex (
if (ObjDesc->Mutex.SyncLevel != OwnerThread->CurrentSyncLevel) if (ObjDesc->Mutex.SyncLevel != OwnerThread->CurrentSyncLevel)
{ {
ACPI_ERROR ((AE_INFO, ACPI_ERROR ((AE_INFO,
"Cannot release Mutex [%4.4s], SyncLevel mismatch: mutex %u current %u", "Cannot release Mutex [%4.4s], SyncLevel mismatch: "
"mutex %u current %u",
AcpiUtGetNodeName (ObjDesc->Mutex.Node), AcpiUtGetNodeName (ObjDesc->Mutex.Node),
ObjDesc->Mutex.SyncLevel, WalkState->Thread->CurrentSyncLevel)); ObjDesc->Mutex.SyncLevel, WalkState->Thread->CurrentSyncLevel));
return_ACPI_STATUS (AE_AML_MUTEX_ORDER); return_ACPI_STATUS (AE_AML_MUTEX_ORDER);
@ -541,6 +556,13 @@ AcpiExReleaseMutex (
PreviousSyncLevel = PreviousSyncLevel =
OwnerThread->AcquiredMutexList->Mutex.OriginalSyncLevel; OwnerThread->AcquiredMutexList->Mutex.OriginalSyncLevel;
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
"Releasing: Object SyncLevel %u, Thread SyncLevel %u, "
"Prev SyncLevel %u, Depth %u TID %p\n",
ObjDesc->Mutex.SyncLevel, WalkState->Thread->CurrentSyncLevel,
PreviousSyncLevel, ObjDesc->Mutex.AcquisitionDepth,
WalkState->Thread));
Status = AcpiExReleaseMutexObject (ObjDesc); Status = AcpiExReleaseMutexObject (ObjDesc);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
@ -554,6 +576,12 @@ AcpiExReleaseMutex (
OwnerThread->CurrentSyncLevel = PreviousSyncLevel; OwnerThread->CurrentSyncLevel = PreviousSyncLevel;
} }
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
"Released: Object SyncLevel %u, Thread SyncLevel, %u, "
"Prev SyncLevel %u, Depth %u\n",
ObjDesc->Mutex.SyncLevel, WalkState->Thread->CurrentSyncLevel,
PreviousSyncLevel, ObjDesc->Mutex.AcquisitionDepth));
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);
} }
@ -584,7 +612,7 @@ AcpiExReleaseAllMutexes (
ACPI_OPERAND_OBJECT *ObjDesc; ACPI_OPERAND_OBJECT *ObjDesc;
ACPI_FUNCTION_NAME (ExReleaseAllMutexes); ACPI_FUNCTION_TRACE (ExReleaseAllMutexes);
/* Traverse the list of owned mutexes, releasing each one */ /* Traverse the list of owned mutexes, releasing each one */
@ -592,14 +620,10 @@ AcpiExReleaseAllMutexes (
while (Next) while (Next)
{ {
ObjDesc = Next; ObjDesc = Next;
Next = ObjDesc->Mutex.Next;
ObjDesc->Mutex.Prev = NULL;
ObjDesc->Mutex.Next = NULL;
ObjDesc->Mutex.AcquisitionDepth = 0;
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
"Force-releasing held mutex: %p\n", ObjDesc)); "Mutex [%4.4s] force-release, SyncLevel %u Depth %u\n",
ObjDesc->Mutex.Node->Name.Ascii, ObjDesc->Mutex.SyncLevel,
ObjDesc->Mutex.AcquisitionDepth));
/* Release the mutex, special case for Global Lock */ /* Release the mutex, special case for Global Lock */
@ -614,13 +638,20 @@ AcpiExReleaseAllMutexes (
AcpiOsReleaseMutex (ObjDesc->Mutex.OsMutex); AcpiOsReleaseMutex (ObjDesc->Mutex.OsMutex);
} }
/* Mark mutex unowned */
ObjDesc->Mutex.OwnerThread = NULL;
ObjDesc->Mutex.ThreadId = 0;
/* Update Thread SyncLevel (Last mutex is the important one) */ /* Update Thread SyncLevel (Last mutex is the important one) */
Thread->CurrentSyncLevel = ObjDesc->Mutex.OriginalSyncLevel; Thread->CurrentSyncLevel = ObjDesc->Mutex.OriginalSyncLevel;
/* Mark mutex unowned */
Next = ObjDesc->Mutex.Next;
ObjDesc->Mutex.Prev = NULL;
ObjDesc->Mutex.Next = NULL;
ObjDesc->Mutex.AcquisitionDepth = 0;
ObjDesc->Mutex.OwnerThread = NULL;
ObjDesc->Mutex.ThreadId = 0;
} }
return_VOID;
} }

View file

@ -232,6 +232,7 @@ AcpiExAllocateNameString (
return_PTR (NameString); return_PTR (NameString);
} }
/******************************************************************************* /*******************************************************************************
* *
* FUNCTION: AcpiExNameSegment * FUNCTION: AcpiExNameSegment
@ -261,8 +262,8 @@ AcpiExNameSegment (
/* /*
* If first character is a digit, then we know that we aren't looking at a * If first character is a digit, then we know that we aren't looking
* valid name segment * at a valid name segment
*/ */
CharBuf[0] = *AmlAddress; CharBuf[0] = *AmlAddress;
@ -466,7 +467,8 @@ AcpiExGetNameString (
AmlAddress++; AmlAddress++;
NumSegments = *AmlAddress; NumSegments = *AmlAddress;
NameString = AcpiExAllocateNameString (PrefixCount, NumSegments); NameString = AcpiExAllocateNameString (
PrefixCount, NumSegments);
if (!NameString) if (!NameString)
{ {
Status = AE_NO_MEMORY; Status = AE_NO_MEMORY;

View file

@ -581,28 +581,30 @@ AcpiExOpcode_1A_1T_1R (
*/ */
case AML_COPY_OP: /* Copy (Source, Target) */ case AML_COPY_OP: /* Copy (Source, Target) */
Status = AcpiUtCopyIobjectToIobject (Operand[0], &ReturnDesc, Status = AcpiUtCopyIobjectToIobject (
WalkState); Operand[0], &ReturnDesc, WalkState);
break; break;
case AML_TO_DECSTRING_OP: /* ToDecimalString (Data, Result) */ case AML_TO_DECSTRING_OP: /* ToDecimalString (Data, Result) */
Status = AcpiExConvertToString (Operand[0], &ReturnDesc, Status = AcpiExConvertToString (
ACPI_EXPLICIT_CONVERT_DECIMAL); Operand[0], &ReturnDesc, ACPI_EXPLICIT_CONVERT_DECIMAL);
if (ReturnDesc == Operand[0]) if (ReturnDesc == Operand[0])
{ {
/* No conversion performed, add ref to handle return value */ /* No conversion performed, add ref to handle return value */
AcpiUtAddReference (ReturnDesc); AcpiUtAddReference (ReturnDesc);
} }
break; break;
case AML_TO_HEXSTRING_OP: /* ToHexString (Data, Result) */ case AML_TO_HEXSTRING_OP: /* ToHexString (Data, Result) */
Status = AcpiExConvertToString (Operand[0], &ReturnDesc, Status = AcpiExConvertToString (
ACPI_EXPLICIT_CONVERT_HEX); Operand[0], &ReturnDesc, ACPI_EXPLICIT_CONVERT_HEX);
if (ReturnDesc == Operand[0]) if (ReturnDesc == Operand[0])
{ {
/* No conversion performed, add ref to handle return value */ /* No conversion performed, add ref to handle return value */
AcpiUtAddReference (ReturnDesc); AcpiUtAddReference (ReturnDesc);
} }
break; break;
@ -613,17 +615,19 @@ AcpiExOpcode_1A_1T_1R (
if (ReturnDesc == Operand[0]) if (ReturnDesc == Operand[0])
{ {
/* No conversion performed, add ref to handle return value */ /* No conversion performed, add ref to handle return value */
AcpiUtAddReference (ReturnDesc); AcpiUtAddReference (ReturnDesc);
} }
break; break;
case AML_TO_INTEGER_OP: /* ToInteger (Data, Result) */ case AML_TO_INTEGER_OP: /* ToInteger (Data, Result) */
Status = AcpiExConvertToInteger (Operand[0], &ReturnDesc, Status = AcpiExConvertToInteger (
ACPI_ANY_BASE); Operand[0], &ReturnDesc, ACPI_ANY_BASE);
if (ReturnDesc == Operand[0]) if (ReturnDesc == Operand[0])
{ {
/* No conversion performed, add ref to handle return value */ /* No conversion performed, add ref to handle return value */
AcpiUtAddReference (ReturnDesc); AcpiUtAddReference (ReturnDesc);
} }
break; break;
@ -774,11 +778,11 @@ AcpiExOpcode_1A_0T_1R (
*/ */
if (WalkState->Opcode == AML_INCREMENT_OP) if (WalkState->Opcode == AML_INCREMENT_OP)
{ {
ReturnDesc->Integer.Value = TempDesc->Integer.Value +1; ReturnDesc->Integer.Value = TempDesc->Integer.Value + 1;
} }
else else
{ {
ReturnDesc->Integer.Value = TempDesc->Integer.Value -1; ReturnDesc->Integer.Value = TempDesc->Integer.Value - 1;
} }
/* Finished with this Integer object */ /* Finished with this Integer object */
@ -792,7 +796,7 @@ AcpiExOpcode_1A_0T_1R (
Status = AcpiExStore (ReturnDesc, Operand[0], WalkState); Status = AcpiExStore (ReturnDesc, Operand[0], WalkState);
break; break;
case AML_TYPE_OP: /* ObjectType (SourceObject) */ case AML_OBJECT_TYPE_OP: /* ObjectType (SourceObject) */
/* /*
* Note: The operand is not resolved at this point because we want to * Note: The operand is not resolved at this point because we want to
* get the associated object, not its value. For example, we don't * get the associated object, not its value. For example, we don't
@ -826,8 +830,8 @@ AcpiExOpcode_1A_0T_1R (
/* Get the base object */ /* Get the base object */
Status = AcpiExResolveMultiple (WalkState, Status = AcpiExResolveMultiple (
Operand[0], &Type, &TempDesc); WalkState, Operand[0], &Type, &TempDesc);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
goto Cleanup; goto Cleanup;
@ -873,8 +877,10 @@ AcpiExOpcode_1A_0T_1R (
default: default:
ACPI_ERROR ((AE_INFO, ACPI_ERROR ((AE_INFO,
"Operand must be Buffer/Integer/String/Package - found type %s", "Operand must be Buffer/Integer/String/Package"
" - found type %s",
AcpiUtGetTypeName (Type))); AcpiUtGetTypeName (Type)));
Status = AE_AML_OPERAND_TYPE; Status = AE_AML_OPERAND_TYPE;
goto Cleanup; goto Cleanup;
} }
@ -899,7 +905,8 @@ AcpiExOpcode_1A_0T_1R (
case AML_REF_OF_OP: /* RefOf (SourceObject) */ case AML_REF_OF_OP: /* RefOf (SourceObject) */
Status = AcpiExGetObjectReference (Operand[0], &ReturnDesc, WalkState); Status = AcpiExGetObjectReference (
Operand[0], &ReturnDesc, WalkState);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
goto Cleanup; goto Cleanup;
@ -1097,6 +1104,7 @@ AcpiExOpcode_1A_0T_1R (
ACPI_ERROR ((AE_INFO, ACPI_ERROR ((AE_INFO,
"Unknown Index TargetType 0x%X in reference object %p", "Unknown Index TargetType 0x%X in reference object %p",
Operand[0]->Reference.TargetType, Operand[0])); Operand[0]->Reference.TargetType, Operand[0]));
Status = AE_AML_OPERAND_TYPE; Status = AE_AML_OPERAND_TYPE;
goto Cleanup; goto Cleanup;
} }
@ -1127,8 +1135,8 @@ AcpiExOpcode_1A_0T_1R (
case ACPI_TYPE_LOCAL_BANK_FIELD: case ACPI_TYPE_LOCAL_BANK_FIELD:
case ACPI_TYPE_LOCAL_INDEX_FIELD: case ACPI_TYPE_LOCAL_INDEX_FIELD:
Status = AcpiExReadDataFromField (WalkState, Status = AcpiExReadDataFromField (
ReturnDesc, &TempDesc); WalkState, ReturnDesc, &TempDesc);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
goto Cleanup; goto Cleanup;
@ -1163,6 +1171,7 @@ AcpiExOpcode_1A_0T_1R (
ACPI_ERROR ((AE_INFO, "Unknown AML opcode 0x%X", ACPI_ERROR ((AE_INFO, "Unknown AML opcode 0x%X",
WalkState->Opcode)); WalkState->Opcode));
Status = AE_AML_BAD_OPCODE; Status = AE_AML_BAD_OPCODE;
goto Cleanup; goto Cleanup;
} }

View file

@ -275,7 +275,8 @@ AcpiExOpcode_2A_2T_1R (
/* Quotient to ReturnDesc1, remainder to ReturnDesc2 */ /* Quotient to ReturnDesc1, remainder to ReturnDesc2 */
Status = AcpiUtDivide (Operand[0]->Integer.Value, Status = AcpiUtDivide (
Operand[0]->Integer.Value,
Operand[1]->Integer.Value, Operand[1]->Integer.Value,
&ReturnDesc1->Integer.Value, &ReturnDesc1->Integer.Value,
&ReturnDesc2->Integer.Value); &ReturnDesc2->Integer.Value);
@ -289,6 +290,7 @@ AcpiExOpcode_2A_2T_1R (
ACPI_ERROR ((AE_INFO, "Unknown AML opcode 0x%X", ACPI_ERROR ((AE_INFO, "Unknown AML opcode 0x%X",
WalkState->Opcode)); WalkState->Opcode));
Status = AE_AML_BAD_OPCODE; Status = AE_AML_BAD_OPCODE;
goto Cleanup; goto Cleanup;
} }
@ -373,7 +375,8 @@ AcpiExOpcode_2A_1T_1R (
goto Cleanup; goto Cleanup;
} }
ReturnDesc->Integer.Value = AcpiExDoMathOp (WalkState->Opcode, ReturnDesc->Integer.Value = AcpiExDoMathOp (
WalkState->Opcode,
Operand[0]->Integer.Value, Operand[0]->Integer.Value,
Operand[1]->Integer.Value); Operand[1]->Integer.Value);
goto StoreResultToTarget; goto StoreResultToTarget;
@ -392,7 +395,8 @@ AcpiExOpcode_2A_1T_1R (
/* ReturnDesc will contain the remainder */ /* ReturnDesc will contain the remainder */
Status = AcpiUtDivide (Operand[0]->Integer.Value, Status = AcpiUtDivide (
Operand[0]->Integer.Value,
Operand[1]->Integer.Value, Operand[1]->Integer.Value,
NULL, NULL,
&ReturnDesc->Integer.Value); &ReturnDesc->Integer.Value);
@ -400,8 +404,8 @@ AcpiExOpcode_2A_1T_1R (
case AML_CONCAT_OP: /* Concatenate (Data1, Data2, Result) */ case AML_CONCAT_OP: /* Concatenate (Data1, Data2, Result) */
Status = AcpiExDoConcatenate (Operand[0], Operand[1], Status = AcpiExDoConcatenate (
&ReturnDesc, WalkState); Operand[0], Operand[1], &ReturnDesc, WalkState);
break; break;
case AML_TO_STRING_OP: /* ToString (Buffer, Length, Result) (ACPI 2.0) */ case AML_TO_STRING_OP: /* ToString (Buffer, Length, Result) (ACPI 2.0) */
@ -448,8 +452,8 @@ AcpiExOpcode_2A_1T_1R (
/* ConcatenateResTemplate (Buffer, Buffer, Result) (ACPI 2.0) */ /* ConcatenateResTemplate (Buffer, Buffer, Result) (ACPI 2.0) */
Status = AcpiExConcatTemplate (Operand[0], Operand[1], Status = AcpiExConcatTemplate (
&ReturnDesc, WalkState); Operand[0], Operand[1], &ReturnDesc, WalkState);
break; break;
case AML_INDEX_OP: /* Index (Source Index Result) */ case AML_INDEX_OP: /* Index (Source Index Result) */
@ -672,6 +676,7 @@ AcpiExOpcode_2A_0T_1R (
ACPI_ERROR ((AE_INFO, "Unknown AML opcode 0x%X", ACPI_ERROR ((AE_INFO, "Unknown AML opcode 0x%X",
WalkState->Opcode)); WalkState->Opcode));
Status = AE_AML_BAD_OPCODE; Status = AE_AML_BAD_OPCODE;
goto Cleanup; goto Cleanup;
} }

View file

@ -178,7 +178,8 @@ AcpiExOpcode_3A_0T_0R (
case AML_FATAL_OP: /* Fatal (FatalType FatalCode FatalArg) */ case AML_FATAL_OP: /* Fatal (FatalType FatalCode FatalArg) */
ACPI_DEBUG_PRINT ((ACPI_DB_INFO, ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
"FatalOp: Type %X Code %X Arg %X <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n", "FatalOp: Type %X Code %X Arg %X "
"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n",
(UINT32) Operand[0]->Integer.Value, (UINT32) Operand[0]->Integer.Value,
(UINT32) Operand[1]->Integer.Value, (UINT32) Operand[1]->Integer.Value,
(UINT32) Operand[2]->Integer.Value)); (UINT32) Operand[2]->Integer.Value));
@ -215,6 +216,7 @@ AcpiExOpcode_3A_0T_0R (
ACPI_ERROR ((AE_INFO, "Unknown AML opcode 0x%X", ACPI_ERROR ((AE_INFO, "Unknown AML opcode 0x%X",
WalkState->Opcode)); WalkState->Opcode));
Status = AE_AML_BAD_OPCODE; Status = AE_AML_BAD_OPCODE;
goto Cleanup; goto Cleanup;
} }
@ -287,8 +289,8 @@ AcpiExOpcode_3A_1T_1R (
else if ((Index + Length) > Operand[0]->String.Length) else if ((Index + Length) > Operand[0]->String.Length)
{ {
Length = (ACPI_SIZE) Operand[0]->String.Length - Length =
(ACPI_SIZE) Index; (ACPI_SIZE) Operand[0]->String.Length - (ACPI_SIZE) Index;
} }
/* Strings always have a sub-pointer, not so for buffers */ /* Strings always have a sub-pointer, not so for buffers */
@ -334,8 +336,8 @@ AcpiExOpcode_3A_1T_1R (
{ {
/* We have a buffer, copy the portion requested */ /* We have a buffer, copy the portion requested */
memcpy (Buffer, Operand[0]->String.Pointer + Index, memcpy (Buffer,
Length); Operand[0]->String.Pointer + Index, Length);
} }
/* Set the length of the new String/Buffer */ /* Set the length of the new String/Buffer */
@ -352,6 +354,7 @@ AcpiExOpcode_3A_1T_1R (
ACPI_ERROR ((AE_INFO, "Unknown AML opcode 0x%X", ACPI_ERROR ((AE_INFO, "Unknown AML opcode 0x%X",
WalkState->Opcode)); WalkState->Opcode));
Status = AE_AML_BAD_OPCODE; Status = AE_AML_BAD_OPCODE;
goto Cleanup; goto Cleanup;
} }
@ -369,12 +372,12 @@ Cleanup:
AcpiUtRemoveReference (ReturnDesc); AcpiUtRemoveReference (ReturnDesc);
WalkState->ResultObj = NULL; WalkState->ResultObj = NULL;
} }
/* Set the return object and exit */
else else
{ {
/* Set the return object and exit */
WalkState->ResultObj = ReturnDesc; WalkState->ResultObj = ReturnDesc;
} }
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);
} }

View file

@ -205,8 +205,8 @@ AcpiExDoMatch (
* True if equal: (P[i] == M) * True if equal: (P[i] == M)
* Change to: (M == P[i]) * Change to: (M == P[i])
*/ */
Status = AcpiExDoLogicalOp (AML_LEQUAL_OP, MatchObj, PackageObj, Status = AcpiExDoLogicalOp (
&LogicalResult); AML_LEQUAL_OP, MatchObj, PackageObj, &LogicalResult);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
return (FALSE); return (FALSE);
@ -218,8 +218,8 @@ AcpiExDoMatch (
* True if less than or equal: (P[i] <= M) (P[i] NotGreater than M) * True if less than or equal: (P[i] <= M) (P[i] NotGreater than M)
* Change to: (M >= P[i]) (M NotLess than P[i]) * Change to: (M >= P[i]) (M NotLess than P[i])
*/ */
Status = AcpiExDoLogicalOp (AML_LLESS_OP, MatchObj, PackageObj, Status = AcpiExDoLogicalOp (
&LogicalResult); AML_LLESS_OP, MatchObj, PackageObj, &LogicalResult);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
return (FALSE); return (FALSE);
@ -232,8 +232,8 @@ AcpiExDoMatch (
* True if less than: (P[i] < M) * True if less than: (P[i] < M)
* Change to: (M > P[i]) * Change to: (M > P[i])
*/ */
Status = AcpiExDoLogicalOp (AML_LGREATER_OP, MatchObj, PackageObj, Status = AcpiExDoLogicalOp (
&LogicalResult); AML_LGREATER_OP, MatchObj, PackageObj, &LogicalResult);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
return (FALSE); return (FALSE);
@ -245,8 +245,8 @@ AcpiExDoMatch (
* True if greater than or equal: (P[i] >= M) (P[i] NotLess than M) * True if greater than or equal: (P[i] >= M) (P[i] NotLess than M)
* Change to: (M <= P[i]) (M NotGreater than P[i]) * Change to: (M <= P[i]) (M NotGreater than P[i])
*/ */
Status = AcpiExDoLogicalOp (AML_LGREATER_OP, MatchObj, PackageObj, Status = AcpiExDoLogicalOp (
&LogicalResult); AML_LGREATER_OP, MatchObj, PackageObj, &LogicalResult);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
return (FALSE); return (FALSE);
@ -259,8 +259,8 @@ AcpiExDoMatch (
* True if greater than: (P[i] > M) * True if greater than: (P[i] > M)
* Change to: (M < P[i]) * Change to: (M < P[i])
*/ */
Status = AcpiExDoLogicalOp (AML_LLESS_OP, MatchObj, PackageObj, Status = AcpiExDoLogicalOp (
&LogicalResult); AML_LLESS_OP, MatchObj, PackageObj, &LogicalResult);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
return (FALSE); return (FALSE);
@ -403,6 +403,7 @@ AcpiExOpcode_6A_0T_1R (
ACPI_ERROR ((AE_INFO, "Unknown AML opcode 0x%X", ACPI_ERROR ((AE_INFO, "Unknown AML opcode 0x%X",
WalkState->Opcode)); WalkState->Opcode));
Status = AE_AML_BAD_OPCODE; Status = AE_AML_BAD_OPCODE;
goto Cleanup; goto Cleanup;
} }

View file

@ -1,6 +1,6 @@
/****************************************************************************** /******************************************************************************
* *
* Module Name: exprep - ACPI AML (p-code) execution - field prep utilities * Module Name: exprep - ACPI AML field prep utilities
* *
*****************************************************************************/ *****************************************************************************/
@ -141,6 +141,7 @@ AcpiExGenerateAccess (
UINT32 FieldBitLength, UINT32 FieldBitLength,
UINT32 RegionLength); UINT32 RegionLength);
/******************************************************************************* /*******************************************************************************
* *
* FUNCTION: AcpiExGenerateAccess * FUNCTION: AcpiExGenerateAccess
@ -185,9 +186,12 @@ AcpiExGenerateAccess (
/* Round Field start offset and length to "minimal" byte boundaries */ /* Round Field start offset and length to "minimal" byte boundaries */
FieldByteOffset = ACPI_DIV_8 (ACPI_ROUND_DOWN (FieldBitOffset, 8)); FieldByteOffset = ACPI_DIV_8 (
FieldByteEndOffset = ACPI_DIV_8 (ACPI_ROUND_UP (FieldBitLength + ACPI_ROUND_DOWN (FieldBitOffset, 8));
FieldBitOffset, 8));
FieldByteEndOffset = ACPI_DIV_8 (
ACPI_ROUND_UP (FieldBitLength + FieldBitOffset, 8));
FieldByteLength = FieldByteEndOffset - FieldByteOffset; FieldByteLength = FieldByteEndOffset - FieldByteOffset;
ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
@ -213,7 +217,8 @@ AcpiExGenerateAccess (
* are done. (This does not optimize for the perfectly aligned * are done. (This does not optimize for the perfectly aligned
* case yet). * case yet).
*/ */
if (ACPI_ROUND_UP (FieldByteEndOffset, AccessByteWidth) <= RegionLength) if (ACPI_ROUND_UP (FieldByteEndOffset, AccessByteWidth) <=
RegionLength)
{ {
FieldStartOffset = FieldStartOffset =
ACPI_ROUND_DOWN (FieldByteOffset, AccessByteWidth) / ACPI_ROUND_DOWN (FieldByteOffset, AccessByteWidth) /
@ -237,7 +242,8 @@ AcpiExGenerateAccess (
if (Accesses <= 1) if (Accesses <= 1)
{ {
ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
"Entire field can be accessed with one operation of size %u\n", "Entire field can be accessed "
"with one operation of size %u\n",
AccessByteWidth)); AccessByteWidth));
return_VALUE (AccessByteWidth); return_VALUE (AccessByteWidth);
} }
@ -255,7 +261,8 @@ AcpiExGenerateAccess (
else else
{ {
ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
"AccessWidth %u end is NOT within region\n", AccessByteWidth)); "AccessWidth %u end is NOT within region\n",
AccessByteWidth));
if (AccessByteWidth == 1) if (AccessByteWidth == 1)
{ {
ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
@ -283,6 +290,7 @@ AcpiExGenerateAccess (
*/ */
ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
"Cannot access field in one operation, using width 8\n")); "Cannot access field in one operation, using width 8\n"));
return_VALUE (8); return_VALUE (8);
} }
#endif /* ACPI_UNDER_DEVELOPMENT */ #endif /* ACPI_UNDER_DEVELOPMENT */
@ -367,6 +375,7 @@ AcpiExDecodeFieldAccess (
ACPI_ERROR ((AE_INFO, ACPI_ERROR ((AE_INFO,
"Unknown field access type 0x%X", "Unknown field access type 0x%X",
Access)); Access));
return_UINT32 (0); return_UINT32 (0);
} }
@ -446,8 +455,8 @@ AcpiExPrepCommonFieldObject (
* For all other access types (Byte, Word, Dword, Qword), the Bitwidth is * For all other access types (Byte, Word, Dword, Qword), the Bitwidth is
* the same (equivalent) as the ByteAlignment. * the same (equivalent) as the ByteAlignment.
*/ */
AccessBitWidth = AcpiExDecodeFieldAccess (ObjDesc, FieldFlags, AccessBitWidth = AcpiExDecodeFieldAccess (
&ByteAlignment); ObjDesc, FieldFlags, &ByteAlignment);
if (!AccessBitWidth) if (!AccessBitWidth)
{ {
return_ACPI_STATUS (AE_AML_OPERAND_VALUE); return_ACPI_STATUS (AE_AML_OPERAND_VALUE);
@ -576,8 +585,10 @@ AcpiExPrepFieldValue (
} }
} }
ObjDesc->Field.ResourceBuffer = SecondDesc->Buffer.Pointer; ObjDesc->Field.ResourceBuffer =
ObjDesc->Field.ResourceLength = (UINT16) SecondDesc->Buffer.Length; SecondDesc->Buffer.Pointer;
ObjDesc->Field.ResourceLength =
(UINT16) SecondDesc->Buffer.Length;
} }
else if (Info->ResourceBuffer) else if (Info->ResourceBuffer)
{ {
@ -599,7 +610,8 @@ AcpiExPrepFieldValue (
if (AccessByteWidth < 256) if (AccessByteWidth < 256)
{ {
ObjDesc->CommonField.AccessByteWidth = (UINT8) AccessByteWidth; ObjDesc->CommonField.AccessByteWidth =
(UINT8) AccessByteWidth;
} }
} }
@ -609,8 +621,10 @@ AcpiExPrepFieldValue (
ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
"RegionField: BitOff %X, Off %X, Gran %X, Region %p\n", "RegionField: BitOff %X, Off %X, Gran %X, Region %p\n",
ObjDesc->Field.StartFieldBitOffset, ObjDesc->Field.BaseByteOffset, ObjDesc->Field.StartFieldBitOffset,
ObjDesc->Field.AccessByteWidth, ObjDesc->Field.RegionObj)); ObjDesc->Field.BaseByteOffset,
ObjDesc->Field.AccessByteWidth,
ObjDesc->Field.RegionObj));
break; break;
case ACPI_TYPE_LOCAL_BANK_FIELD: case ACPI_TYPE_LOCAL_BANK_FIELD:
@ -690,7 +704,8 @@ AcpiExPrepFieldValue (
ObjDesc->IndexField.AccessByteWidth); ObjDesc->IndexField.AccessByteWidth);
ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
"IndexField: BitOff %X, Off %X, Value %X, Gran %X, Index %p, Data %p\n", "IndexField: BitOff %X, Off %X, Value %X, "
"Gran %X, Index %p, Data %p\n",
ObjDesc->IndexField.StartFieldBitOffset, ObjDesc->IndexField.StartFieldBitOffset,
ObjDesc->IndexField.BaseByteOffset, ObjDesc->IndexField.BaseByteOffset,
ObjDesc->IndexField.Value, ObjDesc->IndexField.Value,
@ -710,10 +725,11 @@ AcpiExPrepFieldValue (
* Store the constructed descriptor (ObjDesc) into the parent Node, * Store the constructed descriptor (ObjDesc) into the parent Node,
* preserving the current type of that NamedObj. * preserving the current type of that NamedObj.
*/ */
Status = AcpiNsAttachObject (Info->FieldNode, ObjDesc, Status = AcpiNsAttachObject (
AcpiNsGetType (Info->FieldNode)); Info->FieldNode, ObjDesc, AcpiNsGetType (Info->FieldNode));
ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, "Set NamedObj %p [%4.4s], ObjDesc %p\n", ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
"Set NamedObj %p [%4.4s], ObjDesc %p\n",
Info->FieldNode, AcpiUtGetNodeName (Info->FieldNode), ObjDesc)); Info->FieldNode, AcpiUtGetNodeName (Info->FieldNode), ObjDesc));
/* Remove local reference to the object */ /* Remove local reference to the object */

View file

@ -489,7 +489,8 @@ AcpiExPciConfigSpaceHandler (
PciRegister = (UINT16) (UINT32) Address; PciRegister = (UINT16) (UINT32) Address;
ACPI_DEBUG_PRINT ((ACPI_DB_INFO, ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
"Pci-Config %u (%u) Seg(%04x) Bus(%04x) Dev(%04x) Func(%04x) Reg(%04x)\n", "Pci-Config %u (%u) Seg(%04x) Bus(%04x) "
"Dev(%04x) Func(%04x) Reg(%04x)\n",
Function, BitWidth, PciId->Segment, PciId->Bus, PciId->Device, Function, BitWidth, PciId->Segment, PciId->Bus, PciId->Device,
PciId->Function, PciRegister)); PciId->Function, PciRegister));
@ -498,14 +499,14 @@ AcpiExPciConfigSpaceHandler (
case ACPI_READ: case ACPI_READ:
*Value = 0; *Value = 0;
Status = AcpiOsReadPciConfiguration (PciId, PciRegister, Status = AcpiOsReadPciConfiguration (
Value, BitWidth); PciId, PciRegister, Value, BitWidth);
break; break;
case ACPI_WRITE: case ACPI_WRITE:
Status = AcpiOsWritePciConfiguration (PciId, PciRegister, Status = AcpiOsWritePciConfiguration (
*Value, BitWidth); PciId, PciRegister, *Value, BitWidth);
break; break;
default: default:

View file

@ -190,7 +190,7 @@ AcpiExResolveNodeToValue (
/* /*
* Several object types require no further processing: * Several object types require no further processing:
* 1) Device/Thermal objects don't have a "real" subobject, return the Node * 1) Device/Thermal objects don't have a "real" subobject, return Node
* 2) Method locals and arguments have a pseudo-Node * 2) Method locals and arguments have a pseudo-Node
* 3) 10/2007: Added method type to assist with Package construction. * 3) 10/2007: Added method type to assist with Package construction.
*/ */

View file

@ -307,7 +307,8 @@ AcpiExResolveObjectToValue (
* the package, can't dereference it * the package, can't dereference it
*/ */
ACPI_ERROR ((AE_INFO, ACPI_ERROR ((AE_INFO,
"Attempt to dereference an Index to NULL package element Idx=%p", "Attempt to dereference an Index to "
"NULL package element Idx=%p",
StackDesc)); StackDesc));
Status = AE_AML_UNINITIALIZED_ELEMENT; Status = AE_AML_UNINITIALIZED_ELEMENT;
} }
@ -358,7 +359,8 @@ AcpiExResolveObjectToValue (
default: default:
ACPI_ERROR ((AE_INFO, ACPI_ERROR ((AE_INFO,
"Unknown Reference type 0x%X in %p", RefType, StackDesc)); "Unknown Reference type 0x%X in %p",
RefType, StackDesc));
Status = AE_AML_INTERNAL; Status = AE_AML_INTERNAL;
break; break;
} }
@ -379,7 +381,8 @@ AcpiExResolveObjectToValue (
case ACPI_TYPE_LOCAL_BANK_FIELD: case ACPI_TYPE_LOCAL_BANK_FIELD:
case ACPI_TYPE_LOCAL_INDEX_FIELD: case ACPI_TYPE_LOCAL_INDEX_FIELD:
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "FieldRead SourceDesc=%p Type=%X\n", ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
"FieldRead SourceDesc=%p Type=%X\n",
StackDesc, StackDesc->Common.Type)); StackDesc, StackDesc->Common.Type));
Status = AcpiExReadDataFromField (WalkState, StackDesc, &ObjDesc); Status = AcpiExReadDataFromField (WalkState, StackDesc, &ObjDesc);
@ -450,7 +453,8 @@ AcpiExResolveMultiple (
if (Type == ACPI_TYPE_LOCAL_ALIAS) if (Type == ACPI_TYPE_LOCAL_ALIAS)
{ {
Type = ((ACPI_NAMESPACE_NODE *) ObjDesc)->Type; Type = ((ACPI_NAMESPACE_NODE *) ObjDesc)->Type;
ObjDesc = AcpiNsGetAttachedObject ((ACPI_NAMESPACE_NODE *) ObjDesc); ObjDesc = AcpiNsGetAttachedObject (
(ACPI_NAMESPACE_NODE *) ObjDesc);
} }
if (!ObjDesc) if (!ObjDesc)
@ -599,7 +603,8 @@ AcpiExResolveMultiple (
default: default:
ACPI_ERROR ((AE_INFO, ACPI_ERROR ((AE_INFO,
"Unknown Reference Class 0x%2.2X", ObjDesc->Reference.Class)); "Unknown Reference Class 0x%2.2X",
ObjDesc->Reference.Class));
return_ACPI_STATUS (AE_AML_INTERNAL); return_ACPI_STATUS (AE_AML_INTERNAL);
} }
} }

View file

@ -171,7 +171,8 @@ AcpiExCheckObjectType (
* specification, a store to a constant is a noop.) * specification, a store to a constant is a noop.)
*/ */
if ((ThisType == ACPI_TYPE_INTEGER) && if ((ThisType == ACPI_TYPE_INTEGER) &&
(((ACPI_OPERAND_OBJECT *) Object)->Common.Flags & AOPOBJ_AML_CONSTANT)) (((ACPI_OPERAND_OBJECT *) Object)->Common.Flags &
AOPOBJ_AML_CONSTANT))
{ {
return (AE_OK); return (AE_OK);
} }
@ -288,7 +289,8 @@ AcpiExResolveOperands (
*/ */
if (ObjectType == ACPI_TYPE_LOCAL_ALIAS) if (ObjectType == ACPI_TYPE_LOCAL_ALIAS)
{ {
ObjDesc = AcpiNsGetAttachedObject ((ACPI_NAMESPACE_NODE *) ObjDesc); ObjDesc = AcpiNsGetAttachedObject (
(ACPI_NAMESPACE_NODE *) ObjDesc);
*StackPtr = ObjDesc; *StackPtr = ObjDesc;
ObjectType = ((ACPI_NAMESPACE_NODE *) ObjDesc)->Type; ObjectType = ((ACPI_NAMESPACE_NODE *) ObjDesc)->Type;
} }
@ -369,7 +371,8 @@ AcpiExResolveOperands (
{ {
case ARGI_REF_OR_STRING: /* Can be a String or Reference */ case ARGI_REF_OR_STRING: /* Can be a String or Reference */
if ((ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_OPERAND) && if ((ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) ==
ACPI_DESC_TYPE_OPERAND) &&
(ObjDesc->Common.Type == ACPI_TYPE_STRING)) (ObjDesc->Common.Type == ACPI_TYPE_STRING))
{ {
/* /*
@ -403,8 +406,8 @@ AcpiExResolveOperands (
goto NextOperand; goto NextOperand;
} }
Status = AcpiExCheckObjectType (ACPI_TYPE_LOCAL_REFERENCE, Status = AcpiExCheckObjectType (
ObjectType, ObjDesc); ACPI_TYPE_LOCAL_REFERENCE, ObjectType, ObjDesc);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);
@ -555,8 +558,8 @@ AcpiExResolveOperands (
* But we can implicitly convert from a BUFFER or INTEGER * But we can implicitly convert from a BUFFER or INTEGER
* Aka - "Implicit Source Operand Conversion" * Aka - "Implicit Source Operand Conversion"
*/ */
Status = AcpiExConvertToString (ObjDesc, StackPtr, Status = AcpiExConvertToString (
ACPI_IMPLICIT_CONVERT_HEX); ObjDesc, StackPtr, ACPI_IMPLICIT_CONVERT_HEX);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
if (Status == AE_TYPE) if (Status == AE_TYPE)
@ -689,8 +692,10 @@ AcpiExResolveOperands (
case ARGI_REGION_OR_BUFFER: /* Used by Load() only */ case ARGI_REGION_OR_BUFFER: /* Used by Load() only */
/* Need an operand of type REGION or a BUFFER (which could be a resolved region field) */ /*
* Need an operand of type REGION or a BUFFER
* (which could be a resolved region field)
*/
switch (ObjDesc->Common.Type) switch (ObjDesc->Common.Type)
{ {
case ACPI_TYPE_BUFFER: case ACPI_TYPE_BUFFER:
@ -734,9 +739,9 @@ AcpiExResolveOperands (
if (AcpiGbl_EnableInterpreterSlack) if (AcpiGbl_EnableInterpreterSlack)
{ {
/* /*
* Enable original behavior of Store(), allowing any and all * Enable original behavior of Store(), allowing any
* objects as the source operand. The ACPI spec does not * and all objects as the source operand. The ACPI
* allow this, however. * spec does not allow this, however.
*/ */
break; break;
} }
@ -749,7 +754,8 @@ AcpiExResolveOperands (
} }
ACPI_ERROR ((AE_INFO, ACPI_ERROR ((AE_INFO,
"Needed Integer/Buffer/String/Package/Ref/Ddb], found [%s] %p", "Needed Integer/Buffer/String/Package/Ref/Ddb]"
", found [%s] %p",
AcpiUtGetObjectTypeName (ObjDesc), ObjDesc)); AcpiUtGetObjectTypeName (ObjDesc), ObjDesc));
return_ACPI_STATUS (AE_AML_OPERAND_TYPE); return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
@ -771,8 +777,8 @@ AcpiExResolveOperands (
* Make sure that the original object was resolved to the * Make sure that the original object was resolved to the
* required object type (Simple cases only). * required object type (Simple cases only).
*/ */
Status = AcpiExCheckObjectType (TypeNeeded, Status = AcpiExCheckObjectType (
(*StackPtr)->Common.Type, *StackPtr); TypeNeeded, (*StackPtr)->Common.Type, *StackPtr);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);

View file

@ -346,7 +346,8 @@ AcpiExStoreObjectToIndex (
{ {
/* Normal object, copy it */ /* Normal object, copy it */
Status = AcpiUtCopyIobjectToIobject (SourceDesc, &NewDesc, WalkState); Status = AcpiUtCopyIobjectToIobject (
SourceDesc, &NewDesc, WalkState);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);
@ -559,7 +560,8 @@ AcpiExStoreObjectToNode (
case ACPI_TYPE_THERMAL: case ACPI_TYPE_THERMAL:
ACPI_ERROR ((AE_INFO, ACPI_ERROR ((AE_INFO,
"Target must be [Buffer/Integer/String/Reference], found [%s] (%4.4s)", "Target must be [Buffer/Integer/String/Reference]"
", found [%s] (%4.4s)",
AcpiUtGetTypeName (Node->Type), Node->Name.Ascii)); AcpiUtGetTypeName (Node->Type), Node->Name.Ascii));
return_ACPI_STATUS (AE_AML_TARGET_TYPE); return_ACPI_STATUS (AE_AML_TARGET_TYPE);
@ -599,8 +601,7 @@ AcpiExStoreObjectToNode (
* an implicit conversion, as per the ACPI specification. * an implicit conversion, as per the ACPI specification.
* A direct store is performed instead. * A direct store is performed instead.
*/ */
Status = AcpiExStoreDirectToNode (SourceDesc, Node, Status = AcpiExStoreDirectToNode (SourceDesc, Node, WalkState);
WalkState);
break; break;
} }
@ -624,8 +625,8 @@ AcpiExStoreObjectToNode (
* store has been performed such that the node/object type * store has been performed such that the node/object type
* has been changed. * has been changed.
*/ */
Status = AcpiNsAttachObject (Node, NewDesc, Status = AcpiNsAttachObject (
NewDesc->Common.Type); Node, NewDesc, NewDesc->Common.Type);
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
"Store type [%s] into [%s] via Convert/Attach\n", "Store type [%s] into [%s] via Convert/Attach\n",
@ -657,8 +658,7 @@ AcpiExStoreObjectToNode (
* operator. (Note, for this default case, all normal * operator. (Note, for this default case, all normal
* Store/Target operations exited above with an error). * Store/Target operations exited above with an error).
*/ */
Status = AcpiExStoreDirectToNode (SourceDesc, Node, Status = AcpiExStoreDirectToNode (SourceDesc, Node, WalkState);
WalkState);
break; break;
} }

View file

@ -1,6 +1,6 @@
/****************************************************************************** /******************************************************************************
* *
* Module Name: exstorob - AML Interpreter object store support, store to object * Module Name: exstorob - AML object store support, store to object
* *
*****************************************************************************/ *****************************************************************************/
@ -293,8 +293,9 @@ AcpiExStoreStringToString (
ACPI_FREE (TargetDesc->String.Pointer); ACPI_FREE (TargetDesc->String.Pointer);
} }
TargetDesc->String.Pointer = ACPI_ALLOCATE_ZEROED ( TargetDesc->String.Pointer =
(ACPI_SIZE) Length + 1); ACPI_ALLOCATE_ZEROED ((ACPI_SIZE) Length + 1);
if (!TargetDesc->String.Pointer) if (!TargetDesc->String.Pointer)
{ {
return_ACPI_STATUS (AE_NO_MEMORY); return_ACPI_STATUS (AE_NO_MEMORY);

View file

@ -158,7 +158,6 @@ AcpiExSystemWaitSemaphore (
/* We must wait, so unlock the interpreter */ /* We must wait, so unlock the interpreter */
AcpiExExitInterpreter (); AcpiExExitInterpreter ();
Status = AcpiOsWaitSemaphore (Semaphore, 1, Timeout); Status = AcpiOsWaitSemaphore (Semaphore, 1, Timeout);
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
@ -211,7 +210,6 @@ AcpiExSystemWaitMutex (
/* We must wait, so unlock the interpreter */ /* We must wait, so unlock the interpreter */
AcpiExExitInterpreter (); AcpiExExitInterpreter ();
Status = AcpiOsAcquireMutex (Mutex, Timeout); Status = AcpiOsAcquireMutex (Mutex, Timeout);
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
@ -262,8 +260,8 @@ AcpiExSystemDoStall (
* (ACPI specifies 100 usec as max, but this gives some slack in * (ACPI specifies 100 usec as max, but this gives some slack in
* order to support existing BIOSs) * order to support existing BIOSs)
*/ */
ACPI_ERROR ((AE_INFO, "Time parameter is too large (%u)", ACPI_ERROR ((AE_INFO,
HowLong)); "Time parameter is too large (%u)", HowLong));
Status = AE_AML_OPERAND_VALUE; Status = AE_AML_OPERAND_VALUE;
} }
else else

View file

@ -0,0 +1,499 @@
/******************************************************************************
*
* Module Name: extrace - Support for interpreter execution tracing
*
*****************************************************************************/
/******************************************************************************
*
* 1. Copyright Notice
*
* Some or all of this work - Copyright (c) 1999 - 2015, Intel Corp.
* All rights reserved.
*
* 2. License
*
* 2.1. This is your license from Intel Corp. under its intellectual property
* rights. You may have additional license terms from the party that provided
* you this software, covering your right to use that party's intellectual
* property rights.
*
* 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
* copy of the source code appearing in this file ("Covered Code") an
* irrevocable, perpetual, worldwide license under Intel's copyrights in the
* base code distributed originally by Intel ("Original Intel Code") to copy,
* make derivatives, distribute, use and display any portion of the Covered
* Code in any form, with the right to sublicense such rights; and
*
* 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
* license (with the right to sublicense), under only those claims of Intel
* patents that are infringed by the Original Intel Code, to make, use, sell,
* offer to sell, and import the Covered Code and derivative works thereof
* solely to the minimum extent necessary to exercise the above copyright
* license, and in no event shall the patent license extend to any additions
* to or modifications of the Original Intel Code. No other license or right
* is granted directly or by implication, estoppel or otherwise;
*
* The above copyright and patent license is granted only if the following
* conditions are met:
*
* 3. Conditions
*
* 3.1. Redistribution of Source with Rights to Further Distribute Source.
* Redistribution of source code of any substantial portion of the Covered
* Code or modification with rights to further distribute source must include
* the above Copyright Notice, the above License, this list of Conditions,
* and the following Disclaimer and Export Compliance provision. In addition,
* Licensee must cause all Covered Code to which Licensee contributes to
* contain a file documenting the changes Licensee made to create that Covered
* Code and the date of any change. Licensee must include in that file the
* documentation of any changes made by any predecessor Licensee. Licensee
* must include a prominent statement that the modification is derived,
* directly or indirectly, from Original Intel Code.
*
* 3.2. Redistribution of Source with no Rights to Further Distribute Source.
* Redistribution of source code of any substantial portion of the Covered
* Code or modification without rights to further distribute source must
* include the following Disclaimer and Export Compliance provision in the
* documentation and/or other materials provided with distribution. In
* addition, Licensee may not authorize further sublicense of source of any
* portion of the Covered Code, and must include terms to the effect that the
* license from Licensee to its licensee is limited to the intellectual
* property embodied in the software Licensee provides to its licensee, and
* not to intellectual property embodied in modifications its licensee may
* make.
*
* 3.3. Redistribution of Executable. Redistribution in executable form of any
* substantial portion of the Covered Code or modification must reproduce the
* above Copyright Notice, and the following Disclaimer and Export Compliance
* provision in the documentation and/or other materials provided with the
* distribution.
*
* 3.4. Intel retains all right, title, and interest in and to the Original
* Intel Code.
*
* 3.5. Neither the name Intel nor any other trademark owned or controlled by
* Intel shall be used in advertising or otherwise to promote the sale, use or
* other dealings in products derived from or relating to the Covered Code
* without prior written authorization from Intel.
*
* 4. Disclaimer and Export Compliance
*
* 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
* HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
* IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
* INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
* UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
* IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
* PARTICULAR PURPOSE.
*
* 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
* OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
* COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
* SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
* CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
* HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
* SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
* LIMITED REMEDY.
*
* 4.3. Licensee shall not export, either directly or indirectly, any of this
* software or system incorporating such software without first obtaining any
* required license or other approval from the U. S. Department of Commerce or
* any other agency or department of the United States Government. In the
* event Licensee exports any such software from the United States or
* re-exports any such software from a foreign destination, Licensee shall
* ensure that the distribution and export/re-export of the software is in
* compliance with all laws, regulations, orders, or other restrictions of the
* U.S. Export Administration Regulations. Licensee agrees that neither it nor
* any of its subsidiaries will export/re-export any technical data, process,
* software, or service, directly or indirectly, to any country for which the
* United States government or any agency thereof requires an export license,
* other governmental approval, or letter of assurance, without first obtaining
* such license, approval or letter.
*
*****************************************************************************/
#include "acpi.h"
#include "accommon.h"
#include "acnamesp.h"
#include "acinterp.h"
#define _COMPONENT ACPI_EXECUTER
ACPI_MODULE_NAME ("extrace")
static ACPI_OPERAND_OBJECT *AcpiGbl_TraceMethodObject = NULL;
/* Local prototypes */
#ifdef ACPI_DEBUG_OUTPUT
static const char *
AcpiExGetTraceEventName (
ACPI_TRACE_EVENT_TYPE Type);
#endif
/*******************************************************************************
*
* FUNCTION: AcpiExInterpreterTraceEnabled
*
* PARAMETERS: Name - Whether method name should be matched,
* this should be checked before starting
* the tracer
*
* RETURN: TRUE if interpreter trace is enabled.
*
* DESCRIPTION: Check whether interpreter trace is enabled
*
******************************************************************************/
static BOOLEAN
AcpiExInterpreterTraceEnabled (
char *Name)
{
/* Check if tracing is enabled */
if (!(AcpiGbl_TraceFlags & ACPI_TRACE_ENABLED))
{
return (FALSE);
}
/*
* Check if tracing is filtered:
*
* 1. If the tracer is started, AcpiGbl_TraceMethodObject should have
* been filled by the trace starter
* 2. If the tracer is not started, AcpiGbl_TraceMethodName should be
* matched if it is specified
* 3. If the tracer is oneshot style, AcpiGbl_TraceMethodName should
* not be cleared by the trace stopper during the first match
*/
if (AcpiGbl_TraceMethodObject)
{
return (TRUE);
}
if (Name &&
(AcpiGbl_TraceMethodName &&
strcmp (AcpiGbl_TraceMethodName, Name)))
{
return (FALSE);
}
if ((AcpiGbl_TraceFlags & ACPI_TRACE_ONESHOT) &&
!AcpiGbl_TraceMethodName)
{
return (FALSE);
}
return (TRUE);
}
/*******************************************************************************
*
* FUNCTION: AcpiExGetTraceEventName
*
* PARAMETERS: Type - Trace event type
*
* RETURN: Trace event name.
*
* DESCRIPTION: Used to obtain the full trace event name.
*
******************************************************************************/
#ifdef ACPI_DEBUG_OUTPUT
static const char *
AcpiExGetTraceEventName (
ACPI_TRACE_EVENT_TYPE Type)
{
switch (Type)
{
case ACPI_TRACE_AML_METHOD:
return "Method";
case ACPI_TRACE_AML_OPCODE:
return "Opcode";
case ACPI_TRACE_AML_REGION:
return "Region";
default:
return "";
}
}
#endif
/*******************************************************************************
*
* FUNCTION: AcpiExTracePoint
*
* PARAMETERS: Type - Trace event type
* Begin - TRUE if before execution
* Aml - Executed AML address
* Pathname - Object path
*
* RETURN: None
*
* DESCRIPTION: Internal interpreter execution trace.
*
******************************************************************************/
void
AcpiExTracePoint (
ACPI_TRACE_EVENT_TYPE Type,
BOOLEAN Begin,
UINT8 *Aml,
char *Pathname)
{
ACPI_FUNCTION_NAME (ExTracePoint);
if (Pathname)
{
ACPI_DEBUG_PRINT ((ACPI_DB_TRACE_POINT,
"%s %s [0x%p:%s] execution.\n",
AcpiExGetTraceEventName (Type), Begin ? "Begin" : "End",
Aml, Pathname));
}
else
{
ACPI_DEBUG_PRINT ((ACPI_DB_TRACE_POINT,
"%s %s [0x%p] execution.\n",
AcpiExGetTraceEventName (Type), Begin ? "Begin" : "End",
Aml));
}
}
/*******************************************************************************
*
* FUNCTION: AcpiExStartTraceMethod
*
* PARAMETERS: MethodNode - Node of the method
* ObjDesc - The method object
* WalkState - current state, NULL if not yet executing
* a method.
*
* RETURN: None
*
* DESCRIPTION: Start control method execution trace
*
******************************************************************************/
void
AcpiExStartTraceMethod (
ACPI_NAMESPACE_NODE *MethodNode,
ACPI_OPERAND_OBJECT *ObjDesc,
ACPI_WALK_STATE *WalkState)
{
ACPI_STATUS Status;
char *Pathname = NULL;
BOOLEAN Enabled = FALSE;
ACPI_FUNCTION_NAME (ExStartTraceMethod);
if (MethodNode)
{
Pathname = AcpiNsGetNormalizedPathname (MethodNode, TRUE);
}
Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
if (ACPI_FAILURE (Status))
{
goto Exit;
}
Enabled = AcpiExInterpreterTraceEnabled (Pathname);
if (Enabled && !AcpiGbl_TraceMethodObject)
{
AcpiGbl_TraceMethodObject = ObjDesc;
AcpiGbl_OriginalDbgLevel = AcpiDbgLevel;
AcpiGbl_OriginalDbgLayer = AcpiDbgLayer;
AcpiDbgLevel = ACPI_TRACE_LEVEL_ALL;
AcpiDbgLayer = ACPI_TRACE_LAYER_ALL;
if (AcpiGbl_TraceDbgLevel)
{
AcpiDbgLevel = AcpiGbl_TraceDbgLevel;
}
if (AcpiGbl_TraceDbgLayer)
{
AcpiDbgLayer = AcpiGbl_TraceDbgLayer;
}
}
(void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
Exit:
if (Enabled)
{
ACPI_TRACE_POINT (ACPI_TRACE_AML_METHOD, TRUE,
ObjDesc ? ObjDesc->Method.AmlStart : NULL, Pathname);
}
if (Pathname)
{
ACPI_FREE (Pathname);
}
}
/*******************************************************************************
*
* FUNCTION: AcpiExStopTraceMethod
*
* PARAMETERS: MethodNode - Node of the method
* ObjDesc - The method object
* WalkState - current state, NULL if not yet executing
* a method.
*
* RETURN: None
*
* DESCRIPTION: Stop control method execution trace
*
******************************************************************************/
void
AcpiExStopTraceMethod (
ACPI_NAMESPACE_NODE *MethodNode,
ACPI_OPERAND_OBJECT *ObjDesc,
ACPI_WALK_STATE *WalkState)
{
ACPI_STATUS Status;
char *Pathname = NULL;
BOOLEAN Enabled;
ACPI_FUNCTION_NAME (ExStopTraceMethod);
if (MethodNode)
{
Pathname = AcpiNsGetNormalizedPathname (MethodNode, TRUE);
}
Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
if (ACPI_FAILURE (Status))
{
goto ExitPath;
}
Enabled = AcpiExInterpreterTraceEnabled (NULL);
(void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
if (Enabled)
{
ACPI_TRACE_POINT (ACPI_TRACE_AML_METHOD, FALSE,
ObjDesc ? ObjDesc->Method.AmlStart : NULL, Pathname);
}
Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
if (ACPI_FAILURE (Status))
{
goto ExitPath;
}
/* Check whether the tracer should be stopped */
if (AcpiGbl_TraceMethodObject == ObjDesc)
{
/* Disable further tracing if type is one-shot */
if (AcpiGbl_TraceFlags & ACPI_TRACE_ONESHOT)
{
AcpiGbl_TraceMethodName = NULL;
}
AcpiDbgLevel = AcpiGbl_OriginalDbgLevel;
AcpiDbgLayer = AcpiGbl_OriginalDbgLayer;
AcpiGbl_TraceMethodObject = NULL;
}
(void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
ExitPath:
if (Pathname)
{
ACPI_FREE (Pathname);
}
}
/*******************************************************************************
*
* FUNCTION: AcpiExStartTraceOpcode
*
* PARAMETERS: Op - The parser opcode object
* WalkState - current state, NULL if not yet executing
* a method.
*
* RETURN: None
*
* DESCRIPTION: Start opcode execution trace
*
******************************************************************************/
void
AcpiExStartTraceOpcode (
ACPI_PARSE_OBJECT *Op,
ACPI_WALK_STATE *WalkState)
{
ACPI_FUNCTION_NAME (ExStartTraceOpcode);
if (AcpiExInterpreterTraceEnabled (NULL) &&
(AcpiGbl_TraceFlags & ACPI_TRACE_OPCODE))
{
ACPI_TRACE_POINT (ACPI_TRACE_AML_OPCODE, TRUE,
Op->Common.Aml, Op->Common.AmlOpName);
}
}
/*******************************************************************************
*
* FUNCTION: AcpiExStopTraceOpcode
*
* PARAMETERS: Op - The parser opcode object
* WalkState - current state, NULL if not yet executing
* a method.
*
* RETURN: None
*
* DESCRIPTION: Stop opcode execution trace
*
******************************************************************************/
void
AcpiExStopTraceOpcode (
ACPI_PARSE_OBJECT *Op,
ACPI_WALK_STATE *WalkState)
{
ACPI_FUNCTION_NAME (ExStopTraceOpcode);
if (AcpiExInterpreterTraceEnabled (NULL) &&
(AcpiGbl_TraceFlags & ACPI_TRACE_OPCODE))
{
ACPI_TRACE_POINT (ACPI_TRACE_AML_OPCODE, FALSE,
Op->Common.Aml, Op->Common.AmlOpName);
}
}

View file

@ -259,8 +259,8 @@ AcpiExTruncateFor32bitTable (
(ObjDesc->Integer.Value > (UINT64) ACPI_UINT32_MAX)) (ObjDesc->Integer.Value > (UINT64) ACPI_UINT32_MAX))
{ {
/* /*
* We are executing in a 32-bit ACPI table. * We are executing in a 32-bit ACPI table. Truncate
* Truncate the value to 32 bits by zeroing out the upper 32-bit field * the value to 32 bits by zeroing out the upper 32-bit field
*/ */
ObjDesc->Integer.Value &= (UINT64) ACPI_UINT32_MAX; ObjDesc->Integer.Value &= (UINT64) ACPI_UINT32_MAX;
return (TRUE); return (TRUE);
@ -441,7 +441,8 @@ AcpiExEisaIdToString (
if (CompressedId > ACPI_UINT32_MAX) if (CompressedId > ACPI_UINT32_MAX)
{ {
ACPI_WARNING ((AE_INFO, ACPI_WARNING ((AE_INFO,
"Expected EISAID is larger than 32 bits: 0x%8.8X%8.8X, truncating", "Expected EISAID is larger than 32 bits: "
"0x%8.8X%8.8X, truncating",
ACPI_FORMAT_UINT64 (CompressedId))); ACPI_FORMAT_UINT64 (CompressedId)));
} }
@ -568,5 +569,4 @@ AcpiIsValidSpaceId (
return (TRUE); return (TRUE);
} }
#endif #endif

View file

@ -221,8 +221,8 @@ AcpiHwSetMode (
{ {
if (AcpiHwGetMode () == Mode) if (AcpiHwGetMode () == Mode)
{ {
ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Mode %X successfully enabled\n", ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
Mode)); "Mode %X successfully enabled\n", Mode));
return_ACPI_STATUS (AE_OK); return_ACPI_STATUS (AE_OK);
} }
AcpiOsStall (ACPI_USEC_PER_MSEC); AcpiOsStall (ACPI_USEC_PER_MSEC);

View file

@ -202,7 +202,8 @@ AcpiHwExtendedSleep (
/* Clear wake status (WAK_STS) */ /* Clear wake status (WAK_STS) */
Status = AcpiWrite ((UINT64) ACPI_X_WAKE_STATUS, &AcpiGbl_FADT.SleepStatus); Status = AcpiWrite ((UINT64) ACPI_X_WAKE_STATUS,
&AcpiGbl_FADT.SleepStatus);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);

View file

@ -280,9 +280,7 @@ AcpiHwClearGpe (
*/ */
RegisterBit = AcpiHwGetGpeRegisterBit (GpeEventInfo); RegisterBit = AcpiHwGetGpeRegisterBit (GpeEventInfo);
Status = AcpiHwWrite (RegisterBit, Status = AcpiHwWrite (RegisterBit, &GpeRegisterInfo->StatusAddress);
&GpeRegisterInfo->StatusAddress);
return (Status); return (Status);
} }
@ -405,8 +403,8 @@ AcpiHwGpeEnableWrite (
GpeRegisterInfo->EnableMask = EnableMask; GpeRegisterInfo->EnableMask = EnableMask;
Status = AcpiHwWrite (EnableMask, &GpeRegisterInfo->EnableAddress);
Status = AcpiHwWrite (EnableMask, &GpeRegisterInfo->EnableAddress);
return (Status); return (Status);
} }

View file

@ -140,6 +140,7 @@ AcpiHwWriteMultiple (
#endif /* !ACPI_REDUCED_HARDWARE */ #endif /* !ACPI_REDUCED_HARDWARE */
/****************************************************************************** /******************************************************************************
* *
* FUNCTION: AcpiHwValidateRegister * FUNCTION: AcpiHwValidateRegister

View file

@ -155,7 +155,8 @@ AcpiHwLegacySleep (
/* Clear wake status */ /* Clear wake status */
Status = AcpiWriteBitRegister (ACPI_BITREG_WAKE_STATUS, ACPI_CLEAR_STATUS); Status = AcpiWriteBitRegister (ACPI_BITREG_WAKE_STATUS,
ACPI_CLEAR_STATUS);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);
@ -406,7 +407,8 @@ AcpiHwLegacyWake (
* and use it to determine whether the system is rebooting or * and use it to determine whether the system is rebooting or
* resuming. Clear WAK_STS for compatibility. * resuming. Clear WAK_STS for compatibility.
*/ */
(void) AcpiWriteBitRegister (ACPI_BITREG_WAKE_STATUS, ACPI_CLEAR_STATUS); (void) AcpiWriteBitRegister (ACPI_BITREG_WAKE_STATUS,
ACPI_CLEAR_STATUS);
AcpiGbl_SystemAwakeAndRunning = TRUE; AcpiGbl_SystemAwakeAndRunning = TRUE;
/* Enable power button */ /* Enable power button */

View file

@ -637,12 +637,20 @@ AcpiGetSleepTypeData (
* Evaluate the \_Sx namespace object containing the register values * Evaluate the \_Sx namespace object containing the register values
* for this state * for this state
*/ */
Info->RelativePathname = ACPI_CAST_PTR ( Info->RelativePathname = ACPI_CAST_PTR (char,
char, AcpiGbl_SleepStateNames[SleepState]); AcpiGbl_SleepStateNames[SleepState]);
Status = AcpiNsEvaluate (Info); Status = AcpiNsEvaluate (Info);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
goto Cleanup; if (Status == AE_NOT_FOUND)
{
/* The _Sx states are optional, ignore NOT_FOUND */
goto FinalCleanup;
}
goto WarningCleanup;
} }
/* Must have a return object */ /* Must have a return object */
@ -652,7 +660,7 @@ AcpiGetSleepTypeData (
ACPI_ERROR ((AE_INFO, "No Sleep State object returned from [%s]", ACPI_ERROR ((AE_INFO, "No Sleep State object returned from [%s]",
Info->RelativePathname)); Info->RelativePathname));
Status = AE_AML_NO_RETURN_VALUE; Status = AE_AML_NO_RETURN_VALUE;
goto Cleanup; goto WarningCleanup;
} }
/* Return object must be of type Package */ /* Return object must be of type Package */
@ -661,7 +669,7 @@ AcpiGetSleepTypeData (
{ {
ACPI_ERROR ((AE_INFO, "Sleep State return object is not a Package")); ACPI_ERROR ((AE_INFO, "Sleep State return object is not a Package"));
Status = AE_AML_OPERAND_TYPE; Status = AE_AML_OPERAND_TYPE;
goto Cleanup1; goto ReturnValueCleanup;
} }
/* /*
@ -708,16 +716,18 @@ AcpiGetSleepTypeData (
break; break;
} }
Cleanup1: ReturnValueCleanup:
AcpiUtRemoveReference (Info->ReturnObject); AcpiUtRemoveReference (Info->ReturnObject);
Cleanup: WarningCleanup:
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
ACPI_EXCEPTION ((AE_INFO, Status, ACPI_EXCEPTION ((AE_INFO, Status,
"While evaluating Sleep State [%s]", Info->RelativePathname)); "While evaluating Sleep State [%s]",
Info->RelativePathname));
} }
FinalCleanup:
ACPI_FREE (Info); ACPI_FREE (Info);
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);
} }

View file

@ -320,6 +320,7 @@ AcpiEnterSleepStateS4bios (
{ {
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);
} }
} while (!InValue); } while (!InValue);
return_ACPI_STATUS (AE_OK); return_ACPI_STATUS (AE_OK);

View file

@ -116,6 +116,7 @@
#ifndef _ACAPPS #ifndef _ACAPPS
#define _ACAPPS #define _ACAPPS
#include <stdio.h>
#ifdef _MSC_VER /* disable some level-4 warnings */ #ifdef _MSC_VER /* disable some level-4 warnings */
#pragma warning(disable:4100) /* warning C4100: unreferenced formal parameter */ #pragma warning(disable:4100) /* warning C4100: unreferenced formal parameter */
@ -162,13 +163,51 @@
AcpiOsPrintf (Description); AcpiOsPrintf (Description);
#define ACPI_OPTION(Name, Description) \ #define ACPI_OPTION(Name, Description) \
AcpiOsPrintf (" %-18s%s\n", Name, Description); AcpiOsPrintf (" %-20s%s\n", Name, Description);
/* Check for unexpected exceptions */
#define ACPI_CHECK_STATUS(Name, Status, Expected) \
if (Status != Expected) \
{ \
AcpiOsPrintf ("Unexpected %s from %s (%s-%d)\n", \
AcpiFormatException (Status), #Name, _AcpiModuleName, __LINE__); \
}
/* Check for unexpected non-AE_OK errors */
#define ACPI_CHECK_OK(Name, Status) ACPI_CHECK_STATUS (Name, Status, AE_OK);
#define FILE_SUFFIX_DISASSEMBLY "dsl" #define FILE_SUFFIX_DISASSEMBLY "dsl"
#define FILE_SUFFIX_BINARY_TABLE ".dat" /* Needs the dot */ #define FILE_SUFFIX_BINARY_TABLE ".dat" /* Needs the dot */
/* acfileio */
ACPI_STATUS
AcGetAllTablesFromFile (
char *Filename,
UINT8 GetOnlyAmlTables,
ACPI_NEW_TABLE_DESC **ReturnListHead);
BOOLEAN
AcIsFileBinary (
FILE *File);
ACPI_STATUS
AcValidateTableHeader (
FILE *File,
long TableOffset);
/* Values for GetOnlyAmlTables */
#define ACPI_GET_ONLY_AML_TABLES TRUE
#define ACPI_GET_ALL_TABLES FALSE
/* /*
* getopt * getopt
*/ */
@ -197,51 +236,6 @@ CmGetFileSize (
ACPI_FILE File); ACPI_FILE File);
#ifndef ACPI_DUMP_APP
/*
* adisasm
*/
ACPI_STATUS
AdAmlDisassemble (
BOOLEAN OutToFile,
char *Filename,
char *Prefix,
char **OutFilename);
void
AdPrintStatistics (
void);
ACPI_STATUS
AdFindDsdt(
UINT8 **DsdtPtr,
UINT32 *DsdtLength);
void
AdDumpTables (
void);
ACPI_STATUS
AdGetLocalTables (
void);
ACPI_STATUS
AdParseTable (
ACPI_TABLE_HEADER *Table,
ACPI_OWNER_ID *OwnerId,
BOOLEAN LoadTable,
BOOLEAN External);
ACPI_STATUS
AdDisplayTables (
char *Filename,
ACPI_TABLE_HEADER *Table);
ACPI_STATUS
AdDisplayStatistics (
void);
/* /*
* adwalk * adwalk
*/ */
@ -300,6 +294,5 @@ AdWriteTable (
UINT32 Length, UINT32 Length,
char *TableName, char *TableName,
char *OemTableId); char *OemTableId);
#endif
#endif /* _ACAPPS */ #endif /* _ACAPPS */

View file

@ -163,11 +163,17 @@ typedef struct acpi_db_execute_walk
/* /*
* dbxface - external debugger interfaces * dbxface - external debugger interfaces
*/ */
ACPI_DBR_DEPENDENT_RETURN_OK (
ACPI_STATUS ACPI_STATUS
AcpiDbSingleStep ( AcpiDbSingleStep (
ACPI_WALK_STATE *WalkState, ACPI_WALK_STATE *WalkState,
ACPI_PARSE_OBJECT *Op, ACPI_PARSE_OBJECT *Op,
UINT32 OpType); UINT32 OpType))
ACPI_DBR_DEPENDENT_RETURN_VOID (
void
AcpiDbSignalBreakPoint (
ACPI_WALK_STATE *WalkState))
/* /*
@ -362,10 +368,11 @@ AcpiDbDecodeAndDisplayObject (
char *Target, char *Target,
char *OutputType); char *OutputType);
ACPI_DBR_DEPENDENT_RETURN_VOID (
void void
AcpiDbDisplayResultObject ( AcpiDbDisplayResultObject (
ACPI_OPERAND_OBJECT *ObjDesc, ACPI_OPERAND_OBJECT *ObjDesc,
ACPI_WALK_STATE *WalkState); ACPI_WALK_STATE *WalkState))
ACPI_STATUS ACPI_STATUS
AcpiDbDisplayAllMethods ( AcpiDbDisplayAllMethods (
@ -391,10 +398,11 @@ void
AcpiDbDisplayObjectType ( AcpiDbDisplayObjectType (
char *ObjectArg); char *ObjectArg);
ACPI_DBR_DEPENDENT_RETURN_VOID (
void void
AcpiDbDisplayArgumentObject ( AcpiDbDisplayArgumentObject (
ACPI_OPERAND_OBJECT *ObjDesc, ACPI_OPERAND_OBJECT *ObjDesc,
ACPI_WALK_STATE *WalkState); ACPI_WALK_STATE *WalkState))
/* /*
@ -446,10 +454,8 @@ AcpiDbLoadAcpiTable (
char *Filename); char *Filename);
ACPI_STATUS ACPI_STATUS
AcpiDbGetTableFromFile ( AcpiDbLoadTables (
char *Filename, ACPI_NEW_TABLE_DESC *ListHead);
ACPI_TABLE_HEADER **Table,
BOOLEAN MustBeAmlTable);
/* /*

View file

@ -1119,7 +1119,7 @@ AcpiDmCloseOperator (
/* /*
* acdisasm * dmtables
*/ */
void void
AdDisassemblerHeader ( AdDisassemblerHeader (
@ -1129,4 +1129,35 @@ AdDisassemblerHeader (
#define ACPI_IS_AML_TABLE 0 #define ACPI_IS_AML_TABLE 0
#define ACPI_IS_DATA_TABLE 1 #define ACPI_IS_DATA_TABLE 1
/*
* adisasm
*/
ACPI_STATUS
AdAmlDisassemble (
BOOLEAN OutToFile,
char *Filename,
char *Prefix,
char **OutFilename);
ACPI_STATUS
AdGetLocalTables (
void);
ACPI_STATUS
AdParseTable (
ACPI_TABLE_HEADER *Table,
ACPI_OWNER_ID *OwnerId,
BOOLEAN LoadTable,
BOOLEAN External);
ACPI_STATUS
AdDisplayTables (
char *Filename,
ACPI_TABLE_HEADER *Table);
ACPI_STATUS
AdDisplayStatistics (
void);
#endif /* __ACDISASM_H__ */ #endif /* __ACDISASM_H__ */

View file

@ -294,6 +294,11 @@ AcpiEvDeleteGpeHandlers (
/* /*
* evhandler - Address space handling * evhandler - Address space handling
*/ */
ACPI_OPERAND_OBJECT *
AcpiEvFindRegionHandler (
ACPI_ADR_SPACE_TYPE SpaceId,
ACPI_OPERAND_OBJECT *HandlerObj);
BOOLEAN BOOLEAN
AcpiEvHasDefaultHandler ( AcpiEvHasDefaultHandler (
ACPI_NAMESPACE_NODE *Node, ACPI_NAMESPACE_NODE *Node,
@ -339,10 +344,15 @@ AcpiEvDetachRegion (
ACPI_OPERAND_OBJECT *RegionObj, ACPI_OPERAND_OBJECT *RegionObj,
BOOLEAN AcpiNsIsLocked); BOOLEAN AcpiNsIsLocked);
ACPI_STATUS void
AcpiEvAssociateRegMethod (
ACPI_OPERAND_OBJECT *RegionObj);
void
AcpiEvExecuteRegMethods ( AcpiEvExecuteRegMethods (
ACPI_NAMESPACE_NODE *Node, ACPI_NAMESPACE_NODE *Node,
ACPI_ADR_SPACE_TYPE SpaceId); ACPI_ADR_SPACE_TYPE SpaceId,
UINT32 Function);
ACPI_STATUS ACPI_STATUS
AcpiEvExecuteRegMethod ( AcpiEvExecuteRegMethod (

View file

@ -200,8 +200,9 @@ typedef struct acpi_exception_info
#define AE_OWNER_ID_LIMIT EXCEP_ENV (0x001B) #define AE_OWNER_ID_LIMIT EXCEP_ENV (0x001B)
#define AE_NOT_CONFIGURED EXCEP_ENV (0x001C) #define AE_NOT_CONFIGURED EXCEP_ENV (0x001C)
#define AE_ACCESS EXCEP_ENV (0x001D) #define AE_ACCESS EXCEP_ENV (0x001D)
#define AE_IO_ERROR EXCEP_ENV (0x001E)
#define AE_CODE_ENV_MAX 0x001D #define AE_CODE_ENV_MAX 0x001E
/* /*
@ -334,7 +335,8 @@ static const ACPI_EXCEPTION_INFO AcpiGbl_ExceptionNames_Env[] =
EXCEP_TXT ("AE_NO_HANDLER", "A handler for the operation is not installed"), EXCEP_TXT ("AE_NO_HANDLER", "A handler for the operation is not installed"),
EXCEP_TXT ("AE_OWNER_ID_LIMIT", "There are no more Owner IDs available for ACPI tables or control methods"), EXCEP_TXT ("AE_OWNER_ID_LIMIT", "There are no more Owner IDs available for ACPI tables or control methods"),
EXCEP_TXT ("AE_NOT_CONFIGURED", "The interface is not part of the current subsystem configuration"), EXCEP_TXT ("AE_NOT_CONFIGURED", "The interface is not part of the current subsystem configuration"),
EXCEP_TXT ("AE_ACCESS", "Permission denied for the requested operation") EXCEP_TXT ("AE_ACCESS", "Permission denied for the requested operation"),
EXCEP_TXT ("AE_IO_ERROR", "An I/O error occurred")
}; };
static const ACPI_EXCEPTION_INFO AcpiGbl_ExceptionNames_Pgm[] = static const ACPI_EXCEPTION_INFO AcpiGbl_ExceptionNames_Pgm[] =

View file

@ -134,6 +134,7 @@ ACPI_GLOBAL (ACPI_TABLE_HEADER, AcpiGbl_OriginalDsdtHeader);
ACPI_INIT_GLOBAL (UINT32, AcpiGbl_DsdtIndex, ACPI_INVALID_TABLE_INDEX); ACPI_INIT_GLOBAL (UINT32, AcpiGbl_DsdtIndex, ACPI_INVALID_TABLE_INDEX);
ACPI_INIT_GLOBAL (UINT32, AcpiGbl_FacsIndex, ACPI_INVALID_TABLE_INDEX); ACPI_INIT_GLOBAL (UINT32, AcpiGbl_FacsIndex, ACPI_INVALID_TABLE_INDEX);
ACPI_INIT_GLOBAL (UINT32, AcpiGbl_XFacsIndex, ACPI_INVALID_TABLE_INDEX); ACPI_INIT_GLOBAL (UINT32, AcpiGbl_XFacsIndex, ACPI_INVALID_TABLE_INDEX);
ACPI_INIT_GLOBAL (UINT32, AcpiGbl_FadtIndex, ACPI_INVALID_TABLE_INDEX);
#if (!ACPI_REDUCED_HARDWARE) #if (!ACPI_REDUCED_HARDWARE)
ACPI_GLOBAL (ACPI_TABLE_FACS *, AcpiGbl_FACS); ACPI_GLOBAL (ACPI_TABLE_FACS *, AcpiGbl_FACS);
@ -157,6 +158,8 @@ ACPI_GLOBAL (UINT8, AcpiGbl_IntegerBitWidth);
ACPI_GLOBAL (UINT8, AcpiGbl_IntegerByteWidth); ACPI_GLOBAL (UINT8, AcpiGbl_IntegerByteWidth);
ACPI_GLOBAL (UINT8, AcpiGbl_IntegerNybbleWidth); ACPI_GLOBAL (UINT8, AcpiGbl_IntegerNybbleWidth);
ACPI_INIT_GLOBAL (UINT8, AcpiGbl_GroupModuleLevelCode, FALSE);
/***************************************************************************** /*****************************************************************************
* *
@ -219,6 +222,7 @@ ACPI_GLOBAL (ACPI_CACHE_T *, AcpiGbl_OperandCache);
ACPI_INIT_GLOBAL (UINT32, AcpiGbl_StartupFlags, 0); ACPI_INIT_GLOBAL (UINT32, AcpiGbl_StartupFlags, 0);
ACPI_INIT_GLOBAL (BOOLEAN, AcpiGbl_Shutdown, TRUE); ACPI_INIT_GLOBAL (BOOLEAN, AcpiGbl_Shutdown, TRUE);
ACPI_INIT_GLOBAL (BOOLEAN, AcpiGbl_EarlyInitialization, TRUE);
/* Global handlers */ /* Global handlers */
@ -238,7 +242,7 @@ ACPI_GLOBAL (UINT8, AcpiGbl_NextOwnerIdOffset);
/* Initialization sequencing */ /* Initialization sequencing */
ACPI_GLOBAL (BOOLEAN, AcpiGbl_RegMethodsExecuted); ACPI_INIT_GLOBAL (BOOLEAN, AcpiGbl_RegMethodsEnabled, FALSE);
/* Misc */ /* Misc */
@ -400,9 +404,9 @@ ACPI_GLOBAL (ACPI_EXTERNAL_FILE *, AcpiGbl_ExternalFileList);
#ifdef ACPI_DEBUGGER #ifdef ACPI_DEBUGGER
ACPI_INIT_GLOBAL (BOOLEAN, AcpiGbl_DbTerminateThreads, FALSE);
ACPI_INIT_GLOBAL (BOOLEAN, AcpiGbl_AbortMethod, FALSE); ACPI_INIT_GLOBAL (BOOLEAN, AcpiGbl_AbortMethod, FALSE);
ACPI_INIT_GLOBAL (BOOLEAN, AcpiGbl_MethodExecuting, FALSE); ACPI_INIT_GLOBAL (BOOLEAN, AcpiGbl_MethodExecuting, FALSE);
ACPI_INIT_GLOBAL (ACPI_THREAD_ID, AcpiGbl_DbThreadId, ACPI_INVALID_THREAD_ID);
ACPI_GLOBAL (BOOLEAN, AcpiGbl_DbOpt_NoIniMethods); ACPI_GLOBAL (BOOLEAN, AcpiGbl_DbOpt_NoIniMethods);
ACPI_GLOBAL (BOOLEAN, AcpiGbl_DbOpt_NoRegionSupport); ACPI_GLOBAL (BOOLEAN, AcpiGbl_DbOpt_NoRegionSupport);
@ -412,6 +416,8 @@ ACPI_GLOBAL (char *, AcpiGbl_DbFilename);
ACPI_GLOBAL (UINT32, AcpiGbl_DbDebugLevel); ACPI_GLOBAL (UINT32, AcpiGbl_DbDebugLevel);
ACPI_GLOBAL (UINT32, AcpiGbl_DbConsoleDebugLevel); ACPI_GLOBAL (UINT32, AcpiGbl_DbConsoleDebugLevel);
ACPI_GLOBAL (ACPI_NAMESPACE_NODE *, AcpiGbl_DbScopeNode); ACPI_GLOBAL (ACPI_NAMESPACE_NODE *, AcpiGbl_DbScopeNode);
ACPI_GLOBAL (BOOLEAN, AcpiGbl_DbTerminateLoop);
ACPI_GLOBAL (BOOLEAN, AcpiGbl_DbThreadsTerminated);
ACPI_GLOBAL (char *, AcpiGbl_DbArgs[ACPI_DEBUGGER_MAX_ARGS]); ACPI_GLOBAL (char *, AcpiGbl_DbArgs[ACPI_DEBUGGER_MAX_ARGS]);
ACPI_GLOBAL (ACPI_OBJECT_TYPE, AcpiGbl_DbArgTypes[ACPI_DEBUGGER_MAX_ARGS]); ACPI_GLOBAL (ACPI_OBJECT_TYPE, AcpiGbl_DbArgTypes[ACPI_DEBUGGER_MAX_ARGS]);

View file

@ -190,6 +190,14 @@ typedef struct acpi_rw_lock
#define ACPI_MUTEX_NOT_ACQUIRED (ACPI_THREAD_ID) -1 #define ACPI_MUTEX_NOT_ACQUIRED (ACPI_THREAD_ID) -1
/* This Thread ID means an invalid thread ID */
#ifdef ACPI_OS_INVALID_THREAD_ID
#define ACPI_INVALID_THREAD_ID ACPI_OS_INVALID_THREAD_ID
#else
#define ACPI_INVALID_THREAD_ID ((ACPI_THREAD_ID) 0xFFFFFFFF)
#endif
/* Table for the global mutexes */ /* Table for the global mutexes */
typedef struct acpi_mutex_info typedef struct acpi_mutex_info
@ -308,6 +316,16 @@ typedef struct acpi_table_list
#define ACPI_ROOT_ALLOW_RESIZE (2) #define ACPI_ROOT_ALLOW_RESIZE (2)
/* List to manage incoming ACPI tables */
typedef struct acpi_new_table_desc
{
ACPI_TABLE_HEADER *Table;
struct acpi_new_table_desc *Next;
} ACPI_NEW_TABLE_DESC;
/* Predefined table indexes */ /* Predefined table indexes */
#define ACPI_INVALID_TABLE_INDEX (0xFFFFFFFF) #define ACPI_INVALID_TABLE_INDEX (0xFFFFFFFF)
@ -507,6 +525,7 @@ typedef union acpi_predefined_info
/* Return object auto-repair info */ /* Return object auto-repair info */
typedef ACPI_STATUS (*ACPI_OBJECT_CONVERTER) ( typedef ACPI_STATUS (*ACPI_OBJECT_CONVERTER) (
struct acpi_namespace_node *Scope,
union acpi_operand_object *OriginalObject, union acpi_operand_object *OriginalObject,
union acpi_operand_object **ConvertedObject); union acpi_operand_object **ConvertedObject);
@ -542,6 +561,7 @@ typedef struct acpi_simple_repair_info
typedef struct acpi_reg_walk_info typedef struct acpi_reg_walk_info
{ {
ACPI_ADR_SPACE_TYPE SpaceId; ACPI_ADR_SPACE_TYPE SpaceId;
UINT32 Function;
UINT32 RegRunCount; UINT32 RegRunCount;
} ACPI_REG_WALK_INFO; } ACPI_REG_WALK_INFO;
@ -1094,6 +1114,7 @@ typedef struct acpi_parse_state
#define ACPI_PARSEOP_CLOSING_PAREN 0x10 #define ACPI_PARSEOP_CLOSING_PAREN 0x10
#define ACPI_PARSEOP_COMPOUND 0x20 #define ACPI_PARSEOP_COMPOUND 0x20
#define ACPI_PARSEOP_ASSIGNMENT 0x40 #define ACPI_PARSEOP_ASSIGNMENT 0x40
#define ACPI_PARSEOP_ELSEIF 0x80
/***************************************************************************** /*****************************************************************************

View file

@ -477,18 +477,6 @@
#endif #endif
/*
* Some code only gets executed when the debugger is built in.
* Note that this is entirely independent of whether the
* DEBUG_PRINT stuff (set by ACPI_DEBUG_OUTPUT) is on, or not.
*/
#ifdef ACPI_DEBUGGER
#define ACPI_DEBUGGER_EXEC(a) a
#else
#define ACPI_DEBUGGER_EXEC(a)
#endif
/* /*
* Macros used for ACPICA utilities only * Macros used for ACPICA utilities only
*/ */

View file

@ -150,6 +150,7 @@
/* Object is not a package element */ /* Object is not a package element */
#define ACPI_NOT_PACKAGE_ELEMENT ACPI_UINT32_MAX #define ACPI_NOT_PACKAGE_ELEMENT ACPI_UINT32_MAX
#define ACPI_ALL_PACKAGE_ELEMENTS (ACPI_UINT32_MAX-1)
/* Always emit warning message, not dependent on node flags */ /* Always emit warning message, not dependent on node flags */
@ -296,11 +297,19 @@ AcpiNsConvertToBuffer (
ACPI_STATUS ACPI_STATUS
AcpiNsConvertToUnicode ( AcpiNsConvertToUnicode (
ACPI_NAMESPACE_NODE *Scope,
ACPI_OPERAND_OBJECT *OriginalObject, ACPI_OPERAND_OBJECT *OriginalObject,
ACPI_OPERAND_OBJECT **ReturnObject); ACPI_OPERAND_OBJECT **ReturnObject);
ACPI_STATUS ACPI_STATUS
AcpiNsConvertToResource ( AcpiNsConvertToResource (
ACPI_NAMESPACE_NODE *Scope,
ACPI_OPERAND_OBJECT *OriginalObject,
ACPI_OPERAND_OBJECT **ReturnObject);
ACPI_STATUS
AcpiNsConvertToReference (
ACPI_NAMESPACE_NODE *Scope,
ACPI_OPERAND_OBJECT *OriginalObject, ACPI_OPERAND_OBJECT *OriginalObject,
ACPI_OPERAND_OBJECT **ReturnObject); ACPI_OPERAND_OBJECT **ReturnObject);

View file

@ -166,9 +166,10 @@
#define AOPOBJ_AML_CONSTANT 0x01 /* Integer is an AML constant */ #define AOPOBJ_AML_CONSTANT 0x01 /* Integer is an AML constant */
#define AOPOBJ_STATIC_POINTER 0x02 /* Data is part of an ACPI table, don't delete */ #define AOPOBJ_STATIC_POINTER 0x02 /* Data is part of an ACPI table, don't delete */
#define AOPOBJ_DATA_VALID 0x04 /* Object is initialized and data is valid */ #define AOPOBJ_DATA_VALID 0x04 /* Object is initialized and data is valid */
#define AOPOBJ_OBJECT_INITIALIZED 0x08 /* Region is initialized, _REG was run */ #define AOPOBJ_OBJECT_INITIALIZED 0x08 /* Region is initialized */
#define AOPOBJ_SETUP_COMPLETE 0x10 /* Region setup is complete */ #define AOPOBJ_REG_CONNECTED 0x10 /* _REG was run */
#define AOPOBJ_INVALID 0x20 /* Host OS won't allow a Region address */ #define AOPOBJ_SETUP_COMPLETE 0x20 /* Region setup is complete */
#define AOPOBJ_INVALID 0x40 /* Host OS won't allow a Region address */
/****************************************************************************** /******************************************************************************

View file

@ -165,7 +165,7 @@
#define ARGP_BYTELIST_OP ARGP_LIST1 (ARGP_NAMESTRING) #define ARGP_BYTELIST_OP ARGP_LIST1 (ARGP_NAMESTRING)
#define ARGP_CONCAT_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) #define ARGP_CONCAT_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET)
#define ARGP_CONCAT_RES_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) #define ARGP_CONCAT_RES_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET)
#define ARGP_COND_REF_OF_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_SUPERNAME) #define ARGP_COND_REF_OF_OP ARGP_LIST2 (ARGP_NAME_OR_REF,ARGP_TARGET)
#define ARGP_CONNECTFIELD_OP ARGP_LIST1 (ARGP_NAMESTRING) #define ARGP_CONNECTFIELD_OP ARGP_LIST1 (ARGP_NAMESTRING)
#define ARGP_CONTINUE_OP ARG_NONE #define ARGP_CONTINUE_OP ARG_NONE
#define ARGP_COPY_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_SIMPLENAME) #define ARGP_COPY_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_SIMPLENAME)
@ -225,13 +225,14 @@
#define ARGP_NAMEPATH_OP ARGP_LIST1 (ARGP_NAMESTRING) #define ARGP_NAMEPATH_OP ARGP_LIST1 (ARGP_NAMESTRING)
#define ARGP_NOOP_OP ARG_NONE #define ARGP_NOOP_OP ARG_NONE
#define ARGP_NOTIFY_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_TERMARG) #define ARGP_NOTIFY_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_TERMARG)
#define ARGP_OBJECT_TYPE_OP ARGP_LIST1 (ARGP_NAME_OR_REF)
#define ARGP_ONE_OP ARG_NONE #define ARGP_ONE_OP ARG_NONE
#define ARGP_ONES_OP ARG_NONE #define ARGP_ONES_OP ARG_NONE
#define ARGP_PACKAGE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_BYTEDATA, ARGP_DATAOBJLIST) #define ARGP_PACKAGE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_BYTEDATA, ARGP_DATAOBJLIST)
#define ARGP_POWER_RES_OP ARGP_LIST5 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_BYTEDATA, ARGP_WORDDATA, ARGP_OBJLIST) #define ARGP_POWER_RES_OP ARGP_LIST5 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_BYTEDATA, ARGP_WORDDATA, ARGP_OBJLIST)
#define ARGP_PROCESSOR_OP ARGP_LIST6 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_BYTEDATA, ARGP_DWORDDATA, ARGP_BYTEDATA, ARGP_OBJLIST) #define ARGP_PROCESSOR_OP ARGP_LIST6 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_BYTEDATA, ARGP_DWORDDATA, ARGP_BYTEDATA, ARGP_OBJLIST)
#define ARGP_QWORD_OP ARGP_LIST1 (ARGP_QWORDDATA) #define ARGP_QWORD_OP ARGP_LIST1 (ARGP_QWORDDATA)
#define ARGP_REF_OF_OP ARGP_LIST1 (ARGP_SUPERNAME) #define ARGP_REF_OF_OP ARGP_LIST1 (ARGP_NAME_OR_REF)
#define ARGP_REGION_OP ARGP_LIST4 (ARGP_NAME, ARGP_BYTEDATA, ARGP_TERMARG, ARGP_TERMARG) #define ARGP_REGION_OP ARGP_LIST4 (ARGP_NAME, ARGP_BYTEDATA, ARGP_TERMARG, ARGP_TERMARG)
#define ARGP_RELEASE_OP ARGP_LIST1 (ARGP_SUPERNAME) #define ARGP_RELEASE_OP ARGP_LIST1 (ARGP_SUPERNAME)
#define ARGP_RESERVEDFIELD_OP ARGP_LIST1 (ARGP_NAMESTRING) #define ARGP_RESERVEDFIELD_OP ARGP_LIST1 (ARGP_NAMESTRING)
@ -258,7 +259,6 @@
#define ARGP_TO_HEX_STR_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) #define ARGP_TO_HEX_STR_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET)
#define ARGP_TO_INTEGER_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) #define ARGP_TO_INTEGER_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET)
#define ARGP_TO_STRING_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) #define ARGP_TO_STRING_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET)
#define ARGP_TYPE_OP ARGP_LIST1 (ARGP_SUPERNAME)
#define ARGP_UNLOAD_OP ARGP_LIST1 (ARGP_SUPERNAME) #define ARGP_UNLOAD_OP ARGP_LIST1 (ARGP_SUPERNAME)
#define ARGP_VAR_PACKAGE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_TERMARG, ARGP_DATAOBJLIST) #define ARGP_VAR_PACKAGE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_TERMARG, ARGP_DATAOBJLIST)
#define ARGP_WAIT_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_TERMARG) #define ARGP_WAIT_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_TERMARG)
@ -297,7 +297,7 @@
#define ARGI_BUFFER_OP ARGI_LIST1 (ARGI_INTEGER) #define ARGI_BUFFER_OP ARGI_LIST1 (ARGI_INTEGER)
#define ARGI_BYTE_OP ARGI_INVALID_OPCODE #define ARGI_BYTE_OP ARGI_INVALID_OPCODE
#define ARGI_BYTELIST_OP ARGI_INVALID_OPCODE #define ARGI_BYTELIST_OP ARGI_INVALID_OPCODE
#define ARGI_CONCAT_OP ARGI_LIST3 (ARGI_COMPUTEDATA,ARGI_COMPUTEDATA, ARGI_TARGETREF) #define ARGI_CONCAT_OP ARGI_LIST3 (ARGI_ANYTYPE, ARGI_ANYTYPE, ARGI_TARGETREF)
#define ARGI_CONCAT_RES_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_BUFFER, ARGI_TARGETREF) #define ARGI_CONCAT_RES_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_BUFFER, ARGI_TARGETREF)
#define ARGI_COND_REF_OF_OP ARGI_LIST2 (ARGI_OBJECT_REF, ARGI_TARGETREF) #define ARGI_COND_REF_OF_OP ARGI_LIST2 (ARGI_OBJECT_REF, ARGI_TARGETREF)
#define ARGI_CONNECTFIELD_OP ARGI_INVALID_OPCODE #define ARGI_CONNECTFIELD_OP ARGI_INVALID_OPCODE
@ -359,6 +359,7 @@
#define ARGI_NAMEPATH_OP ARGI_INVALID_OPCODE #define ARGI_NAMEPATH_OP ARGI_INVALID_OPCODE
#define ARGI_NOOP_OP ARG_NONE #define ARGI_NOOP_OP ARG_NONE
#define ARGI_NOTIFY_OP ARGI_LIST2 (ARGI_DEVICE_REF, ARGI_INTEGER) #define ARGI_NOTIFY_OP ARGI_LIST2 (ARGI_DEVICE_REF, ARGI_INTEGER)
#define ARGI_OBJECT_TYPE_OP ARGI_LIST1 (ARGI_ANYTYPE)
#define ARGI_ONE_OP ARG_NONE #define ARGI_ONE_OP ARG_NONE
#define ARGI_ONES_OP ARG_NONE #define ARGI_ONES_OP ARG_NONE
#define ARGI_PACKAGE_OP ARGI_LIST1 (ARGI_INTEGER) #define ARGI_PACKAGE_OP ARGI_LIST1 (ARGI_INTEGER)
@ -392,7 +393,6 @@
#define ARGI_TO_HEX_STR_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET) #define ARGI_TO_HEX_STR_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET)
#define ARGI_TO_INTEGER_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET) #define ARGI_TO_INTEGER_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET)
#define ARGI_TO_STRING_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_FIXED_TARGET) #define ARGI_TO_STRING_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_FIXED_TARGET)
#define ARGI_TYPE_OP ARGI_LIST1 (ARGI_ANYTYPE)
#define ARGI_UNLOAD_OP ARGI_LIST1 (ARGI_DDBHANDLE) #define ARGI_UNLOAD_OP ARGI_LIST1 (ARGI_DDBHANDLE)
#define ARGI_VAR_PACKAGE_OP ARGI_LIST1 (ARGI_INTEGER) #define ARGI_VAR_PACKAGE_OP ARGI_LIST1 (ARGI_INTEGER)
#define ARGI_WAIT_OP ARGI_LIST2 (ARGI_EVENT, ARGI_INTEGER) #define ARGI_WAIT_OP ARGI_LIST2 (ARGI_EVENT, ARGI_INTEGER)

View file

@ -178,7 +178,12 @@ AcpiPsGetNextNamepath (
ACPI_WALK_STATE *WalkState, ACPI_WALK_STATE *WalkState,
ACPI_PARSE_STATE *ParserState, ACPI_PARSE_STATE *ParserState,
ACPI_PARSE_OBJECT *Arg, ACPI_PARSE_OBJECT *Arg,
BOOLEAN MethodCall); BOOLEAN PossibleMethodCall);
/* Values for BOOLEAN above */
#define ACPI_NOT_METHOD_CALL FALSE
#define ACPI_POSSIBLE_METHOD_CALL TRUE
ACPI_STATUS ACPI_STATUS
AcpiPsGetNextArg ( AcpiPsGetNextArg (

View file

@ -129,7 +129,8 @@ typedef enum
OSL_GLOBAL_LOCK_HANDLER, OSL_GLOBAL_LOCK_HANDLER,
OSL_NOTIFY_HANDLER, OSL_NOTIFY_HANDLER,
OSL_GPE_HANDLER, OSL_GPE_HANDLER,
OSL_DEBUGGER_THREAD, OSL_DEBUGGER_MAIN_THREAD,
OSL_DEBUGGER_EXEC_THREAD,
OSL_EC_POLL_HANDLER, OSL_EC_POLL_HANDLER,
OSL_EC_BURST_HANDLER OSL_EC_BURST_HANDLER

View file

@ -118,7 +118,7 @@
/* Current ACPICA subsystem version in YYYYMMDD format */ /* Current ACPICA subsystem version in YYYYMMDD format */
#define ACPI_CA_VERSION 0x20150930 #define ACPI_CA_VERSION 0x20151218
#include "acconfig.h" #include "acconfig.h"
#include "actypes.h" #include "actypes.h"
@ -263,6 +263,11 @@ ACPI_INIT_GLOBAL (UINT8, AcpiGbl_CopyDsdtLocally, FALSE);
*/ */
ACPI_INIT_GLOBAL (UINT8, AcpiGbl_DoNotUseXsdt, FALSE); ACPI_INIT_GLOBAL (UINT8, AcpiGbl_DoNotUseXsdt, FALSE);
/*
* Optionally allow default region handlers to be overridden.
*/
ACPI_INIT_GLOBAL (UINT8, AcpiGbl_OverrideDefaultRegionHandlers, FALSE);
/* /*
* Optionally use 32-bit FADT addresses if and when there is a conflict * Optionally use 32-bit FADT addresses if and when there is a conflict
* (address mismatch) between the 32-bit and 64-bit versions of the * (address mismatch) between the 32-bit and 64-bit versions of the
@ -341,6 +346,10 @@ ACPI_INIT_GLOBAL (UINT32, AcpiDbgLevel, ACPI_NORMAL_DEFAULT);
#endif #endif
ACPI_INIT_GLOBAL (UINT32, AcpiDbgLayer, ACPI_COMPONENT_DEFAULT); ACPI_INIT_GLOBAL (UINT32, AcpiDbgLayer, ACPI_COMPONENT_DEFAULT);
/* Optionally enable timer output with Debug Object output */
ACPI_INIT_GLOBAL (UINT8, AcpiGbl_DisplayDebugTimer, FALSE);
/* /*
* Other miscellaneous globals * Other miscellaneous globals
*/ */
@ -449,6 +458,30 @@ ACPI_GLOBAL (BOOLEAN, AcpiGbl_SystemAwakeAndRunning);
#endif /* ACPI_APPLICATION */ #endif /* ACPI_APPLICATION */
/*
* Debugger prototypes
*
* All interfaces used by debugger will be configured
* out of the ACPICA build unless the ACPI_DEBUGGER
* flag is defined.
*/
#ifdef ACPI_DEBUGGER
#define ACPI_DBR_DEPENDENT_RETURN_OK(Prototype) \
ACPI_EXTERNAL_RETURN_OK(Prototype)
#define ACPI_DBR_DEPENDENT_RETURN_VOID(Prototype) \
ACPI_EXTERNAL_RETURN_VOID(Prototype)
#else
#define ACPI_DBR_DEPENDENT_RETURN_OK(Prototype) \
static ACPI_INLINE Prototype {return(AE_OK);}
#define ACPI_DBR_DEPENDENT_RETURN_VOID(Prototype) \
static ACPI_INLINE Prototype {return;}
#endif /* ACPI_DEBUGGER */
/***************************************************************************** /*****************************************************************************
* *
* ACPICA public interface prototypes * ACPICA public interface prototypes
@ -1288,4 +1321,8 @@ void
AcpiTerminateDebugger ( AcpiTerminateDebugger (
void); void);
void
AcpiSetDebuggerThreadId (
ACPI_THREAD_ID ThreadId);
#endif /* __ACXFACE_H__ */ #endif /* __ACXFACE_H__ */

View file

@ -187,7 +187,7 @@ AcpiTbSetTableLoadedFlag (
*/ */
void void
AcpiTbParseFadt ( AcpiTbParseFadt (
UINT32 TableIndex); void);
void void
AcpiTbCreateLocalFadt ( AcpiTbCreateLocalFadt (
@ -279,10 +279,6 @@ ACPI_STATUS
AcpiTbInitializeFacs ( AcpiTbInitializeFacs (
void); void);
BOOLEAN
AcpiTbTablesLoaded (
void);
void void
AcpiTbPrintTableHeader( AcpiTbPrintTableHeader(
ACPI_PHYSICAL_ADDRESS Address, ACPI_PHYSICAL_ADDRESS Address,

View file

@ -1304,7 +1304,7 @@ UINT32 (*ACPI_INTERFACE_HANDLER) (
#define ACPI_PCICLS_STRING_SIZE 7 /* Includes null terminator */ #define ACPI_PCICLS_STRING_SIZE 7 /* Includes null terminator */
/* Structures used for device/processor HID, UID, CID, and SUB */ /* Structures used for device/processor HID, UID, CID */
typedef struct acpi_pnp_device_id typedef struct acpi_pnp_device_id
{ {
@ -1339,7 +1339,6 @@ typedef struct acpi_device_info
UINT64 Address; /* _ADR value */ UINT64 Address; /* _ADR value */
ACPI_PNP_DEVICE_ID HardwareId; /* _HID value */ ACPI_PNP_DEVICE_ID HardwareId; /* _HID value */
ACPI_PNP_DEVICE_ID UniqueId; /* _UID value */ ACPI_PNP_DEVICE_ID UniqueId; /* _UID value */
ACPI_PNP_DEVICE_ID SubsystemId; /* _SUB value */
ACPI_PNP_DEVICE_ID ClassCode; /* _CLS value */ ACPI_PNP_DEVICE_ID ClassCode; /* _CLS value */
ACPI_PNP_DEVICE_ID_LIST CompatibleIdList; /* _CID list <must be last> */ ACPI_PNP_DEVICE_ID_LIST CompatibleIdList; /* _CID list <must be last> */
@ -1355,13 +1354,12 @@ typedef struct acpi_device_info
#define ACPI_VALID_ADR 0x0002 #define ACPI_VALID_ADR 0x0002
#define ACPI_VALID_HID 0x0004 #define ACPI_VALID_HID 0x0004
#define ACPI_VALID_UID 0x0008 #define ACPI_VALID_UID 0x0008
#define ACPI_VALID_SUB 0x0010
#define ACPI_VALID_CID 0x0020 #define ACPI_VALID_CID 0x0020
#define ACPI_VALID_CLS 0x0040 #define ACPI_VALID_CLS 0x0040
#define ACPI_VALID_SXDS 0x0100 #define ACPI_VALID_SXDS 0x0100
#define ACPI_VALID_SXWS 0x0200 #define ACPI_VALID_SXWS 0x0200
/* Flags for _STA return value (CurrentStatus above) */ /* Flags for _STA method */
#define ACPI_STA_DEVICE_PRESENT 0x01 #define ACPI_STA_DEVICE_PRESENT 0x01
#define ACPI_STA_DEVICE_ENABLED 0x02 #define ACPI_STA_DEVICE_ENABLED 0x02

View file

@ -278,7 +278,7 @@ AcpiUtInitGlobals (
#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER) #if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
char * const char *
AcpiUtGetMutexName ( AcpiUtGetMutexName (
UINT32 MutexId); UINT32 MutexId);
@ -288,15 +288,15 @@ AcpiUtGetNotifyName (
ACPI_OBJECT_TYPE Type); ACPI_OBJECT_TYPE Type);
#endif #endif
char * const char *
AcpiUtGetTypeName ( AcpiUtGetTypeName (
ACPI_OBJECT_TYPE Type); ACPI_OBJECT_TYPE Type);
char * const char *
AcpiUtGetNodeName ( AcpiUtGetNodeName (
void *Object); void *Object);
char * const char *
AcpiUtGetDescriptorName ( AcpiUtGetDescriptorName (
void *Object); void *Object);
@ -304,15 +304,15 @@ const char *
AcpiUtGetReferenceName ( AcpiUtGetReferenceName (
ACPI_OPERAND_OBJECT *Object); ACPI_OPERAND_OBJECT *Object);
char * const char *
AcpiUtGetObjectTypeName ( AcpiUtGetObjectTypeName (
ACPI_OPERAND_OBJECT *ObjDesc); ACPI_OPERAND_OBJECT *ObjDesc);
char * const char *
AcpiUtGetRegionName ( AcpiUtGetRegionName (
UINT8 SpaceId); UINT8 SpaceId);
char * const char *
AcpiUtGetEventName ( AcpiUtGetEventName (
UINT32 EventId); UINT32 EventId);
@ -555,17 +555,6 @@ AcpiUtExecutePowerMethods (
UINT8 *OutValues); UINT8 *OutValues);
/*
* utfileio - file operations
*/
#ifdef ACPI_APPLICATION
ACPI_STATUS
AcpiUtReadTableFromFile (
char *Filename,
ACPI_TABLE_HEADER **Table);
#endif
/* /*
* utids - device ID support * utids - device ID support
*/ */
@ -579,11 +568,6 @@ AcpiUtExecute_UID (
ACPI_NAMESPACE_NODE *DeviceNode, ACPI_NAMESPACE_NODE *DeviceNode,
ACPI_PNP_DEVICE_ID **ReturnId); ACPI_PNP_DEVICE_ID **ReturnId);
ACPI_STATUS
AcpiUtExecute_SUB (
ACPI_NAMESPACE_NODE *DeviceNode,
ACPI_PNP_DEVICE_ID **ReturnId);
ACPI_STATUS ACPI_STATUS
AcpiUtExecute_CID ( AcpiUtExecute_CID (
ACPI_NAMESPACE_NODE *DeviceNode, ACPI_NAMESPACE_NODE *DeviceNode,

View file

@ -192,7 +192,7 @@
#define AML_CREATE_WORD_FIELD_OP (UINT16) 0x8b #define AML_CREATE_WORD_FIELD_OP (UINT16) 0x8b
#define AML_CREATE_BYTE_FIELD_OP (UINT16) 0x8c #define AML_CREATE_BYTE_FIELD_OP (UINT16) 0x8c
#define AML_CREATE_BIT_FIELD_OP (UINT16) 0x8d #define AML_CREATE_BIT_FIELD_OP (UINT16) 0x8d
#define AML_TYPE_OP (UINT16) 0x8e #define AML_OBJECT_TYPE_OP (UINT16) 0x8e
#define AML_CREATE_QWORD_FIELD_OP (UINT16) 0x8f /* ACPI 2.0 */ #define AML_CREATE_QWORD_FIELD_OP (UINT16) 0x8f /* ACPI 2.0 */
#define AML_LAND_OP (UINT16) 0x90 #define AML_LAND_OP (UINT16) 0x90
#define AML_LOR_OP (UINT16) 0x91 #define AML_LOR_OP (UINT16) 0x91
@ -313,7 +313,8 @@
#define ARGP_TERMLIST 0x0F #define ARGP_TERMLIST 0x0F
#define ARGP_WORDDATA 0x10 #define ARGP_WORDDATA 0x10
#define ARGP_QWORDDATA 0x11 #define ARGP_QWORDDATA 0x11
#define ARGP_SIMPLENAME 0x12 #define ARGP_SIMPLENAME 0x12 /* NameString | LocalTerm | ArgTerm */
#define ARGP_NAME_OR_REF 0x13 /* For ObjectType only */
/* /*
* Resolved argument types for the AML Interpreter * Resolved argument types for the AML Interpreter

View file

@ -136,12 +136,16 @@
#define ACPI_USE_SYSTEM_INTTYPES #define ACPI_USE_SYSTEM_INTTYPES
/* Compile for reduced hardware mode only with this kernel config */ /* Kernel specific ACPICA configuration */
#ifdef CONFIG_ACPI_REDUCED_HARDWARE_ONLY #ifdef CONFIG_ACPI_REDUCED_HARDWARE_ONLY
#define ACPI_REDUCED_HARDWARE 1 #define ACPI_REDUCED_HARDWARE 1
#endif #endif
#ifdef CONFIG_ACPI_DEBUGGER
#define ACPI_DEBUGGER
#endif
#include <linux/string.h> #include <linux/string.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/ctype.h> #include <linux/ctype.h>
@ -224,7 +228,6 @@
* OSL interfaces used by utilities * OSL interfaces used by utilities
*/ */
#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsRedirectOutput #define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsRedirectOutput
#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetLine
#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetTableByName #define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetTableByName
#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetTableByIndex #define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetTableByIndex
#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetTableByAddress #define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetTableByAddress

View file

@ -208,6 +208,15 @@ AcpiOsGetThreadId (
Lock ? AE_OK : AE_NO_MEMORY; \ Lock ? AE_OK : AE_NO_MEMORY; \
}) })
static inline BOOLEAN
AcpiOsReadable (
void *Pointer,
ACPI_SIZE Length)
{
return TRUE;
}
/* /*
* OSL interfaces added by Linux * OSL interfaces added by Linux
*/ */

View file

@ -349,7 +349,8 @@ AcpiNsInstallNode (
* modified the namespace. This is used for cleanup when the * modified the namespace. This is used for cleanup when the
* method exits. * method exits.
*/ */
WalkState->MethodDesc->Method.InfoFlags |= ACPI_METHOD_MODIFIED_NAMESPACE; WalkState->MethodDesc->Method.InfoFlags |=
ACPI_METHOD_MODIFIED_NAMESPACE;
} }
} }

View file

@ -209,7 +209,8 @@ AcpiNsCheckAcpiCompliance (
/* Get the ACPI-required arg count from the predefined info table */ /* Get the ACPI-required arg count from the predefined info table */
RequiredParamCount = METHOD_GET_ARG_COUNT (Predefined->Info.ArgumentList); RequiredParamCount =
METHOD_GET_ARG_COUNT (Predefined->Info.ArgumentList);
/* /*
* If this object is not a control method, we can check if the ACPI * If this object is not a control method, we can check if the ACPI
@ -355,7 +356,8 @@ AcpiNsCheckArgumentCount (
* Some methods are allowed to have a "minimum" number of args (_SCP) * Some methods are allowed to have a "minimum" number of args (_SCP)
* because their definition in ACPI has changed over time. * because their definition in ACPI has changed over time.
*/ */
RequiredParamCount = METHOD_GET_ARG_COUNT (Predefined->Info.ArgumentList); RequiredParamCount =
METHOD_GET_ARG_COUNT (Predefined->Info.ArgumentList);
if (UserParamCount < RequiredParamCount) if (UserParamCount < RequiredParamCount)
{ {

View file

@ -176,7 +176,8 @@ AcpiNsConvertToInteger (
for (i = 0; i < OriginalObject->Buffer.Length; i++) for (i = 0; i < OriginalObject->Buffer.Length; i++)
{ {
Value |= ((UINT64) OriginalObject->Buffer.Pointer[i] << (i * 8)); Value |= ((UINT64)
OriginalObject->Buffer.Pointer[i] << (i * 8));
} }
break; break;
@ -239,8 +240,8 @@ AcpiNsConvertToString (
} }
else else
{ {
Status = AcpiExConvertToString (OriginalObject, &NewObject, Status = AcpiExConvertToString (OriginalObject,
ACPI_IMPLICIT_CONVERT_HEX); &NewObject, ACPI_IMPLICIT_CONVERT_HEX);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
return (Status); return (Status);
@ -335,7 +336,8 @@ AcpiNsConvertToBuffer (
/* String-to-Buffer conversion. Simple data copy */ /* String-to-Buffer conversion. Simple data copy */
NewObject = AcpiUtCreateBufferObject (OriginalObject->String.Length); NewObject = AcpiUtCreateBufferObject
(OriginalObject->String.Length);
if (!NewObject) if (!NewObject)
{ {
return (AE_NO_MEMORY); return (AE_NO_MEMORY);
@ -402,7 +404,8 @@ AcpiNsConvertToBuffer (
* *
* FUNCTION: AcpiNsConvertToUnicode * FUNCTION: AcpiNsConvertToUnicode
* *
* PARAMETERS: OriginalObject - ASCII String Object to be converted * PARAMETERS: Scope - Namespace node for the method/object
* OriginalObject - ASCII String Object to be converted
* ReturnObject - Where the new converted object is returned * ReturnObject - Where the new converted object is returned
* *
* RETURN: Status. AE_OK if conversion was successful. * RETURN: Status. AE_OK if conversion was successful.
@ -413,6 +416,7 @@ AcpiNsConvertToBuffer (
ACPI_STATUS ACPI_STATUS
AcpiNsConvertToUnicode ( AcpiNsConvertToUnicode (
ACPI_NAMESPACE_NODE *Scope,
ACPI_OPERAND_OBJECT *OriginalObject, ACPI_OPERAND_OBJECT *OriginalObject,
ACPI_OPERAND_OBJECT **ReturnObject) ACPI_OPERAND_OBJECT **ReturnObject)
{ {
@ -474,7 +478,8 @@ AcpiNsConvertToUnicode (
* *
* FUNCTION: AcpiNsConvertToResource * FUNCTION: AcpiNsConvertToResource
* *
* PARAMETERS: OriginalObject - Object to be converted * PARAMETERS: Scope - Namespace node for the method/object
* OriginalObject - Object to be converted
* ReturnObject - Where the new converted object is returned * ReturnObject - Where the new converted object is returned
* *
* RETURN: Status. AE_OK if conversion was successful * RETURN: Status. AE_OK if conversion was successful
@ -486,6 +491,7 @@ AcpiNsConvertToUnicode (
ACPI_STATUS ACPI_STATUS
AcpiNsConvertToResource ( AcpiNsConvertToResource (
ACPI_NAMESPACE_NODE *Scope,
ACPI_OPERAND_OBJECT *OriginalObject, ACPI_OPERAND_OBJECT *OriginalObject,
ACPI_OPERAND_OBJECT **ReturnObject) ACPI_OPERAND_OBJECT **ReturnObject)
{ {
@ -552,3 +558,81 @@ AcpiNsConvertToResource (
*ReturnObject = NewObject; *ReturnObject = NewObject;
return (AE_OK); return (AE_OK);
} }
/*******************************************************************************
*
* FUNCTION: AcpiNsConvertToReference
*
* PARAMETERS: Scope - Namespace node for the method/object
* OriginalObject - Object to be converted
* ReturnObject - Where the new converted object is returned
*
* RETURN: Status. AE_OK if conversion was successful
*
* DESCRIPTION: Attempt to convert a Integer object to a ObjectReference.
* Buffer.
*
******************************************************************************/
ACPI_STATUS
AcpiNsConvertToReference (
ACPI_NAMESPACE_NODE *Scope,
ACPI_OPERAND_OBJECT *OriginalObject,
ACPI_OPERAND_OBJECT **ReturnObject)
{
ACPI_OPERAND_OBJECT *NewObject = NULL;
ACPI_STATUS Status;
ACPI_NAMESPACE_NODE *Node;
ACPI_GENERIC_STATE ScopeInfo;
char *Name;
ACPI_FUNCTION_NAME (NsConvertToReference);
/* Convert path into internal presentation */
Status = AcpiNsInternalizeName (OriginalObject->String.Pointer, &Name);
if (ACPI_FAILURE (Status))
{
return_ACPI_STATUS (Status);
}
/* Find the namespace node */
ScopeInfo.Scope.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Scope);
Status = AcpiNsLookup (&ScopeInfo, Name,
ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, NULL, &Node);
if (ACPI_FAILURE (Status))
{
/* Check if we are resolving a named reference within a package */
ACPI_ERROR_NAMESPACE (OriginalObject->String.Pointer, Status);
goto ErrorExit;
}
/* Create and init a new internal ACPI object */
NewObject = AcpiUtCreateInternalObject (ACPI_TYPE_LOCAL_REFERENCE);
if (!NewObject)
{
Status = AE_NO_MEMORY;
goto ErrorExit;
}
NewObject->Reference.Node = Node;
NewObject->Reference.Object = Node->Object;
NewObject->Reference.Class = ACPI_REFCLASS_NAME;
/*
* Increase reference of the object if needed (the object is likely a
* null for device nodes).
*/
AcpiUtAddReference (Node->Object);
ErrorExit:
ACPI_FREE (Name);
*ReturnObject = NewObject;
return (AE_OK);
}

View file

@ -331,7 +331,8 @@ AcpiNsDumpOneObject (
if (Type > ACPI_TYPE_LOCAL_MAX) if (Type > ACPI_TYPE_LOCAL_MAX)
{ {
ACPI_WARNING ((AE_INFO, "Invalid ACPI Object Type 0x%08X", Type)); ACPI_WARNING ((AE_INFO,
"Invalid ACPI Object Type 0x%08X", Type));
} }
AcpiOsPrintf ("%4.4s", AcpiUtGetNodeName (ThisNode)); AcpiOsPrintf ("%4.4s", AcpiUtGetNodeName (ThisNode));
@ -637,14 +638,18 @@ AcpiNsDumpOneObject (
if (ObjType > ACPI_TYPE_LOCAL_MAX) if (ObjType > ACPI_TYPE_LOCAL_MAX)
{ {
AcpiOsPrintf ("(Pointer to ACPI Object type %.2X [UNKNOWN])\n", AcpiOsPrintf (
"(Pointer to ACPI Object type %.2X [UNKNOWN])\n",
ObjType); ObjType);
BytesToDump = 32; BytesToDump = 32;
} }
else else
{ {
AcpiOsPrintf ("(Pointer to ACPI Object type %.2X [%s])\n", AcpiOsPrintf (
"(Pointer to ACPI Object type %.2X [%s])\n",
ObjType, AcpiUtGetTypeName (ObjType)); ObjType, AcpiUtGetTypeName (ObjType));
BytesToDump = sizeof (ACPI_OPERAND_OBJECT); BytesToDump = sizeof (ACPI_OPERAND_OBJECT);
} }
@ -674,7 +679,8 @@ AcpiNsDumpOneObject (
*/ */
BytesToDump = ObjDesc->String.Length; BytesToDump = ObjDesc->String.Length;
ObjDesc = (void *) ObjDesc->String.Pointer; ObjDesc = (void *) ObjDesc->String.Pointer;
AcpiOsPrintf ( "(Buffer/String pointer %p length %X)\n",
AcpiOsPrintf ("(Buffer/String pointer %p length %X)\n",
ObjDesc, BytesToDump); ObjDesc, BytesToDump);
ACPI_DUMP_BUFFER (ObjDesc, BytesToDump); ACPI_DUMP_BUFFER (ObjDesc, BytesToDump);
goto Cleanup; goto Cleanup;
@ -826,7 +832,7 @@ AcpiNsDumpOneObjectPath (
return (AE_OK); return (AE_OK);
} }
Pathname = AcpiNsGetExternalPathname (Node); Pathname = AcpiNsGetNormalizedPathname (Node, TRUE);
PathIndent = 1; PathIndent = 1;
if (Level <= MaxLevel) if (Level <= MaxLevel)
@ -990,7 +996,8 @@ AcpiNsDumpTables (
* If the name space has not been initialized, * If the name space has not been initialized,
* there is nothing to dump. * there is nothing to dump.
*/ */
ACPI_DEBUG_PRINT ((ACPI_DB_TABLES, "namespace not initialized!\n")); ACPI_DEBUG_PRINT ((ACPI_DB_TABLES,
"namespace not initialized!\n"));
return_VOID; return_VOID;
} }

View file

@ -217,7 +217,7 @@ AcpiNsEvaluate (
/* Get the full pathname to the object, for use in warning messages */ /* Get the full pathname to the object, for use in warning messages */
Info->FullPathname = AcpiNsGetExternalPathname (Info->Node); Info->FullPathname = AcpiNsGetNormalizedPathname (Info->Node, TRUE);
if (!Info->FullPathname) if (!Info->FullPathname)
{ {
return_ACPI_STATUS (AE_NO_MEMORY); return_ACPI_STATUS (AE_NO_MEMORY);
@ -491,7 +491,7 @@ AcpiNsExecModuleCodeList (
* *
* DESCRIPTION: Execute a control method containing a block of module-level * DESCRIPTION: Execute a control method containing a block of module-level
* executable AML code. The control method is temporarily * executable AML code. The control method is temporarily
* installed to the root node, then evaluated. * installed to a local copy of the root node, then evaluated.
* *
******************************************************************************/ ******************************************************************************/
@ -500,10 +500,9 @@ AcpiNsExecModuleCode (
ACPI_OPERAND_OBJECT *MethodObj, ACPI_OPERAND_OBJECT *MethodObj,
ACPI_EVALUATE_INFO *Info) ACPI_EVALUATE_INFO *Info)
{ {
ACPI_OPERAND_OBJECT *ParentObj;
ACPI_NAMESPACE_NODE *ParentNode;
ACPI_OBJECT_TYPE Type;
ACPI_STATUS Status; ACPI_STATUS Status;
ACPI_NAMESPACE_NODE *TempNode;
ACPI_NAMESPACE_NODE *ParentNode;
ACPI_FUNCTION_TRACE (NsExecModuleCode); ACPI_FUNCTION_TRACE (NsExecModuleCode);
@ -515,21 +514,18 @@ AcpiNsExecModuleCode (
*/ */
ParentNode = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ParentNode = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE,
MethodObj->Method.NextObject); MethodObj->Method.NextObject);
Type = AcpiNsGetType (ParentNode);
/* /* Take a copy of the parent node to act as parent of this method */
* Get the region handler and save it in the method object. We may need
* this if an operation region declaration causes a _REG method to be run. TempNode = ACPI_ALLOCATE (sizeof (ACPI_NAMESPACE_NODE));
* if (!TempNode)
* We can't do this in AcpiPsLinkModuleCode because
* AcpiGbl_RootNode->Object is NULL at PASS1.
*/
if ((Type == ACPI_TYPE_DEVICE) && ParentNode->Object)
{ {
MethodObj->Method.Dispatch.Handler = return_VOID;
ParentNode->Object->Device.Handler;
} }
memcpy (TempNode, ParentNode, sizeof (ACPI_NAMESPACE_NODE));
TempNode->Object = NULL; /* Clear the subobject */
/* Must clear NextObject (AcpiNsAttachObject needs the field) */ /* Must clear NextObject (AcpiNsAttachObject needs the field) */
MethodObj->Method.NextObject = NULL; MethodObj->Method.NextObject = NULL;
@ -537,26 +533,14 @@ AcpiNsExecModuleCode (
/* Initialize the evaluation information block */ /* Initialize the evaluation information block */
memset (Info, 0, sizeof (ACPI_EVALUATE_INFO)); memset (Info, 0, sizeof (ACPI_EVALUATE_INFO));
Info->PrefixNode = ParentNode; Info->PrefixNode = TempNode;
/*
* Get the currently attached parent object. Add a reference, because the
* ref count will be decreased when the method object is installed to
* the parent node.
*/
ParentObj = AcpiNsGetAttachedObject (ParentNode);
if (ParentObj)
{
AcpiUtAddReference (ParentObj);
}
/* Install the method (module-level code) in the parent node */ /* Install the method (module-level code) in the parent node */
Status = AcpiNsAttachObject (ParentNode, MethodObj, Status = AcpiNsAttachObject (TempNode, MethodObj, ACPI_TYPE_METHOD);
ACPI_TYPE_METHOD);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
goto Exit; goto Cleanup;
} }
/* Execute the parent node as a control method */ /* Execute the parent node as a control method */
@ -574,25 +558,7 @@ AcpiNsExecModuleCode (
AcpiUtRemoveReference (Info->ReturnObject); AcpiUtRemoveReference (Info->ReturnObject);
} }
/* Detach the temporary method object */ Cleanup:
ACPI_FREE (TempNode);
AcpiNsDetachObject (ParentNode);
/* Restore the original parent object */
if (ParentObj)
{
Status = AcpiNsAttachObject (ParentNode, ParentObj, Type);
}
else
{
ParentNode->Type = (UINT8) Type;
}
Exit:
if (ParentObj)
{
AcpiUtRemoveReference (ParentObj);
}
return_VOID; return_VOID;
} }

View file

@ -703,7 +703,7 @@ AcpiNsInitOneDevice (
{ {
/* Ignore error and move on to next device */ /* Ignore error and move on to next device */
char *ScopeName = AcpiNsGetExternalPathname (Info->Node); char *ScopeName = AcpiNsGetNormalizedPathname (DeviceNode, TRUE);
ACPI_EXCEPTION ((AE_INFO, Status, "during %s._INI execution", ACPI_EXCEPTION ((AE_INFO, Status, "during %s._INI execution",
ScopeName)); ScopeName));

View file

@ -239,6 +239,24 @@ Unlock:
ACPI_DEBUG_PRINT ((ACPI_DB_INFO, ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
"**** Completed Table Object Initialization\n")); "**** Completed Table Object Initialization\n"));
/*
* Execute any module-level code that was detected during the table load
* phase. Although illegal since ACPI 2.0, there are many machines that
* contain this type of code. Each block of detected executable AML code
* outside of any control method is wrapped with a temporary control
* method object and placed on a global list. The methods on this list
* are executed below.
*
* This case executes the module-level code for each table immediately
* after the table has been loaded. This provides compatibility with
* other ACPI implementations. Optionally, the execution can be deferred
* until later, see AcpiInitializeObjects.
*/
if (!AcpiGbl_GroupModuleLevelCode)
{
AcpiNsExecModuleCodeList ();
}
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);
} }
@ -432,7 +450,6 @@ AcpiNsUnloadNamespace (
/* This function does the real work */ /* This function does the real work */
Status = AcpiNsDeleteSubtree (Handle); Status = AcpiNsDeleteSubtree (Handle);
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);
} }
#endif #endif

View file

@ -149,7 +149,6 @@ AcpiNsGetExternalPathname (
NameBuffer = AcpiNsGetNormalizedPathname (Node, FALSE); NameBuffer = AcpiNsGetNormalizedPathname (Node, FALSE);
return_PTR (NameBuffer); return_PTR (NameBuffer);
} }
@ -177,7 +176,6 @@ AcpiNsGetPathnameLength (
Size = AcpiNsBuildNormalizedPath (Node, NULL, 0, FALSE); Size = AcpiNsBuildNormalizedPath (Node, NULL, 0, FALSE);
return (Size); return (Size);
} }
@ -318,6 +316,7 @@ AcpiNsBuildNormalizedPath (
{ {
ACPI_PATH_PUT8(FullPath, PathSize, AML_DUAL_NAME_PREFIX, Length); ACPI_PATH_PUT8(FullPath, PathSize, AML_DUAL_NAME_PREFIX, Length);
} }
ACPI_MOVE_32_TO_32 (Name, &NextNode->Name); ACPI_MOVE_32_TO_32 (Name, &NextNode->Name);
DoNoTrailing = NoTrailing; DoNoTrailing = NoTrailing;
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
@ -332,8 +331,10 @@ AcpiNsBuildNormalizedPath (
ACPI_PATH_PUT8(FullPath, PathSize, c, Length); ACPI_PATH_PUT8(FullPath, PathSize, c, Length);
} }
} }
NextNode = NextNode->Parent; NextNode = NextNode->Parent;
} }
ACPI_PATH_PUT8(FullPath, PathSize, AML_ROOT_PREFIX, Length); ACPI_PATH_PUT8(FullPath, PathSize, AML_ROOT_PREFIX, Length);
/* Reverse the path string */ /* Reverse the path string */
@ -341,7 +342,8 @@ AcpiNsBuildNormalizedPath (
if (Length <= PathSize) if (Length <= PathSize)
{ {
Left = FullPath; Left = FullPath;
Right = FullPath+Length-1; Right = FullPath+Length - 1;
while (Left < Right) while (Left < Right)
{ {
c = *Left; c = *Left;
@ -353,7 +355,7 @@ AcpiNsBuildNormalizedPath (
/* Append the trailing null */ /* Append the trailing null */
BuildTrailingNull: BuildTrailingNull:
ACPI_PATH_PUT8(FullPath, PathSize, '\0', Length); ACPI_PATH_PUT8 (FullPath, PathSize, '\0', Length);
#undef ACPI_PATH_PUT8 #undef ACPI_PATH_PUT8
@ -403,7 +405,8 @@ AcpiNsGetNormalizedPathname (
NameBuffer = ACPI_ALLOCATE_ZEROED (Size); NameBuffer = ACPI_ALLOCATE_ZEROED (Size);
if (!NameBuffer) if (!NameBuffer)
{ {
ACPI_ERROR ((AE_INFO, "Could not allocate %u bytes", (UINT32) Size)); ACPI_ERROR ((AE_INFO,
"Could not allocate %u bytes", (UINT32) Size));
return_PTR (NULL); return_PTR (NULL);
} }

View file

@ -215,7 +215,8 @@ AcpiNsOneCompleteParse (
if (StartNode && StartNode != AcpiGbl_RootNode) if (StartNode && StartNode != AcpiGbl_RootNode)
{ {
Status = AcpiDsScopeStackPush (StartNode, ACPI_TYPE_METHOD, WalkState); Status = AcpiDsScopeStackPush (
StartNode, ACPI_TYPE_METHOD, WalkState);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
AcpiDsDeleteWalkState (WalkState); AcpiDsDeleteWalkState (WalkState);
@ -225,7 +226,8 @@ AcpiNsOneCompleteParse (
/* Parse the AML */ /* Parse the AML */
ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "*PARSE* pass %u parse\n", PassNumber)); ACPI_DEBUG_PRINT ((ACPI_DB_PARSE,
"*PARSE* pass %u parse\n", PassNumber));
Status = AcpiPsParseAml (WalkState); Status = AcpiPsParseAml (WalkState);
Cleanup: Cleanup:
@ -269,6 +271,7 @@ AcpiNsParseTable (
* performs another complete parse of the AML. * performs another complete parse of the AML.
*/ */
ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "**** Start pass 1\n")); ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "**** Start pass 1\n"));
Status = AcpiNsOneCompleteParse (ACPI_IMODE_LOAD_PASS1, Status = AcpiNsOneCompleteParse (ACPI_IMODE_LOAD_PASS1,
TableIndex, StartNode); TableIndex, StartNode);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))

View file

@ -312,8 +312,8 @@ AcpiNsCheckPackage (
/* First element is the (Integer) revision */ /* First element is the (Integer) revision */
Status = AcpiNsCheckObjectType (Info, Elements, Status = AcpiNsCheckObjectType (
ACPI_RTYPE_INTEGER, 0); Info, Elements, ACPI_RTYPE_INTEGER, 0);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
return (Status); return (Status);
@ -331,8 +331,8 @@ AcpiNsCheckPackage (
/* First element is the (Integer) count of subpackages to follow */ /* First element is the (Integer) count of subpackages to follow */
Status = AcpiNsCheckObjectType (Info, Elements, Status = AcpiNsCheckObjectType (
ACPI_RTYPE_INTEGER, 0); Info, Elements, ACPI_RTYPE_INTEGER, 0);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
return (Status); return (Status);
@ -375,7 +375,8 @@ AcpiNsCheckPackage (
{ {
/* Create the new outer package and populate it */ /* Create the new outer package and populate it */
Status = AcpiNsWrapWithPackage (Info, ReturnObject, ReturnObjectPtr); Status = AcpiNsWrapWithPackage (
Info, ReturnObject, ReturnObjectPtr);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
return (Status); return (Status);

View file

@ -186,6 +186,11 @@ static const ACPI_SIMPLE_REPAIR_INFO AcpiObjectRepairInfo[] =
ACPI_NOT_PACKAGE_ELEMENT, ACPI_NOT_PACKAGE_ELEMENT,
AcpiNsConvertToResource }, AcpiNsConvertToResource },
/* Object reference conversions */
{ "_DEP", ACPI_RTYPE_STRING, ACPI_ALL_PACKAGE_ELEMENTS,
AcpiNsConvertToReference },
/* Unicode conversions */ /* Unicode conversions */
{ "_MLS", ACPI_RTYPE_STRING, 1, { "_MLS", ACPI_RTYPE_STRING, 1,
@ -246,7 +251,8 @@ AcpiNsSimpleRepair (
ACPI_WARN_ALWAYS, "Missing expected return value")); ACPI_WARN_ALWAYS, "Missing expected return value"));
} }
Status = Predefined->ObjectConverter (ReturnObject, &NewObject); Status = Predefined->ObjectConverter (Info->Node, ReturnObject,
&NewObject);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
/* A fatal error occurred during a conversion */ /* A fatal error occurred during a conversion */
@ -445,13 +451,15 @@ AcpiNsMatchSimpleRepair (
/* Check if we can actually repair this name/type combination */ /* Check if we can actually repair this name/type combination */
if ((ReturnBtype & ThisName->UnexpectedBtypes) && if ((ReturnBtype & ThisName->UnexpectedBtypes) &&
(PackageIndex == ThisName->PackageIndex)) (ThisName->PackageIndex == ACPI_ALL_PACKAGE_ELEMENTS ||
PackageIndex == ThisName->PackageIndex))
{ {
return (ThisName); return (ThisName);
} }
return (NULL); return (NULL);
} }
ThisName++; ThisName++;
} }
@ -536,11 +544,13 @@ AcpiNsRepairNullElement (
/* Set the reference count according to the parent Package object */ /* Set the reference count according to the parent Package object */
NewObject->Common.ReferenceCount = Info->ParentPackage->Common.ReferenceCount; NewObject->Common.ReferenceCount =
Info->ParentPackage->Common.ReferenceCount;
ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR, ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR,
"%s: Converted NULL package element to expected %s at index %u\n", "%s: Converted NULL package element to expected %s at index %u\n",
Info->FullPathname, AcpiUtGetObjectTypeName (NewObject), PackageIndex)); Info->FullPathname, AcpiUtGetObjectTypeName (NewObject),
PackageIndex));
*ReturnObjectPtr = NewObject; *ReturnObjectPtr = NewObject;
Info->ReturnFlags |= ACPI_OBJECT_REPAIRED; Info->ReturnFlags |= ACPI_OBJECT_REPAIRED;
@ -623,6 +633,7 @@ AcpiNsRemoveNullElements (
*Dest = *Source; *Dest = *Source;
Dest++; Dest++;
} }
Source++; Source++;
} }
@ -679,8 +690,8 @@ AcpiNsWrapWithPackage (
/* /*
* Create the new outer package and populate it. The new package will * Create the new outer package and populate it. The new
* have a single element, the lone sub-object. * package will have a single element, the lone sub-object.
*/ */
PkgObjDesc = AcpiUtCreatePackageObject (1); PkgObjDesc = AcpiUtCreatePackageObject (1);
if (!PkgObjDesc) if (!PkgObjDesc)

View file

@ -326,6 +326,7 @@ AcpiNsMatchComplexRepair (
{ {
return (ThisName); return (ThisName);
} }
ThisName++; ThisName++;
} }
@ -411,7 +412,8 @@ AcpiNsRepair_FDE (
if (ReturnObject->Buffer.Length != ACPI_FDE_BYTE_BUFFER_SIZE) if (ReturnObject->Buffer.Length != ACPI_FDE_BYTE_BUFFER_SIZE)
{ {
ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags, ACPI_WARN_PREDEFINED ((AE_INFO,
Info->FullPathname, Info->NodeFlags,
"Incorrect return buffer length %u, expected %u", "Incorrect return buffer length %u, expected %u",
ReturnObject->Buffer.Length, ACPI_FDE_DWORD_BUFFER_SIZE)); ReturnObject->Buffer.Length, ACPI_FDE_DWORD_BUFFER_SIZE));
@ -420,7 +422,8 @@ AcpiNsRepair_FDE (
/* Create the new (larger) buffer object */ /* Create the new (larger) buffer object */
BufferObject = AcpiUtCreateBufferObject (ACPI_FDE_DWORD_BUFFER_SIZE); BufferObject = AcpiUtCreateBufferObject (
ACPI_FDE_DWORD_BUFFER_SIZE);
if (!BufferObject) if (!BufferObject)
{ {
return (AE_NO_MEMORY); return (AE_NO_MEMORY);
@ -429,7 +432,8 @@ AcpiNsRepair_FDE (
/* Expand each byte to a DWORD */ /* Expand each byte to a DWORD */
ByteBuffer = ReturnObject->Buffer.Pointer; ByteBuffer = ReturnObject->Buffer.Pointer;
DwordBuffer = ACPI_CAST_PTR (UINT32, BufferObject->Buffer.Pointer); DwordBuffer = ACPI_CAST_PTR (UINT32,
BufferObject->Buffer.Pointer);
for (i = 0; i < ACPI_FDE_FIELD_COUNT; i++) for (i = 0; i < ACPI_FDE_FIELD_COUNT; i++)
{ {
@ -582,7 +586,8 @@ AcpiNsRepair_CST (
if ((*OuterElements)->Package.Count == 0) if ((*OuterElements)->Package.Count == 0)
{ {
ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags, ACPI_WARN_PREDEFINED ((AE_INFO,
Info->FullPathname, Info->NodeFlags,
"SubPackage[%u] - removing entry due to zero count", i)); "SubPackage[%u] - removing entry due to zero count", i));
Removing = TRUE; Removing = TRUE;
goto RemoveElement; goto RemoveElement;
@ -591,7 +596,8 @@ AcpiNsRepair_CST (
ObjDesc = (*OuterElements)->Package.Elements[1]; /* Index1 = Type */ ObjDesc = (*OuterElements)->Package.Elements[1]; /* Index1 = Type */
if ((UINT32) ObjDesc->Integer.Value == 0) if ((UINT32) ObjDesc->Integer.Value == 0)
{ {
ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags, ACPI_WARN_PREDEFINED ((AE_INFO,
Info->FullPathname, Info->NodeFlags,
"SubPackage[%u] - removing entry due to invalid Type(0)", i)); "SubPackage[%u] - removing entry due to invalid Type(0)", i));
Removing = TRUE; Removing = TRUE;
} }
@ -666,7 +672,8 @@ AcpiNsRepair_HID (
if (ReturnObject->String.Length == 0) if (ReturnObject->String.Length == 0)
{ {
ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags, ACPI_WARN_PREDEFINED ((AE_INFO,
Info->FullPathname, Info->NodeFlags,
"Invalid zero-length _HID or _CID string")); "Invalid zero-length _HID or _CID string"));
/* Return AE_OK anyway, let driver handle it */ /* Return AE_OK anyway, let driver handle it */
@ -828,7 +835,7 @@ AcpiNsRepair_PSS (
* incorrectly sorted, sort it. We sort by CpuFrequency, since this * incorrectly sorted, sort it. We sort by CpuFrequency, since this
* should be proportional to the power. * should be proportional to the power.
*/ */
Status =AcpiNsCheckSortedList (Info, ReturnObject, 0, 6, 0, Status = AcpiNsCheckSortedList (Info, ReturnObject, 0, 6, 0,
ACPI_SORT_DESCENDING, "CpuFrequency"); ACPI_SORT_DESCENDING, "CpuFrequency");
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
@ -850,7 +857,8 @@ AcpiNsRepair_PSS (
if ((UINT32) ObjDesc->Integer.Value > PreviousValue) if ((UINT32) ObjDesc->Integer.Value > PreviousValue)
{ {
ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags, ACPI_WARN_PREDEFINED ((AE_INFO,
Info->FullPathname, Info->NodeFlags,
"SubPackage[%u,%u] - suspicious power dissipation values", "SubPackage[%u,%u] - suspicious power dissipation values",
i-1, i)); i-1, i));
} }
@ -1136,6 +1144,7 @@ AcpiNsRemoveElement (
*Dest = *Source; *Dest = *Source;
Dest++; Dest++;
} }
Source++; Source++;
} }

View file

@ -184,7 +184,7 @@ AcpiNsSearchOneScope (
{ {
char *ScopeName; char *ScopeName;
ScopeName = AcpiNsGetExternalPathname (ParentNode); ScopeName = AcpiNsGetNormalizedPathname (ParentNode, TRUE);
if (ScopeName) if (ScopeName)
{ {
ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,

View file

@ -268,9 +268,10 @@ AcpiNsGetInternalNameLength (
Info->FullyQualified = FALSE; Info->FullyQualified = FALSE;
/* /*
* For the internal name, the required length is 4 bytes per segment, plus * For the internal name, the required length is 4 bytes per segment,
* 1 each for RootPrefix, MultiNamePrefixOp, segment count, trailing null * plus 1 each for RootPrefix, MultiNamePrefixOp, segment count,
* (which is not really needed, but no there's harm in putting it there) * trailing null (which is not really needed, but no there's harm in
* putting it there)
* *
* strlen() + 1 covers the first NameSeg, which has no path separator * strlen() + 1 covers the first NameSeg, which has no path separator
*/ */
@ -684,7 +685,8 @@ AcpiNsExternalizeName (
/* Copy and validate the 4-char name segment */ /* Copy and validate the 4-char name segment */
ACPI_MOVE_NAME (&(*ConvertedName)[j], &InternalName[NamesIndex]); ACPI_MOVE_NAME (&(*ConvertedName)[j],
&InternalName[NamesIndex]);
AcpiUtRepairName (&(*ConvertedName)[j]); AcpiUtRepairName (&(*ConvertedName)[j]);
j += ACPI_NAME_SIZE; j += ACPI_NAME_SIZE;
@ -885,6 +887,7 @@ AcpiNsGetNode (
{ {
*ReturnNode = AcpiGbl_RootNode; *ReturnNode = AcpiGbl_RootNode;
} }
return_ACPI_STATUS (AE_OK); return_ACPI_STATUS (AE_OK);
} }

View file

@ -526,8 +526,8 @@ AcpiEvaluateObject (
{ {
/* We have enough space for the object, build it */ /* We have enough space for the object, build it */
Status = AcpiUtCopyIobjectToEobject (Info->ReturnObject, Status = AcpiUtCopyIobjectToEobject (
ReturnBuffer); Info->ReturnObject, ReturnBuffer);
} }
} }
} }
@ -892,8 +892,8 @@ AcpiNsGetDeviceCallback (
/* We have a valid device, invoke the user function */ /* We have a valid device, invoke the user function */
Status = Info->UserFunction (ObjHandle, NestingLevel, Info->Context, Status = Info->UserFunction (ObjHandle, NestingLevel,
ReturnValue); Info->Context, ReturnValue);
return (Status); return (Status);
} }

View file

@ -249,7 +249,7 @@ AcpiGetName (
{ {
ACPI_STATUS Status; ACPI_STATUS Status;
ACPI_NAMESPACE_NODE *Node; ACPI_NAMESPACE_NODE *Node;
char *NodeName; const char *NodeName;
/* Parameter validation */ /* Parameter validation */
@ -337,7 +337,6 @@ AcpiNsCopyDeviceId (
ACPI_PNP_DEVICE_ID *Source, ACPI_PNP_DEVICE_ID *Source,
char *StringArea) char *StringArea)
{ {
/* Create the destination PNP_DEVICE_ID */ /* Create the destination PNP_DEVICE_ID */
Dest->String = StringArea; Dest->String = StringArea;
@ -363,11 +362,18 @@ AcpiNsCopyDeviceId (
* namespace node and possibly by running several standard * namespace node and possibly by running several standard
* control methods (Such as in the case of a device.) * control methods (Such as in the case of a device.)
* *
* For Device and Processor objects, run the Device _HID, _UID, _CID, _SUB, * For Device and Processor objects, run the Device _HID, _UID, _CID, _STA,
* _CLS, _STA, _ADR, _SxW, and _SxD methods. * _CLS, _ADR, _SxW, and _SxD methods.
* *
* Note: Allocates the return buffer, must be freed by the caller. * Note: Allocates the return buffer, must be freed by the caller.
* *
* Note: This interface is intended to be used during the initial device
* discovery namespace traversal. Therefore, no complex methods can be
* executed, especially those that access operation regions. Therefore, do
* not add any additional methods that could cause problems in this area.
* this was the fate of the _SUB method which was found to cause such
* problems and was removed (11/2015).
*
******************************************************************************/ ******************************************************************************/
ACPI_STATUS ACPI_STATUS
@ -380,7 +386,6 @@ AcpiGetObjectInfo (
ACPI_PNP_DEVICE_ID_LIST *CidList = NULL; ACPI_PNP_DEVICE_ID_LIST *CidList = NULL;
ACPI_PNP_DEVICE_ID *Hid = NULL; ACPI_PNP_DEVICE_ID *Hid = NULL;
ACPI_PNP_DEVICE_ID *Uid = NULL; ACPI_PNP_DEVICE_ID *Uid = NULL;
ACPI_PNP_DEVICE_ID *Sub = NULL;
ACPI_PNP_DEVICE_ID *Cls = NULL; ACPI_PNP_DEVICE_ID *Cls = NULL;
char *NextIdString; char *NextIdString;
ACPI_OBJECT_TYPE Type; ACPI_OBJECT_TYPE Type;
@ -434,7 +439,7 @@ AcpiGetObjectInfo (
{ {
/* /*
* Get extra info for ACPI Device/Processor objects only: * Get extra info for ACPI Device/Processor objects only:
* Run the Device _HID, _UID, _SUB, _CID, and _CLS methods. * Run the Device _HID, _UID, _CLS, and _CID methods.
* *
* Note: none of these methods are required, so they may or may * Note: none of these methods are required, so they may or may
* not be present for this device. The Info->Valid bitfield is used * not be present for this device. The Info->Valid bitfield is used
@ -459,15 +464,6 @@ AcpiGetObjectInfo (
Valid |= ACPI_VALID_UID; Valid |= ACPI_VALID_UID;
} }
/* Execute the Device._SUB method */
Status = AcpiUtExecute_SUB (Node, &Sub);
if (ACPI_SUCCESS (Status))
{
InfoSize += Sub->Length;
Valid |= ACPI_VALID_SUB;
}
/* Execute the Device._CID method */ /* Execute the Device._CID method */
Status = AcpiUtExecute_CID (Node, &CidList); Status = AcpiUtExecute_CID (Node, &CidList);
@ -570,9 +566,8 @@ AcpiGetObjectInfo (
} }
/* /*
* Copy the HID, UID, SUB, and CIDs to the return buffer. * Copy the HID, UID, and CIDs to the return buffer. The variable-length
* The variable-length strings are copied to the reserved area * strings are copied to the reserved area at the end of the buffer.
* at the end of the buffer.
* *
* For HID and CID, check if the ID is a PCI Root Bridge. * For HID and CID, check if the ID is a PCI Root Bridge.
*/ */
@ -593,12 +588,6 @@ AcpiGetObjectInfo (
Uid, NextIdString); Uid, NextIdString);
} }
if (Sub)
{
NextIdString = AcpiNsCopyDeviceId (&Info->SubsystemId,
Sub, NextIdString);
}
if (CidList) if (CidList)
{ {
Info->CompatibleIdList.Count = CidList->Count; Info->CompatibleIdList.Count = CidList->Count;
@ -645,10 +634,6 @@ Cleanup:
{ {
ACPI_FREE (Uid); ACPI_FREE (Uid);
} }
if (Sub)
{
ACPI_FREE (Sub);
}
if (CidList) if (CidList)
{ {
ACPI_FREE (CidList); ACPI_FREE (CidList);
@ -724,6 +709,7 @@ AcpiInstallMethod (
ParserState.Aml += AcpiPsGetOpcodeSize (Opcode); ParserState.Aml += AcpiPsGetOpcodeSize (Opcode);
ParserState.PkgEnd = AcpiPsGetNextPackageEnd (&ParserState); ParserState.PkgEnd = AcpiPsGetNextPackageEnd (&ParserState);
Path = AcpiPsGetNextNamestring (&ParserState); Path = AcpiPsGetNextNamestring (&ParserState);
MethodFlags = *ParserState.Aml++; MethodFlags = *ParserState.Aml++;
AmlStart = ParserState.Aml; AmlStart = ParserState.Aml;
AmlLength = ACPI_PTR_DIFF (ParserState.PkgEnd, AmlStart); AmlLength = ACPI_PTR_DIFF (ParserState.PkgEnd, AmlStart);

View file

@ -153,10 +153,8 @@ AcpiGetType (
return (AE_BAD_PARAMETER); return (AE_BAD_PARAMETER);
} }
/* /* Special case for the predefined Root Node (return type ANY) */
* Special case for the predefined Root Node
* (return type ANY)
*/
if (Handle == ACPI_ROOT_OBJECT) if (Handle == ACPI_ROOT_OBJECT)
{ {
*RetType = ACPI_TYPE_ANY; *RetType = ACPI_TYPE_ANY;
@ -180,7 +178,6 @@ AcpiGetType (
*RetType = Node->Type; *RetType = Node->Type;
Status = AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); Status = AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
return (Status); return (Status);
} }

View file

@ -370,7 +370,7 @@ AcpiPsGetNextNamepath (
PossibleMethodCall && PossibleMethodCall &&
(Node->Type == ACPI_TYPE_METHOD)) (Node->Type == ACPI_TYPE_METHOD))
{ {
if (WalkState->Opcode == AML_UNLOAD_OP) if (GET_CURRENT_ARG_TYPE (WalkState->ArgTypes) == ARGP_SUPERNAME)
{ {
/* /*
* AcpiPsGetNextNamestring has increased the AML pointer, * AcpiPsGetNextNamestring has increased the AML pointer,
@ -816,7 +816,7 @@ AcpiPsGetNextField (
* *
* PARAMETERS: WalkState - Current state * PARAMETERS: WalkState - Current state
* ParserState - Current parser state object * ParserState - Current parser state object
* ArgType - The argument type (AML_*_ARG) * ArgType - The parser argument type (ARGP_*)
* ReturnArg - Where the next arg is returned * ReturnArg - Where the next arg is returned
* *
* RETURN: Status, and an op object containing the next argument. * RETURN: Status, and an op object containing the next argument.
@ -859,6 +859,7 @@ AcpiPsGetNextArg (
{ {
return_ACPI_STATUS (AE_NO_MEMORY); return_ACPI_STATUS (AE_NO_MEMORY);
} }
AcpiPsGetNextSimpleArg (ParserState, ArgType, Arg); AcpiPsGetNextSimpleArg (ParserState, ArgType, Arg);
break; break;
@ -928,6 +929,7 @@ AcpiPsGetNextArg (
case ARGP_TARGET: case ARGP_TARGET:
case ARGP_SUPERNAME: case ARGP_SUPERNAME:
case ARGP_SIMPLENAME: case ARGP_SIMPLENAME:
case ARGP_NAME_OR_REF:
Subop = AcpiPsPeekOpcode (ParserState); Subop = AcpiPsPeekOpcode (ParserState);
if (Subop == 0 || if (Subop == 0 ||
@ -943,15 +945,16 @@ AcpiPsGetNextArg (
return_ACPI_STATUS (AE_NO_MEMORY); return_ACPI_STATUS (AE_NO_MEMORY);
} }
/* To support SuperName arg of Unload */ /* SuperName allows argument to be a method call */
if (WalkState->Opcode == AML_UNLOAD_OP) if (ArgType == ARGP_SUPERNAME)
{ {
Status = AcpiPsGetNextNamepath (WalkState, ParserState, Arg, 1); Status = AcpiPsGetNextNamepath (WalkState, ParserState,
Arg, ACPI_POSSIBLE_METHOD_CALL);
/* /*
* If the SuperName arg of Unload is a method call, * If the SuperName argument is a method call, we have
* we have restored the AML pointer, just free this Arg * already restored the AML pointer, just free this Arg
*/ */
if (Arg->Common.AmlOpcode == AML_INT_METHODCALL_OP) if (Arg->Common.AmlOpcode == AML_INT_METHODCALL_OP)
{ {
@ -961,7 +964,8 @@ AcpiPsGetNextArg (
} }
else else
{ {
Status = AcpiPsGetNextNamepath (WalkState, ParserState, Arg, 0); Status = AcpiPsGetNextNamepath (WalkState, ParserState,
Arg, ACPI_NOT_METHOD_CALL);
} }
} }
else else

View file

@ -192,7 +192,8 @@ AcpiPsGetArguments (
case AML_INT_NAMEPATH_OP: /* AML_NAMESTRING_ARG */ case AML_INT_NAMEPATH_OP: /* AML_NAMESTRING_ARG */
Status = AcpiPsGetNextNamepath (WalkState, &(WalkState->ParserState), Op, 1); Status = AcpiPsGetNextNamepath (WalkState,
&(WalkState->ParserState), Op, ACPI_POSSIBLE_METHOD_CALL);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);
@ -205,7 +206,8 @@ AcpiPsGetArguments (
/* /*
* Op is not a constant or string, append each argument to the Op * Op is not a constant or string, append each argument to the Op
*/ */
while (GET_CURRENT_ARG_TYPE (WalkState->ArgTypes) && !WalkState->ArgCount) while (GET_CURRENT_ARG_TYPE (WalkState->ArgTypes) &&
!WalkState->ArgCount)
{ {
WalkState->Aml = WalkState->ParserState.Aml; WalkState->Aml = WalkState->ParserState.Aml;

View file

@ -223,7 +223,8 @@ AcpiPsGetAmlOpcode (
/* Found opcode info, this is a normal opcode */ /* Found opcode info, this is a normal opcode */
WalkState->ParserState.Aml += AcpiPsGetOpcodeSize (WalkState->Opcode); WalkState->ParserState.Aml +=
AcpiPsGetOpcodeSize (WalkState->Opcode);
WalkState->ArgTypes = WalkState->OpInfo->ParseArgs; WalkState->ArgTypes = WalkState->OpInfo->ParseArgs;
break; break;
} }

View file

@ -317,7 +317,7 @@ const ACPI_OPCODE_INFO AcpiGbl_AmlOpInfo[AML_NUM_OPCODES] =
/* 34 */ ACPI_OP ("CreateWordField", ARGP_CREATE_WORD_FIELD_OP, ARGI_CREATE_WORD_FIELD_OP, ACPI_TYPE_BUFFER_FIELD, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_CREATE), /* 34 */ ACPI_OP ("CreateWordField", ARGP_CREATE_WORD_FIELD_OP, ARGI_CREATE_WORD_FIELD_OP, ACPI_TYPE_BUFFER_FIELD, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_CREATE),
/* 35 */ ACPI_OP ("CreateByteField", ARGP_CREATE_BYTE_FIELD_OP, ARGI_CREATE_BYTE_FIELD_OP, ACPI_TYPE_BUFFER_FIELD, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_CREATE), /* 35 */ ACPI_OP ("CreateByteField", ARGP_CREATE_BYTE_FIELD_OP, ARGI_CREATE_BYTE_FIELD_OP, ACPI_TYPE_BUFFER_FIELD, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_CREATE),
/* 36 */ ACPI_OP ("CreateBitField", ARGP_CREATE_BIT_FIELD_OP, ARGI_CREATE_BIT_FIELD_OP, ACPI_TYPE_BUFFER_FIELD, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_CREATE), /* 36 */ ACPI_OP ("CreateBitField", ARGP_CREATE_BIT_FIELD_OP, ARGI_CREATE_BIT_FIELD_OP, ACPI_TYPE_BUFFER_FIELD, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_CREATE),
/* 37 */ ACPI_OP ("ObjectType", ARGP_TYPE_OP, ARGI_TYPE_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R | AML_NO_OPERAND_RESOLVE), /* 37 */ ACPI_OP ("ObjectType", ARGP_OBJECT_TYPE_OP, ARGI_OBJECT_TYPE_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R | AML_NO_OPERAND_RESOLVE),
/* 38 */ ACPI_OP ("LAnd", ARGP_LAND_OP, ARGI_LAND_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL_NUMERIC | AML_CONSTANT), /* 38 */ ACPI_OP ("LAnd", ARGP_LAND_OP, ARGI_LAND_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL_NUMERIC | AML_CONSTANT),
/* 39 */ ACPI_OP ("LOr", ARGP_LOR_OP, ARGI_LOR_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL_NUMERIC | AML_CONSTANT), /* 39 */ ACPI_OP ("LOr", ARGP_LOR_OP, ARGI_LOR_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL_NUMERIC | AML_CONSTANT),
/* 3A */ ACPI_OP ("LNot", ARGP_LNOT_OP, ARGI_LNOT_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R | AML_CONSTANT), /* 3A */ ACPI_OP ("LNot", ARGP_LNOT_OP, ARGI_LNOT_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R | AML_CONSTANT),

View file

@ -272,8 +272,8 @@ AcpiPsCompleteThisOp (
* These opcodes contain TermArg operands. The current * These opcodes contain TermArg operands. The current
* op must be replaced by a placeholder return op * op must be replaced by a placeholder return op
*/ */
ReplacementOp = AcpiPsAllocOp (AML_INT_RETURN_VALUE_OP, ReplacementOp = AcpiPsAllocOp (
Op->Common.Aml); AML_INT_RETURN_VALUE_OP, Op->Common.Aml);
if (!ReplacementOp) if (!ReplacementOp)
{ {
Status = AE_NO_MEMORY; Status = AE_NO_MEMORY;
@ -292,8 +292,8 @@ AcpiPsCompleteThisOp (
(Op->Common.Parent->Common.AmlOpcode == AML_BANK_FIELD_OP) || (Op->Common.Parent->Common.AmlOpcode == AML_BANK_FIELD_OP) ||
(Op->Common.Parent->Common.AmlOpcode == AML_VAR_PACKAGE_OP)) (Op->Common.Parent->Common.AmlOpcode == AML_VAR_PACKAGE_OP))
{ {
ReplacementOp = AcpiPsAllocOp (AML_INT_RETURN_VALUE_OP, ReplacementOp = AcpiPsAllocOp (
Op->Common.Aml); AML_INT_RETURN_VALUE_OP, Op->Common.Aml);
if (!ReplacementOp) if (!ReplacementOp)
{ {
Status = AE_NO_MEMORY; Status = AE_NO_MEMORY;
@ -323,8 +323,8 @@ AcpiPsCompleteThisOp (
default: default:
ReplacementOp = AcpiPsAllocOp (AML_INT_RETURN_VALUE_OP, ReplacementOp = AcpiPsAllocOp (
Op->Common.Aml); AML_INT_RETURN_VALUE_OP, Op->Common.Aml);
if (!ReplacementOp) if (!ReplacementOp)
{ {
Status = AE_NO_MEMORY; Status = AE_NO_MEMORY;
@ -566,7 +566,8 @@ AcpiPsParseAml (
*/ */
if (WalkState->MethodDesc) if (WalkState->MethodDesc)
{ {
WalkState->Thread->CurrentSyncLevel = WalkState->MethodDesc->Method.SyncLevel; WalkState->Thread->CurrentSyncLevel =
WalkState->MethodDesc->Method.SyncLevel;
} }
AcpiDsPushWalkState (WalkState, Thread); AcpiDsPushWalkState (WalkState, Thread);
@ -612,8 +613,8 @@ AcpiPsParseAml (
} }
/* /*
* If the transfer to the new method method call worked, a new walk * If the transfer to the new method method call worked
* state was created -- get it *, a new walk state was created -- get it
*/ */
WalkState = AcpiDsGetCurrentWalkState (Thread); WalkState = AcpiDsGetCurrentWalkState (Thread);
continue; continue;
@ -632,7 +633,8 @@ AcpiPsParseAml (
/* Check for possible multi-thread reentrancy problem */ /* Check for possible multi-thread reentrancy problem */
if ((Status == AE_ALREADY_EXISTS) && if ((Status == AE_ALREADY_EXISTS) &&
(!(WalkState->MethodDesc->Method.InfoFlags & ACPI_METHOD_SERIALIZED))) (!(WalkState->MethodDesc->Method.InfoFlags &
ACPI_METHOD_SERIALIZED)))
{ {
/* /*
* Method is not serialized and tried to create an object * Method is not serialized and tried to create an object
@ -658,7 +660,8 @@ AcpiPsParseAml (
* encountered an error during the method parse phase, there's lots of * encountered an error during the method parse phase, there's lots of
* cleanup to do * cleanup to do
*/ */
if (((WalkState->ParseFlags & ACPI_PARSE_MODE_MASK) == ACPI_PARSE_EXECUTE) || if (((WalkState->ParseFlags & ACPI_PARSE_MODE_MASK) ==
ACPI_PARSE_EXECUTE) ||
(ACPI_FAILURE (Status))) (ACPI_FAILURE (Status)))
{ {
AcpiDsTerminateControlMethod (WalkState->MethodDesc, WalkState); AcpiDsTerminateControlMethod (WalkState->MethodDesc, WalkState);

Some files were not shown because too many files have changed in this diff Show more