[ACPICA]
authorThomas Faber <thomas.faber@reactos.org>
Tue, 1 Aug 2017 09:11:52 +0000 (09:11 +0000)
committerThomas Faber <thomas.faber@reactos.org>
Tue, 1 Aug 2017 09:11:52 +0000 (09:11 +0000)
- Update to version 20170728
CORE-13625 #resolve

svn path=/trunk/; revision=75467

53 files changed:
reactos/drivers/bus/acpi/CMakeLists.txt
reactos/drivers/bus/acpi/acpica/dispatcher/dsfield.c
reactos/drivers/bus/acpi/acpica/dispatcher/dsobject.c
reactos/drivers/bus/acpi/acpica/dispatcher/dsopcode.c
reactos/drivers/bus/acpi/acpica/dispatcher/dspkginit.c [new file with mode: 0644]
reactos/drivers/bus/acpi/acpica/executer/excreate.c
reactos/drivers/bus/acpi/acpica/executer/exdump.c
reactos/drivers/bus/acpi/acpica/executer/exmisc.c
reactos/drivers/bus/acpi/acpica/executer/exoparg2.c
reactos/drivers/bus/acpi/acpica/hardware/hwregs.c
reactos/drivers/bus/acpi/acpica/include/acdisasm.h
reactos/drivers/bus/acpi/acpica/include/acdispat.h
reactos/drivers/bus/acpi/acpica/include/aclocal.h
reactos/drivers/bus/acpi/acpica/include/acnames.h
reactos/drivers/bus/acpi/acpica/include/acobject.h
reactos/drivers/bus/acpi/acpica/include/acpi.h
reactos/drivers/bus/acpi/acpica/include/acpixf.h
reactos/drivers/bus/acpi/acpica/include/actbl2.h
reactos/drivers/bus/acpi/acpica/include/actypes.h
reactos/drivers/bus/acpi/acpica/include/acutils.h
reactos/drivers/bus/acpi/acpica/include/platform/accygwin.h
reactos/drivers/bus/acpi/acpica/include/platform/acdragonfly.h
reactos/drivers/bus/acpi/acpica/include/platform/acefi.h
reactos/drivers/bus/acpi/acpica/include/platform/acefiex.h
reactos/drivers/bus/acpi/acpica/include/platform/acfreebsd.h
reactos/drivers/bus/acpi/acpica/include/platform/acgcc.h
reactos/drivers/bus/acpi/acpica/include/platform/achaiku.h
reactos/drivers/bus/acpi/acpica/include/platform/aclinux.h
reactos/drivers/bus/acpi/acpica/include/platform/acmsvc.h
reactos/drivers/bus/acpi/acpica/include/platform/acnetbsd.h
reactos/drivers/bus/acpi/acpica/include/platform/acos2.h
reactos/drivers/bus/acpi/acpica/include/platform/acqnx.h
reactos/drivers/bus/acpi/acpica/include/platform/acwin.h
reactos/drivers/bus/acpi/acpica/include/platform/acwin64.h
reactos/drivers/bus/acpi/acpica/namespace/nsaccess.c
reactos/drivers/bus/acpi/acpica/namespace/nsarguments.c
reactos/drivers/bus/acpi/acpica/namespace/nsinit.c
reactos/drivers/bus/acpi/acpica/namespace/nsnames.c
reactos/drivers/bus/acpi/acpica/namespace/nsprepkg.c
reactos/drivers/bus/acpi/acpica/parser/psloop.c
reactos/drivers/bus/acpi/acpica/resources/rsxface.c
reactos/drivers/bus/acpi/acpica/tables/tbdata.c
reactos/drivers/bus/acpi/acpica/tables/tbxface.c
reactos/drivers/bus/acpi/acpica/utilities/utclib.c
reactos/drivers/bus/acpi/acpica/utilities/uthex.c
reactos/drivers/bus/acpi/acpica/utilities/utmath.c
reactos/drivers/bus/acpi/acpica/utilities/utmisc.c
reactos/drivers/bus/acpi/acpica/utilities/utobject.c
reactos/drivers/bus/acpi/acpica/utilities/utprint.c
reactos/drivers/bus/acpi/acpica/utilities/utresrc.c
reactos/drivers/bus/acpi/acpica/utilities/utstate.c
reactos/drivers/bus/acpi/acpica/utilities/utstrtoul64.c
reactos/drivers/bus/acpi/acpica/utilities/uttrack.c

index 97847f3..cc2cb2f 100644 (file)
@@ -17,6 +17,7 @@ list(APPEND ACPICA_SOURCE
     acpica/dispatcher/dsmthdat.c
     acpica/dispatcher/dsobject.c
     acpica/dispatcher/dsopcode.c
+    acpica/dispatcher/dspkginit.c
     acpica/dispatcher/dsutils.c
     acpica/dispatcher/dswexec.c
     acpica/dispatcher/dswload.c
@@ -175,7 +176,7 @@ add_library(acpica
     acpica/utilities/utglobal.c)
 
 add_pch(acpica acpica/include/acpi.h ACPICA_SOURCE)
-set_target_properties(acpica PROPERTIES COMPILE_DEFINITIONS "ACPI_USE_LOCAL_CACHE;ACPI_USE_SYSTEM_INTTYPES;ACPI_USE_NATIVE_DIVIDE")
+set_target_properties(acpica PROPERTIES COMPILE_DEFINITIONS "ACPI_USE_LOCAL_CACHE;ACPI_USE_SYSTEM_INTTYPES")
 add_dependencies(acpica bugcodes xdk)
 
 list(APPEND ACPI_SOURCE
index 2ecc99e..a755606 100644 (file)
@@ -205,6 +205,8 @@ AcpiDsCreateBufferField (
 
         if (!(WalkState->ParseFlags & ACPI_PARSE_EXECUTE))
         {
+            ACPI_ERROR ((AE_INFO,
+                "Parse execute mode is not set"));
             return_ACPI_STATUS (AE_AML_INTERNAL);
         }
 
@@ -593,6 +595,8 @@ AcpiDsInitFieldObjects (
             return_ACPI_STATUS (AE_OK);
         }
 
+        ACPI_ERROR ((AE_INFO,
+            "Parse deferred mode is not set"));
         return_ACPI_STATUS (AE_AML_INTERNAL);
     }
 
index cb432e3..ef0f2b7 100644 (file)
 #define _COMPONENT          ACPI_DISPATCHER
         ACPI_MODULE_NAME    ("dsobject")
 
-/* Local prototypes */
-
-static ACPI_STATUS
-AcpiDsBuildInternalObject (
-    ACPI_WALK_STATE         *WalkState,
-    ACPI_PARSE_OBJECT       *Op,
-    ACPI_OPERAND_OBJECT     **ObjDescPtr);
-
 
 #ifndef ACPI_NO_METHOD_EXECUTION
 /*******************************************************************************
@@ -77,7 +69,7 @@ AcpiDsBuildInternalObject (
  *
  ******************************************************************************/
 
-static ACPI_STATUS
+ACPI_STATUS
 AcpiDsBuildInternalObject (
     ACPI_WALK_STATE         *WalkState,
     ACPI_PARSE_OBJECT       *Op,
@@ -85,7 +77,6 @@ AcpiDsBuildInternalObject (
 {
     ACPI_OPERAND_OBJECT     *ObjDesc;
     ACPI_STATUS             Status;
-    ACPI_OBJECT_TYPE        Type;
 
 
     ACPI_FUNCTION_TRACE (DsBuildInternalObject);
@@ -96,129 +87,43 @@ AcpiDsBuildInternalObject (
     {
         /*
          * This is a named object reference. If this name was
-         * previously looked up in the namespace, it was stored in this op.
-         * Otherwise, go ahead and look it up now
+         * previously looked up in the namespace, it was stored in
+         * this op. Otherwise, go ahead and look it up now
          */
         if (!Op->Common.Node)
         {
-            Status = AcpiNsLookup (WalkState->ScopeInfo,
-                Op->Common.Value.String,
-                ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
-                ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, NULL,
-                ACPI_CAST_INDIRECT_PTR (ACPI_NAMESPACE_NODE, &(Op->Common.Node)));
-            if (ACPI_FAILURE (Status))
-            {
-                /* Check if we are resolving a named reference within a package */
-
-                if ((Status == AE_NOT_FOUND) && (AcpiGbl_EnableInterpreterSlack) &&
-
-                    ((Op->Common.Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
-                     (Op->Common.Parent->Common.AmlOpcode == AML_VARIABLE_PACKAGE_OP)))
-                {
-                    /*
-                     * We didn't find the target and we are populating elements
-                     * of a package - ignore if slack enabled. Some ASL code
-                     * contains dangling invalid references in packages and
-                     * expects that no exception will be issued. Leave the
-                     * element as a null element. It cannot be used, but it
-                     * can be overwritten by subsequent ASL code - this is
-                     * typically the case.
-                     */
-                    ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
-                        "Ignoring unresolved reference in package [%4.4s]\n",
-                        WalkState->ScopeInfo->Scope.Node->Name.Ascii));
-
-                    return_ACPI_STATUS (AE_OK);
-                }
-                else
-                {
-                    ACPI_ERROR_NAMESPACE (Op->Common.Value.String, Status);
-                }
-
-                return_ACPI_STATUS (Status);
-            }
-        }
-
-        /* Special object resolution for elements of a package */
-
-        if ((Op->Common.Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
-            (Op->Common.Parent->Common.AmlOpcode == AML_VARIABLE_PACKAGE_OP))
-        {
-            /*
-             * Attempt to resolve the node to a value before we insert it into
-             * the package. If this is a reference to a common data type,
-             * resolve it immediately. According to the ACPI spec, package
-             * elements can only be "data objects" or method references.
-             * Attempt to resolve to an Integer, Buffer, String or Package.
-             * If cannot, return the named reference (for things like Devices,
-             * Methods, etc.) Buffer Fields and Fields will resolve to simple
-             * objects (int/buf/str/pkg).
-             *
-             * NOTE: References to things like Devices, Methods, Mutexes, etc.
-             * will remain as named references. This behavior is not described
-             * in the ACPI spec, but it appears to be an oversight.
-             */
-            ObjDesc = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Op->Common.Node);
-
-            Status = AcpiExResolveNodeToValue (
-                ACPI_CAST_INDIRECT_PTR (ACPI_NAMESPACE_NODE, &ObjDesc),
-                WalkState);
-            if (ACPI_FAILURE (Status))
-            {
-                return_ACPI_STATUS (Status);
-            }
+            /* Check if we are resolving a named reference within a package */
 
-            /*
-             * Special handling for Alias objects. We need to setup the type
-             * and the Op->Common.Node to point to the Alias target. Note,
-             * Alias has at most one level of indirection internally.
-             */
-            Type = Op->Common.Node->Type;
-            if (Type == ACPI_TYPE_LOCAL_ALIAS)
+            if ((Op->Common.Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
+                (Op->Common.Parent->Common.AmlOpcode == AML_VARIABLE_PACKAGE_OP))
             {
-                Type = ObjDesc->Common.Type;
-                Op->Common.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE,
-                    Op->Common.Node->Object);
-            }
-
-            switch (Type)
-            {
-            /*
-             * For these types, we need the actual node, not the subobject.
-             * However, the subobject did not get an extra reference count above.
-             *
-             * TBD: should ExResolveNodeToValue be changed to fix this?
-             */
-            case ACPI_TYPE_DEVICE:
-            case ACPI_TYPE_THERMAL:
-
-                AcpiUtAddReference (Op->Common.Node->Object);
-
-                /*lint -fallthrough */
-            /*
-             * For these types, we need the actual node, not the subobject.
-             * The subobject got an extra reference count in ExResolveNodeToValue.
-             */
-            case ACPI_TYPE_MUTEX:
-            case ACPI_TYPE_METHOD:
-            case ACPI_TYPE_POWER:
-            case ACPI_TYPE_PROCESSOR:
-            case ACPI_TYPE_EVENT:
-            case ACPI_TYPE_REGION:
-
-                /* We will create a reference object for these types below */
-                break;
-
-            default:
                 /*
-                 * All other types - the node was resolved to an actual
-                 * object, we are done.
+                 * We won't resolve package elements here, we will do this
+                 * after all ACPI tables are loaded into the namespace. This
+                 * behavior supports both forward references to named objects
+                 * and external references to objects in other tables.
                  */
-                goto Exit;
+                goto CreateNewObject;
+            }
+            else
+            {
+                Status = AcpiNsLookup (WalkState->ScopeInfo,
+                    Op->Common.Value.String,
+                    ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
+                    ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, NULL,
+                    ACPI_CAST_INDIRECT_PTR (
+                        ACPI_NAMESPACE_NODE, &(Op->Common.Node)));
+                if (ACPI_FAILURE (Status))
+                {
+                    ACPI_ERROR_NAMESPACE (Op->Common.Value.String, Status);
+                    return_ACPI_STATUS (Status);
+                }
             }
         }
     }
 
+CreateNewObject:
+
     /* Create and init a new internal ACPI object */
 
     ObjDesc = AcpiUtCreateInternalObject (
@@ -236,7 +141,28 @@ AcpiDsBuildInternalObject (
         return_ACPI_STATUS (Status);
     }
 
-Exit:
+    /*
+     * Handling for unresolved package reference elements.
+     * These are elements that are namepaths.
+     */
+    if ((Op->Common.Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
+        (Op->Common.Parent->Common.AmlOpcode == AML_VARIABLE_PACKAGE_OP))
+    {
+        ObjDesc->Reference.Resolved = TRUE;
+
+        if ((Op->Common.AmlOpcode == AML_INT_NAMEPATH_OP) &&
+            !ObjDesc->Reference.Node)
+        {
+            /*
+             * Name was unresolved above.
+             * Get the prefix node for later lookup
+             */
+            ObjDesc->Reference.Node = WalkState->ScopeInfo->Scope.Node;
+            ObjDesc->Reference.Aml = Op->Common.Aml;
+            ObjDesc->Reference.Resolved = FALSE;
+        }
+    }
+
     *ObjDescPtr = ObjDesc;
     return_ACPI_STATUS (Status);
 }
@@ -358,209 +284,6 @@ AcpiDsBuildInternalBufferObj (
     return_ACPI_STATUS (AE_OK);
 }
 
-
-/*******************************************************************************
- *
- * FUNCTION:    AcpiDsBuildInternalPackageObj
- *
- * PARAMETERS:  WalkState       - Current walk state
- *              Op              - Parser object to be translated
- *              ElementCount    - Number of elements in the package - this is
- *                                the NumElements argument to Package()
- *              ObjDescPtr      - Where the ACPI internal object is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Translate a parser Op package object to the equivalent
- *              namespace object
- *
- * NOTE: The number of elements in the package will be always be the NumElements
- * count, regardless of the number of elements in the package list. If
- * NumElements is smaller, only that many package list elements are used.
- * if NumElements is larger, the Package object is padded out with
- * objects of type Uninitialized (as per ACPI spec.)
- *
- * Even though the ASL compilers do not allow NumElements to be smaller
- * than the Package list length (for the fixed length package opcode), some
- * BIOS code modifies the AML on the fly to adjust the NumElements, and
- * this code compensates for that. This also provides compatibility with
- * other AML interpreters.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-AcpiDsBuildInternalPackageObj (
-    ACPI_WALK_STATE         *WalkState,
-    ACPI_PARSE_OBJECT       *Op,
-    UINT32                  ElementCount,
-    ACPI_OPERAND_OBJECT     **ObjDescPtr)
-{
-    ACPI_PARSE_OBJECT       *Arg;
-    ACPI_PARSE_OBJECT       *Parent;
-    ACPI_OPERAND_OBJECT     *ObjDesc = NULL;
-    ACPI_STATUS             Status = AE_OK;
-    UINT32                  i;
-    UINT16                  Index;
-    UINT16                  ReferenceCount;
-
-
-    ACPI_FUNCTION_TRACE (DsBuildInternalPackageObj);
-
-
-    /* Find the parent of a possibly nested package */
-
-    Parent = Op->Common.Parent;
-    while ((Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
-           (Parent->Common.AmlOpcode == AML_VARIABLE_PACKAGE_OP))
-    {
-        Parent = Parent->Common.Parent;
-    }
-
-    /*
-     * If we are evaluating a Named package object "Name (xxxx, Package)",
-     * the package object already exists, otherwise it must be created.
-     */
-    ObjDesc = *ObjDescPtr;
-    if (!ObjDesc)
-    {
-        ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_PACKAGE);
-        *ObjDescPtr = ObjDesc;
-        if (!ObjDesc)
-        {
-            return_ACPI_STATUS (AE_NO_MEMORY);
-        }
-
-        ObjDesc->Package.Node = Parent->Common.Node;
-    }
-
-    /*
-     * Allocate the element array (array of pointers to the individual
-     * objects) based on the NumElements parameter. Add an extra pointer slot
-     * so that the list is always null terminated.
-     */
-    ObjDesc->Package.Elements = ACPI_ALLOCATE_ZEROED (
-        ((ACPI_SIZE) ElementCount + 1) * sizeof (void *));
-
-    if (!ObjDesc->Package.Elements)
-    {
-        AcpiUtDeleteObjectDesc (ObjDesc);
-        return_ACPI_STATUS (AE_NO_MEMORY);
-    }
-
-    ObjDesc->Package.Count = ElementCount;
-
-    /*
-     * Initialize the elements of the package, up to the NumElements count.
-     * Package is automatically padded with uninitialized (NULL) elements
-     * if NumElements is greater than the package list length. Likewise,
-     * Package is truncated if NumElements is less than the list length.
-     */
-    Arg = Op->Common.Value.Arg;
-    Arg = Arg->Common.Next;
-    for (i = 0; Arg && (i < ElementCount); i++)
-    {
-        if (Arg->Common.AmlOpcode == AML_INT_RETURN_VALUE_OP)
-        {
-            if (Arg->Common.Node->Type == ACPI_TYPE_METHOD)
-            {
-                /*
-                 * A method reference "looks" to the parser to be a method
-                 * invocation, so we special case it here
-                 */
-                Arg->Common.AmlOpcode = AML_INT_NAMEPATH_OP;
-                Status = AcpiDsBuildInternalObject (
-                    WalkState, Arg, &ObjDesc->Package.Elements[i]);
-            }
-            else
-            {
-                /* This package element is already built, just get it */
-
-                ObjDesc->Package.Elements[i] =
-                    ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Arg->Common.Node);
-            }
-        }
-        else
-        {
-            Status = AcpiDsBuildInternalObject (
-                WalkState, Arg, &ObjDesc->Package.Elements[i]);
-        }
-
-        if (*ObjDescPtr)
-        {
-            /* Existing package, get existing reference count */
-
-            ReferenceCount = (*ObjDescPtr)->Common.ReferenceCount;
-            if (ReferenceCount > 1)
-            {
-                /* Make new element ref count match original ref count */
-
-                for (Index = 0; Index < (ReferenceCount - 1); Index++)
-                {
-                    AcpiUtAddReference ((ObjDesc->Package.Elements[i]));
-                }
-            }
-        }
-
-        Arg = Arg->Common.Next;
-    }
-
-    /* Check for match between NumElements and actual length of PackageList */
-
-    if (Arg)
-    {
-        /*
-         * NumElements was exhausted, but there are remaining elements in the
-         * PackageList. Truncate the package to NumElements.
-         *
-         * Note: technically, this is an error, from ACPI spec: "It is an error
-         * for NumElements to be less than the number of elements in the
-         * PackageList". However, we just print a message and
-         * no exception is returned. This provides Windows compatibility. Some
-         * BIOSs will alter the NumElements on the fly, creating this type
-         * of ill-formed package object.
-         */
-        while (Arg)
-        {
-            /*
-             * We must delete any package elements that were created earlier
-             * and are not going to be used because of the package truncation.
-             */
-            if (Arg->Common.Node)
-            {
-                AcpiUtRemoveReference (
-                    ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Arg->Common.Node));
-                Arg->Common.Node = NULL;
-            }
-
-            /* Find out how many elements there really are */
-
-            i++;
-            Arg = Arg->Common.Next;
-        }
-
-        ACPI_INFO ((
-            "Actual Package length (%u) is larger than "
-            "NumElements field (%u), truncated",
-            i, ElementCount));
-    }
-    else if (i < ElementCount)
-    {
-        /*
-         * Arg list (elements) was exhausted, but we did not reach NumElements count.
-         * Note: this is not an error, the package is padded out with NULLs.
-         */
-        ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
-            "Package List length (%u) smaller than NumElements "
-            "count (%u), padded with null elements\n",
-            i, ElementCount));
-    }
-
-    ObjDesc->Package.Flags |= AOPOBJ_DATA_VALID;
-    Op->Common.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjDesc);
-    return_ACPI_STATUS (Status);
-}
-
-
 /*******************************************************************************
  *
  * FUNCTION:    AcpiDsCreateNode
@@ -688,10 +411,20 @@ AcpiDsInitObjectFromOp (
 
     case ACPI_TYPE_PACKAGE:
         /*
-         * Defer evaluation of Package TermArg operand
+         * Defer evaluation of Package TermArg operand and all
+         * package elements. (01/2017): We defer the element
+         * resolution to allow forward references from the package
+         * in order to provide compatibility with other ACPI
+         * implementations.
          */
         ObjDesc->Package.Node = ACPI_CAST_PTR (
             ACPI_NAMESPACE_NODE, WalkState->Operands[0]);
+
+        if (!Op->Named.Data)
+        {
+            return_ACPI_STATUS (AE_OK);
+        }
+
         ObjDesc->Package.AmlStart = Op->Named.Data;
         ObjDesc->Package.AmlLength = Op->Named.Length;
         break;
@@ -832,8 +565,11 @@ AcpiDsInitObjectFromOp (
                 /* Node was saved in Op */
 
                 ObjDesc->Reference.Node = Op->Common.Node;
-                ObjDesc->Reference.Object = Op->Common.Node->Object;
                 ObjDesc->Reference.Class = ACPI_REFCLASS_NAME;
+                if (Op->Common.Node)
+                {
+                    ObjDesc->Reference.Object = Op->Common.Node->Object;
+                }
                 break;
 
             case AML_DEBUG_OP:
index 83b5cce..da20a3e 100644 (file)
@@ -639,6 +639,16 @@ AcpiDsEvalDataObjectOperands (
      */
     WalkState->OperandIndex = WalkState->NumOperands;
 
+    /* Ignore if child is not valid */
+
+    if (!Op->Common.Value.Arg)
+    {
+        ACPI_ERROR ((AE_INFO,
+            "Dispatch: Missing child while executing TermArg for %X",
+            Op->Common.AmlOpcode));
+        return_ACPI_STATUS (AE_OK);
+    }
+
     Status = AcpiDsCreateOperand (WalkState, Op->Common.Value.Arg, 1);
     if (ACPI_FAILURE (Status))
     {
diff --git a/reactos/drivers/bus/acpi/acpica/dispatcher/dspkginit.c b/reactos/drivers/bus/acpi/acpica/dispatcher/dspkginit.c
new file mode 100644 (file)
index 0000000..65d3c69
--- /dev/null
@@ -0,0 +1,527 @@
+/******************************************************************************
+ *
+ * Module Name: dspkginit - Completion of deferred package initialization
+ *
+ *****************************************************************************/
+
+/*
+ * Copyright (C) 2000 - 2017, Intel Corp.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions, and the following disclaimer,
+ *    without modification.
+ * 2. Redistributions in binary form must reproduce at minimum a disclaimer
+ *    substantially similar to the "NO WARRANTY" disclaimer below
+ *    ("Disclaimer") and any redistribution must be conditioned upon
+ *    including a substantially similar Disclaimer requirement for further
+ *    binary redistribution.
+ * 3. Neither the names of the above-listed copyright holders nor the names
+ *    of any contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * Alternatively, this software may be distributed under the terms of the
+ * GNU General Public License ("GPL") version 2 as published by the Free
+ * Software Foundation.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ */
+
+#include "acpi.h"
+#include "accommon.h"
+#include "acnamesp.h"
+#include "amlcode.h"
+#include "acdispat.h"
+#include "acinterp.h"
+
+
+#define _COMPONENT          ACPI_NAMESPACE
+        ACPI_MODULE_NAME    ("dspkginit")
+
+
+/* Local prototypes */
+
+static void
+AcpiDsResolvePackageElement (
+    ACPI_OPERAND_OBJECT     **Element);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiDsBuildInternalPackageObj
+ *
+ * PARAMETERS:  WalkState       - Current walk state
+ *              Op              - Parser object to be translated
+ *              ElementCount    - Number of elements in the package - this is
+ *                                the NumElements argument to Package()
+ *              ObjDescPtr      - Where the ACPI internal object is returned
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Translate a parser Op package object to the equivalent
+ *              namespace object
+ *
+ * NOTE: The number of elements in the package will be always be the NumElements
+ * count, regardless of the number of elements in the package list. If
+ * NumElements is smaller, only that many package list elements are used.
+ * if NumElements is larger, the Package object is padded out with
+ * objects of type Uninitialized (as per ACPI spec.)
+ *
+ * Even though the ASL compilers do not allow NumElements to be smaller
+ * than the Package list length (for the fixed length package opcode), some
+ * BIOS code modifies the AML on the fly to adjust the NumElements, and
+ * this code compensates for that. This also provides compatibility with
+ * other AML interpreters.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsBuildInternalPackageObj (
+    ACPI_WALK_STATE         *WalkState,
+    ACPI_PARSE_OBJECT       *Op,
+    UINT32                  ElementCount,
+    ACPI_OPERAND_OBJECT     **ObjDescPtr)
+{
+    ACPI_PARSE_OBJECT       *Arg;
+    ACPI_PARSE_OBJECT       *Parent;
+    ACPI_OPERAND_OBJECT     *ObjDesc = NULL;
+    ACPI_STATUS             Status = AE_OK;
+    UINT16                  ReferenceCount;
+    UINT32                  Index;
+    UINT32                  i;
+
+
+    ACPI_FUNCTION_TRACE (DsBuildInternalPackageObj);
+
+
+    /* Find the parent of a possibly nested package */
+
+    Parent = Op->Common.Parent;
+    while ((Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
+           (Parent->Common.AmlOpcode == AML_VARIABLE_PACKAGE_OP))
+    {
+        Parent = Parent->Common.Parent;
+    }
+
+    /*
+     * If we are evaluating a Named package object of the form:
+     *      Name (xxxx, Package)
+     * the package object already exists, otherwise it must be created.
+     */
+    ObjDesc = *ObjDescPtr;
+    if (!ObjDesc)
+    {
+        ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_PACKAGE);
+        *ObjDescPtr = ObjDesc;
+        if (!ObjDesc)
+        {
+            return_ACPI_STATUS (AE_NO_MEMORY);
+        }
+
+        ObjDesc->Package.Node = Parent->Common.Node;
+    }
+
+    if (ObjDesc->Package.Flags & AOPOBJ_DATA_VALID) /* Just in case */
+    {
+        return_ACPI_STATUS (AE_OK);
+    }
+
+    /*
+     * Allocate the element array (array of pointers to the individual
+     * objects) based on the NumElements parameter. Add an extra pointer slot
+     * so that the list is always null terminated.
+     */
+    ObjDesc->Package.Elements = ACPI_ALLOCATE_ZEROED (
+        ((ACPI_SIZE) ElementCount + 1) * sizeof (void *));
+
+    if (!ObjDesc->Package.Elements)
+    {
+        AcpiUtDeleteObjectDesc (ObjDesc);
+        return_ACPI_STATUS (AE_NO_MEMORY);
+    }
+
+    ObjDesc->Package.Count = ElementCount;
+    Arg = Op->Common.Value.Arg;
+    Arg = Arg->Common.Next;
+
+    if (Arg)
+    {
+        ObjDesc->Package.Flags |= AOPOBJ_DATA_VALID;
+    }
+
+    /*
+     * Initialize the elements of the package, up to the NumElements count.
+     * Package is automatically padded with uninitialized (NULL) elements
+     * if NumElements is greater than the package list length. Likewise,
+     * Package is truncated if NumElements is less than the list length.
+     */
+    for (i = 0; Arg && (i < ElementCount); i++)
+    {
+        if (Arg->Common.AmlOpcode == AML_INT_RETURN_VALUE_OP)
+        {
+            if (Arg->Common.Node->Type == ACPI_TYPE_METHOD)
+            {
+                /*
+                 * A method reference "looks" to the parser to be a method
+                 * invocation, so we special case it here
+                 */
+                Arg->Common.AmlOpcode = AML_INT_NAMEPATH_OP;
+                Status = AcpiDsBuildInternalObject (
+                    WalkState, Arg, &ObjDesc->Package.Elements[i]);
+            }
+            else
+            {
+                /* This package element is already built, just get it */
+
+                ObjDesc->Package.Elements[i] =
+                    ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Arg->Common.Node);
+            }
+        }
+        else
+        {
+            Status = AcpiDsBuildInternalObject (
+                WalkState, Arg, &ObjDesc->Package.Elements[i]);
+            if (Status == AE_NOT_FOUND)
+            {
+                ACPI_ERROR ((AE_INFO, "%-48s", "****DS namepath not found"));
+            }
+
+            /*
+             * Initialize this package element. This function handles the
+             * resolution of named references within the package.
+             */
+            AcpiDsInitPackageElement (0, ObjDesc->Package.Elements[i],
+                NULL, &ObjDesc->Package.Elements[i]);
+        }
+
+        if (*ObjDescPtr)
+        {
+            /* Existing package, get existing reference count */
+
+            ReferenceCount = (*ObjDescPtr)->Common.ReferenceCount;
+            if (ReferenceCount > 1)
+            {
+                /* Make new element ref count match original ref count */
+                /* TBD: Probably need an AcpiUtAddReferences function */
+
+                for (Index = 0; Index < ((UINT32) ReferenceCount - 1); Index++)
+                {
+                    AcpiUtAddReference ((ObjDesc->Package.Elements[i]));
+                }
+            }
+        }
+
+        Arg = Arg->Common.Next;
+    }
+
+    /* Check for match between NumElements and actual length of PackageList */
+
+    if (Arg)
+    {
+        /*
+         * NumElements was exhausted, but there are remaining elements in
+         * the PackageList. Truncate the package to NumElements.
+         *
+         * Note: technically, this is an error, from ACPI spec: "It is an
+         * error for NumElements to be less than the number of elements in
+         * the PackageList". However, we just print a message and no
+         * exception is returned. This provides compatibility with other
+         * ACPI implementations. Some firmware implementations will alter
+         * the NumElements on the fly, possibly creating this type of
+         * ill-formed package object.
+         */
+        while (Arg)
+        {
+            /*
+             * We must delete any package elements that were created earlier
+             * and are not going to be used because of the package truncation.
+             */
+            if (Arg->Common.Node)
+            {
+                AcpiUtRemoveReference (
+                    ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Arg->Common.Node));
+                Arg->Common.Node = NULL;
+            }
+
+            /* Find out how many elements there really are */
+
+            i++;
+            Arg = Arg->Common.Next;
+        }
+
+        ACPI_INFO ((
+            "Actual Package length (%u) is larger than "
+            "NumElements field (%u), truncated",
+            i, ElementCount));
+    }
+    else if (i < ElementCount)
+    {
+        /*
+         * Arg list (elements) was exhausted, but we did not reach
+         * NumElements count.
+         *
+         * Note: this is not an error, the package is padded out
+         * with NULLs.
+         */
+        ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
+            "Package List length (%u) smaller than NumElements "
+            "count (%u), padded with null elements\n",
+            i, ElementCount));
+    }
+
+    ObjDesc->Package.Flags |= AOPOBJ_DATA_VALID;
+    Op->Common.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjDesc);
+    return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiDsInitPackageElement
+ *
+ * PARAMETERS:  ACPI_PKG_CALLBACK
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Resolve a named reference element within a package object
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsInitPackageElement (
+    UINT8                   ObjectType,
+    ACPI_OPERAND_OBJECT     *SourceObject,
+    ACPI_GENERIC_STATE      *State,
+    void                    *Context)
+{
+    ACPI_OPERAND_OBJECT     **ElementPtr;
+
+
+    if (!SourceObject)
+    {
+        return (AE_OK);
+    }
+
+    /*
+     * The following code is a bit of a hack to workaround a (current)
+     * limitation of the ACPI_PKG_CALLBACK interface. We need a pointer
+     * to the location within the element array because a new object
+     * may be created and stored there.
+     */
+    if (Context)
+    {
+        /* A direct call was made to this function */
+
+        ElementPtr = (ACPI_OPERAND_OBJECT **) Context;
+    }
+    else
+    {
+        /* Call came from AcpiUtWalkPackageTree */
+
+        ElementPtr = State->Pkg.ThisTargetObj;
+    }
+
+    /* We are only interested in reference objects/elements */
+
+    if (SourceObject->Common.Type == ACPI_TYPE_LOCAL_REFERENCE)
+    {
+        /* Attempt to resolve the (named) reference to a namespace node */
+
+        AcpiDsResolvePackageElement (ElementPtr);
+    }
+    else if (SourceObject->Common.Type == ACPI_TYPE_PACKAGE)
+    {
+        SourceObject->Package.Flags |= AOPOBJ_DATA_VALID;
+    }
+
+    return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiDsResolvePackageElement
+ *
+ * PARAMETERS:  ElementPtr          - Pointer to a reference object
+ *
+ * RETURN:      Possible new element is stored to the indirect ElementPtr
+ *
+ * DESCRIPTION: Resolve a package element that is a reference to a named
+ *              object.
+ *
+ ******************************************************************************/
+
+static void
+AcpiDsResolvePackageElement (
+    ACPI_OPERAND_OBJECT     **ElementPtr)
+{
+    ACPI_STATUS             Status;
+    ACPI_GENERIC_STATE      ScopeInfo;
+    ACPI_OPERAND_OBJECT     *Element = *ElementPtr;
+    ACPI_NAMESPACE_NODE     *ResolvedNode;
+    char                    *ExternalPath = NULL;
+    ACPI_OBJECT_TYPE        Type;
+
+
+    ACPI_FUNCTION_TRACE (DsResolvePackageElement);
+
+
+    /* Check if reference element is already resolved */
+
+    if (Element->Reference.Resolved)
+    {
+        return_VOID;
+    }
+
+    /* Element must be a reference object of correct type */
+
+    ScopeInfo.Scope.Node = Element->Reference.Node; /* Prefix node */
+
+    Status = AcpiNsLookup (&ScopeInfo,
+        (char *) Element->Reference.Aml,            /* Pointer to AML path */
+        ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
+        ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE,
+        NULL, &ResolvedNode);
+    if (ACPI_FAILURE (Status))
+    {
+        Status = AcpiNsExternalizeName (ACPI_UINT32_MAX,
+            (char *) Element->Reference.Aml,
+            NULL, &ExternalPath);
+
+        ACPI_EXCEPTION ((AE_INFO, Status,
+            "Could not find/resolve named package element: %s", ExternalPath));
+
+        ACPI_FREE (ExternalPath);
+        *ElementPtr = NULL;
+        return_VOID;
+    }
+    else if (ResolvedNode->Type == ACPI_TYPE_ANY)
+    {
+        /* Named reference not resolved, return a NULL package element */
+
+        ACPI_ERROR ((AE_INFO,
+            "Could not resolve named package element [%4.4s] in [%4.4s]",
+            ResolvedNode->Name.Ascii, ScopeInfo.Scope.Node->Name.Ascii));
+        *ElementPtr = NULL;
+        return_VOID;
+    }
+#if 0
+    else if (ResolvedNode->Flags & ANOBJ_TEMPORARY)
+    {
+        /*
+         * A temporary node found here indicates that the reference is
+         * to a node that was created within this method. We are not
+         * going to allow it (especially if the package is returned
+         * from the method) -- the temporary node will be deleted out
+         * from under the method. (05/2017).
+         */
+        ACPI_ERROR ((AE_INFO,
+            "Package element refers to a temporary name [%4.4s], "
+            "inserting a NULL element",
+            ResolvedNode->Name.Ascii));
+        *ElementPtr = NULL;
+        return_VOID;
+    }
+#endif
+
+    /*
+     * Special handling for Alias objects. We need ResolvedNode to point
+     * to the Alias target. This effectively "resolves" the alias.
+     */
+    if (ResolvedNode->Type == ACPI_TYPE_LOCAL_ALIAS)
+    {
+        ResolvedNode = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE,
+            ResolvedNode->Object);
+    }
+
+    /* Update the reference object */
+
+    Element->Reference.Resolved = TRUE;
+    Element->Reference.Node = ResolvedNode;
+    Type = Element->Reference.Node->Type;
+
+    /*
+     * Attempt to resolve the node to a value before we insert it into
+     * the package. If this is a reference to a common data type,
+     * resolve it immediately. According to the ACPI spec, package
+     * elements can only be "data objects" or method references.
+     * Attempt to resolve to an Integer, Buffer, String or Package.
+     * If cannot, return the named reference (for things like Devices,
+     * Methods, etc.) Buffer Fields and Fields will resolve to simple
+     * objects (int/buf/str/pkg).
+     *
+     * NOTE: References to things like Devices, Methods, Mutexes, etc.
+     * will remain as named references. This behavior is not described
+     * in the ACPI spec, but it appears to be an oversight.
+     */
+    Status = AcpiExResolveNodeToValue (&ResolvedNode, NULL);
+    if (ACPI_FAILURE (Status))
+    {
+        return_VOID;
+    }
+
+#if 0
+/* TBD - alias support */
+    /*
+     * Special handling for Alias objects. We need to setup the type
+     * and the Op->Common.Node to point to the Alias target. Note,
+     * Alias has at most one level of indirection internally.
+     */
+    Type = Op->Common.Node->Type;
+    if (Type == ACPI_TYPE_LOCAL_ALIAS)
+    {
+        Type = ObjDesc->Common.Type;
+        Op->Common.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE,
+            Op->Common.Node->Object);
+    }
+#endif
+
+    switch (Type)
+    {
+    /*
+     * These object types are a result of named references, so we will
+     * leave them as reference objects. In other words, these types
+     * have no intrinsic "value".
+     */
+    case ACPI_TYPE_DEVICE:
+    case ACPI_TYPE_THERMAL:
+
+        /* TBD: This may not be necesssary */
+
+        AcpiUtAddReference (ResolvedNode->Object);
+        break;
+
+    case ACPI_TYPE_MUTEX:
+    case ACPI_TYPE_METHOD:
+    case ACPI_TYPE_POWER:
+    case ACPI_TYPE_PROCESSOR:
+    case ACPI_TYPE_EVENT:
+    case ACPI_TYPE_REGION:
+
+        break;
+
+    default:
+        /*
+         * For all other types - the node was resolved to an actual
+         * operand object with a value, return the object
+         */
+        *ElementPtr = (ACPI_OPERAND_OBJECT *) ResolvedNode;
+        break;
+    }
+
+    return_VOID;
+}
index 8fcf7bf..011e61b 100644 (file)
@@ -95,70 +95,39 @@ AcpiExCreateAlias (
     }
 
     /* Ensure that the target node is valid */
+
     if (!TargetNode)
     {
         return_ACPI_STATUS (AE_NULL_OBJECT);
     }
 
-    /*
-     * For objects that can never change (i.e., the NS node will
-     * permanently point to the same object), we can simply attach
-     * the object to the new NS node. For other objects (such as
-     * Integers, buffers, etc.), we have to point the Alias node
-     * to the original Node.
-     */
+    /* Construct the alias object (a namespace node) */
+
     switch (TargetNode->Type)
     {
-
-    /* For these types, the sub-object can change dynamically via a Store */
-
-    case ACPI_TYPE_INTEGER:
-    case ACPI_TYPE_STRING:
-    case ACPI_TYPE_BUFFER:
-    case ACPI_TYPE_PACKAGE:
-    case ACPI_TYPE_BUFFER_FIELD:
-    /*
-     * These types open a new scope, so we need the NS node in order to access
-     * any children.
-     */
-    case ACPI_TYPE_DEVICE:
-    case ACPI_TYPE_POWER:
-    case ACPI_TYPE_PROCESSOR:
-    case ACPI_TYPE_THERMAL:
-    case ACPI_TYPE_LOCAL_SCOPE:
-        /*
-         * The new alias has the type ALIAS and points to the original
-         * NS node, not the object itself.
-         */
-        AliasNode->Type = ACPI_TYPE_LOCAL_ALIAS;
-        AliasNode->Object = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, TargetNode);
-        break;
-
     case ACPI_TYPE_METHOD:
         /*
-         * Control method aliases need to be differentiated
+         * Control method aliases need to be differentiated with
+         * a special type
          */
         AliasNode->Type = ACPI_TYPE_LOCAL_METHOD_ALIAS;
-        AliasNode->Object = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, TargetNode);
         break;
 
     default:
-
-        /* Attach the original source object to the new Alias Node */
-
         /*
-         * The new alias assumes the type of the target, and it points
-         * to the same object. The reference count of the object has an
-         * additional reference to prevent deletion out from under either the
-         * target node or the alias Node
+         * All other object types.
+         *
+         * The new alias has the type ALIAS and points to the original
+         * NS node, not the object itself.
          */
-        Status = AcpiNsAttachObject (AliasNode,
-            AcpiNsGetAttachedObject (TargetNode), TargetNode->Type);
+        AliasNode->Type = ACPI_TYPE_LOCAL_ALIAS;
+        AliasNode->Object = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, TargetNode);
         break;
     }
 
     /* Since both operands are Nodes, we don't need to delete them */
 
+    AliasNode->Object = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, TargetNode);
     return_ACPI_STATUS (Status);
 }
 
index d869746..f4d81ee 100644 (file)
@@ -121,7 +121,7 @@ static ACPI_EXDUMP_INFO     AcpiExDumpPackage[6] =
     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpPackage),        NULL},
     {ACPI_EXD_NODE,     ACPI_EXD_OFFSET (Package.Node),                 "Parent Node"},
     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Package.Flags),                "Flags"},
-    {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (Package.Count),                "Elements"},
+    {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (Package.Count),                "Element Count"},
     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Package.Elements),             "Element List"},
     {ACPI_EXD_PACKAGE,  0,                                              NULL}
 };
@@ -402,6 +402,11 @@ AcpiExDumpObject (
 
     while (Count)
     {
+        if (!ObjDesc)
+        {
+            return;
+        }
+
         Target = ACPI_ADD_PTR (UINT8, ObjDesc, Info->Offset);
         Name = Info->Name;
 
@@ -414,7 +419,8 @@ AcpiExDumpObject (
         case ACPI_EXD_TYPE:
 
             AcpiOsPrintf ("%20s : %2.2X [%s]\n", "Type",
-                ObjDesc->Common.Type, AcpiUtGetObjectTypeName (ObjDesc));
+                ObjDesc->Common.Type,
+                AcpiUtGetObjectTypeName (ObjDesc));
             break;
 
         case ACPI_EXD_UINT8:
@@ -480,10 +486,10 @@ AcpiExDumpObject (
             Start = *ACPI_CAST_PTR (void *, Target);
             Next = Start;
 
-            AcpiOsPrintf ("%20s : %p", Name, Next);
+            AcpiOsPrintf ("%20s : %p ", Name, Next);
             if (Next)
             {
-                AcpiOsPrintf ("(%s %2.2X)",
+                AcpiOsPrintf ("%s (Type %2.2X)",
                     AcpiUtGetObjectTypeName (Next), Next->Common.Type);
 
                 while (Next->Common.NextObject)
@@ -506,6 +512,10 @@ AcpiExDumpObject (
                     }
                 }
             }
+            else
+            {
+                AcpiOsPrintf ("- No attached objects");
+            }
 
             AcpiOsPrintf ("\n");
             break;
@@ -1186,7 +1196,8 @@ AcpiExDumpPackageObj (
 
     default:
 
-        AcpiOsPrintf ("[Unknown Type] %X\n", ObjDesc->Common.Type);
+        AcpiOsPrintf ("[%s] Type: %2.2X\n",
+            AcpiUtGetTypeName (ObjDesc->Common.Type), ObjDesc->Common.Type);
         break;
     }
 }
@@ -1230,10 +1241,19 @@ AcpiExDumpObjectDescriptor (
     {
         AcpiExDumpNamespaceNode ((ACPI_NAMESPACE_NODE *) ObjDesc, Flags);
 
-        AcpiOsPrintf ("\nAttached Object (%p):\n",
-            ((ACPI_NAMESPACE_NODE *) ObjDesc)->Object);
-
         ObjDesc = ((ACPI_NAMESPACE_NODE *) ObjDesc)->Object;
+        if (!ObjDesc)
+        {
+            return_VOID;
+        }
+
+        AcpiOsPrintf ("\nAttached Object %p", ObjDesc);
+        if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED)
+        {
+            AcpiOsPrintf (" - Namespace Node");
+        }
+
+        AcpiOsPrintf (":\n");
         goto DumpObject;
     }
 
@@ -1257,6 +1277,11 @@ AcpiExDumpObjectDescriptor (
 
 DumpObject:
 
+    if (!ObjDesc)
+    {
+        return_VOID;
+    }
+
     /* Common Fields */
 
     AcpiExDumpObject (ObjDesc, AcpiExDumpCommon);
index 80d420c..67b8e11 100644 (file)
@@ -292,6 +292,8 @@ AcpiExDoLogicalNumericOp (
 
     default:
 
+        ACPI_ERROR ((AE_INFO,
+            "Invalid numeric logical opcode: %X", Opcode));
         Status = AE_AML_INTERNAL;
         break;
     }
@@ -377,6 +379,9 @@ AcpiExDoLogicalOp (
 
     default:
 
+        ACPI_ERROR ((AE_INFO,
+            "Invalid object type for logical operator: %X",
+            Operand0->Common.Type));
         Status = AE_AML_INTERNAL;
         break;
     }
@@ -426,6 +431,8 @@ AcpiExDoLogicalOp (
 
         default:
 
+            ACPI_ERROR ((AE_INFO,
+                "Invalid comparison opcode: %X", Opcode));
             Status = AE_AML_INTERNAL;
             break;
         }
@@ -504,6 +511,8 @@ AcpiExDoLogicalOp (
 
         default:
 
+            ACPI_ERROR ((AE_INFO,
+                "Invalid comparison opcode: %X", Opcode));
             Status = AE_AML_INTERNAL;
             break;
         }
index cbbb4b5..4c3113a 100644 (file)
@@ -448,6 +448,8 @@ AcpiExOpcode_2A_1T_1R (
 
         default:
 
+            ACPI_ERROR ((AE_INFO,
+                "Invalid object type: %X", (Operand[0])->Common.Type));
             Status = AE_AML_INTERNAL;
             goto Cleanup;
         }
index 0fe7ec2..e287932 100644 (file)
@@ -120,7 +120,7 @@ AcpiHwGetAccessBitWidth (
     }
     else if (Reg->AccessWidth)
     {
-        AccessBitWidth = (1 << (Reg->AccessWidth + 2));
+        AccessBitWidth = ACPI_ACCESS_BIT_WIDTH (Reg->AccessWidth);
     }
     else
     {
index 8d997c7..73ad5c1 100644 (file)
@@ -163,6 +163,7 @@ typedef enum
     ACPI_DMT_PCCT,
     ACPI_DMT_PMTT,
     ACPI_DMT_PPTT,
+    ACPI_DMT_SDEI,
     ACPI_DMT_SLIC,
     ACPI_DMT_SRAT,
 
@@ -419,6 +420,7 @@ extern ACPI_DMTABLE_INFO        AcpiDmTableInfoS3ptHdr[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoS3pt0[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoS3pt1[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSbst[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdei[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSlic[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSlit[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSpcr[];
index f66003c..89694bc 100644 (file)
@@ -301,6 +301,12 @@ AcpiDsInitializeObjects (
  * dsobject - Parser/Interpreter interface - object initialization and conversion
  */
 ACPI_STATUS
+AcpiDsBuildInternalObject (
+    ACPI_WALK_STATE         *WalkState,
+    ACPI_PARSE_OBJECT       *Op,
+    ACPI_OPERAND_OBJECT     **ObjDescPtr);
+
+ACPI_STATUS
 AcpiDsBuildInternalBufferObj (
     ACPI_WALK_STATE         *WalkState,
     ACPI_PARSE_OBJECT       *Op,
@@ -328,6 +334,17 @@ AcpiDsCreateNode (
     ACPI_PARSE_OBJECT       *Op);
 
 
+/*
+ * dspkginit - Package object initialization
+ */
+ACPI_STATUS
+AcpiDsInitPackageElement (
+    UINT8                   ObjectType,
+    ACPI_OPERAND_OBJECT     *SourceObject,
+    ACPI_GENERIC_STATE      *State,
+    void                    *Context);
+
+
 /*
  * dsutils - Parser/Interpreter interface utility routines
  */
index faf5bcf..b2906a7 100644 (file)
@@ -705,7 +705,7 @@ typedef struct acpi_update_state
 typedef struct acpi_pkg_state
 {
     ACPI_STATE_COMMON
-    UINT16                          Index;
+    UINT32                          Index;
     union acpi_operand_object       *SourceObject;
     union acpi_operand_object       *DestObject;
     struct acpi_walk_state          *WalkState;
index 9ef3973..3b7313a 100644 (file)
@@ -54,6 +54,7 @@
 #define METHOD_NAME__CLS        "_CLS"
 #define METHOD_NAME__CRS        "_CRS"
 #define METHOD_NAME__DDN        "_DDN"
+#define METHOD_NAME__DMA        "_DMA"
 #define METHOD_NAME__HID        "_HID"
 #define METHOD_NAME__INI        "_INI"
 #define METHOD_NAME__PLD        "_PLD"
index 2a43055..105e2a1 100644 (file)
@@ -438,11 +438,12 @@ typedef struct acpi_object_reference
     ACPI_OBJECT_COMMON_HEADER
     UINT8                           Class;              /* Reference Class */
     UINT8                           TargetType;         /* Used for Index Op */
-    UINT8                           Reserved;
+    UINT8                           Resolved;           /* Reference has been resolved to a value */
     void                            *Object;            /* NameOp=>HANDLE to obj, IndexOp=>ACPI_OPERAND_OBJECT */
     ACPI_NAMESPACE_NODE             *Node;              /* RefOf or Namepath */
     union acpi_operand_object       **Where;            /* Target of Index */
     UINT8                           *IndexPointer;      /* Used for Buffers and Strings */
+    UINT8                           *Aml;               /* Used for deferred resolution of the ref */
     UINT32                          Value;              /* Used for Local/Arg/Index/DdbHandle */
 
 } ACPI_OBJECT_REFERENCE;
@@ -463,7 +464,6 @@ typedef enum
 
 } ACPI_REFERENCE_CLASSES;
 
-
 /*
  * Extra object is used as additional storage for types that
  * have AML code in their declarations (TermArgs) that must be
index a6ff3bb..69303dc 100644 (file)
  * Note: The order of these include files is important.
  */
 #include "platform/acenv.h"     /* Environment-specific items */
-#include "acnames.h"            /* Common ACPI names and strings */
 #include "actypes.h"            /* ACPICA data types and structures */
+#include "platform/acenvex.h"   /* Extra environment-specific items */
+#include "acnames.h"            /* Common ACPI names and strings */
 #include "acexcep.h"            /* ACPICA exceptions */
 #include "actbl.h"              /* ACPI table definitions */
 #include "acoutput.h"           /* Error output and Debug macros */
 #include "acrestyp.h"           /* Resource Descriptor structs */
 #include "acpiosxf.h"           /* OSL interfaces (ACPICA-to-OS) */
 #include "acpixf.h"             /* ACPI core subsystem external interfaces */
-#include "platform/acenvex.h"   /* Extra environment-specific items */
 
 #endif /* __ACPI_H__ */
index 94398aa..e063533 100644 (file)
@@ -46,7 +46,7 @@
 
 /* Current ACPICA subsystem version in YYYYMMDD format */
 
-#define ACPI_CA_VERSION                 0x20170629
+#define ACPI_CA_VERSION                 0x20170728
 
 #include "acconfig.h"
 #include "actypes.h"
index cb1b638..a618a1f 100644 (file)
@@ -78,6 +78,7 @@
 #define ACPI_SIG_MCHI           "MCHI"      /* Management Controller Host Interface table */
 #define ACPI_SIG_MSDM           "MSDM"      /* Microsoft Data Management Table */
 #define ACPI_SIG_MTMR           "MTMR"      /* MID Timer table */
+#define ACPI_SIG_SDEI           "SDEI"      /* Software Delegated Exception Interface Table */
 #define ACPI_SIG_SLIC           "SLIC"      /* Software Licensing Description Table */
 #define ACPI_SIG_SPCR           "SPCR"      /* Serial Port Console Redirection table */
 #define ACPI_SIG_SPMI           "SPMI"      /* Server Platform Management Interface table */
@@ -1314,6 +1315,21 @@ typedef struct acpi_mtmr_entry
 
 } ACPI_MTMR_ENTRY;
 
+/*******************************************************************************
+ *
+ * SDEI - Software Delegated Exception Interface Descriptor Table
+ *
+ * Conforms to "Software Delegated Exception Interface (SDEI)" ARM DEN0054A,
+ * May 8th, 2017. Copyright 2017 ARM Ltd.
+ *
+ ******************************************************************************/
+
+typedef struct acpi_table_sdei
+{
+    ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
+
+} ACPI_TABLE_SDEI;
+
 
 /*******************************************************************************
  *
index b6d4080..4177ccb 100644 (file)
@@ -168,6 +168,7 @@ typedef UINT64                          ACPI_PHYSICAL_ADDRESS;
 #define ACPI_MAX_PTR                    ACPI_UINT64_MAX
 #define ACPI_SIZE_MAX                   ACPI_UINT64_MAX
 #define ACPI_USE_NATIVE_DIVIDE          /* Has native 64-bit integer support */
+#define ACPI_USE_NATIVE_MATH64          /* Has native 64-bit integer support */
 
 /*
  * In the case of the Itanium Processor Family (IPF), the hardware does not
@@ -567,6 +568,13 @@ typedef UINT64                          ACPI_INTEGER;
 #define ACPI_VALIDATE_RSDP_SIG(a)       (!strncmp (ACPI_CAST_PTR (char, (a)), ACPI_SIG_RSDP, 8))
 #define ACPI_MAKE_RSDP_SIG(dest)        (memcpy (ACPI_CAST_PTR (char, (dest)), ACPI_SIG_RSDP, 8))
 
+/*
+ * Algorithm to obtain access bit width.
+ * Can be used with AccessWidth of ACPI_GENERIC_ADDRESS and AccessSize of
+ * ACPI_RESOURCE_GENERIC_REGISTER.
+ */
+#define ACPI_ACCESS_BIT_WIDTH(size)     (1 << ((size) + 2))
+
 
 /*******************************************************************************
  *
index e560a6f..1450b85 100644 (file)
@@ -737,7 +737,7 @@ ACPI_GENERIC_STATE *
 AcpiUtCreatePkgState (
     void                    *InternalObject,
     void                    *ExternalObject,
-    UINT16                  Index);
+    UINT32                  Index);
 
 ACPI_STATUS
 AcpiUtCreateUpdateStateAndPush (
@@ -771,6 +771,24 @@ AcpiUtShortDivide (
     UINT64                  *OutQuotient,
     UINT32                  *OutRemainder);
 
+ACPI_STATUS
+AcpiUtShortMultiply (
+    UINT64                  InMultiplicand,
+    UINT32                  Multiplier,
+    UINT64                  *Outproduct);
+
+ACPI_STATUS
+AcpiUtShortShiftLeft (
+    UINT64                  Operand,
+    UINT32                  Count,
+    UINT64                  *OutResult);
+
+ACPI_STATUS
+AcpiUtShortShiftRight (
+    UINT64                  Operand,
+    UINT32                  Count,
+    UINT64                  *OutResult);
+
 
 /*
  * utmisc
index c1ca160..667e2c7 100644 (file)
@@ -72,6 +72,7 @@
 #define COMPILER_DEPENDENT_INT64    long long
 #define COMPILER_DEPENDENT_UINT64   unsigned long long
 #define ACPI_USE_NATIVE_DIVIDE
+#define ACPI_USE_NATIVE_MATH64
 #endif
 
 #ifndef __cdecl
index 30848af..a992b9d 100644 (file)
@@ -51,6 +51,7 @@
 #else
 #define ACPI_MACHINE_WIDTH              32
 #define ACPI_USE_NATIVE_DIVIDE
+#define ACPI_USE_NATIVE_MATH64
 #endif
 
 #define ACPI_UINTPTR_T                  uintptr_t
index c6f8c8b..8f80daf 100644 (file)
 #ifndef __ACEFI_H__
 #define __ACEFI_H__
 
+/*
+ * Single threaded environment where Mutex/Event/Sleep are fake. This model is
+ * sufficient for pre-boot AcpiExec.
+ */
+#ifndef DEBUGGER_THREADING
+#define DEBUGGER_THREADING          DEBUGGER_SINGLE_THREADED
+#endif /* !DEBUGGER_THREADING */
+
 /* EDK2 EFI environemnt */
 
 #if defined(_EDK2_EFI)
 
-#define _GNU_EFI
+#ifdef USE_STDLIB
+#define ACPI_USE_STANDARD_HEADERS
+#define ACPI_USE_SYSTEM_CLIBRARY
+#define ACPI_USE_NATIVE_DIVIDE
+#define ACPI_USE_NATIVE_MATH64
+#endif
 
 #endif
 
 
 #endif
 
+#ifndef USE_STDLIB
 #define UINTN       uint64_t
 #define INTN        int64_t
+#endif
 
 #define ACPI_EFI_ERR(a)             (0x8000000000000000 | a)
 
 
 #define ACPI_MACHINE_WIDTH          32
 
+#ifndef USE_STDLIB
 #define UINTN       uint32_t
 #define INTN        int32_t
+#endif
 
 #define ACPI_EFI_ERR(a)             (0x80000000 | a)
 
@@ -218,26 +235,59 @@ UINT64 efi_call10(void *func, UINT64 arg1, UINT64 arg2, UINT64 arg3,
 #endif
 
 
-/* GNU EFI definitions */
-
-#if defined(_GNU_EFI)
+/* EFI math64 definitions */
 
+#if defined(_GNU_EFI) || defined(_EDK2_EFI)
 /*
- * Math helpers
+ * Math helpers, GNU EFI provided a platform independent 64-bit math
+ * support.
  */
-#define ACPI_DIV_64_BY_32(n_hi, n_lo, d32, q32, r32) \
+#ifndef ACPI_DIV_64_BY_32
+#define ACPI_DIV_64_BY_32(n_hi, n_lo, d32, q32, r32)         \
+    do {                                                     \
+        UINT64 __n = ((UINT64) n_hi) << 32 | (n_lo);         \
+        (q32) = (UINT32) DivU64x32 ((__n), (d32), &(r32));   \
+    } while (0)
+#endif
+
+#ifndef ACPI_MUL_64_BY_32
+#define ACPI_MUL_64_BY_32(n_hi, n_lo, m32, p32, c32) \
+    do {                                             \
+        UINT64 __n = ((UINT64) n_hi) << 32 | (n_lo); \
+        UINT64 __p = MultU64x32 (__n, (m32));        \
+        (p32) = (UINT32) __p;                        \
+        (c32) = (UINT32) (__p >> 32);                \
+    } while (0)
+#endif
+
+#ifndef ACPI_SHIFT_LEFT_64_by_32
+#define ACPI_SHIFT_LEFT_64_BY_32(n_hi, n_lo, s32)    \
+    do {                                             \
+        UINT64 __n = ((UINT64) n_hi) << 32 | (n_lo); \
+        UINT64 __r = LShiftU64 (__n, (s32));         \
+        (n_lo) = (UINT32) __r;                       \
+        (n_hi) = (UINT32) (__r >> 32);               \
+    } while (0)
+#endif
+
+#ifndef ACPI_SHIFT_RIGHT_64_BY_32
+#define ACPI_SHIFT_RIGHT_64_BY_32(n_hi, n_lo, s32)   \
     do {                                             \
         UINT64 __n = ((UINT64) n_hi) << 32 | (n_lo); \
-        (q32) = DivU64x32 ((__n), (d32), &(r32));    \
+        UINT64 __r = RShiftU64 (__n, (s32));         \
+        (n_lo) = (UINT32) __r;                       \
+        (n_hi) = (UINT32) (__r >> 32);               \
     } while (0)
+#endif
 
+#ifndef ACPI_SHIFT_RIGHT_64
 #define ACPI_SHIFT_RIGHT_64(n_hi, n_lo) \
     do {                                \
         (n_lo) >>= 1;                   \
         (n_lo) |= (((n_hi) & 1) << 31); \
         (n_hi) >>= 1;                   \
     } while (0)
-
+#endif
 #endif
 
 struct _ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE;
@@ -245,17 +295,21 @@ struct _ACPI_SIMPLE_INPUT_INTERFACE;
 struct _ACPI_EFI_FILE_IO_INTERFACE;
 struct _ACPI_EFI_FILE_HANDLE;
 struct _ACPI_EFI_BOOT_SERVICES;
+struct _ACPI_EFI_RUNTIME_SERVICES;
 struct _ACPI_EFI_SYSTEM_TABLE;
 struct _ACPI_EFI_PCI_IO;
 
 extern struct _ACPI_EFI_SYSTEM_TABLE        *ST;
 extern struct _ACPI_EFI_BOOT_SERVICES       *BS;
+extern struct _ACPI_EFI_RUNTIME_SERVICES    *RT;
 
+#ifndef USE_STDLIB
 typedef union acpi_efi_file ACPI_EFI_FILE;
 #define FILE                ACPI_EFI_FILE
 
 extern FILE                 *stdin;
 extern FILE                 *stdout;
 extern FILE                 *stderr;
+#endif
 
 #endif /* __ACEFI_H__ */
index 859d77e..426cdf3 100644 (file)
@@ -487,6 +487,11 @@ ACPI_EFI_STATUS
     ACPI_EFI_HANDLE                 ImageHandle);
 
 
+typedef
+ACPI_EFI_STATUS
+(ACPI_EFI_API *ACPI_EFI_STALL) (
+    UINTN                           Microseconds);
+
 typedef
 ACPI_EFI_STATUS
 (ACPI_EFI_API *ACPI_EFI_SET_WATCHDOG_TIMER) (
@@ -556,6 +561,27 @@ ACPI_EFI_STATUS
     VOID                            *Buffer);
 
 
+/*
+ * EFI Time
+ */
+typedef struct {
+    UINT32 Resolution;
+    UINT32 Accuracy;
+    BOOLEAN SetsToZero;
+} ACPI_EFI_TIME_CAPABILITIES;
+
+typedef
+ACPI_EFI_STATUS
+(ACPI_EFI_API *ACPI_EFI_GET_TIME) (
+    ACPI_EFI_TIME                   *Time,
+    ACPI_EFI_TIME_CAPABILITIES      *Capabilities);
+
+typedef
+ACPI_EFI_STATUS
+(ACPI_EFI_API *ACPI_EFI_SET_TIME) (
+    ACPI_EFI_TIME                   *Time);
+
+
 /*
  * Protocol handler functions
  */
@@ -782,12 +808,11 @@ typedef struct _ACPI_EFI_BOOT_SERVICES {
 #if 0
     ACPI_EFI_EXIT_BOOT_SERVICES         ExitBootServices;
     ACPI_EFI_GET_NEXT_MONOTONIC_COUNT   GetNextMonotonicCount;
-    ACPI_EFI_STALL                      Stall;
 #else
     ACPI_EFI_UNKNOWN_INTERFACE          ExitBootServices;
     ACPI_EFI_UNKNOWN_INTERFACE          GetNextMonotonicCount;
-    ACPI_EFI_UNKNOWN_INTERFACE          Stall;
 #endif
+    ACPI_EFI_STALL                      Stall;
     ACPI_EFI_SET_WATCHDOG_TIMER         SetWatchdogTimer;
 
 #if 0
@@ -820,6 +845,54 @@ typedef struct _ACPI_EFI_BOOT_SERVICES {
 } ACPI_EFI_BOOT_SERVICES;
 
 
+/*
+ * EFI Runtime Services Table
+ */
+#define ACPI_EFI_RUNTIME_SERVICES_SIGNATURE 0x56524553544e5552
+#define ACPI_EFI_RUNTIME_SERVICES_REVISION  (EFI_SPECIFICATION_MAJOR_REVISION<<16) | (EFI_SPECIFICATION_MINOR_REVISION)
+
+typedef struct _ACPI_EFI_RUNTIME_SERVICES {
+    ACPI_EFI_TABLE_HEADER               Hdr;
+
+    ACPI_EFI_GET_TIME                   GetTime;
+    ACPI_EFI_SET_TIME                   SetTime;
+#if 0
+    ACPI_EFI_GET_WAKEUP_TIME            GetWakeupTime;
+    ACPI_EFI_SET_WAKEUP_TIME            SetWakeupTime;
+#else
+    ACPI_EFI_UNKNOWN_INTERFACE          GetWakeupTime;
+    ACPI_EFI_UNKNOWN_INTERFACE          SetWakeupTime;
+#endif
+
+#if 0
+    ACPI_EFI_SET_VIRTUAL_ADDRESS_MAP    SetVirtualAddressMap;
+    ACPI_EFI_CONVERT_POINTER            ConvertPointer;
+#else
+    ACPI_EFI_UNKNOWN_INTERFACE          SetVirtualAddressMap;
+    ACPI_EFI_UNKNOWN_INTERFACE          ConvertPointer;
+#endif
+
+#if 0
+    ACPI_EFI_GET_VARIABLE               GetVariable;
+    ACPI_EFI_GET_NEXT_VARIABLE_NAME     GetNextVariableName;
+    ACPI_EFI_SET_VARIABLE               SetVariable;
+#else
+    ACPI_EFI_UNKNOWN_INTERFACE          GetVariable;
+    ACPI_EFI_UNKNOWN_INTERFACE          GetNextVariableName;
+    ACPI_EFI_UNKNOWN_INTERFACE          SetVariable;
+#endif
+
+#if 0
+    ACPI_EFI_GET_NEXT_HIGH_MONO_COUNT   GetNextHighMonotonicCount;
+    ACPI_EFI_RESET_SYSTEM               ResetSystem;
+#else
+    ACPI_EFI_UNKNOWN_INTERFACE          GetNextHighMonotonicCount;
+    ACPI_EFI_UNKNOWN_INTERFACE          ResetSystem;
+#endif
+
+} ACPI_EFI_RUNTIME_SERVICES;
+
+
 /*
  * EFI System Table
  */
@@ -856,11 +929,7 @@ typedef struct _ACPI_EFI_SYSTEM_TABLE {
     ACPI_EFI_HANDLE                     StandardErrorHandle;
     ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE   *StdErr;
 
-#if 0
     ACPI_EFI_RUNTIME_SERVICES           *RuntimeServices;
-#else
-    ACPI_EFI_HANDLE                     *RuntimeServices;
-#endif
     ACPI_EFI_BOOT_SERVICES              *BootServices;
 
     UINTN                               NumberOfTableEntries;
@@ -943,19 +1012,34 @@ union acpi_efi_file {
 };
 
 
-/* GNU EFI definitions */
+/* EFI definitions */
 
-#if defined(_GNU_EFI)
+#if defined(_GNU_EFI) || defined(_EDK2_EFI)
 
 /*
  * This is needed to hide platform specific code from ACPICA
  */
-UINT64
+UINT64 ACPI_EFI_API
 DivU64x32 (
     UINT64                  Dividend,
     UINTN                   Divisor,
     UINTN                   *Remainder);
 
+UINT64 ACPI_EFI_API
+MultU64x32 (
+    UINT64                  Multiplicand,
+    UINTN                   Multiplier);
+
+UINT64 ACPI_EFI_API
+LShiftU64 (
+    UINT64                  Operand,
+    UINTN                   Count);
+
+UINT64 ACPI_EFI_API
+RShiftU64 (
+    UINT64                  Operand,
+    UINTN                   Count);
+
 /*
  * EFI specific prototypes
  */
@@ -969,7 +1053,6 @@ acpi_main (
     int                     argc,
     char                    *argv[]);
 
-
 #endif
 
 extern ACPI_EFI_GUID AcpiGbl_LoadedImageProtocol;
index 211b379..5341802 100644 (file)
@@ -61,6 +61,7 @@
 #define ACPI_USE_DO_WHILE_0
 #define ACPI_USE_LOCAL_CACHE
 #define ACPI_USE_NATIVE_DIVIDE
+#define ACPI_USE_NATIVE_MATH64
 #define ACPI_USE_SYSTEM_CLIBRARY
 
 #ifdef _KERNEL
index 7964d0e..6b70a50 100644 (file)
@@ -84,6 +84,9 @@ typedef __builtin_va_list       va_list;
 
 #define COMPILER_VA_MACRO               1
 
+/* GCC supports native multiply/shift on 32-bit platforms */
+
+#define ACPI_USE_NATIVE_MATH64
 
 #ifdef __REACTOS__
 /* Flush CPU cache - used when going to sleep. Wbinvd or similar. */
@@ -135,19 +138,5 @@ do {                                                        \
         :"=a"(Acq):"a"(0),"c"(FacsPtr),"i"(~3L):"edx");\
 } while(0)
 
-
-#define ACPI_DIV_64_BY_32(n_hi, n_lo, d32, q32, r32)                \
-{                                                                   \
-    asm("divl %4;"                                                  \
-        :"=a"(q32),"=d"(r32):"a"(n_lo),"d"(n_hi),"rm"(d32):"cc");   \
-}
-
-#define ACPI_SHIFT_RIGHT_64(n_hi, n_lo)                     \
-{                                                           \
-    asm("shrl $1, %0;"                                      \
-        "rcrl $1, %1;"                                      \
-        :"=rm"(n_hi),"=rm"(n_lo):"0"(n_hi),"1"(n_lo):"cc"); \
-}
-
 #endif /* __REACTOS__ */
 #endif /* __ACGCC_H__ */
index 6b7da88..a7fcd84 100644 (file)
@@ -58,6 +58,7 @@ struct mutex;
 #define ACPI_MUTEX                  struct mutex *
 
 #define ACPI_USE_NATIVE_DIVIDE
+#define ACPI_USE_NATIVE_MATH64
 
 /* #define ACPI_THREAD_ID               thread_id */
 
index 2e92a85..92929fb 100644 (file)
 /* Host-dependent types and defines for in-kernel ACPICA */
 
 #define ACPI_MACHINE_WIDTH          BITS_PER_LONG
+#define ACPI_USE_NATIVE_MATH64
 #define ACPI_EXPORT_SYMBOL(symbol)  EXPORT_SYMBOL(symbol);
 #define strtoul                     simple_strtoul
 
 #define COMPILER_DEPENDENT_INT64    long long
 #define COMPILER_DEPENDENT_UINT64   unsigned long long
 #define ACPI_USE_NATIVE_DIVIDE
+#define ACPI_USE_NATIVE_MATH64
 #endif
 
 #ifndef __cdecl
index 9147fd7..db302ad 100644 (file)
  * out if these are actually defined.
  */
 
-/*
- * Map low I/O functions for MS. This allows us to disable MS language
- * extensions for maximum portability.
- */
-#define open            _open
-#define read            _read
-#define write           _write
-#define close           _close
-#define stat            _stat
-#define fstat           _fstat
-#define mkdir           _mkdir
-#define snprintf        _snprintf
-#if _MSC_VER <= 1200 /* Versions below VC++ 6 */
-#define vsnprintf       _vsnprintf
-#endif
-#define O_RDONLY        _O_RDONLY
-#define O_BINARY        _O_BINARY
-#define O_CREAT         _O_CREAT
-#define O_WRONLY        _O_WRONLY
-#define O_TRUNC         _O_TRUNC
-#define S_IREAD         _S_IREAD
-#define S_IWRITE        _S_IWRITE
-#define S_IFDIR         _S_IFDIR
-
 /* Eliminate warnings for "old" (non-secure) versions of clib functions */
 
 #ifndef _CRT_SECURE_NO_WARNINGS
 
 /* Do not maintain the architecture specific stuffs for the EFI ports */
 
-#if !defined(_EDK2_EFI) && !defined(_GNU_EFI)
-#ifndef _LINT
+#if defined(__i386__) && !defined(_GNU_EFI) && !defined(_EDK2_EFI)
 /*
  * Math helper functions
  */
+#ifndef ACPI_DIV_64_BY_32
 #define ACPI_DIV_64_BY_32(n_hi, n_lo, d32, q32, r32) \
 {                           \
     __asm mov    edx, n_hi  \
     __asm mov    q32, eax   \
     __asm mov    r32, edx   \
 }
+#endif
 
-#define ACPI_SHIFT_RIGHT_64(n_hi, n_lo) \
+#ifndef ACPI_MUL_64_BY_32
+#define ACPI_MUL_64_BY_32(n_hi, n_lo, m32, p32, c32) \
 {                           \
-    __asm shr    n_hi, 1    \
-    __asm rcr    n_lo, 1    \
+    __asm mov    edx, n_hi  \
+    __asm mov    eax, n_lo  \
+    __asm mul    m32        \
+    __asm mov    p32, eax   \
+    __asm mov    c32, edx   \
 }
-#else
+#endif
 
-/* Fake versions to make lint happy */
+#ifndef ACPI_SHIFT_LEFT_64_BY_32
+#define ACPI_SHIFT_LEFT_64_BY_32(n_hi, n_lo, s32) \
+{                               \
+    __asm mov    edx, n_hi      \
+    __asm mov    eax, n_lo      \
+    __asm mov    ecx, s32       \
+    __asm and    ecx, 31        \
+    __asm shld   edx, eax, cl   \
+    __asm shl    eax, cl        \
+    __asm mov    n_hi, edx      \
+    __asm mov    n_lo, eax      \
+}
+#endif
 
-#define ACPI_DIV_64_BY_32(n_hi, n_lo, d32, q32, r32) \
-{                           \
-    q32 = n_hi / d32;       \
-    r32 = n_lo / d32;       \
+#ifndef ACPI_SHIFT_RIGHT_64_BY_32
+#define ACPI_SHIFT_RIGHT_64_BY_32(n_hi, n_lo, s32) \
+{                               \
+    __asm mov    edx, n_hi      \
+    __asm mov    eax, n_lo      \
+    __asm mov    ecx, s32       \
+    __asm and    ecx, 31        \
+    __asm shrd   eax, edx, cl   \
+    __asm shr    edx, cl        \
+    __asm mov    n_hi, edx      \
+    __asm mov    n_lo, eax      \
 }
+#endif
 
+#ifndef ACPI_SHIFT_RIGHT_64
 #define ACPI_SHIFT_RIGHT_64(n_hi, n_lo) \
 {                           \
-    n_hi >>= 1;    \
-    n_lo >>= 1;    \
+    __asm shr    n_hi, 1    \
+    __asm rcr    n_lo, 1    \
 }
 #endif
 #endif
index 5bccbf5..dfa5ec0 100644 (file)
@@ -70,6 +70,7 @@
 #define asm         __asm
 
 #define ACPI_USE_NATIVE_DIVIDE
+#define ACPI_USE_NATIVE_MATH64
 
 #define ACPI_SYSTEM_XFACE
 #define ACPI_EXTERNAL_XFACE
 /* Always use NetBSD code over our local versions */
 #define ACPI_USE_SYSTEM_CLIBRARY
 #define ACPI_USE_NATIVE_DIVIDE
+#define ACPI_USE_NATIVE_MATH64
 
 #endif /* __ACNETBSD_H__ */
index 43776aa..9097ba2 100644 (file)
@@ -56,6 +56,7 @@
 #define COMPILER_DEPENDENT_INT64    long long
 #define COMPILER_DEPENDENT_UINT64   unsigned long long
 #define ACPI_USE_NATIVE_DIVIDE
+#define ACPI_USE_NATIVE_MATH64
 
 #define ACPI_SYSTEM_XFACE           APIENTRY
 #define ACPI_EXTERNAL_XFACE         APIENTRY
index 0d91b52..9dcabc8 100644 (file)
@@ -66,5 +66,6 @@
 #define __cdecl
 
 #define ACPI_USE_NATIVE_DIVIDE
+#define ACPI_USE_NATIVE_MATH64
 
 #endif /* __ACQNX_H__ */
index 0ad747c..b86daa7 100644 (file)
@@ -48,6 +48,8 @@
 #define ACPI_USE_SYSTEM_CLIBRARY
 
 #define ACPI_MACHINE_WIDTH      32
+#define ACPI_USE_NATIVE_DIVIDE
+#define ACPI_USE_NATIVE_MATH64
 
 #ifdef ACPI_DEFINE_ALTERNATE_TYPES
 /*
@@ -62,6 +64,30 @@ typedef unsigned int                    u32;
 typedef COMPILER_DEPENDENT_UINT64       u64;
 #endif
 
+/*
+ * Map low I/O functions for MS. This allows us to disable MS language
+ * extensions for maximum portability.
+ */
+#define open            _open
+#define read            _read
+#define write           _write
+#define close           _close
+#define stat            _stat
+#define fstat           _fstat
+#define mkdir           _mkdir
+#define snprintf        _snprintf
+#if _MSC_VER <= 1200 /* Versions below VC++ 6 */
+#define vsnprintf       _vsnprintf
+#endif
+#define O_RDONLY        _O_RDONLY
+#define O_BINARY        _O_BINARY
+#define O_CREAT         _O_CREAT
+#define O_WRONLY        _O_WRONLY
+#define O_TRUNC         _O_TRUNC
+#define S_IREAD         _S_IREAD
+#define S_IWRITE        _S_IWRITE
+#define S_IFDIR         _S_IFDIR
+
 
 /*
  * Handle platform- and compiler-specific assembly language differences.
index 9585b24..1cb4cf0 100644 (file)
 
 #define ACPI_MACHINE_WIDTH          64
 
+/*
+ * Map low I/O functions for MS. This allows us to disable MS language
+ * extensions for maximum portability.
+ */
+#define open            _open
+#define read            _read
+#define write           _write
+#define close           _close
+#define stat            _stat
+#define fstat           _fstat
+#define mkdir           _mkdir
+#define snprintf        _snprintf
+#if _MSC_VER <= 1200 /* Versions below VC++ 6 */
+#define vsnprintf       _vsnprintf
+#endif
+#define O_RDONLY        _O_RDONLY
+#define O_BINARY        _O_BINARY
+#define O_CREAT         _O_CREAT
+#define O_WRONLY        _O_WRONLY
+#define O_TRUNC         _O_TRUNC
+#define S_IREAD         _S_IREAD
+#define S_IWRITE        _S_IWRITE
+#define S_IFDIR         _S_IFDIR
+
 /*
  * Handle platform- and compiler-specific assembly language differences.
  *
index f176c73..4c6307c 100644 (file)
@@ -302,6 +302,7 @@ AcpiNsLookup (
 {
     ACPI_STATUS             Status;
     char                    *Path = Pathname;
+    char                    *ExternalPath;
     ACPI_NAMESPACE_NODE     *PrefixNode;
     ACPI_NAMESPACE_NODE     *CurrentNode = NULL;
     ACPI_NAMESPACE_NODE     *ThisNode = NULL;
@@ -448,11 +449,21 @@ AcpiNsLookup (
                 ThisNode = ThisNode->Parent;
                 if (!ThisNode)
                 {
-                    /* Current scope has no parent scope */
+                    /*
+                     * Current scope has no parent scope. Externalize
+                     * the internal path for error message.
+                     */
+                    Status = AcpiNsExternalizeName (ACPI_UINT32_MAX, Pathname,
+                        NULL, &ExternalPath);
+                    if (ACPI_SUCCESS (Status))
+                    {
+                        ACPI_ERROR ((AE_INFO,
+                            "%s: Path has too many parent prefixes (^)",
+                            ExternalPath));
+
+                        ACPI_FREE (ExternalPath);
+                    }
 
-                    ACPI_ERROR ((AE_INFO,
-                        "%s: Path has too many parent prefixes (^) "
-                        "- reached beyond root node", Pathname));
                     return_ACPI_STATUS (AE_NOT_FOUND);
                 }
             }
index c072188..ec17fc7 100644 (file)
@@ -75,9 +75,14 @@ AcpiNsCheckArgumentTypes (
     UINT32                      i;
 
 
-    /* If not a predefined name, cannot typecheck args */
-
-    if (!Info->Predefined)
+    /*
+     * If not a predefined name, cannot typecheck args, because
+     * we have no idea what argument types are expected.
+     * Also, ignore typecheck if warnings/errors if this method
+     * has already been evaluated at least once -- in order
+     * to suppress repetitive messages.
+     */
+    if (!Info->Predefined || (Info->Node->Flags & ANOBJ_EVALUATED))
     {
         return;
     }
@@ -99,6 +104,10 @@ AcpiNsCheckArgumentTypes (
                 "Found [%s], ACPI requires [%s]", (i + 1),
                 AcpiUtGetTypeName (UserArgType),
                 AcpiUtGetTypeName (ArgType)));
+
+            /* Prevent any additional typechecking for this method */
+
+            Info->Node->Flags |= ANOBJ_EVALUATED;
         }
     }
 }
@@ -130,7 +139,7 @@ AcpiNsCheckAcpiCompliance (
     UINT32                      RequiredParamCount;
 
 
-    if (!Predefined)
+    if (!Predefined || (Node->Flags & ANOBJ_EVALUATED))
     {
         return;
     }
@@ -224,6 +233,11 @@ AcpiNsCheckArgumentCount (
     UINT32                      RequiredParamCount;
 
 
+    if (Node->Flags & ANOBJ_EVALUATED)
+    {
+        return;
+    }
+
     if (!Predefined)
     {
         /*
index fcf7874..4a6134a 100644 (file)
@@ -427,6 +427,20 @@ AcpiNsInitOneObject (
 
         Info->PackageInit++;
         Status = AcpiDsGetPackageArguments (ObjDesc);
+        if (ACPI_FAILURE (Status))
+        {
+            break;
+        }
+
+        /*
+         * Resolve all named references in package objects (and all
+         * sub-packages). This action has been deferred until the entire
+         * namespace has been loaded, in order to support external and
+         * forward references from individual package elements (05/2017).
+         */
+        Status = AcpiUtWalkPackageTree (ObjDesc, NULL,
+            AcpiDsInitPackageElement, NULL);
+        ObjDesc->Package.Flags |= AOPOBJ_DATA_VALID;
         break;
 
     default:
index 0ca3514..0df136a 100644 (file)
@@ -100,8 +100,15 @@ AcpiNsGetPathnameLength (
     ACPI_SIZE               Size;
 
 
-    ACPI_FUNCTION_ENTRY ();
+    /* Validate the Node */
 
+    if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED)
+    {
+        ACPI_ERROR ((AE_INFO,
+            "Invalid/cached reference target node: %p, descriptor type %d",
+            Node, ACPI_GET_DESCRIPTOR_TYPE (Node)));
+        return (0);
+    }
 
     Size = AcpiNsBuildNormalizedPath (Node, NULL, 0, FALSE);
     return (Size);
index 1e38021..36b29bf 100644 (file)
@@ -614,6 +614,8 @@ AcpiNsCheckPackageList (
 
         default: /* Should not get here, type was validated by caller */
 
+            ACPI_ERROR ((AE_INFO, "Invalid Package type: %X",
+                Package->RetInfo.Type));
             return (AE_AML_INTERNAL);
         }
 
index 9ff8bcf..68fe72b 100644 (file)
@@ -174,6 +174,9 @@ AcpiPsGetArguments (
             INCREMENT_ARG_LIST (WalkState->ArgTypes);
         }
 
+        ACPI_DEBUG_PRINT ((ACPI_DB_PARSE,
+            "Final argument count: %u pass %u\n",
+            WalkState->ArgCount, WalkState->PassNumber));
 
         /*
          * Handle executable code at "module-level". This refers to
@@ -272,6 +275,10 @@ AcpiPsGetArguments (
                 (Op->Common.Parent->Common.AmlOpcode == AML_NAME_OP) &&
                 (WalkState->PassNumber <= ACPI_IMODE_LOAD_PASS2))
             {
+                ACPI_DEBUG_PRINT ((ACPI_DB_PARSE,
+                    "Setup Package/Buffer: Pass %u, AML Ptr: %p\n",
+                    WalkState->PassNumber, AmlOpStart));
+
                 /*
                  * Skip parsing of Buffers and Packages because we don't have
                  * enough info in the first pass to parse them correctly.
@@ -581,6 +588,9 @@ AcpiPsParseLoop (
 
         /* Check for arguments that need to be processed */
 
+        ACPI_DEBUG_PRINT ((ACPI_DB_PARSE,
+            "Parseloop: argument count: %u\n", WalkState->ArgCount));
+
         if (WalkState->ArgCount)
         {
             /*
index 7ce8b61..5d8881b 100644 (file)
@@ -688,7 +688,7 @@ ACPI_EXPORT_SYMBOL (AcpiWalkResourceBuffer)
  *                                device we are querying
  *              Name            - Method name of the resources we want.
  *                                (METHOD_NAME__CRS, METHOD_NAME__PRS, or
- *                                METHOD_NAME__AEI)
+ *                                METHOD_NAME__AEI or METHOD_NAME__DMA)
  *              UserFunction    - Called for each resource
  *              Context         - Passed to UserFunction
  *
@@ -719,12 +719,13 @@ AcpiWalkResources (
     if (!DeviceHandle || !UserFunction || !Name ||
         (!ACPI_COMPARE_NAME (Name, METHOD_NAME__CRS) &&
          !ACPI_COMPARE_NAME (Name, METHOD_NAME__PRS) &&
-         !ACPI_COMPARE_NAME (Name, METHOD_NAME__AEI)))
+         !ACPI_COMPARE_NAME (Name, METHOD_NAME__AEI) &&
+         !ACPI_COMPARE_NAME (Name, METHOD_NAME__DMA)))
     {
         return_ACPI_STATUS (AE_BAD_PARAMETER);
     }
 
-    /* Get the _CRS/_PRS/_AEI resource list */
+    /* Get the _CRS/_PRS/_AEI/_DMA resource list */
 
     Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
     Status = AcpiRsGetMethodData (DeviceHandle, Name, &Buffer);
index 97c6890..0a18b8b 100644 (file)
@@ -540,6 +540,8 @@ AcpiTbCheckDuplication (
  *
  * DESCRIPTION: This function is called to validate and verify the table, the
  *              returned table descriptor is in "VALIDATED" state.
+ *              Note that 'TableIndex' is required to be set to !NULL to
+ *              enable duplication check.
  *
  *****************************************************************************/
 
index 17e23ba..a34e445 100644 (file)
@@ -185,7 +185,7 @@ AcpiReallocateRootTable (
 {
     ACPI_STATUS             Status;
     ACPI_TABLE_DESC         *TableDesc;
-    UINT32                  i;
+    UINT32                  i, j;
 
 
     ACPI_FUNCTION_TRACE (AcpiReallocateRootTable);
@@ -231,7 +231,7 @@ AcpiReallocateRootTable (
             TableDesc = &AcpiGbl_RootTableList.Tables[i];
             if (!(TableDesc->Flags & ACPI_TABLE_IS_VERIFIED))
             {
-                Status = AcpiTbVerifyTempTable (TableDesc, NULL, NULL);
+                Status = AcpiTbVerifyTempTable (TableDesc, NULL, &j);
                 if (ACPI_FAILURE (Status))
                 {
                     AcpiTbUninstallTable (TableDesc);
index 3d3bda7..17fc94c 100644 (file)
@@ -654,7 +654,7 @@ strstr (
     char                    *String1,
     char                    *String2)
 {
-    UINT32                  Length;
+    ACPI_SIZE               Length;
 
 
     Length = strlen (String2);
index 5fe8151..667b996 100644 (file)
@@ -75,8 +75,10 @@ AcpiUtHexToAsciiChar (
     UINT64                  Integer,
     UINT32                  Position)
 {
+    UINT64                  Index;
 
-    return (AcpiGbl_HexToAscii[(Integer >> Position) & 0xF]);
+    AcpiUtShortShiftRight (Integer, Position, &Index);
+    return (AcpiGbl_HexToAscii[Index & 0xF]);
 }
 
 
index e803f75..758b8bf 100644 (file)
 #define _COMPONENT          ACPI_UTILITIES
         ACPI_MODULE_NAME    ("utmath")
 
-/*
- * Optional support for 64-bit double-precision integer divide. This code
- * is configurable and is implemented in order to support 32-bit kernel
- * environments where a 64-bit double-precision math library is not available.
- *
- * Support for a more normal 64-bit divide/modulo (with check for a divide-
- * by-zero) appears after this optional section of code.
- */
-#ifndef ACPI_USE_NATIVE_DIVIDE
-
 /* Structures used only for 64-bit divide */
 
 typedef struct uint64_struct
@@ -74,6 +64,257 @@ typedef union uint64_overlay
 
 } UINT64_OVERLAY;
 
+/*
+ * Optional support for 64-bit double-precision integer multiply and shift.
+ * This code is configurable and is implemented in order to support 32-bit
+ * kernel environments where a 64-bit double-precision math library is not
+ * available.
+ */
+#ifndef ACPI_USE_NATIVE_MATH64
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiUtShortMultiply
+ *
+ * PARAMETERS:  Multiplicand        - 64-bit multiplicand
+ *              Multiplier          - 32-bit multiplier
+ *              OutProduct          - Pointer to where the product is returned
+ *
+ * DESCRIPTION: Perform a short multiply.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtShortMultiply (
+    UINT64                  Multiplicand,
+    UINT32                  Multiplier,
+    UINT64                  *OutProduct)
+{
+    UINT64_OVERLAY          MultiplicandOvl;
+    UINT64_OVERLAY          Product;
+    UINT32                  Carry32;
+
+
+    ACPI_FUNCTION_TRACE (UtShortMultiply);
+
+
+    MultiplicandOvl.Full = Multiplicand;
+
+    /*
+     * The Product is 64 bits, the carry is always 32 bits,
+     * and is generated by the second multiply.
+     */
+    ACPI_MUL_64_BY_32 (0, MultiplicandOvl.Part.Hi, Multiplier,
+        Product.Part.Hi, Carry32);
+
+    ACPI_MUL_64_BY_32 (0, MultiplicandOvl.Part.Lo, Multiplier,
+        Product.Part.Lo, Carry32);
+
+    Product.Part.Hi += Carry32;
+
+    /* Return only what was requested */
+
+    if (OutProduct)
+    {
+        *OutProduct = Product.Full;
+    }
+
+    return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiUtShortShiftLeft
+ *
+ * PARAMETERS:  Operand             - 64-bit shift operand
+ *              Count               - 32-bit shift count
+ *              OutResult           - Pointer to where the result is returned
+ *
+ * DESCRIPTION: Perform a short left shift.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtShortShiftLeft (
+    UINT64                  Operand,
+    UINT32                  Count,
+    UINT64                  *OutResult)
+{
+    UINT64_OVERLAY          OperandOvl;
+
+
+    ACPI_FUNCTION_TRACE (UtShortShiftLeft);
+
+
+    OperandOvl.Full = Operand;
+
+    if ((Count & 63) >= 32)
+    {
+        OperandOvl.Part.Hi = OperandOvl.Part.Lo;
+        OperandOvl.Part.Lo ^= OperandOvl.Part.Lo;
+        Count = (Count & 63) - 32;
+    }
+    ACPI_SHIFT_LEFT_64_BY_32 (OperandOvl.Part.Hi,
+        OperandOvl.Part.Lo, Count);
+
+    /* Return only what was requested */
+
+    if (OutResult)
+    {
+        *OutResult = OperandOvl.Full;
+    }
+
+    return_ACPI_STATUS (AE_OK);
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiUtShortShiftRight
+ *
+ * PARAMETERS:  Operand             - 64-bit shift operand
+ *              Count               - 32-bit shift count
+ *              OutResult           - Pointer to where the result is returned
+ *
+ * DESCRIPTION: Perform a short right shift.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtShortShiftRight (
+    UINT64                  Operand,
+    UINT32                  Count,
+    UINT64                  *OutResult)
+{
+    UINT64_OVERLAY          OperandOvl;
+
+
+    ACPI_FUNCTION_TRACE (UtShortShiftRight);
+
+
+    OperandOvl.Full = Operand;
+
+    if ((Count & 63) >= 32)
+    {
+        OperandOvl.Part.Lo = OperandOvl.Part.Hi;
+        OperandOvl.Part.Hi ^= OperandOvl.Part.Hi;
+        Count = (Count & 63) - 32;
+    }
+    ACPI_SHIFT_RIGHT_64_BY_32 (OperandOvl.Part.Hi,
+        OperandOvl.Part.Lo, Count);
+
+    /* Return only what was requested */
+
+    if (OutResult)
+    {
+        *OutResult = OperandOvl.Full;
+    }
+
+    return_ACPI_STATUS (AE_OK);
+}
+#else
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiUtShortMultiply
+ *
+ * PARAMETERS:  See function headers above
+ *
+ * DESCRIPTION: Native version of the UtShortMultiply function.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtShortMultiply (
+    UINT64                  Multiplicand,
+    UINT32                  Multiplier,
+    UINT64                  *OutProduct)
+{
+
+    ACPI_FUNCTION_TRACE (UtShortMultiply);
+
+
+    /* Return only what was requested */
+
+    if (OutProduct)
+    {
+        *OutProduct = Multiplicand * Multiplier;
+    }
+
+    return_ACPI_STATUS (AE_OK);
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiUtShortShiftLeft
+ *
+ * PARAMETERS:  See function headers above
+ *
+ * DESCRIPTION: Native version of the UtShortShiftLeft function.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtShortShiftLeft (
+    UINT64                  Operand,
+    UINT32                  Count,
+    UINT64                  *OutResult)
+{
+
+    ACPI_FUNCTION_TRACE (UtShortShiftLeft);
+
+
+    /* Return only what was requested */
+
+    if (OutResult)
+    {
+        *OutResult = Operand << Count;
+    }
+
+    return_ACPI_STATUS (AE_OK);
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiUtShortShiftRight
+ *
+ * PARAMETERS:  See function headers above
+ *
+ * DESCRIPTION: Native version of the UtShortShiftRight function.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtShortShiftRight (
+    UINT64                  Operand,
+    UINT32                  Count,
+    UINT64                  *OutResult)
+{
+
+    ACPI_FUNCTION_TRACE (UtShortShiftRight);
+
+
+    /* Return only what was requested */
+
+    if (OutResult)
+    {
+        *OutResult = Operand >> Count;
+    }
+
+    return_ACPI_STATUS (AE_OK);
+}
+#endif
+
+/*
+ * Optional support for 64-bit double-precision integer divide. This code
+ * is configurable and is implemented in order to support 32-bit kernel
+ * environments where a 64-bit double-precision math library is not available.
+ *
+ * Support for a more normal 64-bit divide/modulo (with check for a divide-
+ * by-zero) appears after this optional section of code.
+ */
+#ifndef ACPI_USE_NATIVE_DIVIDE
+
 
 /*******************************************************************************
  *
index ebad4d1..edf0b8b 100644 (file)
@@ -255,7 +255,7 @@ AcpiUtCreateUpdateStateAndPush (
  *
  * RETURN:      Status
  *
- * DESCRIPTION: Walk through a package
+ * DESCRIPTION: Walk through a package, including subpackages
  *
  ******************************************************************************/
 
@@ -269,8 +269,8 @@ AcpiUtWalkPackageTree (
     ACPI_STATUS             Status = AE_OK;
     ACPI_GENERIC_STATE      *StateList = NULL;
     ACPI_GENERIC_STATE      *State;
-    UINT32                  ThisIndex;
     ACPI_OPERAND_OBJECT     *ThisSourceObj;
+    UINT32                  ThisIndex;
 
 
     ACPI_FUNCTION_TRACE (UtWalkPackageTree);
@@ -287,8 +287,10 @@ AcpiUtWalkPackageTree (
         /* Get one element of the package */
 
         ThisIndex = State->Pkg.Index;
-        ThisSourceObj = (ACPI_OPERAND_OBJECT *)
+        ThisSourceObj =
             State->Pkg.SourceObject->Package.Elements[ThisIndex];
+        State->Pkg.ThisTargetObj =
+            &State->Pkg.SourceObject->Package.Elements[ThisIndex];
 
         /*
          * Check for:
@@ -304,7 +306,7 @@ AcpiUtWalkPackageTree (
             (ThisSourceObj->Common.Type != ACPI_TYPE_PACKAGE))
         {
             Status = WalkCallback (ACPI_COPY_TYPE_SIMPLE, ThisSourceObj,
-                                    State, Context);
+                State, Context);
             if (ACPI_FAILURE (Status))
             {
                 return_ACPI_STATUS (Status);
@@ -377,6 +379,9 @@ AcpiUtWalkPackageTree (
 
     /* We should never get here */
 
+    ACPI_ERROR ((AE_INFO,
+        "State list did not terminate correctly"));
+
     return_ACPI_STATUS (AE_AML_INTERNAL);
 }
 
index 8767b89..11c95ed 100644 (file)
@@ -543,6 +543,10 @@ AcpiUtGetSimpleObjectSize (
     {
         /* A namespace node should never get here */
 
+        ACPI_ERROR ((AE_INFO,
+            "Received a namespace node [%4.4s] "
+            "where an operand object is required",
+            ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, InternalObject)->Name.Ascii));
         return_ACPI_STATUS (AE_AML_INTERNAL);
     }
 
index 0044372..fa3332d 100644 (file)
@@ -223,7 +223,7 @@ AcpiUtScanNumber (
 
     while (isdigit ((int) *String))
     {
-        Number *= 10;
+        AcpiUtShortMultiply (Number, 10, &Number);
         Number += *(String++) - '0';
     }
 
@@ -355,7 +355,7 @@ AcpiUtFormatNumber (
     /* Generate full string in reverse order */
 
     Pos = AcpiUtPutNumber (ReversedString, Number, Base, Upper);
-    i = ACPI_PTR_DIFF (Pos, ReversedString);
+    i = (INT32) ACPI_PTR_DIFF (Pos, ReversedString);
 
     /* Printing 100 using %2d gives "100", not "00" */
 
@@ -587,7 +587,7 @@ vsnprintf (
             {
                 s = "<NULL>";
             }
-            Length = AcpiUtBoundStringLength (s, Precision);
+            Length = (INT32) AcpiUtBoundStringLength (s, Precision);
             if (!(Type & ACPI_FORMAT_LEFT))
             {
                 while (Length < Width--)
@@ -707,7 +707,7 @@ vsnprintf (
         }
     }
 
-    return (ACPI_PTR_DIFF (Pos, String));
+    return ((int) ACPI_PTR_DIFF (Pos, String));
 }
 
 
index bb1454b..0b23eeb 100644 (file)
@@ -252,14 +252,11 @@ AcpiUtWalkAmlResources (
             }
 
             /*
-             * The EndTag opcode must be followed by a zero byte.
-             * Although this byte is technically defined to be a checksum,
-             * in practice, all ASL compilers set this byte to zero.
+             * Don't attempt to perform any validation on the 2nd byte.
+             * Although all known ASL compilers insert a zero for the 2nd
+             * byte, it can also be a checksum (as per the ACPI spec),
+             * and this is occasionally seen in the field. July 2017.
              */
-            if (*(Aml + 1) != 0)
-            {
-                return_ACPI_STATUS (AE_AML_NO_RESOURCE_END_TAG);
-            }
 
             /* Return the pointer to the EndTag if requested */
 
index deecb93..982f261 100644 (file)
@@ -255,7 +255,7 @@ ACPI_GENERIC_STATE *
 AcpiUtCreatePkgState (
     void                    *InternalObject,
     void                    *ExternalObject,
-    UINT16                  Index)
+    UINT32                  Index)
 {
     ACPI_GENERIC_STATE      *State;
 
index 8d1e9e7..7894a4c 100644 (file)
@@ -311,8 +311,8 @@ AcpiUtStrtoulBase10 (
 
         /* Convert and insert (add) the decimal digit */
 
-        NextValue =
-            (ReturnValue * 10) + (AsciiDigit - ACPI_ASCII_ZERO);
+        AcpiUtShortMultiply (ReturnValue, 10, &NextValue);
+        NextValue += (AsciiDigit - ACPI_ASCII_ZERO);
 
         /* Check for overflow (32 or 64 bit) - return current converted value */
 
@@ -378,8 +378,8 @@ AcpiUtStrtoulBase16 (
 
         /* Convert and insert the hex digit */
 
-        ReturnValue =
-            (ReturnValue << 4) | AcpiUtAsciiCharToHex (AsciiDigit);
+        AcpiUtShortShiftLeft (ReturnValue, 4, &ReturnValue);
+        ReturnValue |= AcpiUtAsciiCharToHex (AsciiDigit);
 
         String++;
         ValidDigits++;
index 2f720c2..2bb1801 100644 (file)
@@ -668,6 +668,11 @@ AcpiUtDumpAllocations (
         return_VOID;
     }
 
+    if (!AcpiGbl_GlobalList)
+    {
+        goto Exit;
+    }
+
     Element = AcpiGbl_GlobalList->ListHead;
     while (Element)
     {
@@ -679,7 +684,7 @@ AcpiUtDumpAllocations (
 
             if (Element->Size < sizeof (ACPI_COMMON_DESCRIPTOR))
             {
-                AcpiOsPrintf ("%p Length 0x%04X %9.9s-%u "
+                AcpiOsPrintf ("%p Length 0x%04X %9.9s-%4.4u "
                     "[Not a Descriptor - too small]\n",
                     Descriptor, Element->Size, Element->Module,
                     Element->Line);
@@ -691,7 +696,7 @@ AcpiUtDumpAllocations (
                 if (ACPI_GET_DESCRIPTOR_TYPE (Descriptor) !=
                     ACPI_DESC_TYPE_CACHED)
                 {
-                    AcpiOsPrintf ("%p Length 0x%04X %9.9s-%u [%s] ",
+                    AcpiOsPrintf ("%p Length 0x%04X %9.9s-%4.4u [%s] ",
                         Descriptor, Element->Size, Element->Module,
                         Element->Line, AcpiUtGetDescriptorName (Descriptor));
 
@@ -767,6 +772,7 @@ AcpiUtDumpAllocations (
         Element = Element->Next;
     }
 
+Exit:
     (void) AcpiUtReleaseMutex (ACPI_MTX_MEMORY);
 
     /* Print summary */