xref: /dflybsd-src/sys/contrib/dev/acpica/source/components/disassembler/dmutils.c (revision 0d27ae553036e6073e8793cf6f2fb4583c33f3dc)
10d02842fSSascha Wildner /*******************************************************************************
20d02842fSSascha Wildner  *
30d02842fSSascha Wildner  * Module Name: dmutils - AML disassembler utilities
40d02842fSSascha Wildner  *
50d02842fSSascha Wildner  ******************************************************************************/
60d02842fSSascha Wildner 
70d02842fSSascha Wildner /*
8f5f76cf2SSascha Wildner  * Copyright (C) 2000 - 2016, Intel Corp.
90d02842fSSascha Wildner  * All rights reserved.
100d02842fSSascha Wildner  *
110d02842fSSascha Wildner  * Redistribution and use in source and binary forms, with or without
120d02842fSSascha Wildner  * modification, are permitted provided that the following conditions
130d02842fSSascha Wildner  * are met:
140d02842fSSascha Wildner  * 1. Redistributions of source code must retain the above copyright
150d02842fSSascha Wildner  *    notice, this list of conditions, and the following disclaimer,
160d02842fSSascha Wildner  *    without modification.
170d02842fSSascha Wildner  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
180d02842fSSascha Wildner  *    substantially similar to the "NO WARRANTY" disclaimer below
190d02842fSSascha Wildner  *    ("Disclaimer") and any redistribution must be conditioned upon
200d02842fSSascha Wildner  *    including a substantially similar Disclaimer requirement for further
210d02842fSSascha Wildner  *    binary redistribution.
220d02842fSSascha Wildner  * 3. Neither the names of the above-listed copyright holders nor the names
230d02842fSSascha Wildner  *    of any contributors may be used to endorse or promote products derived
240d02842fSSascha Wildner  *    from this software without specific prior written permission.
250d02842fSSascha Wildner  *
260d02842fSSascha Wildner  * Alternatively, this software may be distributed under the terms of the
270d02842fSSascha Wildner  * GNU General Public License ("GPL") version 2 as published by the Free
280d02842fSSascha Wildner  * Software Foundation.
290d02842fSSascha Wildner  *
300d02842fSSascha Wildner  * NO WARRANTY
310d02842fSSascha Wildner  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
320d02842fSSascha Wildner  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
330d02842fSSascha Wildner  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
340d02842fSSascha Wildner  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
350d02842fSSascha Wildner  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
360d02842fSSascha Wildner  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
370d02842fSSascha Wildner  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
380d02842fSSascha Wildner  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
390d02842fSSascha Wildner  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
400d02842fSSascha Wildner  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
410d02842fSSascha Wildner  * POSSIBILITY OF SUCH DAMAGES.
420d02842fSSascha Wildner  */
430d02842fSSascha Wildner 
440d02842fSSascha Wildner #include "acpi.h"
450d02842fSSascha Wildner #include "accommon.h"
460d02842fSSascha Wildner #include "amlcode.h"
470d02842fSSascha Wildner #include "acdisasm.h"
480d02842fSSascha Wildner 
490d02842fSSascha Wildner #ifdef ACPI_ASL_COMPILER
500d02842fSSascha Wildner #include <acnamesp.h>
510d02842fSSascha Wildner #endif
520d02842fSSascha Wildner 
530d02842fSSascha Wildner #ifdef ACPI_DISASSEMBLER
540d02842fSSascha Wildner 
550d02842fSSascha Wildner #define _COMPONENT          ACPI_CA_DEBUGGER
560d02842fSSascha Wildner         ACPI_MODULE_NAME    ("dmutils")
570d02842fSSascha Wildner 
580d02842fSSascha Wildner 
590d02842fSSascha Wildner /* Data used in keeping track of fields */
600d02842fSSascha Wildner #if 0
610d02842fSSascha Wildner const char                      *AcpiGbl_FENames[] =
620d02842fSSascha Wildner {
630d02842fSSascha Wildner     "skip",
640d02842fSSascha Wildner     "?access?"
650d02842fSSascha Wildner };              /* FE = Field Element */
660d02842fSSascha Wildner #endif
670d02842fSSascha Wildner 
680d02842fSSascha Wildner /* Operators for Match() */
690d02842fSSascha Wildner 
700d02842fSSascha Wildner const char                      *AcpiGbl_MatchOps[] =
710d02842fSSascha Wildner {
720d02842fSSascha Wildner     "MTR",
730d02842fSSascha Wildner     "MEQ",
740d02842fSSascha Wildner     "MLE",
750d02842fSSascha Wildner     "MLT",
760d02842fSSascha Wildner     "MGE",
770d02842fSSascha Wildner     "MGT"
780d02842fSSascha Wildner };
790d02842fSSascha Wildner 
800d02842fSSascha Wildner /* Access type decoding */
810d02842fSSascha Wildner 
820d02842fSSascha Wildner const char                      *AcpiGbl_AccessTypes[] =
830d02842fSSascha Wildner {
840d02842fSSascha Wildner     "AnyAcc",
850d02842fSSascha Wildner     "ByteAcc",
860d02842fSSascha Wildner     "WordAcc",
870d02842fSSascha Wildner     "DWordAcc",
880d02842fSSascha Wildner     "QWordAcc",
890d02842fSSascha Wildner     "BufferAcc",
900d02842fSSascha Wildner     "InvalidAccType",
910d02842fSSascha Wildner     "InvalidAccType"
920d02842fSSascha Wildner };
930d02842fSSascha Wildner 
940d02842fSSascha Wildner /* Lock rule decoding */
950d02842fSSascha Wildner 
960d02842fSSascha Wildner const char                      *AcpiGbl_LockRule[] =
970d02842fSSascha Wildner {
980d02842fSSascha Wildner     "NoLock",
990d02842fSSascha Wildner     "Lock"
1000d02842fSSascha Wildner };
1010d02842fSSascha Wildner 
1020d02842fSSascha Wildner /* Update rule decoding */
1030d02842fSSascha Wildner 
1040d02842fSSascha Wildner const char                      *AcpiGbl_UpdateRules[] =
1050d02842fSSascha Wildner {
1060d02842fSSascha Wildner     "Preserve",
1070d02842fSSascha Wildner     "WriteAsOnes",
1080d02842fSSascha Wildner     "WriteAsZeros",
1090d02842fSSascha Wildner     "InvalidUpdateRule"
1100d02842fSSascha Wildner };
1110d02842fSSascha Wildner 
1120d02842fSSascha Wildner /* Strings used to decode resource descriptors */
1130d02842fSSascha Wildner 
1140d02842fSSascha Wildner const char                      *AcpiGbl_WordDecode[] =
1150d02842fSSascha Wildner {
1160d02842fSSascha Wildner     "Memory",
1170d02842fSSascha Wildner     "IO",
1180d02842fSSascha Wildner     "BusNumber",
1190d02842fSSascha Wildner     "UnknownResourceType"
1200d02842fSSascha Wildner };
1210d02842fSSascha Wildner 
1220d02842fSSascha Wildner const char                      *AcpiGbl_IrqDecode[] =
1230d02842fSSascha Wildner {
1240d02842fSSascha Wildner     "IRQNoFlags",
1250d02842fSSascha Wildner     "IRQ"
1260d02842fSSascha Wildner };
1270d02842fSSascha Wildner 
1280d02842fSSascha Wildner 
1290d02842fSSascha Wildner /*******************************************************************************
1300d02842fSSascha Wildner  *
1310d02842fSSascha Wildner  * FUNCTION:    AcpiDmDecodeAttribute
1320d02842fSSascha Wildner  *
1330d02842fSSascha Wildner  * PARAMETERS:  Attribute       - Attribute field of AccessAs keyword
1340d02842fSSascha Wildner  *
1350d02842fSSascha Wildner  * RETURN:      None
1360d02842fSSascha Wildner  *
1370d02842fSSascha Wildner  * DESCRIPTION: Decode the AccessAs attribute byte. (Mostly SMBus and
1380d02842fSSascha Wildner  *              GenericSerialBus stuff.)
1390d02842fSSascha Wildner  *
1400d02842fSSascha Wildner  ******************************************************************************/
1410d02842fSSascha Wildner 
1420d02842fSSascha Wildner void
1430d02842fSSascha Wildner AcpiDmDecodeAttribute (
1440d02842fSSascha Wildner     UINT8                   Attribute)
1450d02842fSSascha Wildner {
1460d02842fSSascha Wildner 
1470d02842fSSascha Wildner     switch (Attribute)
1480d02842fSSascha Wildner     {
1490d02842fSSascha Wildner     case AML_FIELD_ATTRIB_QUICK:
1500d02842fSSascha Wildner 
1510d02842fSSascha Wildner         AcpiOsPrintf ("AttribQuick");
1520d02842fSSascha Wildner         break;
1530d02842fSSascha Wildner 
1540d02842fSSascha Wildner     case AML_FIELD_ATTRIB_SEND_RCV:
1550d02842fSSascha Wildner 
1560d02842fSSascha Wildner         AcpiOsPrintf ("AttribSendReceive");
1570d02842fSSascha Wildner         break;
1580d02842fSSascha Wildner 
1590d02842fSSascha Wildner     case AML_FIELD_ATTRIB_BYTE:
1600d02842fSSascha Wildner 
1610d02842fSSascha Wildner         AcpiOsPrintf ("AttribByte");
1620d02842fSSascha Wildner         break;
1630d02842fSSascha Wildner 
1640d02842fSSascha Wildner     case AML_FIELD_ATTRIB_WORD:
1650d02842fSSascha Wildner 
1660d02842fSSascha Wildner         AcpiOsPrintf ("AttribWord");
1670d02842fSSascha Wildner         break;
1680d02842fSSascha Wildner 
1690d02842fSSascha Wildner     case AML_FIELD_ATTRIB_BLOCK:
1700d02842fSSascha Wildner 
1710d02842fSSascha Wildner         AcpiOsPrintf ("AttribBlock");
1720d02842fSSascha Wildner         break;
1730d02842fSSascha Wildner 
1740d02842fSSascha Wildner     case AML_FIELD_ATTRIB_MULTIBYTE:
1750d02842fSSascha Wildner 
1760d02842fSSascha Wildner         AcpiOsPrintf ("AttribBytes");
1770d02842fSSascha Wildner         break;
1780d02842fSSascha Wildner 
1790d02842fSSascha Wildner     case AML_FIELD_ATTRIB_WORD_CALL:
1800d02842fSSascha Wildner 
1810d02842fSSascha Wildner         AcpiOsPrintf ("AttribProcessCall");
1820d02842fSSascha Wildner         break;
1830d02842fSSascha Wildner 
1840d02842fSSascha Wildner     case AML_FIELD_ATTRIB_BLOCK_CALL:
1850d02842fSSascha Wildner 
1860d02842fSSascha Wildner         AcpiOsPrintf ("AttribBlockProcessCall");
1870d02842fSSascha Wildner         break;
1880d02842fSSascha Wildner 
1890d02842fSSascha Wildner     case AML_FIELD_ATTRIB_RAW_BYTES:
1900d02842fSSascha Wildner 
1910d02842fSSascha Wildner         AcpiOsPrintf ("AttribRawBytes");
1920d02842fSSascha Wildner         break;
1930d02842fSSascha Wildner 
1940d02842fSSascha Wildner     case AML_FIELD_ATTRIB_RAW_PROCESS:
1950d02842fSSascha Wildner 
1960d02842fSSascha Wildner         AcpiOsPrintf ("AttribRawProcessBytes");
1970d02842fSSascha Wildner         break;
1980d02842fSSascha Wildner 
1990d02842fSSascha Wildner     default:
2000d02842fSSascha Wildner 
2010d02842fSSascha Wildner         /* A ByteConst is allowed by the grammar */
2020d02842fSSascha Wildner 
2030d02842fSSascha Wildner         AcpiOsPrintf ("0x%2.2X", Attribute);
2040d02842fSSascha Wildner         break;
2050d02842fSSascha Wildner     }
2060d02842fSSascha Wildner }
2070d02842fSSascha Wildner 
2080d02842fSSascha Wildner 
2090d02842fSSascha Wildner /*******************************************************************************
2100d02842fSSascha Wildner  *
2110d02842fSSascha Wildner  * FUNCTION:    AcpiDmIndent
2120d02842fSSascha Wildner  *
2130d02842fSSascha Wildner  * PARAMETERS:  Level               - Current source code indentation level
2140d02842fSSascha Wildner  *
2150d02842fSSascha Wildner  * RETURN:      None
2160d02842fSSascha Wildner  *
2170d02842fSSascha Wildner  * DESCRIPTION: Indent 4 spaces per indentation level.
2180d02842fSSascha Wildner  *
2190d02842fSSascha Wildner  ******************************************************************************/
2200d02842fSSascha Wildner 
2210d02842fSSascha Wildner void
2220d02842fSSascha Wildner AcpiDmIndent (
2230d02842fSSascha Wildner     UINT32                  Level)
2240d02842fSSascha Wildner {
2250d02842fSSascha Wildner 
2260d02842fSSascha Wildner     if (!Level)
2270d02842fSSascha Wildner     {
2280d02842fSSascha Wildner         return;
2290d02842fSSascha Wildner     }
2300d02842fSSascha Wildner 
2312ffe9f16SSascha Wildner     AcpiOsPrintf ("%*.s", (Level * 4), " ");
2320d02842fSSascha Wildner }
2330d02842fSSascha Wildner 
2340d02842fSSascha Wildner 
2350d02842fSSascha Wildner /*******************************************************************************
2360d02842fSSascha Wildner  *
2370d02842fSSascha Wildner  * FUNCTION:    AcpiDmCommaIfListMember
2380d02842fSSascha Wildner  *
2390d02842fSSascha Wildner  * PARAMETERS:  Op              - Current operator/operand
2400d02842fSSascha Wildner  *
2410d02842fSSascha Wildner  * RETURN:      TRUE if a comma was inserted
2420d02842fSSascha Wildner  *
2430d02842fSSascha Wildner  * DESCRIPTION: Insert a comma if this Op is a member of an argument list.
2440d02842fSSascha Wildner  *
2450d02842fSSascha Wildner  ******************************************************************************/
2460d02842fSSascha Wildner 
2470d02842fSSascha Wildner BOOLEAN
2480d02842fSSascha Wildner AcpiDmCommaIfListMember (
2490d02842fSSascha Wildner     ACPI_PARSE_OBJECT       *Op)
2500d02842fSSascha Wildner {
2510d02842fSSascha Wildner 
2520d02842fSSascha Wildner     if (!Op->Common.Next)
2530d02842fSSascha Wildner     {
2540d02842fSSascha Wildner         return (FALSE);
2550d02842fSSascha Wildner     }
2560d02842fSSascha Wildner 
2570d02842fSSascha Wildner     if (AcpiDmListType (Op->Common.Parent) & BLOCK_COMMA_LIST)
2580d02842fSSascha Wildner     {
2592e2672b8SSascha Wildner         /* Exit if Target has been marked IGNORE */
2602e2672b8SSascha Wildner 
2612e2672b8SSascha Wildner         if (Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_IGNORE)
2622e2672b8SSascha Wildner         {
2632e2672b8SSascha Wildner             return (FALSE);
2642e2672b8SSascha Wildner         }
2652e2672b8SSascha Wildner 
2660d02842fSSascha Wildner         /* Check for a NULL target operand */
2670d02842fSSascha Wildner 
2680d02842fSSascha Wildner         if ((Op->Common.Next->Common.AmlOpcode == AML_INT_NAMEPATH_OP) &&
2690d02842fSSascha Wildner             (!Op->Common.Next->Common.Value.String))
2700d02842fSSascha Wildner         {
2710d02842fSSascha Wildner             /*
2720d02842fSSascha Wildner              * To handle the Divide() case where there are two optional
2730d02842fSSascha Wildner              * targets, look ahead one more op. If null, this null target
2740d02842fSSascha Wildner              * is the one and only target -- no comma needed. Otherwise,
2750d02842fSSascha Wildner              * we need a comma to prepare for the next target.
2760d02842fSSascha Wildner              */
2770d02842fSSascha Wildner             if (!Op->Common.Next->Common.Next)
2780d02842fSSascha Wildner             {
2790d02842fSSascha Wildner                 return (FALSE);
2800d02842fSSascha Wildner             }
2810d02842fSSascha Wildner         }
2820d02842fSSascha Wildner 
283*0d27ae55SSascha Wildner         if ((Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMETER_LIST) &&
284*0d27ae55SSascha Wildner             (!(Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_PARAMETER_LIST)))
2850d02842fSSascha Wildner         {
2860d02842fSSascha Wildner             return (FALSE);
2870d02842fSSascha Wildner         }
2880d02842fSSascha Wildner 
2892e2672b8SSascha Wildner         /* Emit comma only if this is not a C-style operator */
2902e2672b8SSascha Wildner 
2912e2672b8SSascha Wildner         if (!Op->Common.OperatorSymbol)
2922e2672b8SSascha Wildner         {
2930d02842fSSascha Wildner             AcpiOsPrintf (", ");
2942e2672b8SSascha Wildner         }
2952e2672b8SSascha Wildner 
2960d02842fSSascha Wildner         return (TRUE);
2970d02842fSSascha Wildner     }
2980d02842fSSascha Wildner 
299*0d27ae55SSascha Wildner     else if ((Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMETER_LIST) &&
300*0d27ae55SSascha Wildner              (Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_PARAMETER_LIST))
3010d02842fSSascha Wildner     {
3020d02842fSSascha Wildner         AcpiOsPrintf (", ");
3030d02842fSSascha Wildner         return (TRUE);
3040d02842fSSascha Wildner     }
3050d02842fSSascha Wildner 
3060d02842fSSascha Wildner     return (FALSE);
3070d02842fSSascha Wildner }
3080d02842fSSascha Wildner 
3090d02842fSSascha Wildner 
3100d02842fSSascha Wildner /*******************************************************************************
3110d02842fSSascha Wildner  *
3120d02842fSSascha Wildner  * FUNCTION:    AcpiDmCommaIfFieldMember
3130d02842fSSascha Wildner  *
3140d02842fSSascha Wildner  * PARAMETERS:  Op              - Current operator/operand
3150d02842fSSascha Wildner  *
3160d02842fSSascha Wildner  * RETURN:      None
3170d02842fSSascha Wildner  *
3180d02842fSSascha Wildner  * DESCRIPTION: Insert a comma if this Op is a member of a Field argument list.
3190d02842fSSascha Wildner  *
3200d02842fSSascha Wildner  ******************************************************************************/
3210d02842fSSascha Wildner 
3220d02842fSSascha Wildner void
3230d02842fSSascha Wildner AcpiDmCommaIfFieldMember (
3240d02842fSSascha Wildner     ACPI_PARSE_OBJECT       *Op)
3250d02842fSSascha Wildner {
3260d02842fSSascha Wildner 
3270d02842fSSascha Wildner     if (Op->Common.Next)
3280d02842fSSascha Wildner     {
3290d02842fSSascha Wildner         AcpiOsPrintf (", ");
3300d02842fSSascha Wildner     }
3310d02842fSSascha Wildner }
3320d02842fSSascha Wildner 
3330d02842fSSascha Wildner #endif
334