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

📄 aslopt.c

📁 acpi tools for linux include acpiexec and acpixtract
💻 C
📖 第 1 页 / 共 2 页
字号:
    if (ACPI_STRLEN (NewPath) >= AmlNameStringLength)    {        ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OPTIMIZATIONS,            " NOT SHORTER (New %u old %u)",            ACPI_STRLEN (NewPath), AmlNameStringLength));        ACPI_FREE (NewPathExternal);        return (AE_NOT_FOUND);    }    /*     * Check to make sure that the optimization finds the node we are     * looking for.  This is simply a sanity check on the new     * path that has been created.     */    Status = AcpiNsLookup (&ScopeInfo,  NewPath,                    ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,                    ACPI_NS_DONT_OPEN_SCOPE, WalkState, &(Node));    if (ACPI_SUCCESS (Status))    {        /* Found the namepath, but make sure the node is correct */        if (Node == TargetNode)        {            /* The lookup matched the node, accept this optimization */            AslError (ASL_OPTIMIZATION, ASL_MSG_NAME_OPTIMIZATION,                Op, NewPathExternal);            *ReturnNewPath = NewPath;        }        else        {            /* Node is not correct, do not use this optimization */            Status = AE_NOT_FOUND;            ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OPTIMIZATIONS, " ***** WRONG NODE"));            AslError (ASL_WARNING, ASL_MSG_COMPILER_INTERNAL, Op,                "Not using optimized name - found wrong node");        }    }    else    {        /* The lookup failed, we obviously cannot use this optimization */        ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OPTIMIZATIONS, " ***** NOT FOUND"));        AslError (ASL_WARNING, ASL_MSG_COMPILER_INTERNAL, Op,            "Not using optimized name - did not find node");    }    ACPI_FREE (NewPathExternal);    return (Status);}/******************************************************************************* * * FUNCTION:    OptOptimizeNameDeclaration * * PARAMETERS:  Op                  - Current parser op *              WalkState           - Current state *              CurrentNode         - Where we are in the namespace *              AmlNameString       - Unoptimized namepath *              NewPath             - Where the optimized path is returned * * RETURN:      Status. AE_OK If path is optimized * * DESCRIPTION: Perform a simple optimization of removing an extraneous *              backslash prefix if we are already at the root scope. * ******************************************************************************/static ACPI_STATUSOptOptimizeNameDeclaration (    ACPI_PARSE_OBJECT       *Op,    ACPI_WALK_STATE         *WalkState,    ACPI_NAMESPACE_NODE     *CurrentNode,    ACPI_NAMESPACE_NODE     *TargetNode,    char                    *AmlNameString,    char                    **NewPath){    ACPI_STATUS             Status;    char                    *NewPathExternal;    ACPI_GENERIC_STATE      ScopeInfo;    ACPI_NAMESPACE_NODE     *Node;    ACPI_FUNCTION_TRACE (OptOptimizeNameDeclaration);    if (((CurrentNode == AcpiGbl_RootNode) ||        (Op->Common.Parent->Asl.ParseOpcode == PARSEOP_DEFINITIONBLOCK)) &&            (AmlNameString[0] == '\\'))    {        /*         * The current scope is the root, and the namepath has a root prefix         * that is therefore extraneous.  Remove it.         */        *NewPath = &AmlNameString[1];        /* Debug output */        Status = AcpiNsExternalizeName (ACPI_UINT32_MAX, *NewPath,                    NULL, &NewPathExternal);        if (ACPI_FAILURE (Status))        {            AslCoreSubsystemError (Op, Status, "Externalizing NamePath",                ASL_NO_ABORT);            return (Status);        }        /*         * Check to make sure that the optimization finds the node we are         * looking for.  This is simply a sanity check on the new         * path that has been created.         */        ScopeInfo.Scope.Node = CurrentNode;        Status = AcpiNsLookup (&ScopeInfo, *NewPath,                        ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,                        ACPI_NS_DONT_OPEN_SCOPE, WalkState, &(Node));        if (ACPI_SUCCESS (Status))        {            /* Found the namepath, but make sure the node is correct */            if (Node == TargetNode)            {                /* The lookup matched the node, accept this optimization */                AslError (ASL_OPTIMIZATION, ASL_MSG_NAME_OPTIMIZATION,                    Op, NewPathExternal);                ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OPTIMIZATIONS,                    "AT ROOT:   %-24s", NewPathExternal));            }            else            {                /* Node is not correct, do not use this optimization */                Status = AE_NOT_FOUND;                ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OPTIMIZATIONS,                    " ***** WRONG NODE"));                AslError (ASL_WARNING, ASL_MSG_COMPILER_INTERNAL, Op,                    "Not using optimized name - found wrong node");            }        }        else        {            /* The lookup failed, we obviously cannot use this optimization */            ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OPTIMIZATIONS,                " ***** NOT FOUND"));            AslError (ASL_WARNING, ASL_MSG_COMPILER_INTERNAL, Op,                "Not using optimized name - did not find node");        }        ACPI_FREE (NewPathExternal);        return (Status);    }    /* Could not optimize */    return (AE_NOT_FOUND);}/******************************************************************************* * * FUNCTION:    OptOptimizeNamePath * * PARAMETERS:  Op                  - Current parser op *              Flags               - Opcode info flags *              WalkState           - Current state *              AmlNameString       - Unoptimized namepath *              TargetNode          - Node to which AmlNameString refers * * RETURN:      None.  If path is optimized, the Op is updated with new path * * DESCRIPTION: Optimize a Named Declaration or Reference to the minimal length. *              Must take into account both the current location in the *              namespace and the actual reference path. * ******************************************************************************/voidOptOptimizeNamePath (    ACPI_PARSE_OBJECT       *Op,    UINT32                  Flags,    ACPI_WALK_STATE         *WalkState,    char                    *AmlNameString,    ACPI_NAMESPACE_NODE     *TargetNode){    ACPI_STATUS             Status;    ACPI_BUFFER             TargetPath;    ACPI_BUFFER             CurrentPath;    ACPI_SIZE               AmlNameStringLength;    ACPI_NAMESPACE_NODE     *CurrentNode;    char                    *ExternalNameString;    char                    *NewPath = NULL;    ACPI_SIZE               HowMuchShorter;    ACPI_PARSE_OBJECT       *NextOp;    ACPI_FUNCTION_TRACE (OptOptimizeNamePath);    /* This is an optional optimization */    if (!Gbl_ReferenceOptimizationFlag)    {        return_VOID;    }    /* Various required items */    if (!TargetNode || !WalkState || !AmlNameString || !Op->Common.Parent)    {        return_VOID;    }    ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OPTIMIZATIONS, "%5d [%12.12s] [%12.12s] ",        Op->Asl.LogicalLineNumber,        AcpiPsGetOpcodeName (Op->Common.Parent->Common.AmlOpcode),        AcpiPsGetOpcodeName (Op->Common.AmlOpcode)));    if (!(Flags & (AML_NAMED | AML_CREATE)))    {        if (Op->Asl.CompileFlags & NODE_IS_NAME_DECLARATION)        {            /* We don't want to fuss with actual name declaration nodes here */            ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OPTIMIZATIONS,                "******* NAME DECLARATION\n"));            return_VOID;        }    }    /*     * The original path must be longer than one NameSeg (4 chars) for there     * to be any possibility that it can be optimized to a shorter string     */    AmlNameStringLength = ACPI_STRLEN (AmlNameString);    if (AmlNameStringLength <= ACPI_NAME_SIZE)    {        ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OPTIMIZATIONS,            "NAMESEG %4.4s\n", AmlNameString));        return_VOID;    }    /*     * We need to obtain the node that represents the current scope -- where     * we are right now in the namespace.  We will compare this path     * against the Namepath, looking for commonality.     */    CurrentNode = AcpiGbl_RootNode;    if (WalkState->ScopeInfo)    {        CurrentNode = WalkState->ScopeInfo->Scope.Node;    }    if (Flags & (AML_NAMED | AML_CREATE))    {        /* This is the declaration of a new name */        ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OPTIMIZATIONS, "NAME"));        /*         * The node of interest is the parent of this node         * (the containing scope)         */        CurrentNode = Op->Asl.Parent->Asl.Node;        if (!CurrentNode)        {            CurrentNode = AcpiGbl_RootNode;        }    }    else    {        /* This is a reference to an existing named object */        ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OPTIMIZATIONS, "REF "));    }    /*     * Obtain the full paths to the two nodes that we are interested in     * (Target and current namespace location) in external     * format -- something we can easily manipulate     */    TargetPath.Length = ACPI_ALLOCATE_LOCAL_BUFFER;    Status = AcpiNsHandleToPathname (TargetNode, &TargetPath);    if (ACPI_FAILURE (Status))    {        AslCoreSubsystemError (Op, Status, "Getting Target NamePath",            ASL_NO_ABORT);        return_VOID;    }    TargetPath.Length--;    /* Subtract one for null terminator */    /* CurrentPath is the path to this scope (where we are in the namespace) */    CurrentPath.Length = ACPI_ALLOCATE_LOCAL_BUFFER;    Status = AcpiNsHandleToPathname (CurrentNode, &CurrentPath);    if (ACPI_FAILURE (Status))    {        AslCoreSubsystemError (Op, Status, "Getting Current NamePath",            ASL_NO_ABORT);        return_VOID;    }    CurrentPath.Length--;   /* Subtract one for null terminator */    /* Debug output only */    Status = AcpiNsExternalizeName (ACPI_UINT32_MAX, AmlNameString,                NULL, &ExternalNameString);    if (ACPI_FAILURE (Status))    {        AslCoreSubsystemError (Op, Status, "Externalizing NamePath",            ASL_NO_ABORT);        return_VOID;    }    ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OPTIMIZATIONS,        "%37s (%2u) ==> %-32s(%2u) %-32s",        (char *) CurrentPath.Pointer, CurrentPath.Length,        (char *) TargetPath.Pointer, TargetPath.Length, ExternalNameString));    ACPI_FREE (ExternalNameString);    /*     * Attempt an optmization depending on the type of namepath     */    if (Flags & (AML_NAMED | AML_CREATE))    {        /*         * This is a named opcode and the namepath is a name declaration, not         * a reference.         */        Status = OptOptimizeNameDeclaration (Op, WalkState, CurrentNode,                    TargetNode, AmlNameString, &NewPath);        if (ACPI_FAILURE (Status))        {            /*             * 2) now attempt to             *    optimize the namestring with carats (up-arrow)             */            Status = OptBuildShortestPath (Op, WalkState, CurrentNode,                            TargetNode, &CurrentPath, &TargetPath,                            AmlNameStringLength, 1, &NewPath);        }    }    else    {        /*         * This is a reference to an existing named object         *         * 1) Check if search-to-root can be utilized using the last         *    NameSeg of the NamePath         */        Status = OptSearchToRoot (Op, WalkState, CurrentNode,                        TargetNode, &TargetPath, &NewPath);        if (ACPI_FAILURE (Status))        {            /*             * 2) Search-to-root could not be used, now attempt to             *    optimize the namestring with carats (up-arrow)             */            Status = OptBuildShortestPath (Op, WalkState, CurrentNode,                            TargetNode, &CurrentPath, &TargetPath,                            AmlNameStringLength, 0, &NewPath);        }    }    /*     * Success from above indicates that the NamePath was successfully     * optimized.  We need to update the parse op with the new name     */    if (ACPI_SUCCESS (Status))    {        HowMuchShorter = (AmlNameStringLength - ACPI_STRLEN (NewPath));        OptTotal += HowMuchShorter;        ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OPTIMIZATIONS, " REDUCED %2u (%u)",            HowMuchShorter, OptTotal));        if (Flags & AML_NAMED)        {            if (Op->Asl.AmlOpcode == AML_ALIAS_OP)            {                /*                 * ALIAS is the only oddball opcode, the name declaration                 * (alias name) is the second operand                 */                Op->Asl.Child->Asl.Next->Asl.Value.String = NewPath;                Op->Asl.Child->Asl.Next->Asl.AmlLength = ACPI_STRLEN (NewPath);            }            else            {                Op->Asl.Child->Asl.Value.String = NewPath;                Op->Asl.Child->Asl.AmlLength = ACPI_STRLEN (NewPath);            }        }        else if (Flags & AML_CREATE)        {            /* Name must appear as the last parameter */            NextOp = Op->Asl.Child;            while (!(NextOp->Asl.CompileFlags & NODE_IS_NAME_DECLARATION))            {                NextOp = NextOp->Asl.Next;            }            /* Update the parse node with the new NamePath */            NextOp->Asl.Value.String = NewPath;            NextOp->Asl.AmlLength = ACPI_STRLEN (NewPath);        }        else        {            /* Update the parse node with the new NamePath */            Op->Asl.Value.String = NewPath;            Op->Asl.AmlLength = ACPI_STRLEN (NewPath);        }    }    else    {        ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OPTIMIZATIONS, " ALREADY OPTIMAL"));    }    /* Cleanup path buffers */    ACPI_FREE (TargetPath.Pointer);    ACPI_FREE (CurrentPath.Pointer);    ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OPTIMIZATIONS, "\n"));    return_VOID;}

⌨️ 快捷键说明

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