1100966Siwasaki/*******************************************************************************
2100966Siwasaki *
3100966Siwasaki * Module Name: dmutils - AML disassembler utilities
4100966Siwasaki *
5100966Siwasaki ******************************************************************************/
6100966Siwasaki
7217365Sjkim/*
8217365Sjkim * Copyright (C) 2000 - 2011, 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
44100966Siwasaki
45193341Sjkim#include <contrib/dev/acpica/include/acpi.h>
46193341Sjkim#include <contrib/dev/acpica/include/accommon.h>
47193341Sjkim#include <contrib/dev/acpica/include/amlcode.h>
48193341Sjkim#include <contrib/dev/acpica/include/acdisasm.h>
49151937Sjkim
50151937Sjkim#ifdef ACPI_ASL_COMPILER
51193341Sjkim#include <contrib/dev/acpica/include/acnamesp.h>
52151937Sjkim#endif
53100966Siwasaki
54100966Siwasaki#ifdef ACPI_DISASSEMBLER
55100966Siwasaki
56102550Siwasaki#define _COMPONENT          ACPI_CA_DEBUGGER
57100966Siwasaki        ACPI_MODULE_NAME    ("dmutils")
58100966Siwasaki
59100966Siwasaki
60100966Siwasaki/* Data used in keeping track of fields */
61100966Siwasaki#if 0
62167802Sjkimconst char                      *AcpiGbl_FENames[] =
63100966Siwasaki{
64100966Siwasaki    "skip",
65100966Siwasaki    "?access?"
66100966Siwasaki};              /* FE = Field Element */
67100966Siwasaki#endif
68100966Siwasaki
69167802Sjkim/* Operators for Match() */
70100966Siwasaki
71167802Sjkimconst char                      *AcpiGbl_MatchOps[] =
72100966Siwasaki{
73100966Siwasaki    "MTR",
74100966Siwasaki    "MEQ",
75100966Siwasaki    "MLE",
76100966Siwasaki    "MLT",
77100966Siwasaki    "MGE",
78100966Siwasaki    "MGT"
79100966Siwasaki};
80100966Siwasaki
81100966Siwasaki/* Access type decoding */
82100966Siwasaki
83167802Sjkimconst char                      *AcpiGbl_AccessTypes[] =
84100966Siwasaki{
85100966Siwasaki    "AnyAcc",
86100966Siwasaki    "ByteAcc",
87100966Siwasaki    "WordAcc",
88100966Siwasaki    "DWordAcc",
89100966Siwasaki    "QWordAcc",
90100966Siwasaki    "BufferAcc",
91167802Sjkim    "InvalidAccType",
92167802Sjkim    "InvalidAccType"
93100966Siwasaki};
94100966Siwasaki
95100966Siwasaki/* Lock rule decoding */
96100966Siwasaki
97167802Sjkimconst char                      *AcpiGbl_LockRule[] =
98100966Siwasaki{
99100966Siwasaki    "NoLock",
100100966Siwasaki    "Lock"
101100966Siwasaki};
102100966Siwasaki
103100966Siwasaki/* Update rule decoding */
104100966Siwasaki
105167802Sjkimconst char                      *AcpiGbl_UpdateRules[] =
106100966Siwasaki{
107100966Siwasaki    "Preserve",
108100966Siwasaki    "WriteAsOnes",
109167802Sjkim    "WriteAsZeros",
110167802Sjkim    "InvalidUpdateRule"
111100966Siwasaki};
112100966Siwasaki
113167802Sjkim/* Strings used to decode resource descriptors */
114100966Siwasaki
115167802Sjkimconst char                      *AcpiGbl_WordDecode[] =
116100966Siwasaki{
117151937Sjkim    "Memory",
118151937Sjkim    "IO",
119151937Sjkim    "BusNumber",
120167802Sjkim    "UnknownResourceType"
121100966Siwasaki};
122100966Siwasaki
123167802Sjkimconst char                      *AcpiGbl_IrqDecode[] =
124100966Siwasaki{
125100966Siwasaki    "IRQNoFlags",
126100966Siwasaki    "IRQ"
127100966Siwasaki};
128100966Siwasaki
129100966Siwasaki
130100966Siwasaki/*******************************************************************************
131100966Siwasaki *
132107325Siwasaki * FUNCTION:    AcpiDmDecodeAttribute
133107325Siwasaki *
134107325Siwasaki * PARAMETERS:  Attribute       - Attribute field of AccessAs keyword
135107325Siwasaki *
136107325Siwasaki * RETURN:      None
137107325Siwasaki *
138107325Siwasaki * DESCRIPTION: Decode the AccessAs attribute byte.  (Mostly SMBus stuff)
139107325Siwasaki *
140107325Siwasaki ******************************************************************************/
141107325Siwasaki
142107325Siwasakivoid
143107325SiwasakiAcpiDmDecodeAttribute (
144107325Siwasaki    UINT8                   Attribute)
145107325Siwasaki{
146107325Siwasaki
147107325Siwasaki    switch (Attribute)
148107325Siwasaki    {
149107325Siwasaki    case AML_FIELD_ATTRIB_SMB_QUICK:
150107325Siwasaki
151107325Siwasaki        AcpiOsPrintf ("SMBQuick");
152107325Siwasaki        break;
153107325Siwasaki
154107325Siwasaki    case AML_FIELD_ATTRIB_SMB_SEND_RCV:
155107325Siwasaki
156107325Siwasaki        AcpiOsPrintf ("SMBSendReceive");
157107325Siwasaki        break;
158107325Siwasaki
159107325Siwasaki    case AML_FIELD_ATTRIB_SMB_BYTE:
160107325Siwasaki
161107325Siwasaki        AcpiOsPrintf ("SMBByte");
162107325Siwasaki        break;
163107325Siwasaki
164107325Siwasaki    case AML_FIELD_ATTRIB_SMB_WORD:
165107325Siwasaki
166107325Siwasaki        AcpiOsPrintf ("SMBWord");
167107325Siwasaki        break;
168107325Siwasaki
169107325Siwasaki    case AML_FIELD_ATTRIB_SMB_WORD_CALL:
170107325Siwasaki
171107325Siwasaki        AcpiOsPrintf ("SMBProcessCall");
172107325Siwasaki        break;
173107325Siwasaki
174107325Siwasaki    case AML_FIELD_ATTRIB_SMB_BLOCK:
175107325Siwasaki
176107325Siwasaki        AcpiOsPrintf ("SMBBlock");
177107325Siwasaki        break;
178107325Siwasaki
179107325Siwasaki    case AML_FIELD_ATTRIB_SMB_BLOCK_CALL:
180107325Siwasaki
181107325Siwasaki        AcpiOsPrintf ("SMBBlockProcessCall");
182107325Siwasaki        break;
183107325Siwasaki
184107325Siwasaki    default:
185107325Siwasaki
186107325Siwasaki        AcpiOsPrintf ("0x%.2X", Attribute);
187107325Siwasaki        break;
188107325Siwasaki    }
189107325Siwasaki}
190107325Siwasaki
191107325Siwasaki
192107325Siwasaki/*******************************************************************************
193107325Siwasaki *
194100966Siwasaki * FUNCTION:    AcpiDmIndent
195100966Siwasaki *
196100966Siwasaki * PARAMETERS:  Level               - Current source code indentation level
197100966Siwasaki *
198100966Siwasaki * RETURN:      None
199100966Siwasaki *
200100966Siwasaki * DESCRIPTION: Indent 4 spaces per indentation level.
201100966Siwasaki *
202100966Siwasaki ******************************************************************************/
203100966Siwasaki
204100966Siwasakivoid
205100966SiwasakiAcpiDmIndent (
206100966Siwasaki    UINT32                  Level)
207100966Siwasaki{
208100966Siwasaki
209100966Siwasaki    if (!Level)
210100966Siwasaki    {
211100966Siwasaki        return;
212100966Siwasaki    }
213100966Siwasaki
214100966Siwasaki    AcpiOsPrintf ("%*.s", ACPI_MUL_4 (Level), " ");
215100966Siwasaki}
216100966Siwasaki
217100966Siwasaki
218100966Siwasaki/*******************************************************************************
219100966Siwasaki *
220100966Siwasaki * FUNCTION:    AcpiDmCommaIfListMember
221100966Siwasaki *
222100966Siwasaki * PARAMETERS:  Op              - Current operator/operand
223100966Siwasaki *
224100966Siwasaki * RETURN:      TRUE if a comma was inserted
225100966Siwasaki *
226100966Siwasaki * DESCRIPTION: Insert a comma if this Op is a member of an argument list.
227100966Siwasaki *
228100966Siwasaki ******************************************************************************/
229100966Siwasaki
230100966SiwasakiBOOLEAN
231100966SiwasakiAcpiDmCommaIfListMember (
232100966Siwasaki    ACPI_PARSE_OBJECT       *Op)
233100966Siwasaki{
234100966Siwasaki
235100966Siwasaki    if (!Op->Common.Next)
236100966Siwasaki    {
237100966Siwasaki        return FALSE;
238100966Siwasaki    }
239100966Siwasaki
240100966Siwasaki    if (AcpiDmListType (Op->Common.Parent) & BLOCK_COMMA_LIST)
241100966Siwasaki    {
242100966Siwasaki        /* Check for a NULL target operand */
243100966Siwasaki
244100966Siwasaki        if ((Op->Common.Next->Common.AmlOpcode == AML_INT_NAMEPATH_OP) &&
245100966Siwasaki            (!Op->Common.Next->Common.Value.String))
246100966Siwasaki        {
247100966Siwasaki            /*
248100966Siwasaki             * To handle the Divide() case where there are two optional
249100966Siwasaki             * targets, look ahead one more op.  If null, this null target
250100966Siwasaki             * is the one and only target -- no comma needed.  Otherwise,
251100966Siwasaki             * we need a comma to prepare for the next target.
252100966Siwasaki             */
253100966Siwasaki            if (!Op->Common.Next->Common.Next)
254100966Siwasaki            {
255100966Siwasaki                return FALSE;
256100966Siwasaki            }
257100966Siwasaki        }
258100966Siwasaki
259100966Siwasaki        if ((Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST) &&
260100966Siwasaki            (!(Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST)))
261100966Siwasaki        {
262100966Siwasaki            return FALSE;
263100966Siwasaki        }
264100966Siwasaki
265100966Siwasaki        AcpiOsPrintf (", ");
266100966Siwasaki        return (TRUE);
267100966Siwasaki    }
268100966Siwasaki
269100966Siwasaki    else if ((Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST) &&
270100966Siwasaki             (Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST))
271100966Siwasaki    {
272100966Siwasaki        AcpiOsPrintf (", ");
273100966Siwasaki        return (TRUE);
274100966Siwasaki    }
275100966Siwasaki
276100966Siwasaki    return (FALSE);
277100966Siwasaki}
278100966Siwasaki
279100966Siwasaki
280100966Siwasaki/*******************************************************************************
281100966Siwasaki *
282100966Siwasaki * FUNCTION:    AcpiDmCommaIfFieldMember
283100966Siwasaki *
284100966Siwasaki * PARAMETERS:  Op              - Current operator/operand
285100966Siwasaki *
286100966Siwasaki * RETURN:      None
287100966Siwasaki *
288100966Siwasaki * DESCRIPTION: Insert a comma if this Op is a member of a Field argument list.
289100966Siwasaki *
290100966Siwasaki ******************************************************************************/
291100966Siwasaki
292100966Siwasakivoid
293100966SiwasakiAcpiDmCommaIfFieldMember (
294100966Siwasaki    ACPI_PARSE_OBJECT       *Op)
295100966Siwasaki{
296100966Siwasaki
297100966Siwasaki    if (Op->Common.Next)
298100966Siwasaki    {
299100966Siwasaki        AcpiOsPrintf (", ");
300100966Siwasaki    }
301100966Siwasaki}
302100966Siwasaki
303100966Siwasaki#endif
304