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