Ejemplo n.º 1
0
static ACPI_STATUS
LkIsObjectUsed (
    ACPI_HANDLE             ObjHandle,
    UINT32                  Level,
    void                    *Context,
    void                    **ReturnValue)
{
    ACPI_NAMESPACE_NODE     *Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjHandle);


    /* Referenced flag is set during the namespace xref */

    if (Node->Flags & ANOBJ_IS_REFERENCED)
    {
        return (AE_OK);
    }

    /*
     * Ignore names that start with an underscore,
     * these are the reserved ACPI names and are typically not referenced,
     * they are called by the host OS.
     */
    if (Node->Name.Ascii[0] == '_')
    {
        return (AE_OK);
    }

    /* There are some types that are typically not referenced, ignore them */

    switch (Node->Type)
    {
    case ACPI_TYPE_DEVICE:
    case ACPI_TYPE_PROCESSOR:
    case ACPI_TYPE_POWER:
    case ACPI_TYPE_LOCAL_RESOURCE:

        return (AE_OK);

    default:

        break;
    }

    /* All others are valid unreferenced namespace objects */

    if (Node->Op)
    {
        AslError (ASL_WARNING2, ASL_MSG_NOT_REFERENCED, LkGetNameOp (Node->Op), NULL);
    }
    return (AE_OK);
}
Ejemplo n.º 2
0
static ACPI_STATUS
LkIsObjectUsed (
    ACPI_HANDLE             ObjHandle,
    UINT32                  Level,
    void                    *Context,
    void                    **ReturnValue)
{
    ACPI_NAMESPACE_NODE     *Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjHandle);
    ACPI_NAMESPACE_NODE     *Next;


    /* Referenced flag is set during the namespace xref */

    if (Node->Flags & ANOBJ_IS_REFERENCED)
    {
        return (AE_OK);
    }

    if (!Node->Op)
    {
        return (AE_OK);
    }

    /* These types are typically never directly referenced, ignore them */

    switch (Node->Type)
    {
    case ACPI_TYPE_DEVICE:
    case ACPI_TYPE_PROCESSOR:
    case ACPI_TYPE_POWER:
    case ACPI_TYPE_THERMAL:
    case ACPI_TYPE_LOCAL_RESOURCE:

        return (AE_OK);

    default:

        break;
    }

    /* Determine if the name is within a control method */

    Next = Node->Parent;
    while (Next)
    {
        if (Next->Type == ACPI_TYPE_METHOD)
        {
            /*
             * Name is within a method, therefore it is temporary.
             * Issue a remark even if it is a reserved name (starts
             * with an underscore).
             */
            snprintf (MsgBuffer, sizeof(MsgBuffer), "Name is within method [%4.4s]",
                Next->Name.Ascii);
            AslError (ASL_REMARK, ASL_MSG_NOT_REFERENCED,
                LkGetNameOp (Node->Op), MsgBuffer);
            return (AE_OK);
        }

        Next = Next->Parent;
    }

    /* The name is not within a control method */

    /*
     * Ignore names that start with an underscore. These are the reserved
     * ACPI names and are typically not referenced since they are meant
     * to be called by the host OS.
     */
    if (Node->Name.Ascii[0] == '_')
    {
        return (AE_OK);
    }

    /*
     * What remains is an unresolved user name that is not within a method.
     * However, the object could be referenced via another table, so issue
     * the warning at level 2.
     */
    AslError (ASL_WARNING2, ASL_MSG_NOT_REFERENCED,
        LkGetNameOp (Node->Op), NULL);
    return (AE_OK);
}
Ejemplo n.º 3
0
static ACPI_STATUS
LkIsObjectUsed (
    ACPI_HANDLE             ObjHandle,
    UINT32                  Level,
    void                    *Context,
    void                    **ReturnValue)
{
    ACPI_NAMESPACE_NODE     *Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjHandle);
    ACPI_NAMESPACE_NODE     *Next;
    ASL_METHOD_LOCAL        *MethodLocals;
    ASL_METHOD_LOCAL        *MethodArgs;
    UINT32                  i;


    if (Node->Type == ACPI_TYPE_METHOD)
    {
        if (!Node->Op || !Node->MethodLocals)
        {
            return (AE_OK);
        }

        MethodLocals = (ASL_METHOD_LOCAL *) Node->MethodLocals;
        MethodArgs = (ASL_METHOD_LOCAL *) Node->MethodArgs;

        /*
         * Analysis of LocalX variables
         */
        for (i = 0; i < ACPI_METHOD_NUM_LOCALS; i++)
        {
            /* Warn for Locals that are set but never referenced */

            if ((MethodLocals[i].Flags & ASL_LOCAL_INITIALIZED) &&
                (!(MethodLocals[i].Flags & ASL_LOCAL_REFERENCED)))
            {
                sprintf (AslGbl_MsgBuffer, "Local%u", i);
                AslError (ASL_WARNING, ASL_MSG_LOCAL_NOT_USED,
                    MethodLocals[i].Op, AslGbl_MsgBuffer);
            }
        }

        /*
         * Analysis of ArgX variables (standard method arguments,
         * and remaining unused ArgX can also be used as locals)
         */
        for (i = 0; i < ACPI_METHOD_NUM_ARGS; i++)
        {
            if (MethodArgs[i].Flags & ASL_ARG_IS_LOCAL)
            {
                /* Warn if ArgX is being used as a local, but not referenced */

                if ((MethodArgs[i].Flags & ASL_ARG_INITIALIZED) &&
                    (!(MethodArgs[i].Flags & ASL_ARG_REFERENCED)))
                {
                    sprintf (AslGbl_MsgBuffer, "Arg%u", i);
                    AslError (ASL_WARNING, ASL_MSG_ARG_AS_LOCAL_NOT_USED,
                        MethodArgs[i].Op, AslGbl_MsgBuffer);
                }
            }
            else
            {
                /*
                 * Remark if a normal method ArgX is not referenced.
                 * We ignore the predefined methods since often, not
                 * all arguments are needed or used.
                 */
                if ((Node->Name.Ascii[0] != '_') &&
                    (!(MethodArgs[i].Flags & ASL_ARG_REFERENCED)))
                {
                    sprintf (AslGbl_MsgBuffer, "Arg%u", i);
                    AslError (ASL_REMARK, ASL_MSG_ARG_NOT_USED,
                        MethodArgs[i].Op, AslGbl_MsgBuffer);
                }
            }
        }
    }

    /* Referenced flag is set during the namespace xref */

    if (Node->Flags & ANOBJ_IS_REFERENCED)
    {
        return (AE_OK);
    }

    if (!Node->Op)
    {
        return (AE_OK);
    }

    /* These types are typically never directly referenced, ignore them */

    switch (Node->Type)
    {
    case ACPI_TYPE_DEVICE:
    case ACPI_TYPE_PROCESSOR:
    case ACPI_TYPE_POWER:
    case ACPI_TYPE_THERMAL:
    case ACPI_TYPE_LOCAL_RESOURCE:
    case ACPI_TYPE_LOCAL_RESOURCE_FIELD: /* Names assigned to descriptor elements */

        return (AE_OK);

    default:

        break;
    }

    /* Determine if the name is within a control method */

    Next = Node->Parent;
    while (Next)
    {
        if (Next->Type == ACPI_TYPE_METHOD)
        {
            /*
             * Name is within a method, therefore it is temporary.
             * Issue a remark even if it is a reserved name (starts
             * with an underscore).
             */
            sprintf (AslGbl_MsgBuffer, "Name [%4.4s] is within a method [%4.4s]",
                Node->Name.Ascii, Next->Name.Ascii);
            AslError (ASL_REMARK, ASL_MSG_NOT_REFERENCED,
                LkGetNameOp (Node->Op), AslGbl_MsgBuffer);
            return (AE_OK);
        }

        Next = Next->Parent;
    }

    /* The name is not within a control method */

    /*
     * Ignore names that start with an underscore. These are the reserved
     * ACPI names and are typically not referenced since they are meant
     * to be called by the host OS.
     */
    if (Node->Name.Ascii[0] == '_')
    {
        return (AE_OK);
    }

    /*
     * What remains is an unresolved user name that is not within a method.
     * However, the object could be referenced via another table, so issue
     * the warning at level 2.
     */
    AslError (ASL_WARNING2, ASL_MSG_NOT_REFERENCED,
        LkGetNameOp (Node->Op), NULL);
    return (AE_OK);
}