diff options
Diffstat (limited to 'source/components/dispatcher')
| -rw-r--r-- | source/components/dispatcher/dsargs.c | 5 | ||||
| -rw-r--r-- | source/components/dispatcher/dsdebug.c | 1 | ||||
| -rw-r--r-- | source/components/dispatcher/dsmethod.c | 14 | ||||
| -rw-r--r-- | source/components/dispatcher/dsopcode.c | 7 | ||||
| -rwxr-xr-x | source/components/dispatcher/dspkginit.c | 638 | ||||
| -rw-r--r-- | source/components/dispatcher/dsutils.c | 6 | ||||
| -rw-r--r-- | source/components/dispatcher/dswexec.c | 3 | ||||
| -rw-r--r-- | source/components/dispatcher/dswload.c | 38 | ||||
| -rw-r--r-- | source/components/dispatcher/dswload2.c | 18 | 
9 files changed, 713 insertions, 17 deletions
diff --git a/source/components/dispatcher/dsargs.c b/source/components/dispatcher/dsargs.c index 6a79c7cb09b2..504005b30aca 100644 --- a/source/components/dispatcher/dsargs.c +++ b/source/components/dispatcher/dsargs.c @@ -197,7 +197,7 @@ AcpiDsExecuteArguments (      ACPI_WALK_STATE         *WalkState; -    ACPI_FUNCTION_TRACE (DsExecuteArguments); +    ACPI_FUNCTION_TRACE_PTR (DsExecuteArguments, AmlStart);      /* Allocate a new parser op to be the root of the parsed tree */ @@ -474,7 +474,8 @@ AcpiDsGetPackageArguments (          return_ACPI_STATUS (AE_AML_INTERNAL);      } -    ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Package Arg Init\n")); +    ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Package Argument Init, AML Ptr: %p\n", +        ObjDesc->Package.AmlStart));      /* Execute the AML code for the TermArg arguments */ diff --git a/source/components/dispatcher/dsdebug.c b/source/components/dispatcher/dsdebug.c index ceb6b8a51b70..4a0696a3632b 100644 --- a/source/components/dispatcher/dsdebug.c +++ b/source/components/dispatcher/dsdebug.c @@ -320,6 +320,7 @@ AcpiDsDumpMethodStack (                  Op->Common.Next = NULL;  #ifdef ACPI_DISASSEMBLER +                AcpiOsPrintf ("Failed at ");                  AcpiDmDisassemble (NextWalkState, Op, ACPI_UINT32_MAX);  #endif                  Op->Common.Next = Next; diff --git a/source/components/dispatcher/dsmethod.c b/source/components/dispatcher/dsmethod.c index d3588f5aaf16..79dff2c766cb 100644 --- a/source/components/dispatcher/dsmethod.c +++ b/source/components/dispatcher/dsmethod.c @@ -333,6 +333,7 @@ AcpiDsMethodError (      ACPI_WALK_STATE         *WalkState)  {      UINT32                  AmlOffset; +    ACPI_NAME               Name = 0;      ACPI_FUNCTION_ENTRY (); @@ -361,9 +362,16 @@ AcpiDsMethodError (          AmlOffset = (UINT32) ACPI_PTR_DIFF (WalkState->Aml,              WalkState->ParserState.AmlStart); -        Status = AcpiGbl_ExceptionHandler (Status, -            WalkState->MethodNode ? -                WalkState->MethodNode->Name.Integer : 0, +        if (WalkState->MethodNode) +        { +            Name = WalkState->MethodNode->Name.Integer; +        } +        else if (WalkState->DeferredNode) +        { +            Name = WalkState->DeferredNode->Name.Integer; +        } + +        Status = AcpiGbl_ExceptionHandler (Status, Name,              WalkState->Opcode, AmlOffset, NULL);          AcpiExEnterInterpreter ();      } diff --git a/source/components/dispatcher/dsopcode.c b/source/components/dispatcher/dsopcode.c index 6a4f5bf25551..3ceec94b17e2 100644 --- a/source/components/dispatcher/dsopcode.c +++ b/source/components/dispatcher/dsopcode.c @@ -353,10 +353,9 @@ AcpiDsInitBufferField (          (8 * (UINT32) BufferDesc->Buffer.Length))      {          ACPI_ERROR ((AE_INFO, -            "Field [%4.4s] at %u exceeds Buffer [%4.4s] size %u (bits)", -            AcpiUtGetNodeName (ResultDesc), -            BitOffset + BitCount, -            AcpiUtGetNodeName (BufferDesc->Buffer.Node), +            "Field [%4.4s] at bit offset/length %u/%u " +            "exceeds size of target Buffer (%u bits)", +            AcpiUtGetNodeName (ResultDesc), BitOffset, BitCount,              8 * (UINT32) BufferDesc->Buffer.Length));          Status = AE_AML_BUFFER_LIMIT;          goto Cleanup; diff --git a/source/components/dispatcher/dspkginit.c b/source/components/dispatcher/dspkginit.c new file mode 100755 index 000000000000..efbc0f3a8043 --- /dev/null +++ b/source/components/dispatcher/dspkginit.c @@ -0,0 +1,638 @@ +/****************************************************************************** + * + * Module Name: dspkginit - Completion of deferred package initialization + * + *****************************************************************************/ + +/****************************************************************************** + * + * 1. Copyright Notice + * + * Some or all of this work - Copyright (c) 1999 - 2017, Intel Corp. + * All rights reserved. + * + * 2. License + * + * 2.1. This is your license from Intel Corp. under its intellectual property + * rights. You may have additional license terms from the party that provided + * you this software, covering your right to use that party's intellectual + * property rights. + * + * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a + * copy of the source code appearing in this file ("Covered Code") an + * irrevocable, perpetual, worldwide license under Intel's copyrights in the + * base code distributed originally by Intel ("Original Intel Code") to copy, + * make derivatives, distribute, use and display any portion of the Covered + * Code in any form, with the right to sublicense such rights; and + * + * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent + * license (with the right to sublicense), under only those claims of Intel + * patents that are infringed by the Original Intel Code, to make, use, sell, + * offer to sell, and import the Covered Code and derivative works thereof + * solely to the minimum extent necessary to exercise the above copyright + * license, and in no event shall the patent license extend to any additions + * to or modifications of the Original Intel Code. No other license or right + * is granted directly or by implication, estoppel or otherwise; + * + * The above copyright and patent license is granted only if the following + * conditions are met: + * + * 3. Conditions + * + * 3.1. Redistribution of Source with Rights to Further Distribute Source. + * Redistribution of source code of any substantial portion of the Covered + * Code or modification with rights to further distribute source must include + * the above Copyright Notice, the above License, this list of Conditions, + * and the following Disclaimer and Export Compliance provision. In addition, + * Licensee must cause all Covered Code to which Licensee contributes to + * contain a file documenting the changes Licensee made to create that Covered + * Code and the date of any change. Licensee must include in that file the + * documentation of any changes made by any predecessor Licensee. Licensee + * must include a prominent statement that the modification is derived, + * directly or indirectly, from Original Intel Code. + * + * 3.2. Redistribution of Source with no Rights to Further Distribute Source. + * Redistribution of source code of any substantial portion of the Covered + * Code or modification without rights to further distribute source must + * include the following Disclaimer and Export Compliance provision in the + * documentation and/or other materials provided with distribution. In + * addition, Licensee may not authorize further sublicense of source of any + * portion of the Covered Code, and must include terms to the effect that the + * license from Licensee to its licensee is limited to the intellectual + * property embodied in the software Licensee provides to its licensee, and + * not to intellectual property embodied in modifications its licensee may + * make. + * + * 3.3. Redistribution of Executable. Redistribution in executable form of any + * substantial portion of the Covered Code or modification must reproduce the + * above Copyright Notice, and the following Disclaimer and Export Compliance + * provision in the documentation and/or other materials provided with the + * distribution. + * + * 3.4. Intel retains all right, title, and interest in and to the Original + * Intel Code. + * + * 3.5. Neither the name Intel nor any other trademark owned or controlled by + * Intel shall be used in advertising or otherwise to promote the sale, use or + * other dealings in products derived from or relating to the Covered Code + * without prior written authorization from Intel. + * + * 4. Disclaimer and Export Compliance + * + * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED + * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE + * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, + * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY + * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY + * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A + * PARTICULAR PURPOSE. + * + * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES + * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR + * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, + * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY + * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL + * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS + * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY + * LIMITED REMEDY. + * + * 4.3. Licensee shall not export, either directly or indirectly, any of this + * software or system incorporating such software without first obtaining any + * required license or other approval from the U. S. Department of Commerce or + * any other agency or department of the United States Government. In the + * event Licensee exports any such software from the United States or + * re-exports any such software from a foreign destination, Licensee shall + * ensure that the distribution and export/re-export of the software is in + * compliance with all laws, regulations, orders, or other restrictions of the + * U.S. Export Administration Regulations. Licensee agrees that neither it nor + * any of its subsidiaries will export/re-export any technical data, process, + * software, or service, directly or indirectly, to any country for which the + * United States government or any agency thereof requires an export license, + * other governmental approval, or letter of assurance, without first obtaining + * such license, approval or letter. + * + ***************************************************************************** + * + * Alternatively, you may choose to be licensed under the terms of the + * following license: + * + * 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. + * + * 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 MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * 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 DAMAGE. + * + * Alternatively, you may choose to be licensed under the terms of the + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. + * + *****************************************************************************/ + +#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                  Index; +    UINT16                  ReferenceCount; +    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); +        } + +printf ("****DS: BuildPkg - Create package object %p\n", ObjDesc); + +        ObjDesc->Package.Node = Parent->Common.Node; +    } + +// +printf ("****DS: BuildPkg, from DsEvalDataObjectOperands - Valid: %X, Pass %u, %p\n", +    ObjDesc->Package.Flags & AOPOBJ_DATA_VALID, +    WalkState->PassNumber, ObjDesc); + +// just in case +if (ObjDesc->Package.Flags & AOPOBJ_DATA_VALID) +{ +    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; + +    /* +     * 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; + +    if (Arg) +    { +        printf ("****DS: Mark package evaluated\n"); +        ObjDesc->Package.Flags |= AOPOBJ_DATA_VALID; +    } + +    for (i = 0; Arg && (i < ElementCount); i++) +    { +printf ("****DS: Eval package element\n"); + +        if (Arg->Common.AmlOpcode == AML_INT_RETURN_VALUE_OP) +        { +// Maybe this is just temp code: +/* +if (!Arg->Common.Node) +{ +    printf ("****DS: No attached NS node\n"); +    return_ACPI_STATUS (AE_AML_INTERNAL); +} +else  */         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) +            { +// remove or fix +                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 */ + +                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) +    { +        //ObjDesc->Package.Flags |= AOPOBJ_DATA_VALID; + + +        /* +         * 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)); +    } + +    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) +    { +        /* 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:      Status + * + * 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; +    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_LOAD_PASS2, +        ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, +        NULL, &ResolvedNode); + +    if (ACPI_FAILURE (Status)) +    { +        ACPI_EXCEPTION ((AE_INFO, Status, +            "Could not resolve package element")); +        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 package element [%4.4s] in [%4.4s]", +            ResolvedNode->Name.Ascii, ScopeInfo.Scope.Node->Name.Ascii)); +        *ElementPtr = NULL; +        return_VOID; +    } + +    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 is a temporary name [%4.4s], " +            "returning NULL element", +            ResolvedNode->Name.Ascii)); +        *ElementPtr = NULL; +        return_VOID; +    } + +    /* 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 +    /* +     * 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; +} diff --git a/source/components/dispatcher/dsutils.c b/source/components/dispatcher/dsutils.c index 77dff895f54d..4688e16ec8f0 100644 --- a/source/components/dispatcher/dsutils.c +++ b/source/components/dispatcher/dsutils.c @@ -791,12 +791,6 @@ AcpiDsCreateOperand (          if ((OpInfo->Flags & AML_HAS_RETVAL) ||              (Arg->Common.Flags & ACPI_PARSEOP_IN_STACK))          { -            ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, -                "Argument previously created, already stacked\n")); - -            AcpiDbDisplayArgumentObject ( -                WalkState->Operands [WalkState->NumOperands - 1], WalkState); -              /*               * Use value that was already previously returned               * by the evaluation of this argument diff --git a/source/components/dispatcher/dswexec.c b/source/components/dispatcher/dswexec.c index 4df147138def..dfdfeaa03660 100644 --- a/source/components/dispatcher/dswexec.c +++ b/source/components/dispatcher/dswexec.c @@ -723,7 +723,8 @@ AcpiDsExecEndOp (          case AML_TYPE_CREATE_OBJECT:              ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, -                "Executing CreateObject (Buffer/Package) Op=%p\n", Op)); +                "Executing CreateObject (Buffer/Package) Op=%p AMLPtr=%p\n", +                Op, Op->Named.Data));              switch (Op->Common.Parent->Common.AmlOpcode)              { diff --git a/source/components/dispatcher/dswload.c b/source/components/dispatcher/dswload.c index f3f99ea1b914..8793c0ed1cf5 100644 --- a/source/components/dispatcher/dswload.c +++ b/source/components/dispatcher/dswload.c @@ -518,7 +518,7 @@ AcpiDsLoad1BeginOp (      /* Initialize the op */  #if (defined (ACPI_NO_METHOD_EXECUTION) || defined (ACPI_CONSTANT_EVAL_ONLY)) -    Op->Named.Path = ACPI_CAST_PTR (UINT8, Path); +    Op->Named.Path = Path;  #endif      if (Node) @@ -558,6 +558,10 @@ AcpiDsLoad1EndOp (      ACPI_OBJECT_TYPE        ObjectType;      ACPI_STATUS             Status = AE_OK; +#ifdef ACPI_ASL_COMPILER +    UINT8                   ParamCount; +#endif +      ACPI_FUNCTION_TRACE (DsLoad1EndOp); @@ -642,6 +646,37 @@ AcpiDsLoad1EndOp (          }      } +#ifdef ACPI_ASL_COMPILER +    /* +     * For external opcode, get the object type from the argument and +     * get the parameter count from the argument's next. +     */ +    if (AcpiGbl_DisasmFlag && +        Op->Common.Node && +        Op->Common.AmlOpcode == AML_EXTERNAL_OP) +    { +        /* +         * Note, if this external is not a method +         * Op->Common.Value.Arg->Common.Next->Common.Value.Integer == 0 +         * Therefore, ParamCount will be 0. +         */ +        ParamCount = (UINT8) Op->Common.Value.Arg->Common.Next->Common.Value.Integer; +        ObjectType = (UINT8) Op->Common.Value.Arg->Common.Value.Integer; +        Op->Common.Node->Flags |= ANOBJ_IS_EXTERNAL; +        Op->Common.Node->Type = (UINT8) ObjectType; + +        AcpiDmCreateSubobjectForExternal ((UINT8)ObjectType, +            &Op->Common.Node, ParamCount); + +        /* +         * Add the external to the external list because we may be +         * emitting code based off of the items within the external list. +         */ +        AcpiDmAddOpToExternalList (Op, Op->Named.Path, (UINT8)ObjectType, ParamCount, +           ACPI_EXT_ORIGIN_FROM_OPCODE | ACPI_EXT_RESOLVED_REFERENCE); +    } +#endif +      /*       * If we are executing a method, do not create any namespace objects       * during the load phase, only during execution. @@ -689,6 +724,7 @@ AcpiDsLoad1EndOp (      /* Pop the scope stack (only if loading a table) */      if (!WalkState->MethodNode && +        Op->Common.AmlOpcode != AML_EXTERNAL_OP &&          AcpiNsOpensScope (ObjectType))      {          ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "(%s): Popping scope for Op %p\n", diff --git a/source/components/dispatcher/dswload2.c b/source/components/dispatcher/dswload2.c index 46870830f44b..184f6aa367d2 100644 --- a/source/components/dispatcher/dswload2.c +++ b/source/components/dispatcher/dswload2.c @@ -428,6 +428,24 @@ AcpiDsLoad2BeginOp (              }          } +#ifdef ACPI_ASL_COMPILER + +        /* +         * Do not open a scope for AML_EXTERNAL_OP +         * AcpiNsLookup can open a new scope based on the object type +         * of this op. AML_EXTERNAL_OP is a declaration rather than a +         * definition. In the case that this external is a method object, +         * AcpiNsLookup will open a new scope. However, an AML_EXTERNAL_OP +         * associated with the ACPI_TYPE_METHOD is a declaration, rather than +         * a definition. Flags is set to avoid opening a scope for any +         * AML_EXTERNAL_OP. +         */ +        if (WalkState->Opcode == AML_EXTERNAL_OP) +        { +            Flags |= ACPI_NS_DONT_OPEN_SCOPE; +        } +#endif +          /* Add new entry or lookup existing entry */          Status = AcpiNsLookup (WalkState->ScopeInfo, BufferPtr, ObjectType,  | 
