⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aslload.c

📁 acpi tools for linux include acpiexec and acpixtract
💻 C
📖 第 1 页 / 共 2 页
字号:
    UINT32                  Flags = ACPI_NS_NO_UPSEARCH;    ACPI_PARSE_OBJECT       *Arg;    UINT32                  i;    BOOLEAN                 ForceNewScope = FALSE;    ACPI_FUNCTION_NAME (LdNamespace1Begin);    ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op %p [%s]\n",        Op, Op->Asl.ParseOpName));    /*     * We are only interested in opcodes that have an associated name     * (or multiple names)     */    switch (Op->Asl.AmlOpcode)    {    case AML_BANK_FIELD_OP:    case AML_INDEX_FIELD_OP:    case AML_FIELD_OP:        Status = LdLoadFieldElements (Op, WalkState);        return (Status);    default:        /* All other opcodes go below */        break;    }    /* Check if this object has already been installed in the namespace */    if (Op->Asl.Node)    {        return (AE_OK);    }    Path = Op->Asl.Namepath;    if (!Path)    {        return (AE_OK);    }    /* Map the raw opcode into an internal object type */    switch (Op->Asl.ParseOpcode)    {    case PARSEOP_NAME:        Arg = Op->Asl.Child;  /* Get the NameSeg/NameString node */        Arg = Arg->Asl.Next;  /* First peer is the object to be associated with the name */        /*         * If this name refers to a ResourceTemplate, we will need to open         * a new scope so that the resource subfield names can be entered into         * the namespace underneath this name         */        if (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DESC)        {            ForceNewScope = TRUE;        }        /* Get the data type associated with the named object, not the name itself */        /* Log2 loop to convert from Btype (binary) to Etype (encoded) */        ObjectType = 1;        for (i = 1; i < Arg->Asl.AcpiBtype; i *= 2)        {            ObjectType++;        }        break;    case PARSEOP_EXTERNAL:        /*         * "External" simply enters a name and type into the namespace.         * We must be careful to not open a new scope, however, no matter         * what type the external name refers to (e.g., a method)         *         * first child is name, next child is ObjectType         */        ActualObjectType = (UINT8) Op->Asl.Child->Asl.Next->Asl.Value.Integer;        ObjectType = ACPI_TYPE_ANY;        /*         * We will mark every new node along the path as "External". This         * allows some or all of the nodes to be created later in the ASL         * code. Handles cases like this:         *         *   External (\_SB_.PCI0.ABCD, IntObj)         *   Scope (_SB_)         *   {         *       Device (PCI0)         *       {         *       }         *   }         *   Method (X)         *   {         *       Store (\_SB_.PCI0.ABCD, Local0)         *   }         */        Flags |= ACPI_NS_EXTERNAL;        break;    case PARSEOP_DEFAULT_ARG:        if (Op->Asl.CompileFlags == NODE_IS_RESOURCE_DESC)        {            Status = LdLoadResourceElements (Op, WalkState);            goto Exit;        }        ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);        break;    case PARSEOP_SCOPE:        /*         * The name referenced by Scope(Name) must already exist at this point.         * In other words, forward references for Scope() are not supported.         * The only real reason for this is that the MS interpreter cannot         * handle this case.  Perhaps someday this case can go away.         */        Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY,                    ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT,                    WalkState, &(Node));        if (ACPI_FAILURE (Status))        {            if (Status == AE_NOT_FOUND)            {                /* The name was not found, go ahead and create it */                Status = AcpiNsLookup (WalkState->ScopeInfo, Path,                            ACPI_TYPE_LOCAL_SCOPE,                            ACPI_IMODE_LOAD_PASS1, Flags,                            WalkState, &(Node));                /*                 * However, this is an error -- primarily because the MS                 * interpreter can't handle a forward reference from the                 * Scope() operator.                 */                AslError (ASL_ERROR, ASL_MSG_NOT_FOUND, Op,                    Op->Asl.ExternalName);                AslError (ASL_ERROR, ASL_MSG_SCOPE_FWD_REF, Op,                    Op->Asl.ExternalName);                goto FinishNode;            }            AslCoreSubsystemError (Op, Status, "Failure from lookup\n", FALSE);            goto Exit;        }        /* We found a node with this name, now check the type */        switch (Node->Type)        {        case ACPI_TYPE_LOCAL_SCOPE:        case ACPI_TYPE_DEVICE:        case ACPI_TYPE_POWER:        case ACPI_TYPE_PROCESSOR:        case ACPI_TYPE_THERMAL:            /* These are acceptable types - they all open a new scope */            break;        case ACPI_TYPE_INTEGER:        case ACPI_TYPE_STRING:        case ACPI_TYPE_BUFFER:            /*             * These types we will allow, but we will change the type.             * This enables some existing code of the form:             *             *  Name (DEB, 0)             *  Scope (DEB) { ... }             *             * Which is used to workaround the fact that the MS interpreter             * does not allow Scope() forward references.             */            sprintf (MsgBuffer, "%s [%s], changing type to [Scope]",                Op->Asl.ExternalName, AcpiUtGetTypeName (Node->Type));            AslError (ASL_REMARK, ASL_MSG_SCOPE_TYPE, Op, MsgBuffer);            /* Switch the type to scope, open the new scope */            Node->Type = ACPI_TYPE_LOCAL_SCOPE;            Status = AcpiDsScopeStackPush (Node, ACPI_TYPE_LOCAL_SCOPE,                        WalkState);            if (ACPI_FAILURE (Status))            {                return_ACPI_STATUS (Status);            }            break;        default:            /* All other types are an error */            sprintf (MsgBuffer, "%s [%s]", Op->Asl.ExternalName,                AcpiUtGetTypeName (Node->Type));            AslError (ASL_ERROR, ASL_MSG_SCOPE_TYPE, Op, MsgBuffer);            /*             * However, switch the type to be an actual scope so             * that compilation can continue without generating a whole             * cascade of additional errors.  Open the new scope.             */            Node->Type = ACPI_TYPE_LOCAL_SCOPE;            Status = AcpiDsScopeStackPush (Node, ACPI_TYPE_LOCAL_SCOPE,                        WalkState);            if (ACPI_FAILURE (Status))            {                return_ACPI_STATUS (Status);            }            break;        }        Status = AE_OK;        goto FinishNode;    default:        ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);        break;    }    ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Loading name: %s, (%s)\n",            Op->Asl.ExternalName, AcpiUtGetTypeName (ObjectType)));    /* The name must not already exist */    Flags |= ACPI_NS_ERROR_IF_FOUND;    /*     * Enter the named type into the internal namespace.  We enter the name     * as we go downward in the parse tree.  Any necessary subobjects that     * involve arguments to the opcode must be created as we go back up the     * parse tree later.     */    Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType,                    ACPI_IMODE_LOAD_PASS1, Flags, WalkState, &Node);    if (ACPI_FAILURE (Status))    {        if (Status == AE_ALREADY_EXISTS)        {            /* The name already exists in this scope */            if (Node->Type == ACPI_TYPE_LOCAL_SCOPE)            {                /* Allow multiple references to the same scope */                Node->Type = (UINT8) ObjectType;                Status = AE_OK;            }            else if ((Node->Flags & ANOBJ_IS_EXTERNAL) &&                     (Op->Asl.ParseOpcode != PARSEOP_EXTERNAL))            {                /*                 * Allow one create on an object or segment that was                 * previously declared External                 */                Node->Flags &= ~ANOBJ_IS_EXTERNAL;                Node->Type = (UINT8) ObjectType;                /* Just retyped a node, probably will need to open a scope */                if (AcpiNsOpensScope (ObjectType))                {                    Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState);                    if (ACPI_FAILURE (Status))                    {                        return_ACPI_STATUS (Status);                    }                }                Status = AE_OK;            }            else            {                /* Valid error, object already exists */                AslError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Op,                    Op->Asl.ExternalName);                Status = AE_OK;                goto Exit;            }        }        else        {            AslCoreSubsystemError (Op, Status,                "Failure from lookup %s\n", FALSE);            goto Exit;        }    }    if (ForceNewScope)    {        Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState);        if (ACPI_FAILURE (Status))        {            return_ACPI_STATUS (Status);        }    }FinishNode:    /*     * Point the parse node to the new namespace node, and point     * the Node back to the original Parse node     */    Op->Asl.Node = Node;    Node->Op = Op;    /* Set the actual data type if appropriate (EXTERNAL term only) */    if (ActualObjectType != ACPI_TYPE_ANY)    {        Node->Type = (UINT8) ActualObjectType;        Node->Value = ASL_EXTERNAL_METHOD;    }    if (Op->Asl.ParseOpcode == PARSEOP_METHOD)    {        /*         * Get the method argument count from "Extra" and save         * it in the namespace node         */        Node->Value = (UINT32) Op->Asl.Extra;    }Exit:    return (Status);}/******************************************************************************* * * FUNCTION:    LdNamespace1End * * PARAMETERS:  ASL_WALK_CALLBACK * * RETURN:      Status * * DESCRIPTION: Ascending callback used during the loading of the namespace, *              We only need to worry about managing the scope stack here. * ******************************************************************************/static ACPI_STATUSLdNamespace1End (    ACPI_PARSE_OBJECT       *Op,    UINT32                  Level,    void                    *Context){    ACPI_WALK_STATE         *WalkState = (ACPI_WALK_STATE *) Context;    ACPI_OBJECT_TYPE        ObjectType;    BOOLEAN                 ForceNewScope = FALSE;    ACPI_FUNCTION_NAME (LdNamespace1End);    /* We are only interested in opcodes that have an associated name */    if (!Op->Asl.Namepath)    {        return (AE_OK);    }    /* Get the type to determine if we should pop the scope */    if ((Op->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG) &&        (Op->Asl.CompileFlags == NODE_IS_RESOURCE_DESC))    {        /* TBD: Merge into AcpiDsMapNamedOpcodeToDataType */        ObjectType = ACPI_TYPE_LOCAL_RESOURCE;    }    else    {        ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);    }    /* Pop scope that was pushed for Resource Templates */    if (Op->Asl.ParseOpcode == PARSEOP_NAME)    {        if (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DESC)        {            ForceNewScope = TRUE;        }    }    /* Pop the scope stack */    if (ForceNewScope || AcpiNsOpensScope (ObjectType))    {        ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,            "(%s): Popping scope for Op [%s] %p\n",            AcpiUtGetTypeName (ObjectType), Op->Asl.ParseOpName, Op));        (void) AcpiDsScopeStackPop (WalkState);    }    return (AE_OK);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -