dmutils.c revision 281075
1247720Sjilles/*******************************************************************************
2247720Sjilles *
3247720Sjilles * Module Name: dmutils - AML disassembler utilities
4247720Sjilles *
5247720Sjilles ******************************************************************************/
6247720Sjilles
7247720Sjilles/*
8247720Sjilles * Copyright (C) 2000 - 2015, Intel Corp.
9247720Sjilles * All rights reserved.
10247720Sjilles *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 *    notice, this list of conditions, and the following disclaimer,
16 *    without modification.
17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18 *    substantially similar to the "NO WARRANTY" disclaimer below
19 *    ("Disclaimer") and any redistribution must be conditioned upon
20 *    including a substantially similar Disclaimer requirement for further
21 *    binary redistribution.
22 * 3. Neither the names of the above-listed copyright holders nor the names
23 *    of any contributors may be used to endorse or promote products derived
24 *    from this software without specific prior written permission.
25 *
26 * Alternatively, this software may be distributed under the terms of the
27 * GNU General Public License ("GPL") version 2 as published by the Free
28 * Software Foundation.
29 *
30 * NO WARRANTY
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 * POSSIBILITY OF SUCH DAMAGES.
42 */
43
44#include <contrib/dev/acpica/include/acpi.h>
45#include <contrib/dev/acpica/include/accommon.h>
46#include <contrib/dev/acpica/include/amlcode.h>
47#include <contrib/dev/acpica/include/acdisasm.h>
48
49#ifdef ACPI_ASL_COMPILER
50#include <contrib/dev/acpica/include/acnamesp.h>
51#endif
52
53#ifdef ACPI_DISASSEMBLER
54
55#define _COMPONENT          ACPI_CA_DEBUGGER
56        ACPI_MODULE_NAME    ("dmutils")
57
58
59/* Data used in keeping track of fields */
60#if 0
61const char                      *AcpiGbl_FENames[] =
62{
63    "skip",
64    "?access?"
65};              /* FE = Field Element */
66#endif
67
68/* Operators for Match() */
69
70const char                      *AcpiGbl_MatchOps[] =
71{
72    "MTR",
73    "MEQ",
74    "MLE",
75    "MLT",
76    "MGE",
77    "MGT"
78};
79
80/* Access type decoding */
81
82const char                      *AcpiGbl_AccessTypes[] =
83{
84    "AnyAcc",
85    "ByteAcc",
86    "WordAcc",
87    "DWordAcc",
88    "QWordAcc",
89    "BufferAcc",
90    "InvalidAccType",
91    "InvalidAccType"
92};
93
94/* Lock rule decoding */
95
96const char                      *AcpiGbl_LockRule[] =
97{
98    "NoLock",
99    "Lock"
100};
101
102/* Update rule decoding */
103
104const char                      *AcpiGbl_UpdateRules[] =
105{
106    "Preserve",
107    "WriteAsOnes",
108    "WriteAsZeros",
109    "InvalidUpdateRule"
110};
111
112/* Strings used to decode resource descriptors */
113
114const char                      *AcpiGbl_WordDecode[] =
115{
116    "Memory",
117    "IO",
118    "BusNumber",
119    "UnknownResourceType"
120};
121
122const char                      *AcpiGbl_IrqDecode[] =
123{
124    "IRQNoFlags",
125    "IRQ"
126};
127
128
129/*******************************************************************************
130 *
131 * FUNCTION:    AcpiDmDecodeAttribute
132 *
133 * PARAMETERS:  Attribute       - Attribute field of AccessAs keyword
134 *
135 * RETURN:      None
136 *
137 * DESCRIPTION: Decode the AccessAs attribute byte. (Mostly SMBus and
138 *              GenericSerialBus stuff.)
139 *
140 ******************************************************************************/
141
142void
143AcpiDmDecodeAttribute (
144    UINT8                   Attribute)
145{
146
147    switch (Attribute)
148    {
149    case AML_FIELD_ATTRIB_QUICK:
150
151        AcpiOsPrintf ("AttribQuick");
152        break;
153
154    case AML_FIELD_ATTRIB_SEND_RCV:
155
156        AcpiOsPrintf ("AttribSendReceive");
157        break;
158
159    case AML_FIELD_ATTRIB_BYTE:
160
161        AcpiOsPrintf ("AttribByte");
162        break;
163
164    case AML_FIELD_ATTRIB_WORD:
165
166        AcpiOsPrintf ("AttribWord");
167        break;
168
169    case AML_FIELD_ATTRIB_BLOCK:
170
171        AcpiOsPrintf ("AttribBlock");
172        break;
173
174    case AML_FIELD_ATTRIB_MULTIBYTE:
175
176        AcpiOsPrintf ("AttribBytes");
177        break;
178
179    case AML_FIELD_ATTRIB_WORD_CALL:
180
181        AcpiOsPrintf ("AttribProcessCall");
182        break;
183
184    case AML_FIELD_ATTRIB_BLOCK_CALL:
185
186        AcpiOsPrintf ("AttribBlockProcessCall");
187        break;
188
189    case AML_FIELD_ATTRIB_RAW_BYTES:
190
191        AcpiOsPrintf ("AttribRawBytes");
192        break;
193
194    case AML_FIELD_ATTRIB_RAW_PROCESS:
195
196        AcpiOsPrintf ("AttribRawProcessBytes");
197        break;
198
199    default:
200
201        /* A ByteConst is allowed by the grammar */
202
203        AcpiOsPrintf ("0x%2.2X", Attribute);
204        break;
205    }
206}
207
208
209/*******************************************************************************
210 *
211 * FUNCTION:    AcpiDmIndent
212 *
213 * PARAMETERS:  Level               - Current source code indentation level
214 *
215 * RETURN:      None
216 *
217 * DESCRIPTION: Indent 4 spaces per indentation level.
218 *
219 ******************************************************************************/
220
221void
222AcpiDmIndent (
223    UINT32                  Level)
224{
225
226    if (!Level)
227    {
228        return;
229    }
230
231    AcpiOsPrintf ("%*.s", ACPI_MUL_4 (Level), " ");
232}
233
234
235/*******************************************************************************
236 *
237 * FUNCTION:    AcpiDmCommaIfListMember
238 *
239 * PARAMETERS:  Op              - Current operator/operand
240 *
241 * RETURN:      TRUE if a comma was inserted
242 *
243 * DESCRIPTION: Insert a comma if this Op is a member of an argument list.
244 *
245 ******************************************************************************/
246
247BOOLEAN
248AcpiDmCommaIfListMember (
249    ACPI_PARSE_OBJECT       *Op)
250{
251
252    if (!Op->Common.Next)
253    {
254        return (FALSE);
255    }
256
257    if (AcpiDmListType (Op->Common.Parent) & BLOCK_COMMA_LIST)
258    {
259        /* Exit if Target has been marked IGNORE */
260
261        if (Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_IGNORE)
262        {
263            return (FALSE);
264        }
265
266        /* Check for a NULL target operand */
267
268        if ((Op->Common.Next->Common.AmlOpcode == AML_INT_NAMEPATH_OP) &&
269            (!Op->Common.Next->Common.Value.String))
270        {
271            /*
272             * To handle the Divide() case where there are two optional
273             * targets, look ahead one more op. If null, this null target
274             * is the one and only target -- no comma needed. Otherwise,
275             * we need a comma to prepare for the next target.
276             */
277            if (!Op->Common.Next->Common.Next)
278            {
279                return (FALSE);
280            }
281        }
282
283        if ((Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST) &&
284            (!(Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST)))
285        {
286            return (FALSE);
287        }
288
289        /* Emit comma only if this is not a C-style operator */
290
291        if (!Op->Common.OperatorSymbol)
292        {
293            AcpiOsPrintf (", ");
294        }
295
296        return (TRUE);
297    }
298
299    else if ((Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST) &&
300             (Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST))
301    {
302        AcpiOsPrintf (", ");
303        return (TRUE);
304    }
305
306    return (FALSE);
307}
308
309
310/*******************************************************************************
311 *
312 * FUNCTION:    AcpiDmCommaIfFieldMember
313 *
314 * PARAMETERS:  Op              - Current operator/operand
315 *
316 * RETURN:      None
317 *
318 * DESCRIPTION: Insert a comma if this Op is a member of a Field argument list.
319 *
320 ******************************************************************************/
321
322void
323AcpiDmCommaIfFieldMember (
324    ACPI_PARSE_OBJECT       *Op)
325{
326
327    if (Op->Common.Next)
328    {
329        AcpiOsPrintf (", ");
330    }
331}
332
333#endif
334