Blame source/tools/acpihelp/ahasl.c

Packit Service 1fb00e
/******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * Module Name: ahasl - ASL operator decoding for acpihelp utility
Packit Service 1fb00e
 *
Packit Service 1fb00e
 *****************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
/*
Packit Service 1fb00e
 * Copyright (C) 2000 - 2018, Intel Corp.
Packit Service 1fb00e
 * All rights reserved.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * Redistribution and use in source and binary forms, with or without
Packit Service 1fb00e
 * modification, are permitted provided that the following conditions
Packit Service 1fb00e
 * are met:
Packit Service 1fb00e
 * 1. Redistributions of source code must retain the above copyright
Packit Service 1fb00e
 *    notice, this list of conditions, and the following disclaimer,
Packit Service 1fb00e
 *    without modification.
Packit Service 1fb00e
 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
Packit Service 1fb00e
 *    substantially similar to the "NO WARRANTY" disclaimer below
Packit Service 1fb00e
 *    ("Disclaimer") and any redistribution must be conditioned upon
Packit Service 1fb00e
 *    including a substantially similar Disclaimer requirement for further
Packit Service 1fb00e
 *    binary redistribution.
Packit Service 1fb00e
 * 3. Neither the names of the above-listed copyright holders nor the names
Packit Service 1fb00e
 *    of any contributors may be used to endorse or promote products derived
Packit Service 1fb00e
 *    from this software without specific prior written permission.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * Alternatively, this software may be distributed under the terms of the
Packit Service 1fb00e
 * GNU General Public License ("GPL") version 2 as published by the Free
Packit Service 1fb00e
 * Software Foundation.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * NO WARRANTY
Packit Service 1fb00e
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Packit Service 1fb00e
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Packit Service 1fb00e
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
Packit Service 1fb00e
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
Packit Service 1fb00e
 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
Packit Service 1fb00e
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
Packit Service 1fb00e
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
Packit Service 1fb00e
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
Packit Service 1fb00e
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
Packit Service 1fb00e
 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
Packit Service 1fb00e
 * POSSIBILITY OF SUCH DAMAGES.
Packit Service 1fb00e
 */
Packit Service 1fb00e
Packit Service 1fb00e
#include "acpihelp.h"
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/* Local prototypes */
Packit Service 1fb00e
Packit Service 1fb00e
static void
Packit Service 1fb00e
AhDisplayAslOperator (
Packit Service 1fb00e
    const AH_ASL_OPERATOR   *Op);
Packit Service 1fb00e
Packit Service 1fb00e
static void
Packit Service 1fb00e
AhDisplayOperatorKeywords (
Packit Service 1fb00e
    const AH_ASL_OPERATOR   *Op);
Packit Service 1fb00e
Packit Service 1fb00e
static void
Packit Service 1fb00e
AhDisplayAslKeyword (
Packit Service 1fb00e
    const AH_ASL_KEYWORD    *Op);
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    AhFindAslKeywords (entry point for ASL keyword search)
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  Name                - Name or prefix for an ASL keyword.
Packit Service 1fb00e
 *                                    NULL means "find all"
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      None
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Find all ASL keywords that match the input Name or name
Packit Service 1fb00e
 *              prefix.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
void
Packit Service 1fb00e
AhFindAslKeywords (
Packit Service 1fb00e
    char                    *Name)
Packit Service 1fb00e
{
Packit Service 1fb00e
    const AH_ASL_KEYWORD    *Keyword;
Packit Service 1fb00e
    BOOLEAN                 Found = FALSE;
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    AcpiUtStrupr (Name);
Packit Service 1fb00e
Packit Service 1fb00e
    for (Keyword = Gbl_AslKeywordInfo; Keyword->Name; Keyword++)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        if (!Name || (Name[0] == '*'))
Packit Service 1fb00e
        {
Packit Service 1fb00e
            AhDisplayAslKeyword (Keyword);
Packit Service 1fb00e
            Found = TRUE;
Packit Service 1fb00e
            continue;
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        /* Upper case the operator name before substring compare */
Packit Service 1fb00e
Packit Service 1fb00e
        strcpy (Gbl_Buffer, Keyword->Name);
Packit Service 1fb00e
        AcpiUtStrupr (Gbl_Buffer);
Packit Service 1fb00e
Packit Service 1fb00e
        if (strstr (Gbl_Buffer, Name) == Gbl_Buffer)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            AhDisplayAslKeyword (Keyword);
Packit Service 1fb00e
            Found = TRUE;
Packit Service 1fb00e
        }
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    if (!Found)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        printf ("%s, no matching ASL keywords\n", Name);
Packit Service 1fb00e
    }
Packit Service 1fb00e
}
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    AhDisplayAslKeyword
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  Op                  - Pointer to ASL keyword with syntax info
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      None
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Format and display syntax info for an ASL keyword. Splits
Packit Service 1fb00e
 *              long lines appropriately for reading.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
static void
Packit Service 1fb00e
AhDisplayAslKeyword (
Packit Service 1fb00e
    const AH_ASL_KEYWORD    *Op)
Packit Service 1fb00e
{
Packit Service 1fb00e
Packit Service 1fb00e
    /* ASL keyword name and description */
Packit Service 1fb00e
Packit Service 1fb00e
    printf ("%22s: %s\n", Op->Name, Op->Description);
Packit Service 1fb00e
    if (!Op->KeywordList)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        return;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* List of actual keywords */
Packit Service 1fb00e
Packit Service 1fb00e
    AhPrintOneField (24, 0, AH_MAX_ASL_LINE_LENGTH, Op->KeywordList);
Packit Service 1fb00e
    printf ("\n");
Packit Service 1fb00e
}
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    AhFindAslAndAmlOperators
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  Name                - Name or prefix for an ASL operator.
Packit Service 1fb00e
 *                                    NULL means "find all"
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      None
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Find all ASL operators that match the input Name or name
Packit Service 1fb00e
 *              prefix. Also displays the AML information if only one entry
Packit Service 1fb00e
 *              matches.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
void
Packit Service 1fb00e
AhFindAslAndAmlOperators (
Packit Service 1fb00e
    char                    *Name)
Packit Service 1fb00e
{
Packit Service 1fb00e
    UINT32                  MatchCount;
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    MatchCount = AhFindAslOperators (Name);
Packit Service 1fb00e
    if (MatchCount == 1)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        AhFindAmlOpcode (Name);
Packit Service 1fb00e
    }
Packit Service 1fb00e
}
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    AhFindAslOperators (entry point for ASL operator search)
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  Name                - Name or prefix for an ASL operator.
Packit Service 1fb00e
 *                                    NULL means "find all"
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      Number of operators that matched the name prefix.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Find all ASL operators that match the input Name or name
Packit Service 1fb00e
 *              prefix.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
UINT32
Packit Service 1fb00e
AhFindAslOperators (
Packit Service 1fb00e
    char                    *Name)
Packit Service 1fb00e
{
Packit Service 1fb00e
    const AH_ASL_OPERATOR   *Operator;
Packit Service 1fb00e
    BOOLEAN                 MatchCount = 0;
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    AcpiUtStrupr (Name);
Packit Service 1fb00e
Packit Service 1fb00e
    /* Find/display all names that match the input name prefix */
Packit Service 1fb00e
Packit Service 1fb00e
    for (Operator = Gbl_AslOperatorInfo; Operator->Name; Operator++)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        if (!Name || (Name[0] == '*'))
Packit Service 1fb00e
        {
Packit Service 1fb00e
            AhDisplayAslOperator (Operator);
Packit Service 1fb00e
            MatchCount++;
Packit Service 1fb00e
            continue;
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        /* Upper case the operator name before substring compare */
Packit Service 1fb00e
Packit Service 1fb00e
        strcpy (Gbl_Buffer, Operator->Name);
Packit Service 1fb00e
        AcpiUtStrupr (Gbl_Buffer);
Packit Service 1fb00e
Packit Service 1fb00e
        if (strstr (Gbl_Buffer, Name) == Gbl_Buffer)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            AhDisplayAslOperator (Operator);
Packit Service 1fb00e
            MatchCount++;
Packit Service 1fb00e
        }
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    if (!MatchCount)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        printf ("%s, no matching ASL operators\n", Name);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    return (MatchCount);
Packit Service 1fb00e
}
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    AhDisplayAslOperator
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  Op                  - Pointer to ASL operator with syntax info
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      None
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Format and display syntax info for an ASL operator. Splits
Packit Service 1fb00e
 *              long lines appropriately for reading.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
static void
Packit Service 1fb00e
AhDisplayAslOperator (
Packit Service 1fb00e
    const AH_ASL_OPERATOR   *Op)
Packit Service 1fb00e
{
Packit Service 1fb00e
Packit Service 1fb00e
    /* ASL operator name and description */
Packit Service 1fb00e
Packit Service 1fb00e
    printf ("%16s: %s\n", Op->Name, Op->Description);
Packit Service 1fb00e
    if (!Op->Syntax)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        return;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Syntax for the operator */
Packit Service 1fb00e
Packit Service 1fb00e
    AhPrintOneField (18, 0, AH_MAX_ASL_LINE_LENGTH, Op->Syntax);
Packit Service 1fb00e
    printf ("\n");
Packit Service 1fb00e
Packit Service 1fb00e
    AhDisplayOperatorKeywords (Op);
Packit Service 1fb00e
    printf ("\n");
Packit Service 1fb00e
}
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    AhDisplayOperatorKeywords
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  Op                  - Pointer to ASL keyword with syntax info
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      None
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Display any/all keywords that are associated with the ASL
Packit Service 1fb00e
 *              operator.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
static void
Packit Service 1fb00e
AhDisplayOperatorKeywords (
Packit Service 1fb00e
    const AH_ASL_OPERATOR   *Op)
Packit Service 1fb00e
{
Packit Service 1fb00e
    char                    *Token;
Packit Service 1fb00e
    char                    *Separators = "(){}, ";
Packit Service 1fb00e
    BOOLEAN                 FirstKeyword = TRUE;
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    if (!Op || !Op->Syntax)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        return;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /*
Packit Service 1fb00e
     * Find all parameters that have the word "keyword" within, and then
Packit Service 1fb00e
     * display the info about that keyword
Packit Service 1fb00e
     */
Packit Service 1fb00e
    strcpy (Gbl_LineBuffer, Op->Syntax);
Packit Service 1fb00e
    Token = strtok (Gbl_LineBuffer, Separators);
Packit Service 1fb00e
    while (Token)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        if (strstr (Token, "Keyword"))
Packit Service 1fb00e
        {
Packit Service 1fb00e
            if (FirstKeyword)
Packit Service 1fb00e
            {
Packit Service 1fb00e
                printf ("\n");
Packit Service 1fb00e
                FirstKeyword = FALSE;
Packit Service 1fb00e
            }
Packit Service 1fb00e
Packit Service 1fb00e
            /* Found a keyword, display keyword information */
Packit Service 1fb00e
Packit Service 1fb00e
            AhFindAslKeywords (Token);
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        Token = strtok (NULL, Separators);
Packit Service 1fb00e
    }
Packit Service 1fb00e
}