1100966Siwasaki/*******************************************************************************
2100966Siwasaki *
3100966Siwasaki * Module Name: dmutils - AML disassembler utilities
4100966Siwasaki *
5100966Siwasaki ******************************************************************************/
6100966Siwasaki
7217365Sjkim/*
8281075Sdim * Copyright (C) 2000 - 2015, Intel Corp.
9100966Siwasaki * All rights reserved.
10100966Siwasaki *
11217365Sjkim * Redistribution and use in source and binary forms, with or without
12217365Sjkim * modification, are permitted provided that the following conditions
13217365Sjkim * are met:
14217365Sjkim * 1. Redistributions of source code must retain the above copyright
15217365Sjkim *    notice, this list of conditions, and the following disclaimer,
16217365Sjkim *    without modification.
17217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18217365Sjkim *    substantially similar to the "NO WARRANTY" disclaimer below
19217365Sjkim *    ("Disclaimer") and any redistribution must be conditioned upon
20217365Sjkim *    including a substantially similar Disclaimer requirement for further
21217365Sjkim *    binary redistribution.
22217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names
23217365Sjkim *    of any contributors may be used to endorse or promote products derived
24217365Sjkim *    from this software without specific prior written permission.
25100966Siwasaki *
26217365Sjkim * Alternatively, this software may be distributed under the terms of the
27217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free
28217365Sjkim * Software Foundation.
29100966Siwasaki *
30217365Sjkim * NO WARRANTY
31217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41217365Sjkim * POSSIBILITY OF SUCH DAMAGES.
42217365Sjkim */
43100966Siwasaki
44193341Sjkim#include <contrib/dev/acpica/include/acpi.h>
45193341Sjkim#include <contrib/dev/acpica/include/accommon.h>
46193341Sjkim#include <contrib/dev/acpica/include/amlcode.h>
47193341Sjkim#include <contrib/dev/acpica/include/acdisasm.h>
48151937Sjkim
49151937Sjkim#ifdef ACPI_ASL_COMPILER
50193341Sjkim#include <contrib/dev/acpica/include/acnamesp.h>
51151937Sjkim#endif
52100966Siwasaki
53100966Siwasaki#ifdef ACPI_DISASSEMBLER
54100966Siwasaki
55102550Siwasaki#define _COMPONENT          ACPI_CA_DEBUGGER
56100966Siwasaki        ACPI_MODULE_NAME    ("dmutils")
57100966Siwasaki
58100966Siwasaki
59100966Siwasaki/* Data used in keeping track of fields */
60100966Siwasaki#if 0
61167802Sjkimconst char                      *AcpiGbl_FENames[] =
62100966Siwasaki{
63100966Siwasaki    "skip",
64100966Siwasaki    "?access?"
65100966Siwasaki};              /* FE = Field Element */
66100966Siwasaki#endif
67100966Siwasaki
68167802Sjkim/* Operators for Match() */
69100966Siwasaki
70167802Sjkimconst char                      *AcpiGbl_MatchOps[] =
71100966Siwasaki{
72100966Siwasaki    "MTR",
73100966Siwasaki    "MEQ",
74100966Siwasaki    "MLE",
75100966Siwasaki    "MLT",
76100966Siwasaki    "MGE",
77100966Siwasaki    "MGT"
78100966Siwasaki};
79100966Siwasaki
80100966Siwasaki/* Access type decoding */
81100966Siwasaki
82167802Sjkimconst char                      *AcpiGbl_AccessTypes[] =
83100966Siwasaki{
84100966Siwasaki    "AnyAcc",
85100966Siwasaki    "ByteAcc",
86100966Siwasaki    "WordAcc",
87100966Siwasaki    "DWordAcc",
88100966Siwasaki    "QWordAcc",
89100966Siwasaki    "BufferAcc",
90167802Sjkim    "InvalidAccType",
91167802Sjkim    "InvalidAccType"
92100966Siwasaki};
93100966Siwasaki
94100966Siwasaki/* Lock rule decoding */
95100966Siwasaki
96167802Sjkimconst char                      *AcpiGbl_LockRule[] =
97100966Siwasaki{
98100966Siwasaki    "NoLock",
99100966Siwasaki    "Lock"
100100966Siwasaki};
101100966Siwasaki
102100966Siwasaki/* Update rule decoding */
103100966Siwasaki
104167802Sjkimconst char                      *AcpiGbl_UpdateRules[] =
105100966Siwasaki{
106100966Siwasaki    "Preserve",
107100966Siwasaki    "WriteAsOnes",
108167802Sjkim    "WriteAsZeros",
109167802Sjkim    "InvalidUpdateRule"
110100966Siwasaki};
111100966Siwasaki
112167802Sjkim/* Strings used to decode resource descriptors */
113100966Siwasaki
114167802Sjkimconst char                      *AcpiGbl_WordDecode[] =
115100966Siwasaki{
116151937Sjkim    "Memory",
117151937Sjkim    "IO",
118151937Sjkim    "BusNumber",
119167802Sjkim    "UnknownResourceType"
120100966Siwasaki};
121100966Siwasaki
122167802Sjkimconst char                      *AcpiGbl_IrqDecode[] =
123100966Siwasaki{
124100966Siwasaki    "IRQNoFlags",
125100966Siwasaki    "IRQ"
126100966Siwasaki};
127100966Siwasaki
128100966Siwasaki
129100966Siwasaki/*******************************************************************************
130100966Siwasaki *
131107325Siwasaki * FUNCTION:    AcpiDmDecodeAttribute
132107325Siwasaki *
133107325Siwasaki * PARAMETERS:  Attribute       - Attribute field of AccessAs keyword
134107325Siwasaki *
135107325Siwasaki * RETURN:      None
136107325Siwasaki *
137228110Sjkim * DESCRIPTION: Decode the AccessAs attribute byte. (Mostly SMBus and
138228110Sjkim *              GenericSerialBus stuff.)
139107325Siwasaki *
140107325Siwasaki ******************************************************************************/
141107325Siwasaki
142107325Siwasakivoid
143107325SiwasakiAcpiDmDecodeAttribute (
144107325Siwasaki    UINT8                   Attribute)
145107325Siwasaki{
146107325Siwasaki
147107325Siwasaki    switch (Attribute)
148107325Siwasaki    {
149228110Sjkim    case AML_FIELD_ATTRIB_QUICK:
150107325Siwasaki
151228110Sjkim        AcpiOsPrintf ("AttribQuick");
152107325Siwasaki        break;
153107325Siwasaki
154228110Sjkim    case AML_FIELD_ATTRIB_SEND_RCV:
155107325Siwasaki
156228110Sjkim        AcpiOsPrintf ("AttribSendReceive");
157107325Siwasaki        break;
158107325Siwasaki
159228110Sjkim    case AML_FIELD_ATTRIB_BYTE:
160107325Siwasaki
161228110Sjkim        AcpiOsPrintf ("AttribByte");
162107325Siwasaki        break;
163107325Siwasaki
164228110Sjkim    case AML_FIELD_ATTRIB_WORD:
165107325Siwasaki
166228110Sjkim        AcpiOsPrintf ("AttribWord");
167107325Siwasaki        break;
168107325Siwasaki
169228110Sjkim    case AML_FIELD_ATTRIB_BLOCK:
170107325Siwasaki
171228110Sjkim        AcpiOsPrintf ("AttribBlock");
172107325Siwasaki        break;
173107325Siwasaki
174228110Sjkim    case AML_FIELD_ATTRIB_MULTIBYTE:
175107325Siwasaki
176228110Sjkim        AcpiOsPrintf ("AttribBytes");
177107325Siwasaki        break;
178107325Siwasaki
179228110Sjkim    case AML_FIELD_ATTRIB_WORD_CALL:
180107325Siwasaki
181228110Sjkim        AcpiOsPrintf ("AttribProcessCall");
182107325Siwasaki        break;
183107325Siwasaki
184228110Sjkim    case AML_FIELD_ATTRIB_BLOCK_CALL:
185228110Sjkim
186228110Sjkim        AcpiOsPrintf ("AttribBlockProcessCall");
187228110Sjkim        break;
188228110Sjkim
189228110Sjkim    case AML_FIELD_ATTRIB_RAW_BYTES:
190228110Sjkim
191228110Sjkim        AcpiOsPrintf ("AttribRawBytes");
192228110Sjkim        break;
193228110Sjkim
194228110Sjkim    case AML_FIELD_ATTRIB_RAW_PROCESS:
195228110Sjkim
196228110Sjkim        AcpiOsPrintf ("AttribRawProcessBytes");
197228110Sjkim        break;
198228110Sjkim
199107325Siwasaki    default:
200107325Siwasaki
201228110Sjkim        /* A ByteConst is allowed by the grammar */
202228110Sjkim
203228110Sjkim        AcpiOsPrintf ("0x%2.2X", Attribute);
204107325Siwasaki        break;
205107325Siwasaki    }
206107325Siwasaki}
207107325Siwasaki
208107325Siwasaki
209107325Siwasaki/*******************************************************************************
210107325Siwasaki *
211100966Siwasaki * FUNCTION:    AcpiDmIndent
212100966Siwasaki *
213100966Siwasaki * PARAMETERS:  Level               - Current source code indentation level
214100966Siwasaki *
215100966Siwasaki * RETURN:      None
216100966Siwasaki *
217100966Siwasaki * DESCRIPTION: Indent 4 spaces per indentation level.
218100966Siwasaki *
219100966Siwasaki ******************************************************************************/
220100966Siwasaki
221100966Siwasakivoid
222100966SiwasakiAcpiDmIndent (
223100966Siwasaki    UINT32                  Level)
224100966Siwasaki{
225100966Siwasaki
226100966Siwasaki    if (!Level)
227100966Siwasaki    {
228100966Siwasaki        return;
229100966Siwasaki    }
230100966Siwasaki
231100966Siwasaki    AcpiOsPrintf ("%*.s", ACPI_MUL_4 (Level), " ");
232100966Siwasaki}
233100966Siwasaki
234100966Siwasaki
235100966Siwasaki/*******************************************************************************
236100966Siwasaki *
237100966Siwasaki * FUNCTION:    AcpiDmCommaIfListMember
238100966Siwasaki *
239100966Siwasaki * PARAMETERS:  Op              - Current operator/operand
240100966Siwasaki *
241100966Siwasaki * RETURN:      TRUE if a comma was inserted
242100966Siwasaki *
243100966Siwasaki * DESCRIPTION: Insert a comma if this Op is a member of an argument list.
244100966Siwasaki *
245100966Siwasaki ******************************************************************************/
246100966Siwasaki
247100966SiwasakiBOOLEAN
248100966SiwasakiAcpiDmCommaIfListMember (
249100966Siwasaki    ACPI_PARSE_OBJECT       *Op)
250100966Siwasaki{
251100966Siwasaki
252100966Siwasaki    if (!Op->Common.Next)
253100966Siwasaki    {
254241973Sjkim        return (FALSE);
255100966Siwasaki    }
256100966Siwasaki
257100966Siwasaki    if (AcpiDmListType (Op->Common.Parent) & BLOCK_COMMA_LIST)
258100966Siwasaki    {
259281075Sdim        /* Exit if Target has been marked IGNORE */
260281075Sdim
261281075Sdim        if (Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_IGNORE)
262281075Sdim        {
263281075Sdim            return (FALSE);
264281075Sdim        }
265281075Sdim
266100966Siwasaki        /* Check for a NULL target operand */
267100966Siwasaki
268100966Siwasaki        if ((Op->Common.Next->Common.AmlOpcode == AML_INT_NAMEPATH_OP) &&
269100966Siwasaki            (!Op->Common.Next->Common.Value.String))
270100966Siwasaki        {
271100966Siwasaki            /*
272100966Siwasaki             * To handle the Divide() case where there are two optional
273241973Sjkim             * targets, look ahead one more op. If null, this null target
274241973Sjkim             * is the one and only target -- no comma needed. Otherwise,
275100966Siwasaki             * we need a comma to prepare for the next target.
276100966Siwasaki             */
277100966Siwasaki            if (!Op->Common.Next->Common.Next)
278100966Siwasaki            {
279241973Sjkim                return (FALSE);
280100966Siwasaki            }
281100966Siwasaki        }
282100966Siwasaki
283100966Siwasaki        if ((Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST) &&
284100966Siwasaki            (!(Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST)))
285100966Siwasaki        {
286241973Sjkim            return (FALSE);
287100966Siwasaki        }
288100966Siwasaki
289281075Sdim        /* Emit comma only if this is not a C-style operator */
290281075Sdim
291281075Sdim        if (!Op->Common.OperatorSymbol)
292281075Sdim        {
293281075Sdim            AcpiOsPrintf (", ");
294281075Sdim        }
295281075Sdim
296100966Siwasaki        return (TRUE);
297100966Siwasaki    }
298100966Siwasaki
299100966Siwasaki    else if ((Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST) &&
300100966Siwasaki             (Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST))
301100966Siwasaki    {
302100966Siwasaki        AcpiOsPrintf (", ");
303100966Siwasaki        return (TRUE);
304100966Siwasaki    }
305100966Siwasaki
306100966Siwasaki    return (FALSE);
307100966Siwasaki}
308100966Siwasaki
309100966Siwasaki
310100966Siwasaki/*******************************************************************************
311100966Siwasaki *
312100966Siwasaki * FUNCTION:    AcpiDmCommaIfFieldMember
313100966Siwasaki *
314100966Siwasaki * PARAMETERS:  Op              - Current operator/operand
315100966Siwasaki *
316100966Siwasaki * RETURN:      None
317100966Siwasaki *
318100966Siwasaki * DESCRIPTION: Insert a comma if this Op is a member of a Field argument list.
319100966Siwasaki *
320100966Siwasaki ******************************************************************************/
321100966Siwasaki
322100966Siwasakivoid
323100966SiwasakiAcpiDmCommaIfFieldMember (
324100966Siwasaki    ACPI_PARSE_OBJECT       *Op)
325100966Siwasaki{
326100966Siwasaki
327100966Siwasaki    if (Op->Common.Next)
328100966Siwasaki    {
329100966Siwasaki        AcpiOsPrintf (", ");
330100966Siwasaki    }
331100966Siwasaki}
332100966Siwasaki
333100966Siwasaki#endif
334