svn commit: r350510 - in head/sys/contrib/dev/acpica: . compiler components/dispatcher components/events components/executer components/namespace components/tables components/utilities include

Jung-uk Kim jkim at FreeBSD.org
Thu Aug 1 17:45:48 UTC 2019


Author: jkim
Date: Thu Aug  1 17:45:43 2019
New Revision: 350510
URL: https://svnweb.freebsd.org/changeset/base/350510

Log:
  Revert r349863 (ACPICA 20190703).
  
  This commit caused boot failures on some systems.
  
  Requested by:	scottl

Modified:
  head/sys/contrib/dev/acpica/changes.txt
  head/sys/contrib/dev/acpica/compiler/asldefine.h
  head/sys/contrib/dev/acpica/compiler/aslglobal.h
  head/sys/contrib/dev/acpica/compiler/aslload.c
  head/sys/contrib/dev/acpica/compiler/aslmessages.c
  head/sys/contrib/dev/acpica/compiler/aslmessages.h
  head/sys/contrib/dev/acpica/compiler/aslstubs.c
  head/sys/contrib/dev/acpica/compiler/aslsupport.l
  head/sys/contrib/dev/acpica/components/dispatcher/dsinit.c
  head/sys/contrib/dev/acpica/components/events/evgpe.c
  head/sys/contrib/dev/acpica/components/events/evgpeblk.c
  head/sys/contrib/dev/acpica/components/events/evxface.c
  head/sys/contrib/dev/acpica/components/events/evxfgpe.c
  head/sys/contrib/dev/acpica/components/executer/exconfig.c
  head/sys/contrib/dev/acpica/components/namespace/nsaccess.c
  head/sys/contrib/dev/acpica/components/namespace/nseval.c
  head/sys/contrib/dev/acpica/components/namespace/nsinit.c
  head/sys/contrib/dev/acpica/components/namespace/nsload.c
  head/sys/contrib/dev/acpica/components/namespace/nsutils.c
  head/sys/contrib/dev/acpica/components/tables/tbdata.c
  head/sys/contrib/dev/acpica/components/tables/tbxfload.c
  head/sys/contrib/dev/acpica/components/utilities/utinit.c
  head/sys/contrib/dev/acpica/components/utilities/utxfinit.c
  head/sys/contrib/dev/acpica/include/acevents.h
  head/sys/contrib/dev/acpica/include/acglobal.h
  head/sys/contrib/dev/acpica/include/acnamesp.h
  head/sys/contrib/dev/acpica/include/acpixf.h

Modified: head/sys/contrib/dev/acpica/changes.txt
==============================================================================
--- head/sys/contrib/dev/acpica/changes.txt	Thu Aug  1 17:37:25 2019	(r350509)
+++ head/sys/contrib/dev/acpica/changes.txt	Thu Aug  1 17:45:43 2019	(r350510)
@@ -1,53 +1,4 @@
 ----------------------------------------
-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:
 
 

Modified: head/sys/contrib/dev/acpica/compiler/asldefine.h
==============================================================================
--- head/sys/contrib/dev/acpica/compiler/asldefine.h	Thu Aug  1 17:37:25 2019	(r350509)
+++ head/sys/contrib/dev/acpica/compiler/asldefine.h	Thu Aug  1 17:45:43 2019	(r350510)
@@ -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 */

Modified: head/sys/contrib/dev/acpica/compiler/aslglobal.h
==============================================================================
--- head/sys/contrib/dev/acpica/compiler/aslglobal.h	Thu Aug  1 17:37:25 2019	(r350509)
+++ head/sys/contrib/dev/acpica/compiler/aslglobal.h	Thu Aug  1 17:45:43 2019	(r350510)
@@ -223,26 +223,11 @@ const char                          *AslGbl_OpFlagName
     "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
-
 
 
 /*

Modified: head/sys/contrib/dev/acpica/compiler/aslload.c
==============================================================================
--- head/sys/contrib/dev/acpica/compiler/aslload.c	Thu Aug  1 17:37:25 2019	(r350509)
+++ head/sys/contrib/dev/acpica/compiler/aslload.c	Thu Aug  1 17:45:43 2019	(r350510)
@@ -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);
@@ -1016,42 +1001,6 @@ FinishNode:
     }
 
     return_ACPI_STATUS (Status);
-}
-
-
-/*******************************************************************************
- *
- * 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;
-        }
-    }
 }
 
 

Modified: head/sys/contrib/dev/acpica/compiler/aslmessages.c
==============================================================================
--- head/sys/contrib/dev/acpica/compiler/aslmessages.c	Thu Aug  1 17:37:25 2019	(r350509)
+++ head/sys/contrib/dev/acpica/compiler/aslmessages.c	Thu Aug  1 17:45:43 2019	(r350510)
@@ -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 */

Modified: head/sys/contrib/dev/acpica/compiler/aslmessages.h
==============================================================================
--- head/sys/contrib/dev/acpica/compiler/aslmessages.h	Thu Aug  1 17:37:25 2019	(r350509)
+++ head/sys/contrib/dev/acpica/compiler/aslmessages.h	Thu Aug  1 17:45:43 2019	(r350510)
@@ -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 */
 

Modified: head/sys/contrib/dev/acpica/compiler/aslstubs.c
==============================================================================
--- head/sys/contrib/dev/acpica/compiler/aslstubs.c	Thu Aug  1 17:37:25 2019	(r350509)
+++ head/sys/contrib/dev/acpica/compiler/aslstubs.c	Thu Aug  1 17:45:43 2019	(r350510)
@@ -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)

Modified: head/sys/contrib/dev/acpica/compiler/aslsupport.l
==============================================================================
--- head/sys/contrib/dev/acpica/compiler/aslsupport.l	Thu Aug  1 17:37:25 2019	(r350509)
+++ head/sys/contrib/dev/acpica/compiler/aslsupport.l	Thu Aug  1 17:45:43 2019	(r350510)
@@ -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)
         {

Modified: head/sys/contrib/dev/acpica/components/dispatcher/dsinit.c
==============================================================================
--- head/sys/contrib/dev/acpica/components/dispatcher/dsinit.c	Thu Aug  1 17:37:25 2019	(r350509)
+++ head/sys/contrib/dev/acpica/components/dispatcher/dsinit.c	Thu Aug  1 17:45:43 2019	(r350510)
@@ -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 */

Modified: head/sys/contrib/dev/acpica/components/events/evgpe.c
==============================================================================
--- head/sys/contrib/dev/acpica/components/events/evgpe.c	Thu Aug  1 17:37:25 2019	(r350509)
+++ head/sys/contrib/dev/acpica/components/events/evgpe.c	Thu Aug  1 17:45:43 2019	(r350510)
@@ -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;
 
@@ -345,11 +343,6 @@ AcpiEvAddGpeReference (
     if (GpeEventInfo->RuntimeCount == 1)
     {
         /* Enable on first reference */
-
-        if (ClearOnEnable)
-        {
-            (void) AcpiHwClearGpe (GpeEventInfo);
-        }
 
         Status = AcpiEvUpdateGpeEnableMask (GpeEventInfo);
         if (ACPI_SUCCESS (Status))

Modified: head/sys/contrib/dev/acpica/components/events/evgpeblk.c
==============================================================================
--- head/sys/contrib/dev/acpica/components/events/evgpeblk.c	Thu Aug  1 17:37:25 2019	(r350509)
+++ head/sys/contrib/dev/acpica/components/events/evgpeblk.c	Thu Aug  1 17:45:43 2019	(r350510)
@@ -637,7 +637,7 @@ AcpiEvInitializeGpeBlock (
                 continue;
             }
 
-            Status = AcpiEvAddGpeReference (GpeEventInfo, FALSE);
+            Status = AcpiEvAddGpeReference (GpeEventInfo);
             if (ACPI_FAILURE (Status))
             {
                 ACPI_EXCEPTION ((AE_INFO, Status,

Modified: head/sys/contrib/dev/acpica/components/events/evxface.c
==============================================================================
--- head/sys/contrib/dev/acpica/components/events/evxface.c	Thu Aug  1 17:37:25 2019	(r350509)
+++ head/sys/contrib/dev/acpica/components/events/evxface.c	Thu Aug  1 17:45:43 2019	(r350510)
@@ -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 */

Modified: head/sys/contrib/dev/acpica/components/events/evxfgpe.c
==============================================================================
--- head/sys/contrib/dev/acpica/components/events/evxfgpe.c	Thu Aug  1 17:37:25 2019	(r350509)
+++ head/sys/contrib/dev/acpica/components/events/evxfgpe.c	Thu Aug  1 17:45:43 2019	(r350510)
@@ -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))
             {

Modified: head/sys/contrib/dev/acpica/components/executer/exconfig.c
==============================================================================
--- head/sys/contrib/dev/acpica/components/executer/exconfig.c	Thu Aug  1 17:37:25 2019	(r350509)
+++ head/sys/contrib/dev/acpica/components/executer/exconfig.c	Thu Aug  1 17:45:43 2019	(r350510)
@@ -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 */
 

Modified: head/sys/contrib/dev/acpica/components/namespace/nsaccess.c
==============================================================================
--- head/sys/contrib/dev/acpica/components/namespace/nsaccess.c	Thu Aug  1 17:37:25 2019	(r350509)
+++ head/sys/contrib/dev/acpica/components/namespace/nsaccess.c	Thu Aug  1 17:45:43 2019	(r350510)
@@ -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;
@@ -394,6 +358,7 @@ AcpiNsRootInitialize (
             AcpiUtRemoveReference (ObjDesc);
         }
     }
+
 
 UnlockAndExit:
     (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);

Modified: head/sys/contrib/dev/acpica/components/namespace/nseval.c
==============================================================================
--- head/sys/contrib/dev/acpica/components/namespace/nseval.c	Thu Aug  1 17:37:25 2019	(r350509)
+++ head/sys/contrib/dev/acpica/components/namespace/nseval.c	Thu Aug  1 17:45:43 2019	(r350510)
@@ -160,7 +160,14 @@
 #define _COMPONENT          ACPI_NAMESPACE
         ACPI_MODULE_NAME    ("nseval")
 
+/* Local prototypes */
 
+static void
+AcpiNsExecModuleCode (
+    ACPI_OPERAND_OBJECT     *MethodObj,
+    ACPI_EVALUATE_INFO      *Info);
+
+
 /*******************************************************************************
  *
  * FUNCTION:    AcpiNsEvaluate
@@ -457,4 +464,207 @@ Cleanup:
     ACPI_FREE (Info->FullPathname);
     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;
 }

Modified: head/sys/contrib/dev/acpica/components/namespace/nsinit.c
==============================================================================
--- head/sys/contrib/dev/acpica/components/namespace/nsinit.c	Thu Aug  1 17:37:25 2019	(r350509)
+++ head/sys/contrib/dev/acpica/components/namespace/nsinit.c	Thu Aug  1 17:45:43 2019	(r350510)
@@ -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;
     }
 

Modified: head/sys/contrib/dev/acpica/components/namespace/nsload.c
==============================================================================
--- head/sys/contrib/dev/acpica/components/namespace/nsload.c	Thu Aug  1 17:37:25 2019	(r350509)
+++ head/sys/contrib/dev/acpica/components/namespace/nsload.c	Thu Aug  1 17:45:43 2019	(r350510)
@@ -268,6 +268,18 @@ Unlock:
     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);
 }
 

Modified: head/sys/contrib/dev/acpica/components/namespace/nsutils.c
==============================================================================
--- head/sys/contrib/dev/acpica/components/namespace/nsutils.c	Thu Aug  1 17:37:25 2019	(r350509)
+++ head/sys/contrib/dev/acpica/components/namespace/nsutils.c	Thu Aug  1 17:45:43 2019	(r350510)
@@ -802,10 +802,23 @@ 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

Modified: head/sys/contrib/dev/acpica/components/tables/tbdata.c
==============================================================================
--- head/sys/contrib/dev/acpica/components/tables/tbdata.c	Thu Aug  1 17:37:25 2019	(r350509)
+++ head/sys/contrib/dev/acpica/components/tables/tbdata.c	Thu Aug  1 17:45:43 2019	(r350510)
@@ -1191,6 +1191,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
      * that may have been loaded by this table.

Modified: head/sys/contrib/dev/acpica/components/tables/tbxfload.c
==============================================================================
--- head/sys/contrib/dev/acpica/components/tables/tbxfload.c	Thu Aug  1 17:37:25 2019	(r350509)
+++ head/sys/contrib/dev/acpica/components/tables/tbxfload.c	Thu Aug  1 17:45:43 2019	(r350510)
@@ -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);
 }
 

Modified: head/sys/contrib/dev/acpica/components/utilities/utinit.c
==============================================================================
--- head/sys/contrib/dev/acpica/components/utilities/utinit.c	Thu Aug  1 17:37:25 2019	(r350509)
+++ head/sys/contrib/dev/acpica/components/utilities/utinit.c	Thu Aug  1 17:45:43 2019	(r350510)
@@ -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;

Modified: head/sys/contrib/dev/acpica/components/utilities/utxfinit.c
==============================================================================
--- head/sys/contrib/dev/acpica/components/utilities/utxfinit.c	Thu Aug  1 17:37:25 2019	(r350509)
+++ head/sys/contrib/dev/acpica/components/utilities/utxfinit.c	Thu Aug  1 17:45:43 2019	(r350510)
@@ -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,

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***


More information about the svn-src-all mailing list