Revert r349863 (ACPICA 20190703).
This commit caused boot failures on some systems. Requested by: scottl
This commit is contained in:
parent
850287a84b
commit
94134d2b4d
@ -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:
|
||||
|
||||
|
@ -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 */
|
||||
|
@ -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
|
||||
*/
|
||||
|
@ -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
|
||||
|
@ -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 */
|
||||
|
@ -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 */
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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 */
|
||||
|
@ -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))
|
||||
{
|
||||
|
@ -637,7 +637,7 @@ AcpiEvInitializeGpeBlock (
|
||||
continue;
|
||||
}
|
||||
|
||||
Status = AcpiEvAddGpeReference (GpeEventInfo, FALSE);
|
||||
Status = AcpiEvAddGpeReference (GpeEventInfo);
|
||||
if (ACPI_FAILURE (Status))
|
||||
{
|
||||
ACPI_EXCEPTION ((AE_INFO, Status,
|
||||
|
@ -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 */
|
||||
|
@ -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))
|
||||
{
|
||||
|
@ -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 */
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -245,8 +245,7 @@ AcpiEvMaskGpe (
|
||||
|
||||
ACPI_STATUS
|
||||
AcpiEvAddGpeReference (
|
||||
ACPI_GPE_EVENT_INFO *GpeEventInfo,
|
||||
BOOLEAN ClearOnEnable);
|
||||
ACPI_GPE_EVENT_INFO *GpeEventInfo);
|
||||
|
||||
ACPI_STATUS
|
||||
AcpiEvRemoveGpeReference (
|
||||
|
@ -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];
|
||||
|
@ -419,6 +419,10 @@ ACPI_STATUS
|
||||
AcpiNsEvaluate (
|
||||
ACPI_EVALUATE_INFO *Info);
|
||||
|
||||
void
|
||||
AcpiNsExecModuleCodeList (
|
||||
void);
|
||||
|
||||
|
||||
/*
|
||||
* nsarguments - Argument count/type checking for predefined/reserved names
|
||||
|
@ -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>
|
||||
|
Loading…
Reference in New Issue
Block a user