Blame source/compiler/asldebug.c

Packit Service 1fb00e
/******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * Module Name: asldebug -- Debug output support
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 "aslcompiler.h"
Packit Service 1fb00e
#include "aslcompiler.y.h"
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
#define _COMPONENT          ACPI_COMPILER
Packit Service 1fb00e
        ACPI_MODULE_NAME    ("asldebug")
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/* Local prototypes */
Packit Service 1fb00e
Packit Service 1fb00e
static void
Packit Service 1fb00e
UtDumpParseOpName (
Packit Service 1fb00e
    ACPI_PARSE_OBJECT       *Op,
Packit Service 1fb00e
    UINT32                  Level,
Packit Service 1fb00e
    UINT32                  DataLength);
Packit Service 1fb00e
Packit Service 1fb00e
static char *
Packit Service 1fb00e
UtCreateEscapeSequences (
Packit Service 1fb00e
    char                    *InString);
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    CvDbgPrint
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  Type                - Type of output
Packit Service 1fb00e
 *              Fmt                 - Printf format string
Packit Service 1fb00e
 *              ...                 - variable printf list
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      None
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Print statement for debug messages within the converter.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
void
Packit Service 1fb00e
CvDbgPrint (
Packit Service 1fb00e
    char                    *Fmt,
Packit Service 1fb00e
    ...)
Packit Service 1fb00e
{
Packit Service 1fb00e
    va_list                 Args;
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    if (!AcpiGbl_CaptureComments || !AcpiGbl_DebugAslConversion)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        return;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    va_start (Args, Fmt);
Packit Service 1fb00e
    (void) vfprintf (AcpiGbl_ConvDebugFile, Fmt, Args);
Packit Service 1fb00e
    va_end (Args);
Packit Service 1fb00e
    return;
Packit Service 1fb00e
}
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    UtDumpIntegerOp
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  Op                  - Current parse op
Packit Service 1fb00e
 *              Level               - Current output indentation level
Packit Service 1fb00e
 *              IntegerLength       - Output length of the integer (2/4/8/16)
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      None
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Emit formatted debug output for "integer" ops.
Packit Service 1fb00e
 *              Note: IntegerLength must be one of 2,4,8,16.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
void
Packit Service 1fb00e
UtDumpIntegerOp (
Packit Service 1fb00e
    ACPI_PARSE_OBJECT       *Op,
Packit Service 1fb00e
    UINT32                  Level,
Packit Service 1fb00e
    UINT32                  IntegerLength)
Packit Service 1fb00e
{
Packit Service 1fb00e
Packit Service 1fb00e
    /* Emit the ParseOp name, leaving room for the integer */
Packit Service 1fb00e
Packit Service 1fb00e
    UtDumpParseOpName (Op, Level, IntegerLength);
Packit Service 1fb00e
Packit Service 1fb00e
    /* Emit the integer based upon length */
Packit Service 1fb00e
Packit Service 1fb00e
    switch (IntegerLength)
Packit Service 1fb00e
    {
Packit Service 1fb00e
    case 2: /* Byte */
Packit Service 1fb00e
    case 4: /* Word */
Packit Service 1fb00e
    case 8: /* Dword */
Packit Service 1fb00e
Packit Service 1fb00e
        DbgPrint (ASL_TREE_OUTPUT,
Packit Service 1fb00e
            "%*.*X", IntegerLength, IntegerLength, Op->Asl.Value.Integer);
Packit Service 1fb00e
        break;
Packit Service 1fb00e
Packit Service 1fb00e
    case 16: /* Qword and Integer */
Packit Service 1fb00e
Packit Service 1fb00e
        DbgPrint (ASL_TREE_OUTPUT,
Packit Service 1fb00e
            "%8.8X%8.8X", ACPI_FORMAT_UINT64 (Op->Asl.Value.Integer));
Packit Service 1fb00e
        break;
Packit Service 1fb00e
Packit Service 1fb00e
    default:
Packit Service 1fb00e
        break;
Packit Service 1fb00e
    }
Packit Service 1fb00e
}
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    UtDumpStringOp
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  Op                  - Current parse op
Packit Service 1fb00e
 *              Level               - Current output indentation level
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      None
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Emit formatted debug output for String/Pathname ops.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
void
Packit Service 1fb00e
UtDumpStringOp (
Packit Service 1fb00e
    ACPI_PARSE_OBJECT       *Op,
Packit Service 1fb00e
    UINT32                  Level)
Packit Service 1fb00e
{
Packit Service 1fb00e
    char                    *String;
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    String = Op->Asl.Value.String;
Packit Service 1fb00e
    if (Op->Asl.ParseOpcode != PARSEOP_STRING_LITERAL)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        /*
Packit Service 1fb00e
         * For the "path" ops NAMEPATH, NAMESEG, METHODCALL -- if the
Packit Service 1fb00e
         * ExternalName is valid, it takes precedence. In these cases the
Packit Service 1fb00e
         * Value.String is the raw "internal" name from the AML code, which
Packit Service 1fb00e
         * we don't want to use, because it contains non-ascii characters.
Packit Service 1fb00e
         */
Packit Service 1fb00e
        if (Op->Asl.ExternalName)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            String = Op->Asl.ExternalName;
Packit Service 1fb00e
        }
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    if (!String)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        DbgPrint (ASL_TREE_OUTPUT,
Packit Service 1fb00e
            " ERROR: Could not find a valid String/Path pointer\n");
Packit Service 1fb00e
        return;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    String = UtCreateEscapeSequences (String);
Packit Service 1fb00e
Packit Service 1fb00e
    /* Emit the ParseOp name, leaving room for the string */
Packit Service 1fb00e
Packit Service 1fb00e
    UtDumpParseOpName (Op, Level, strlen (String));
Packit Service 1fb00e
    DbgPrint (ASL_TREE_OUTPUT, "%s", String);
Packit Service 1fb00e
}
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    UtCreateEscapeSequences
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  InString            - ASCII string to be expanded
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      Expanded string
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Expand all non-printable ASCII bytes (0-0x1F) to escape
Packit Service 1fb00e
 *              sequences. For example, hex 14 becomes \x14
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * NOTE:        Since this function is used for debug output only, it does
Packit Service 1fb00e
 *              not attempt to translate into the "known" escape sequences
Packit Service 1fb00e
 *              such as \a, \f, \t, etc.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
static char *
Packit Service 1fb00e
UtCreateEscapeSequences (
Packit Service 1fb00e
    char                    *InString)
Packit Service 1fb00e
{
Packit Service 1fb00e
    char                    *String = InString;
Packit Service 1fb00e
    char                    *OutString;
Packit Service 1fb00e
    char                    *OutStringPtr;
Packit Service 1fb00e
    UINT32                  InStringLength = 0;
Packit Service 1fb00e
    UINT32                  EscapeCount = 0;
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    /*
Packit Service 1fb00e
     * Determine up front how many escapes are within the string.
Packit Service 1fb00e
     * Obtain the input string length while doing so.
Packit Service 1fb00e
     */
Packit Service 1fb00e
    while (*String)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        if ((*String <= 0x1F) || (*String >= 0x7F))
Packit Service 1fb00e
        {
Packit Service 1fb00e
            EscapeCount++;
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        InStringLength++;
Packit Service 1fb00e
        String++;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    if (!EscapeCount)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        return (InString); /* No escapes, nothing to do */
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* New string buffer, 3 extra chars per escape (4 total) */
Packit Service 1fb00e
Packit Service 1fb00e
    OutString = UtLocalCacheCalloc (InStringLength + (EscapeCount * 3));
Packit Service 1fb00e
    OutStringPtr = OutString;
Packit Service 1fb00e
Packit Service 1fb00e
    /* Convert non-ascii or non-printable chars to escape sequences */
Packit Service 1fb00e
Packit Service 1fb00e
    while (*InString)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        if ((*InString <= 0x1F) || (*InString >= 0x7F))
Packit Service 1fb00e
        {
Packit Service 1fb00e
            /* Insert a \x hex escape sequence */
Packit Service 1fb00e
Packit Service 1fb00e
            OutStringPtr[0] = '\\';
Packit Service 1fb00e
            OutStringPtr[1] = 'x';
Packit Service 1fb00e
            OutStringPtr[2] = AcpiUtHexToAsciiChar (*InString, 4);
Packit Service 1fb00e
            OutStringPtr[3] = AcpiUtHexToAsciiChar (*InString, 0);
Packit Service 1fb00e
            OutStringPtr += 4;
Packit Service 1fb00e
        }
Packit Service 1fb00e
        else /* Normal ASCII character */
Packit Service 1fb00e
        {
Packit Service 1fb00e
            *OutStringPtr = *InString;
Packit Service 1fb00e
            OutStringPtr++;
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        InString++;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    return (OutString);
Packit Service 1fb00e
}
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    UtDumpBasicOp
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  Op                  - Current parse op
Packit Service 1fb00e
 *              Level               - Current output indentation level
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      None
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Generic formatted debug output for "basic" ops that have no
Packit Service 1fb00e
 *              associated strings or integer values.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
void
Packit Service 1fb00e
UtDumpBasicOp (
Packit Service 1fb00e
    ACPI_PARSE_OBJECT       *Op,
Packit Service 1fb00e
    UINT32                  Level)
Packit Service 1fb00e
{
Packit Service 1fb00e
Packit Service 1fb00e
    /* Just print out the ParseOp name, there is no extra data */
Packit Service 1fb00e
Packit Service 1fb00e
    UtDumpParseOpName (Op, Level, 0);
Packit Service 1fb00e
}
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    UtDumpParseOpName
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  Op                  - Current parse op
Packit Service 1fb00e
 *              Level               - Current output indentation level
Packit Service 1fb00e
 *              DataLength          - Length of data to appear after the name
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      None
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Indent and emit the ascii ParseOp name for the op
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
static void
Packit Service 1fb00e
UtDumpParseOpName (
Packit Service 1fb00e
    ACPI_PARSE_OBJECT       *Op,
Packit Service 1fb00e
    UINT32                  Level,
Packit Service 1fb00e
    UINT32                  DataLength)
Packit Service 1fb00e
{
Packit Service 1fb00e
    char                    *ParseOpName;
Packit Service 1fb00e
    UINT32                  IndentLength;
Packit Service 1fb00e
    UINT32                  NameLength;
Packit Service 1fb00e
    UINT32                  LineLength;
Packit Service 1fb00e
    UINT32                  PaddingLength;
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    /* Emit the LineNumber/IndentLevel prefix on each output line */
Packit Service 1fb00e
Packit Service 1fb00e
    DbgPrint (ASL_TREE_OUTPUT,
Packit Service 1fb00e
        "%5.5d [%2d]", Op->Asl.LogicalLineNumber, Level);
Packit Service 1fb00e
Packit Service 1fb00e
    ParseOpName = UtGetOpName (Op->Asl.ParseOpcode);
Packit Service 1fb00e
Packit Service 1fb00e
    /* Calculate various lengths for output alignment */
Packit Service 1fb00e
Packit Service 1fb00e
    IndentLength = Level * DEBUG_SPACES_PER_INDENT;
Packit Service 1fb00e
    NameLength = strlen (ParseOpName);
Packit Service 1fb00e
    LineLength = IndentLength + 1 + NameLength + 1 + DataLength;
Packit Service 1fb00e
    PaddingLength = (DEBUG_MAX_LINE_LENGTH + 1) - LineLength;
Packit Service 1fb00e
Packit Service 1fb00e
    /* Parse tree indentation is based upon the nesting/indent level */
Packit Service 1fb00e
Packit Service 1fb00e
    if (Level)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        DbgPrint (ASL_TREE_OUTPUT, "%*s", IndentLength, " ");
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Emit the actual name here */
Packit Service 1fb00e
Packit Service 1fb00e
    DbgPrint (ASL_TREE_OUTPUT, " %s", ParseOpName);
Packit Service 1fb00e
Packit Service 1fb00e
    /* Emit extra padding blanks for alignment of later data items */
Packit Service 1fb00e
Packit Service 1fb00e
    if (LineLength > DEBUG_MAX_LINE_LENGTH)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        /* Split a long line immediately after the ParseOpName string */
Packit Service 1fb00e
Packit Service 1fb00e
        DbgPrint (ASL_TREE_OUTPUT, "\n%*s",
Packit Service 1fb00e
            (DEBUG_FULL_LINE_LENGTH - DataLength), " ");
Packit Service 1fb00e
    }
Packit Service 1fb00e
    else
Packit Service 1fb00e
    {
Packit Service 1fb00e
        DbgPrint (ASL_TREE_OUTPUT, "%*s", PaddingLength, " ");
Packit Service 1fb00e
    }
Packit Service 1fb00e
}