Blame source/components/disassembler/dmutils.c

Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * Module Name: dmutils - AML disassembler utilities
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 "acpi.h"
Packit Service 1fb00e
#include "accommon.h"
Packit Service 1fb00e
#include "amlcode.h"
Packit Service 1fb00e
#include "acdisasm.h"
Packit Service 1fb00e
#include "acconvert.h"
Packit Service 1fb00e
Packit Service 1fb00e
#ifdef ACPI_ASL_COMPILER
Packit Service 1fb00e
#include <acnamesp.h>
Packit Service 1fb00e
#endif
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
#define _COMPONENT          ACPI_CA_DEBUGGER
Packit Service 1fb00e
        ACPI_MODULE_NAME    ("dmutils")
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/* Data used in keeping track of fields */
Packit Service 1fb00e
#if 0
Packit Service 1fb00e
const char                      *AcpiGbl_FENames[] =
Packit Service 1fb00e
{
Packit Service 1fb00e
    "skip",
Packit Service 1fb00e
    "?access?"
Packit Service 1fb00e
};              /* FE = Field Element */
Packit Service 1fb00e
#endif
Packit Service 1fb00e
Packit Service 1fb00e
/* Operators for Match() */
Packit Service 1fb00e
Packit Service 1fb00e
const char                      *AcpiGbl_MatchOps[] =
Packit Service 1fb00e
{
Packit Service 1fb00e
    "MTR",
Packit Service 1fb00e
    "MEQ",
Packit Service 1fb00e
    "MLE",
Packit Service 1fb00e
    "MLT",
Packit Service 1fb00e
    "MGE",
Packit Service 1fb00e
    "MGT"
Packit Service 1fb00e
};
Packit Service 1fb00e
Packit Service 1fb00e
/* Access type decoding */
Packit Service 1fb00e
Packit Service 1fb00e
const char                      *AcpiGbl_AccessTypes[] =
Packit Service 1fb00e
{
Packit Service 1fb00e
    "AnyAcc",
Packit Service 1fb00e
    "ByteAcc",
Packit Service 1fb00e
    "WordAcc",
Packit Service 1fb00e
    "DWordAcc",
Packit Service 1fb00e
    "QWordAcc",
Packit Service 1fb00e
    "BufferAcc",
Packit Service 1fb00e
    "InvalidAccType",
Packit Service 1fb00e
    "InvalidAccType"
Packit Service 1fb00e
};
Packit Service 1fb00e
Packit Service 1fb00e
/* Lock rule decoding */
Packit Service 1fb00e
Packit Service 1fb00e
const char                      *AcpiGbl_LockRule[] =
Packit Service 1fb00e
{
Packit Service 1fb00e
    "NoLock",
Packit Service 1fb00e
    "Lock"
Packit Service 1fb00e
};
Packit Service 1fb00e
Packit Service 1fb00e
/* Update rule decoding */
Packit Service 1fb00e
Packit Service 1fb00e
const char                      *AcpiGbl_UpdateRules[] =
Packit Service 1fb00e
{
Packit Service 1fb00e
    "Preserve",
Packit Service 1fb00e
    "WriteAsOnes",
Packit Service 1fb00e
    "WriteAsZeros",
Packit Service 1fb00e
    "InvalidUpdateRule"
Packit Service 1fb00e
};
Packit Service 1fb00e
Packit Service 1fb00e
/* Strings used to decode resource descriptors */
Packit Service 1fb00e
Packit Service 1fb00e
const char                      *AcpiGbl_WordDecode[] =
Packit Service 1fb00e
{
Packit Service 1fb00e
    "Memory",
Packit Service 1fb00e
    "IO",
Packit Service 1fb00e
    "BusNumber",
Packit Service 1fb00e
    "UnknownResourceType"
Packit Service 1fb00e
};
Packit Service 1fb00e
Packit Service 1fb00e
const char                      *AcpiGbl_IrqDecode[] =
Packit Service 1fb00e
{
Packit Service 1fb00e
    "IRQNoFlags",
Packit Service 1fb00e
    "IRQ"
Packit Service 1fb00e
};
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    AcpiDmDecodeAttribute
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  Attribute       - Attribute field of AccessAs keyword
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      None
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Decode the AccessAs attribute byte. (Mostly SMBus and
Packit Service 1fb00e
 *              GenericSerialBus stuff.)
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
void
Packit Service 1fb00e
AcpiDmDecodeAttribute (
Packit Service 1fb00e
    UINT8                   Attribute)
Packit Service 1fb00e
{
Packit Service 1fb00e
Packit Service 1fb00e
    switch (Attribute)
Packit Service 1fb00e
    {
Packit Service 1fb00e
    case AML_FIELD_ATTRIB_QUICK:
Packit Service 1fb00e
Packit Service 1fb00e
        AcpiOsPrintf ("AttribQuick");
Packit Service 1fb00e
        break;
Packit Service 1fb00e
Packit Service 1fb00e
    case AML_FIELD_ATTRIB_SEND_RCV:
Packit Service 1fb00e
Packit Service 1fb00e
        AcpiOsPrintf ("AttribSendReceive");
Packit Service 1fb00e
        break;
Packit Service 1fb00e
Packit Service 1fb00e
    case AML_FIELD_ATTRIB_BYTE:
Packit Service 1fb00e
Packit Service 1fb00e
        AcpiOsPrintf ("AttribByte");
Packit Service 1fb00e
        break;
Packit Service 1fb00e
Packit Service 1fb00e
    case AML_FIELD_ATTRIB_WORD:
Packit Service 1fb00e
Packit Service 1fb00e
        AcpiOsPrintf ("AttribWord");
Packit Service 1fb00e
        break;
Packit Service 1fb00e
Packit Service 1fb00e
    case AML_FIELD_ATTRIB_BLOCK:
Packit Service 1fb00e
Packit Service 1fb00e
        AcpiOsPrintf ("AttribBlock");
Packit Service 1fb00e
        break;
Packit Service 1fb00e
Packit Service 1fb00e
    case AML_FIELD_ATTRIB_MULTIBYTE:
Packit Service 1fb00e
Packit Service 1fb00e
        AcpiOsPrintf ("AttribBytes");
Packit Service 1fb00e
        break;
Packit Service 1fb00e
Packit Service 1fb00e
    case AML_FIELD_ATTRIB_WORD_CALL:
Packit Service 1fb00e
Packit Service 1fb00e
        AcpiOsPrintf ("AttribProcessCall");
Packit Service 1fb00e
        break;
Packit Service 1fb00e
Packit Service 1fb00e
    case AML_FIELD_ATTRIB_BLOCK_CALL:
Packit Service 1fb00e
Packit Service 1fb00e
        AcpiOsPrintf ("AttribBlockProcessCall");
Packit Service 1fb00e
        break;
Packit Service 1fb00e
Packit Service 1fb00e
    case AML_FIELD_ATTRIB_RAW_BYTES:
Packit Service 1fb00e
Packit Service 1fb00e
        AcpiOsPrintf ("AttribRawBytes");
Packit Service 1fb00e
        break;
Packit Service 1fb00e
Packit Service 1fb00e
    case AML_FIELD_ATTRIB_RAW_PROCESS:
Packit Service 1fb00e
Packit Service 1fb00e
        AcpiOsPrintf ("AttribRawProcessBytes");
Packit Service 1fb00e
        break;
Packit Service 1fb00e
Packit Service 1fb00e
    default:
Packit Service 1fb00e
Packit Service 1fb00e
        /* A ByteConst is allowed by the grammar */
Packit Service 1fb00e
Packit Service 1fb00e
        AcpiOsPrintf ("0x%2.2X", Attribute);
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:    AcpiDmIndent
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  Level               - Current source code indentation level
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      None
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Indent 4 spaces per indentation level.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
void
Packit Service 1fb00e
AcpiDmIndent (
Packit Service 1fb00e
    UINT32                  Level)
Packit Service 1fb00e
{
Packit Service 1fb00e
Packit Service 1fb00e
    if (!Level)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        return;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    AcpiOsPrintf ("%*.s", (Level * 4), " ");
Packit Service 1fb00e
}
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    AcpiDmCommaIfListMember
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  Op              - Current operator/operand
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      TRUE if a comma was inserted
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Insert a comma if this Op is a member of an argument list.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
BOOLEAN
Packit Service 1fb00e
AcpiDmCommaIfListMember (
Packit Service 1fb00e
    ACPI_PARSE_OBJECT       *Op)
Packit Service 1fb00e
{
Packit Service 1fb00e
Packit Service 1fb00e
    if (!Op->Common.Next)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        ASL_CV_PRINT_ONE_COMMENT (Op, AMLCOMMENT_INLINE, NULL, 0);
Packit Service 1fb00e
        return (FALSE);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    if (AcpiDmListType (Op->Common.Parent) & BLOCK_COMMA_LIST)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        /* Exit if Target has been marked IGNORE */
Packit Service 1fb00e
Packit Service 1fb00e
        if (Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_IGNORE)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            ASL_CV_PRINT_ONE_COMMENT (Op, AMLCOMMENT_INLINE, NULL, 0);
Packit Service 1fb00e
            return (FALSE);
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        /* Check for a NULL target operand */
Packit Service 1fb00e
Packit Service 1fb00e
        if ((Op->Common.Next->Common.AmlOpcode == AML_INT_NAMEPATH_OP) &&
Packit Service 1fb00e
            (!Op->Common.Next->Common.Value.String))
Packit Service 1fb00e
        {
Packit Service 1fb00e
            /*
Packit Service 1fb00e
             * To handle the Divide() case where there are two optional
Packit Service 1fb00e
             * targets, look ahead one more op. If null, this null target
Packit Service 1fb00e
             * is the one and only target -- no comma needed. Otherwise,
Packit Service 1fb00e
             * we need a comma to prepare for the next target.
Packit Service 1fb00e
             */
Packit Service 1fb00e
            if (!Op->Common.Next->Common.Next)
Packit Service 1fb00e
            {
Packit Service 1fb00e
                ASL_CV_PRINT_ONE_COMMENT (Op, AMLCOMMENT_INLINE, NULL, 0);
Packit Service 1fb00e
                return (FALSE);
Packit Service 1fb00e
            }
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        if ((Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMETER_LIST) &&
Packit Service 1fb00e
            (!(Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_PARAMETER_LIST)))
Packit Service 1fb00e
        {
Packit Service 1fb00e
            ASL_CV_PRINT_ONE_COMMENT (Op, AMLCOMMENT_INLINE, NULL, 0);
Packit Service 1fb00e
            return (FALSE);
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        /* Emit comma only if this is not a C-style operator */
Packit Service 1fb00e
Packit Service 1fb00e
        if (!Op->Common.OperatorSymbol)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            AcpiOsPrintf (", ");
Packit Service 1fb00e
            ASL_CV_PRINT_ONE_COMMENT (Op, AMLCOMMENT_INLINE, NULL, 0);
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        return (TRUE);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    else if ((Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMETER_LIST) &&
Packit Service 1fb00e
             (Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_PARAMETER_LIST))
Packit Service 1fb00e
    {
Packit Service 1fb00e
        AcpiOsPrintf (", ");
Packit Service 1fb00e
        ASL_CV_PRINT_ONE_COMMENT (Op, AMLCOMMENT_INLINE, NULL, 0);
Packit Service 1fb00e
Packit Service 1fb00e
        return (TRUE);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    return (FALSE);
Packit Service 1fb00e
}
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    AcpiDmCommaIfFieldMember
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  Op              - Current operator/operand
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      None
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Insert a comma if this Op is a member of a Field argument list.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
void
Packit Service 1fb00e
AcpiDmCommaIfFieldMember (
Packit Service 1fb00e
    ACPI_PARSE_OBJECT       *Op)
Packit Service 1fb00e
{
Packit Service 1fb00e
Packit Service 1fb00e
    if (Op->Common.Next)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        AcpiOsPrintf (", ");
Packit Service 1fb00e
    }
Packit Service 1fb00e
}