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

📄 nssearch.c

📁 acpi tools for linux include acpiexec and acpixtract
💻 C
📖 第 1 页 / 共 2 页
字号:
 * * PARAMETERS:  TargetName      - Ascii ACPI name to search for *              Node            - Starting node where search will begin *              Type            - Object type to match *              ReturnNode      - Where the matched Node is returned * * RETURN:      Status * * DESCRIPTION: Called when a name has not been found in the current namespace *              level. Before adding it or giving up, ACPI scope rules require *              searching enclosing scopes in cases identified by AcpiNsLocal(). * *              "A name is located by finding the matching name in the current *              name space, and then in the parent name space. If the parent *              name space does not contain the name, the search continues *              recursively until either the name is found or the name space *              does not have a parent (the root of the name space). This *              indicates that the name is not found" (From ACPI Specification, *              section 5.3) * ******************************************************************************/static ACPI_STATUSAcpiNsSearchParentTree (    UINT32                  TargetName,    ACPI_NAMESPACE_NODE     *Node,    ACPI_OBJECT_TYPE        Type,    ACPI_NAMESPACE_NODE     **ReturnNode){    ACPI_STATUS             Status;    ACPI_NAMESPACE_NODE     *ParentNode;    ACPI_FUNCTION_TRACE (NsSearchParentTree);    ParentNode = AcpiNsGetParentNode (Node);    /*     * If there is no parent (i.e., we are at the root) or type is "local",     * we won't be searching the parent tree.     */    if (!ParentNode)    {        ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "[%4.4s] has no parent\n",            ACPI_CAST_PTR (char, &TargetName)));        return_ACPI_STATUS (AE_NOT_FOUND);    }    if (AcpiNsLocal (Type))    {        ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,            "[%4.4s] type [%s] must be local to this scope (no parent search)\n",            ACPI_CAST_PTR (char, &TargetName), AcpiUtGetTypeName (Type)));        return_ACPI_STATUS (AE_NOT_FOUND);    }    /* Search the parent tree */    ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,        "Searching parent [%4.4s] for [%4.4s]\n",        AcpiUtGetNodeName (ParentNode), ACPI_CAST_PTR (char, &TargetName)));    /*     * Search parents until target is found or we have backed up to the root     */    while (ParentNode)    {        /*         * Search parent scope. Use TYPE_ANY because we don't care about the         * object type at this point, we only care about the existence of         * the actual name we are searching for. Typechecking comes later.         */        Status = AcpiNsSearchOneScope (                    TargetName, ParentNode, ACPI_TYPE_ANY, ReturnNode);        if (ACPI_SUCCESS (Status))        {            return_ACPI_STATUS (Status);        }        /* Not found here, go up another level (until we reach the root) */        ParentNode = AcpiNsGetParentNode (ParentNode);    }    /* Not found in parent tree */    return_ACPI_STATUS (AE_NOT_FOUND);}/******************************************************************************* * * FUNCTION:    AcpiNsSearchAndEnter * * PARAMETERS:  TargetName          - Ascii ACPI name to search for (4 chars) *              WalkState           - Current state of the walk *              Node                - Starting node where search will begin *              InterpreterMode     - Add names only in ACPI_MODE_LOAD_PASS_x. *                                    Otherwise,search only. *              Type                - Object type to match *              Flags               - Flags describing the search restrictions *              ReturnNode          - Where the Node is returned * * RETURN:      Status * * DESCRIPTION: Search for a name segment in a single namespace level, *              optionally adding it if it is not found. If the passed *              Type is not Any and the type previously stored in the *              entry was Any (i.e. unknown), update the stored type. * *              In ACPI_IMODE_EXECUTE, search only. *              In other modes, search and add if not found. * ******************************************************************************/ACPI_STATUSAcpiNsSearchAndEnter (    UINT32                  TargetName,    ACPI_WALK_STATE         *WalkState,    ACPI_NAMESPACE_NODE     *Node,    ACPI_INTERPRETER_MODE   InterpreterMode,    ACPI_OBJECT_TYPE        Type,    UINT32                  Flags,    ACPI_NAMESPACE_NODE     **ReturnNode){    ACPI_STATUS             Status;    ACPI_NAMESPACE_NODE     *NewNode;    ACPI_FUNCTION_TRACE (NsSearchAndEnter);    /* Parameter validation */    if (!Node || !TargetName || !ReturnNode)    {        ACPI_ERROR ((AE_INFO,            "Null parameter: Node %p Name %X ReturnNode %p",            Node, TargetName, ReturnNode));        return_ACPI_STATUS (AE_BAD_PARAMETER);    }    /*     * Name must consist of valid ACPI characters. We will repair the name if     * necessary because we don't want to abort because of this, but we want     * all namespace names to be printable. A warning message is appropriate.     *     * This issue came up because there are in fact machines that exhibit     * this problem, and we want to be able to enable ACPI support for them,     * even though there are a few bad names.     */    if (!AcpiUtValidAcpiName (TargetName))    {        TargetName = AcpiUtRepairName (ACPI_CAST_PTR (char, &TargetName));        /* Report warning only if in strict mode or debug mode */        if (!AcpiGbl_EnableInterpreterSlack)        {            ACPI_WARNING ((AE_INFO,                "Found bad character(s) in name, repaired: [%4.4s]\n",                ACPI_CAST_PTR (char, &TargetName)));        }        else        {            ACPI_DEBUG_PRINT ((ACPI_DB_WARN,                "Found bad character(s) in name, repaired: [%4.4s]\n",                ACPI_CAST_PTR (char, &TargetName)));        }    }    /* Try to find the name in the namespace level specified by the caller */    *ReturnNode = ACPI_ENTRY_NOT_FOUND;    Status = AcpiNsSearchOneScope (TargetName, Node, Type, ReturnNode);    if (Status != AE_NOT_FOUND)    {        /*         * If we found it AND the request specifies that a find is an error,         * return the error         */        if ((Status == AE_OK) &&            (Flags & ACPI_NS_ERROR_IF_FOUND))        {            Status = AE_ALREADY_EXISTS;        }        /* Either found it or there was an error: finished either way */        return_ACPI_STATUS (Status);    }    /*     * The name was not found. If we are NOT performing the first pass     * (name entry) of loading the namespace, search the parent tree (all the     * way to the root if necessary.) We don't want to perform the parent     * search when the namespace is actually being loaded. We want to perform     * the search when namespace references are being resolved (load pass 2)     * and during the execution phase.     */    if ((InterpreterMode != ACPI_IMODE_LOAD_PASS1) &&        (Flags & ACPI_NS_SEARCH_PARENT))    {        /*         * Not found at this level - search parent tree according to the         * ACPI specification         */        Status = AcpiNsSearchParentTree (TargetName, Node, Type, ReturnNode);        if (ACPI_SUCCESS (Status))        {            return_ACPI_STATUS (Status);        }    }    /* In execute mode, just search, never add names. Exit now */    if (InterpreterMode == ACPI_IMODE_EXECUTE)    {        ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,            "%4.4s Not found in %p [Not adding]\n",            ACPI_CAST_PTR (char, &TargetName), Node));        return_ACPI_STATUS (AE_NOT_FOUND);    }    /* Create the new named object */    NewNode = AcpiNsCreateNode (TargetName);    if (!NewNode)    {        return_ACPI_STATUS (AE_NO_MEMORY);    }#ifdef ACPI_ASL_COMPILER    /*     * Node is an object defined by an External() statement     */    if (Flags & ACPI_NS_EXTERNAL)    {        NewNode->Flags |= ANOBJ_IS_EXTERNAL;    }#endif    if (Flags & ACPI_NS_TEMPORARY)    {        NewNode->Flags |= ANOBJ_TEMPORARY;    }    /* Install the new object into the parent's list of children */    AcpiNsInstallNode (WalkState, Node, NewNode, Type);    *ReturnNode = NewNode;    return_ACPI_STATUS (AE_OK);}

⌨️ 快捷键说明

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