Revert r349863 (ACPICA 20190703).

This commit caused boot failures on some systems.

Requested by:	scottl
This commit is contained in:
jkim 2019-08-01 17:45:43 +00:00
parent 850287a84b
commit 94134d2b4d
27 changed files with 341 additions and 247 deletions

View File

@ -1,52 +1,3 @@
----------------------------------------
03 July 2019. Summary of changes for version 20190703:
1) ACPICA kernel-resident subsystem:
Remove legacy module-level support code. There were still some remnants
of the legacy module-level code executions. Since we no longer support
this option, this is essentially dead code and has been removed from the
ACPICA source.
iASL: ensure that _WAK, _PTS, _TTS, and _Sx are declared only at the root
scope. If these named objects are declared outside the root scope, they
will not be invoked by any host Operating System.
Clear status of GPEs on first direct enable. ACPI GPEs (other than the EC
one) can be enabled in two situations. First, the GPEs with existing _Lxx
and _Exx methods are enabled implicitly by ACPICA during system
initialization. Second, the GPEs without these methods (like GPEs listed
by _PRW objects for wakeup devices) need to be enabled directly by the
code that is going to use them (e.g. ACPI power management or device
drivers).
In the former case, if the status of a given GPE is set to start with,
its handler method (either _Lxx or _Exx) needs to be invoked to take care
of the events (possibly) signaled before the GPE was enabled. In the
latter case, however, the first caller of AcpiEnableGpe() for a given GPE
should not be expected to care about any events that might be signaled
through it earlier. In that case, it is better to clear the status of
the GPE before enabling it, to prevent stale events from triggering
unwanted actions (like spurious system resume, for example).
For this reason, modify AcpiEvAddGpeReference() to take an additional
boolean argument indicating whether or not the GPE status needs to be
cleared when its reference counter changes from zero to one and make
AcpiEnableGpe() pass TRUE to it through that new argument.
2) iASL Compiler/Disassembler and ACPICA tools:
The tool generation process has been migrated to MSVC 2017, and all
project files have been upgraded. The new project files appear in the
directory \acpica\generate\msvc2017. This change effectively deprecates
the older project files in \acpica\generate\msvc9.
iASL: ensure that _WAK, _PTS, _TTS, and _Sx are declared only at the root
scope. If these named objects are declared outside the root scope, they
will not be invoked by any host Operating System
----------------------------------------
09 May 2019. Summary of changes for version 20190509:

View File

@ -298,20 +298,4 @@
#define COMMENT_CAPTURE_ON AslGbl_CommentState.CaptureComments = TRUE;
#define COMMENT_CAPTURE_OFF AslGbl_CommentState.CaptureComments = FALSE;
/*
* Special name segments - these must only be declared at the root scope
*/
#define NAMESEG__PTS "_PTS"
#define NAMESEG__WAK "_WAK"
#define NAMESEG__S0 "_S0_"
#define NAMESEG__S1 "_S1_"
#define NAMESEG__S2 "_S2_"
#define NAMESEG__S3 "_S3_"
#define NAMESEG__S4 "_S4_"
#define NAMESEG__S5 "_S5_"
#define NAMESEG__TTS "_TTS"
#define MAX_SPECIAL_NAMES 9
#endif /* ASLDEFINE.H */

View File

@ -223,28 +223,13 @@ const char *AslGbl_OpFlagNames[ACPI_NUM_OP_FLAGS] =
"OP_NOT_FOUND_DURING_LOAD"
};
const char *AslGbl_SpecialNamedObjects [MAX_SPECIAL_NAMES] =
{
NAMESEG__PTS,
NAMESEG__WAK,
NAMESEG__S0,
NAMESEG__S1,
NAMESEG__S2,
NAMESEG__S3,
NAMESEG__S4,
NAMESEG__S5,
NAMESEG__TTS
};
#else
extern ASL_FILE_DESC AslGbl_FileDescs [ASL_NUM_FILES];
extern UINT32 AslGbl_ExceptionCount[ASL_NUM_REPORT_LEVELS];
extern const char *AslGbl_OpFlagNames[ACPI_NUM_OP_FLAGS];
extern const char *AslGbl_SpecialNamedObjects[MAX_SPECIAL_NAMES];
#endif
/*
* Parser and other externals
*/

View File

@ -164,7 +164,6 @@
static ACPI_STATUS
LdLoadFieldElements (
UINT32 AmlType,
ACPI_PARSE_OBJECT *Op,
ACPI_WALK_STATE *WalkState);
@ -191,10 +190,6 @@ LdCommonNamespaceEnd (
UINT32 Level,
void *Context);
static void
LdCheckSpecialNames (
ACPI_NAMESPACE_NODE *Node,
ACPI_PARSE_OBJECT *Op);
/*******************************************************************************
*
@ -252,8 +247,7 @@ LdLoadNamespace (
*
* FUNCTION: LdLoadFieldElements
*
* PARAMETERS: AmlType - Type to search
* Op - Parent node (Field)
* PARAMETERS: Op - Parent node (Field)
* WalkState - Current walk state
*
* RETURN: Status
@ -265,7 +259,6 @@ LdLoadNamespace (
static ACPI_STATUS
LdLoadFieldElements (
UINT32 AmlType,
ACPI_PARSE_OBJECT *Op,
ACPI_WALK_STATE *WalkState)
{
@ -281,7 +274,7 @@ LdLoadFieldElements (
{
Status = AcpiNsLookup (WalkState->ScopeInfo,
SourceRegion->Asl.Value.String,
AmlType, ACPI_IMODE_EXECUTE,
ACPI_TYPE_REGION, ACPI_IMODE_EXECUTE,
ACPI_NS_DONT_OPEN_SCOPE, NULL, &Node);
if (Status == AE_NOT_FOUND)
{
@ -514,15 +507,11 @@ LdNamespace1Begin (
*/
switch (Op->Asl.AmlOpcode)
{
case AML_INDEX_FIELD_OP:
Status = LdLoadFieldElements (ACPI_TYPE_LOCAL_REGION_FIELD, Op, WalkState);
return (Status);
case AML_BANK_FIELD_OP:
case AML_INDEX_FIELD_OP:
case AML_FIELD_OP:
Status = LdLoadFieldElements (ACPI_TYPE_REGION, Op, WalkState);
Status = LdLoadFieldElements (Op, WalkState);
return (Status);
case AML_INT_CONNECTION_OP:
@ -977,10 +966,6 @@ LdNamespace1Begin (
}
}
/* Check special names like _WAK and _PTS */
LdCheckSpecialNames (Node, Op);
if (ForceNewScope)
{
Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState);
@ -1019,42 +1004,6 @@ LdNamespace1Begin (
}
/*******************************************************************************
*
* FUNCTION: LdCheckSpecialNames
*
* PARAMETERS: Node - Node that represents the named object
* Op - Named object declaring this named object
*
* RETURN: None
*
* DESCRIPTION: Check if certain named objects are declared in the incorrect
* scope. Special named objects are listed in
* AslGbl_SpecialNamedObjects and can only be declared at the root
* scope.
*
******************************************************************************/
static void
LdCheckSpecialNames (
ACPI_NAMESPACE_NODE *Node,
ACPI_PARSE_OBJECT *Op)
{
UINT32 i;
for (i = 0; i < MAX_SPECIAL_NAMES; i++)
{
if (ACPI_COMPARE_NAMESEG(Node->Name.Ascii, AslGbl_SpecialNamedObjects[i]) &&
Node->Parent != AcpiGbl_RootNode)
{
AslError (ASL_ERROR, ASL_MSG_INVALID_SPECIAL_NAME, Op, Op->Asl.ExternalName);
return;
}
}
}
/*******************************************************************************
*
* FUNCTION: LdNamespace2Begin

View File

@ -365,8 +365,7 @@ const char *AslCompilerMsgs [] =
/* ASL_MSG_REGION_LENGTH */ "Operation Region declared with zero length",
/* ASL_MSG_TEMPORARY_OBJECT */ "Object is created temporarily in another method and cannot be accessed",
/* ASL_MSG_UNDEFINED_EXTERNAL */ "Named object was declared external but the actual definition does not exist",
/* ASL_MSG_BUFFER_FIELD_OVERFLOW */ "Buffer field extends beyond end of target buffer",
/* ASL_MSG_INVALID_SPECIAL_NAME */ "declaration of this named object outside root scope is illegal"
/* ASL_MSG_BUFFER_FIELD_OVERFLOW */ "Buffer field extends beyond end of target buffer"
};
/* Table compiler */

View File

@ -368,7 +368,6 @@ typedef enum
ASL_MSG_TEMPORARY_OBJECT,
ASL_MSG_UNDEFINED_EXTERNAL,
ASL_MSG_BUFFER_FIELD_OVERFLOW,
ASL_MSG_INVALID_SPECIAL_NAME,
/* These messages are used by the Data Table compiler only */

View File

@ -166,6 +166,12 @@
* Things like Events, Global Lock, etc. are not used
* by the compiler, so they are stubbed out here.
*/
void
AcpiNsExecModuleCodeList (
void)
{
}
ACPI_STATUS
AcpiNsInitializeObjects (
void)

View File

@ -220,7 +220,7 @@ AslDoLineDirective (
while ((c = input()) != '\n' && c != EOF)
{
*AslGbl_LineBufPtr = (char) c;
*AslGbl_LineBufPtr = c;
AslGbl_LineBufPtr++;
}
*AslGbl_LineBufPtr = 0;
@ -498,7 +498,7 @@ AslInsertLineBuffer (
if (AcpiGbl_CaptureComments)
{
CvProcessCommentState ((char) SourceChar);
CvProcessCommentState (SourceChar);
}
}
}
@ -601,7 +601,7 @@ loop:
AslInsertLineBuffer (c);
if (AcpiGbl_CaptureComments && CurrentState.CaptureComments)
{
*StringBuffer = (char) c;
*StringBuffer = c;
++StringBuffer;
}
c1 = c;
@ -629,7 +629,7 @@ loop:
AslInsertLineBuffer (c);
if (AcpiGbl_CaptureComments && CurrentState.CaptureComments)
{
*StringBuffer = (char) c;
*StringBuffer = c;
++StringBuffer;
}
@ -720,7 +720,7 @@ AslDoCommentType2 (
AslInsertLineBuffer (c);
if (AcpiGbl_CaptureComments && CurrentState.CaptureComments)
{
*StringBuffer = (char) c;
*StringBuffer = c;
++StringBuffer;
}
}
@ -878,7 +878,7 @@ DoCharacter:
if (ACPI_IS_OCTAL_DIGIT (StringChar))
{
State = ASL_OCTAL_CONSTANT;
ConvertBuffer[0] = (char) StringChar;
ConvertBuffer[0] = StringChar;
i = 1;
continue;
}
@ -934,7 +934,7 @@ DoCharacter:
/* Append another digit of the constant */
ConvertBuffer[i] = (char) StringChar;
ConvertBuffer[i] = StringChar;
i++;
continue;
@ -978,7 +978,7 @@ DoCharacter:
/* Append another digit of the constant */
ConvertBuffer[i] = (char) StringChar;
ConvertBuffer[i] = StringChar;
i++;
continue;
@ -989,7 +989,7 @@ DoCharacter:
/* Save the finished character */
*StringBuffer = (char) StringChar;
*StringBuffer = StringChar;
StringBuffer++;
if (StringBuffer >= EndBuffer)
{

View File

@ -362,7 +362,7 @@ AcpiDsInitializeObjects (
if (ACPI_COMPARE_NAMESEG (Table->Signature, ACPI_SIG_DSDT))
{
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT,
"\nACPI table initialization:\n"));
"\nInitializing Namespace objects:\n"));
}
/* Summary of objects initialized */

View File

@ -316,7 +316,6 @@ AcpiEvMaskGpe (
* FUNCTION: AcpiEvAddGpeReference
*
* PARAMETERS: GpeEventInfo - Add a reference to this GPE
* ClearOnEnable - Clear GPE status before enabling it
*
* RETURN: Status
*
@ -327,8 +326,7 @@ AcpiEvMaskGpe (
ACPI_STATUS
AcpiEvAddGpeReference (
ACPI_GPE_EVENT_INFO *GpeEventInfo,
BOOLEAN ClearOnEnable)
ACPI_GPE_EVENT_INFO *GpeEventInfo)
{
ACPI_STATUS Status = AE_OK;
@ -346,11 +344,6 @@ AcpiEvAddGpeReference (
{
/* Enable on first reference */
if (ClearOnEnable)
{
(void) AcpiHwClearGpe (GpeEventInfo);
}
Status = AcpiEvUpdateGpeEnableMask (GpeEventInfo);
if (ACPI_SUCCESS (Status))
{

View File

@ -637,7 +637,7 @@ AcpiEvInitializeGpeBlock (
continue;
}
Status = AcpiEvAddGpeReference (GpeEventInfo, FALSE);
Status = AcpiEvAddGpeReference (GpeEventInfo);
if (ACPI_FAILURE (Status))
{
ACPI_EXCEPTION ((AE_INFO, Status,

View File

@ -1256,7 +1256,7 @@ AcpiRemoveGpeHandler (
ACPI_GPE_DISPATCH_NOTIFY)) &&
Handler->OriginallyEnabled)
{
(void) AcpiEvAddGpeReference (GpeEventInfo, FALSE);
(void) AcpiEvAddGpeReference (GpeEventInfo);
if (ACPI_GPE_IS_POLLING_NEEDED (GpeEventInfo))
{
/* Poll edge triggered GPEs to handle existing events */

View File

@ -267,7 +267,7 @@ AcpiEnableGpe (
if (ACPI_GPE_DISPATCH_TYPE (GpeEventInfo->Flags) !=
ACPI_GPE_DISPATCH_NONE)
{
Status = AcpiEvAddGpeReference (GpeEventInfo, TRUE);
Status = AcpiEvAddGpeReference (GpeEventInfo);
if (ACPI_SUCCESS (Status) &&
ACPI_GPE_IS_POLLING_NEEDED (GpeEventInfo))
{

View File

@ -342,9 +342,10 @@ AcpiExLoadTableOp (
return_ACPI_STATUS (Status);
}
/* Complete the initialization/resolution of new objects */
/* Complete the initialization/resolution of package objects */
AcpiNsInitializeObjects ();
Status = AcpiNsWalkNamespace (ACPI_TYPE_PACKAGE, ACPI_ROOT_OBJECT,
ACPI_UINT32_MAX, 0, AcpiNsInitOnePackage, NULL, NULL, NULL);
/* Parameter Data (optional) */
@ -619,11 +620,10 @@ AcpiExLoadOp (
return_ACPI_STATUS (Status);
}
/* Complete the initialization/resolution of new objects */
/* Complete the initialization/resolution of package objects */
AcpiExExitInterpreter ();
AcpiNsInitializeObjects ();
AcpiExEnterInterpreter ();
Status = AcpiNsWalkNamespace (ACPI_TYPE_PACKAGE, ACPI_ROOT_OBJECT,
ACPI_UINT32_MAX, 0, AcpiNsInitOnePackage, NULL, NULL, NULL);
/* Store the DdbHandle into the Target operand */

View File

@ -184,7 +184,6 @@ AcpiNsRootInitialize (
ACPI_STATUS Status;
const ACPI_PREDEFINED_NAMES *InitVal = NULL;
ACPI_NAMESPACE_NODE *NewNode;
ACPI_NAMESPACE_NODE *PrevNode = NULL;
ACPI_OPERAND_OBJECT *ObjDesc;
ACPI_STRING Val = NULL;
@ -214,30 +213,13 @@ AcpiNsRootInitialize (
*/
AcpiGbl_RootNode = &AcpiGbl_RootNodeStruct;
/* Enter the predefined names in the name table */
/* Enter the pre-defined names in the name table */
ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
"Entering predefined entries into namespace\n"));
/*
* Create the initial (default) namespace.
* This namespace looks like something similar to this:
*
* ACPI Namespace (from Namespace Root):
* 0 _GPE Scope 00203160 00
* 0 _PR_ Scope 002031D0 00
* 0 _SB_ Device 00203240 00 Notify Object: 0020ADD8
* 0 _SI_ Scope 002032B0 00
* 0 _TZ_ Device 00203320 00
* 0 _REV Integer 00203390 00 = 0000000000000002
* 0 _OS_ String 00203488 00 Len 14 "Microsoft Windows NT"
* 0 _GL_ Mutex 00203580 00 Object 002035F0
* 0 _OSI Method 00203678 00 Args 1 Len 0000 Aml 00000000
*/
for (InitVal = AcpiGbl_PreDefinedNames; InitVal->Name; InitVal++)
{
Status = AE_OK;
/* _OSI is optional for now, will be permanent later */
if (!strcmp (InitVal->Name, "_OSI") && !AcpiGbl_CreateOsiMethod)
@ -245,35 +227,17 @@ AcpiNsRootInitialize (
continue;
}
/*
* Create, init, and link the new predefined name
* Note: No need to use AcpiNsLookup here because all the
* predefined names are at the root level. It is much easier to
* just create and link the new node(s) here.
*/
NewNode = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_NAMESPACE_NODE));
if (!NewNode)
Status = AcpiNsLookup (NULL, ACPI_CAST_PTR (char, InitVal->Name),
InitVal->Type, ACPI_IMODE_LOAD_PASS2, ACPI_NS_NO_UPSEARCH,
NULL, &NewNode);
if (ACPI_FAILURE (Status))
{
Status = AE_NO_MEMORY;
goto UnlockAndExit;
ACPI_EXCEPTION ((AE_INFO, Status,
"Could not create predefined name %s",
InitVal->Name));
continue;
}
ACPI_COPY_NAMESEG (NewNode->Name.Ascii, InitVal->Name);
NewNode->DescriptorType = ACPI_DESC_TYPE_NAMED;
NewNode->Type = InitVal->Type;
if (!PrevNode)
{
AcpiGbl_RootNodeStruct.Child = NewNode;
}
else
{
PrevNode->Peer = NewNode;
}
NewNode->Parent = &AcpiGbl_RootNodeStruct;
PrevNode = NewNode;
/*
* Name entered successfully. If entry in PreDefinedNames[] specifies
* an initial value, create the initial value.
@ -322,7 +286,7 @@ AcpiNsRootInitialize (
NewNode->Value = ObjDesc->Method.ParamCount;
#else
/* Mark this as a very SPECIAL method (_OSI) */
/* Mark this as a very SPECIAL method */
ObjDesc->Method.InfoFlags = ACPI_METHOD_INTERNAL_ONLY;
ObjDesc->Method.Dispatch.Implementation = AcpiUtOsiImplementation;
@ -395,6 +359,7 @@ AcpiNsRootInitialize (
}
}
UnlockAndExit:
(void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);

View File

@ -160,6 +160,13 @@
#define _COMPONENT ACPI_NAMESPACE
ACPI_MODULE_NAME ("nseval")
/* Local prototypes */
static void
AcpiNsExecModuleCode (
ACPI_OPERAND_OBJECT *MethodObj,
ACPI_EVALUATE_INFO *Info);
/*******************************************************************************
*
@ -458,3 +465,206 @@ AcpiNsEvaluate (
Info->FullPathname = NULL;
return_ACPI_STATUS (Status);
}
/*******************************************************************************
*
* FUNCTION: AcpiNsExecModuleCodeList
*
* PARAMETERS: None
*
* RETURN: None. Exceptions during method execution are ignored, since
* we cannot abort a table load.
*
* DESCRIPTION: Execute all elements of the global module-level code list.
* Each element is executed as a single control method.
*
* NOTE: With this option enabled, each block of detected executable AML
* code that is 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 function executes the module-level code for all tables only after
* all of the tables have been loaded. It is a legacy option and is
* not compatible with other ACPI implementations. See AcpiNsLoadTable.
*
* This function will be removed when the legacy option is removed.
*
******************************************************************************/
void
AcpiNsExecModuleCodeList (
void)
{
ACPI_OPERAND_OBJECT *Prev;
ACPI_OPERAND_OBJECT *Next;
ACPI_EVALUATE_INFO *Info;
UINT32 MethodCount = 0;
ACPI_FUNCTION_TRACE (NsExecModuleCodeList);
/* Exit now if the list is empty */
Next = AcpiGbl_ModuleCodeList;
if (!Next)
{
ACPI_DEBUG_PRINT ((ACPI_DB_INIT_NAMES,
"Legacy MLC block list is empty\n"));
return_VOID;
}
/* Allocate the evaluation information block */
Info = ACPI_ALLOCATE (sizeof (ACPI_EVALUATE_INFO));
if (!Info)
{
return_VOID;
}
/* Walk the list, executing each "method" */
while (Next)
{
Prev = Next;
Next = Next->Method.Mutex;
/* Clear the link field and execute the method */
Prev->Method.Mutex = NULL;
AcpiNsExecModuleCode (Prev, Info);
MethodCount++;
/* Delete the (temporary) method object */
AcpiUtRemoveReference (Prev);
}
ACPI_INFO ((
"Executed %u blocks of module-level executable AML code",
MethodCount));
ACPI_FREE (Info);
AcpiGbl_ModuleCodeList = NULL;
return_VOID;
}
/*******************************************************************************
*
* FUNCTION: AcpiNsExecModuleCode
*
* PARAMETERS: MethodObj - Object container for the module-level code
* Info - Info block for method evaluation
*
* RETURN: None. Exceptions during method execution are ignored, since
* we cannot abort a table load.
*
* DESCRIPTION: Execute a control method containing a block of module-level
* executable AML code. The control method is temporarily
* installed to the root node, then evaluated.
*
******************************************************************************/
static void
AcpiNsExecModuleCode (
ACPI_OPERAND_OBJECT *MethodObj,
ACPI_EVALUATE_INFO *Info)
{
ACPI_OPERAND_OBJECT *ParentObj;
ACPI_NAMESPACE_NODE *ParentNode;
ACPI_OBJECT_TYPE Type;
ACPI_STATUS Status;
ACPI_FUNCTION_TRACE (NsExecModuleCode);
/*
* Get the parent node. We cheat by using the NextObject field
* of the method object descriptor.
*/
ParentNode = ACPI_CAST_PTR (
ACPI_NAMESPACE_NODE, MethodObj->Method.NextObject);
Type = AcpiNsGetType (ParentNode);
/*
* 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.
*
* 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 =
ParentNode->Object->Device.Handler;
}
/* Must clear NextObject (AcpiNsAttachObject needs the field) */
MethodObj->Method.NextObject = NULL;
/* Initialize the evaluation information block */
memset (Info, 0, sizeof (ACPI_EVALUATE_INFO));
Info->PrefixNode = ParentNode;
/*
* 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 */
Status = AcpiNsAttachObject (ParentNode, MethodObj, ACPI_TYPE_METHOD);
if (ACPI_FAILURE (Status))
{
goto Exit;
}
/* Execute the parent node as a control method */
Status = AcpiNsEvaluate (Info);
ACPI_DEBUG_PRINT ((ACPI_DB_INIT_NAMES,
"Executed module-level code at %p\n",
MethodObj->Method.AmlStart));
/* Delete a possible implicit return value (in slack mode) */
if (Info->ReturnObject)
{
AcpiUtRemoveReference (Info->ReturnObject);
}
/* Detach the temporary method object */
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;
}

View File

@ -212,30 +212,29 @@ AcpiNsInitializeObjects (
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
"**** Starting initialization of namespace objects ****\n"));
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT,
"Final data object initialization: "));
"Completing Region/Field/Buffer/Package initialization:\n"));
/* Clear the info block */
/* Set all init info to zero */
memset (&Info, 0, sizeof (ACPI_INIT_WALK_INFO));
/* Walk entire namespace from the supplied root */
/*
* TBD: will become ACPI_TYPE_PACKAGE as this type object
* is now the only one that supports deferred initialization
* (forward references).
*/
Status = AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
ACPI_UINT32_MAX, AcpiNsInitOneObject, NULL, &Info, NULL);
ACPI_UINT32_MAX, AcpiNsInitOneObject, NULL,
&Info, NULL);
if (ACPI_FAILURE (Status))
{
ACPI_EXCEPTION ((AE_INFO, Status, "During WalkNamespace"));
}
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT,
"Namespace contains %u (0x%X) objects\n",
Info.ObjectCount,
Info.ObjectCount));
" Initialized %u/%u Regions %u/%u Fields %u/%u "
"Buffers %u/%u Packages (%u nodes)\n",
Info.OpRegionInit, Info.OpRegionCount,
Info.FieldInit, Info.FieldCount,
Info.BufferInit, Info.BufferCount,
Info.PackageInit, Info.PackageCount, Info.ObjectCount));
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
"%u Control Methods found\n%u Op Regions found\n",
@ -562,19 +561,35 @@ AcpiNsInitOneObject (
AcpiExEnterInterpreter ();
/*
* Only initialization of Package objects can be deferred, in order
* to support forward references.
* Each of these types can contain executable AML code within the
* declaration.
*/
switch (Type)
{
case ACPI_TYPE_LOCAL_BANK_FIELD:
case ACPI_TYPE_REGION:
/* TBD: BankFields do not require deferred init, remove this code */
Info->OpRegionInit++;
Status = AcpiDsGetRegionArguments (ObjDesc);
break;
case ACPI_TYPE_BUFFER_FIELD:
Info->FieldInit++;
Status = AcpiDsGetBufferFieldArguments (ObjDesc);
break;
case ACPI_TYPE_LOCAL_BANK_FIELD:
Info->FieldInit++;
Status = AcpiDsGetBankFieldArguments (ObjDesc);
break;
case ACPI_TYPE_BUFFER:
Info->BufferInit++;
Status = AcpiDsGetBufferArguments (ObjDesc);
break;
case ACPI_TYPE_PACKAGE:
/* Complete the initialization/resolution of the package object */
@ -585,12 +600,8 @@ AcpiNsInitOneObject (
default:
/* No other types should get here */
/* No other types can get here */
Status = AE_TYPE;
ACPI_EXCEPTION ((AE_INFO, Status,
"Opcode is not deferred [%4.4s] (%s)",
AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Type)));
break;
}

View File

@ -268,6 +268,18 @@ AcpiNsLoadTable (
ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
"**** Completed Table Object Initialization\n"));
/*
* This case handles the legacy option that groups all module-level
* code blocks together and defers execution until all of the tables
* are loaded. Execute all of these blocks at this time.
* Execute any module-level code that was detected during the table
* load phase.
*
* Note: this option is deprecated and will be eliminated in the
* future. Use of this option can cause problems with AML code that
* depends upon in-order immediate execution of module-level code.
*/
AcpiNsExecModuleCodeList ();
return_ACPI_STATUS (Status);
}

View File

@ -802,11 +802,24 @@ AcpiNsTerminate (
void)
{
ACPI_STATUS Status;
ACPI_OPERAND_OBJECT *Prev;
ACPI_OPERAND_OBJECT *Next;
ACPI_FUNCTION_TRACE (NsTerminate);
/* Delete any module-level code blocks */
Next = AcpiGbl_ModuleCodeList;
while (Next)
{
Prev = Next;
Next = Next->Method.Mutex;
Prev->Method.Mutex = NULL; /* Clear the Mutex (cheated) field */
AcpiUtRemoveReference (Prev);
}
/*
* Free the entire namespace -- all nodes and all objects
* attached to the nodes

View File

@ -1190,6 +1190,19 @@ AcpiTbLoadTable (
Status = AcpiNsLoadTable (TableIndex, ParentNode);
/*
* This case handles the legacy option that groups all module-level
* code blocks together and defers execution until all of the tables
* are loaded. Execute all of these blocks at this time.
* Execute any module-level code that was detected during the table
* load phase.
*
* Note: this option is deprecated and will be eliminated in the
* future. Use of this option can cause problems with AML code that
* depends upon in-order immediate execution of module-level code.
*/
AcpiNsExecModuleCodeList ();
/*
* Update GPEs for any new _Lxx/_Exx methods. Ignore errors. The host is
* responsible for discovering any new wake GPEs by running _PRW methods

View File

@ -479,13 +479,6 @@ AcpiLoadTable (
ACPI_INFO (("Host-directed Dynamic ACPI Table Load:"));
Status = AcpiTbInstallAndLoadTable (ACPI_PTR_TO_PHYSADDR (Table),
ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL, FALSE, &TableIndex);
if (ACPI_SUCCESS (Status))
{
/* Complete the initialization/resolution of new objects */
AcpiNsInitializeObjects ();
}
return_ACPI_STATUS (Status);
}

View File

@ -342,6 +342,7 @@ AcpiUtInitGlobals (
/* Namespace */
AcpiGbl_ModuleCodeList = NULL;
AcpiGbl_RootNode = NULL;
AcpiGbl_RootNodeStruct.Name.Integer = ACPI_ROOT_NAME;
AcpiGbl_RootNodeStruct.DescriptorType = ACPI_DESC_TYPE_NAMED;

View File

@ -381,17 +381,24 @@ AcpiInitializeObjects (
ACPI_FUNCTION_TRACE (AcpiInitializeObjects);
#ifdef ACPI_OBSOLETE_BEHAVIOR
/*
* 05/2019: Removed, initialization now happens at both object
* creation and table load time
* This case handles the legacy option that groups all module-level
* code blocks together and defers execution until all of the tables
* are loaded. Execute all of these blocks at this time.
* Execute any module-level code that was detected during the table
* load phase.
*
* Note: this option is deprecated and will be eliminated in the
* future. Use of this option can cause problems with AML code that
* depends upon in-order immediate execution of module-level code.
*/
AcpiNsExecModuleCodeList ();
/*
* Initialize the objects that remain uninitialized. This
* runs the executable AML that may be part of the
* declaration of these objects: OperationRegions, BufferFields,
* BankFields, Buffers, and Packages.
* declaration of these objects:
* OperationRegions, BufferFields, Buffers, and Packages.
*/
if (!(Flags & ACPI_NO_OBJECT_INIT))
{
@ -401,7 +408,6 @@ AcpiInitializeObjects (
return_ACPI_STATUS (Status);
}
}
#endif
/*
* Initialize all device/region objects in the namespace. This runs

View File

@ -245,8 +245,7 @@ AcpiEvMaskGpe (
ACPI_STATUS
AcpiEvAddGpeReference (
ACPI_GPE_EVENT_INFO *GpeEventInfo,
BOOLEAN ClearOnEnable);
ACPI_GPE_EVENT_INFO *GpeEventInfo);
ACPI_STATUS
AcpiEvRemoveGpeReference (

View File

@ -323,6 +323,7 @@ ACPI_GLOBAL (BOOLEAN, AcpiGbl_VerboseLeakDump);
ACPI_GLOBAL (ACPI_NAMESPACE_NODE, AcpiGbl_RootNodeStruct);
ACPI_GLOBAL (ACPI_NAMESPACE_NODE *, AcpiGbl_RootNode);
ACPI_GLOBAL (ACPI_NAMESPACE_NODE *, AcpiGbl_FadtGpeDevice);
ACPI_GLOBAL (ACPI_OPERAND_OBJECT *, AcpiGbl_ModuleCodeList);
extern const UINT8 AcpiGbl_NsProperties [ACPI_NUM_NS_TYPES];
extern const ACPI_PREDEFINED_NAMES AcpiGbl_PreDefinedNames [NUM_PREDEFINED_NAMES];

View File

@ -419,6 +419,10 @@ ACPI_STATUS
AcpiNsEvaluate (
ACPI_EVALUATE_INFO *Info);
void
AcpiNsExecModuleCodeList (
void);
/*
* nsarguments - Argument count/type checking for predefined/reserved names

View File

@ -154,7 +154,7 @@
/* Current ACPICA subsystem version in YYYYMMDD format */
#define ACPI_CA_VERSION 0x20190703
#define ACPI_CA_VERSION 0x20190509
#include <contrib/dev/acpica/include/acconfig.h>
#include <contrib/dev/acpica/include/actypes.h>