xref: /titanic_51/usr/src/uts/intel/io/acpica/disassembler/dmopcode.c (revision 385cc6b4ad1792caef3f84eb61eed3f27085801f)
1ae115bc7Smrj /*******************************************************************************
2ae115bc7Smrj  *
3ae115bc7Smrj  * Module Name: dmopcode - AML disassembler, specific AML opcodes
4ae115bc7Smrj  *
5ae115bc7Smrj  ******************************************************************************/
6ae115bc7Smrj 
726f3cdf0SGordon Ross /*
8*385cc6b4SJerry Jelinek  * Copyright (C) 2000 - 2016, Intel Corp.
9ae115bc7Smrj  * All rights reserved.
10ae115bc7Smrj  *
1126f3cdf0SGordon Ross  * Redistribution and use in source and binary forms, with or without
1226f3cdf0SGordon Ross  * modification, are permitted provided that the following conditions
1326f3cdf0SGordon Ross  * are met:
1426f3cdf0SGordon Ross  * 1. Redistributions of source code must retain the above copyright
1526f3cdf0SGordon Ross  *    notice, this list of conditions, and the following disclaimer,
1626f3cdf0SGordon Ross  *    without modification.
1726f3cdf0SGordon Ross  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
1826f3cdf0SGordon Ross  *    substantially similar to the "NO WARRANTY" disclaimer below
1926f3cdf0SGordon Ross  *    ("Disclaimer") and any redistribution must be conditioned upon
2026f3cdf0SGordon Ross  *    including a substantially similar Disclaimer requirement for further
2126f3cdf0SGordon Ross  *    binary redistribution.
2226f3cdf0SGordon Ross  * 3. Neither the names of the above-listed copyright holders nor the names
2326f3cdf0SGordon Ross  *    of any contributors may be used to endorse or promote products derived
2426f3cdf0SGordon Ross  *    from this software without specific prior written permission.
25ae115bc7Smrj  *
2626f3cdf0SGordon Ross  * Alternatively, this software may be distributed under the terms of the
2726f3cdf0SGordon Ross  * GNU General Public License ("GPL") version 2 as published by the Free
2826f3cdf0SGordon Ross  * Software Foundation.
29ae115bc7Smrj  *
3026f3cdf0SGordon Ross  * NO WARRANTY
3126f3cdf0SGordon Ross  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
3226f3cdf0SGordon Ross  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3326f3cdf0SGordon Ross  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
3426f3cdf0SGordon Ross  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3526f3cdf0SGordon Ross  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
3626f3cdf0SGordon Ross  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
3726f3cdf0SGordon Ross  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
3826f3cdf0SGordon Ross  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
3926f3cdf0SGordon Ross  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
4026f3cdf0SGordon Ross  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
4126f3cdf0SGordon Ross  * POSSIBILITY OF SUCH DAMAGES.
4226f3cdf0SGordon Ross  */
43ae115bc7Smrj 
44ae115bc7Smrj #include "acpi.h"
45aa2aa9a6SDana Myers #include "accommon.h"
46ae115bc7Smrj #include "acparser.h"
47ae115bc7Smrj #include "amlcode.h"
48*385cc6b4SJerry Jelinek #include "acinterp.h"
49*385cc6b4SJerry Jelinek #include "acnamesp.h"
50*385cc6b4SJerry Jelinek #include "acdebug.h"
51ae115bc7Smrj 
52ae115bc7Smrj 
53ae115bc7Smrj #define _COMPONENT          ACPI_CA_DEBUGGER
54ae115bc7Smrj         ACPI_MODULE_NAME    ("dmopcode")
55ae115bc7Smrj 
56*385cc6b4SJerry Jelinek 
57ae115bc7Smrj /* Local prototypes */
58ae115bc7Smrj 
59ae115bc7Smrj static void
60ae115bc7Smrj AcpiDmMatchKeyword (
61ae115bc7Smrj     ACPI_PARSE_OBJECT       *Op);
62ae115bc7Smrj 
63*385cc6b4SJerry Jelinek static void
64*385cc6b4SJerry Jelinek AcpiDmConvertToElseIf (
65*385cc6b4SJerry Jelinek     ACPI_PARSE_OBJECT       *Op);
66*385cc6b4SJerry Jelinek 
67*385cc6b4SJerry Jelinek 
68*385cc6b4SJerry Jelinek /*******************************************************************************
69*385cc6b4SJerry Jelinek  *
70*385cc6b4SJerry Jelinek  * FUNCTION:    AcpiDmDisplayTargetPathname
71*385cc6b4SJerry Jelinek  *
72*385cc6b4SJerry Jelinek  * PARAMETERS:  Op              - Parse object
73*385cc6b4SJerry Jelinek  *
74*385cc6b4SJerry Jelinek  * RETURN:      None
75*385cc6b4SJerry Jelinek  *
76*385cc6b4SJerry Jelinek  * DESCRIPTION: For AML opcodes that have a target operand, display the full
77*385cc6b4SJerry Jelinek  *              pathname for the target, in a comment field. Handles Return()
78*385cc6b4SJerry Jelinek  *              statements also.
79*385cc6b4SJerry Jelinek  *
80*385cc6b4SJerry Jelinek  ******************************************************************************/
81*385cc6b4SJerry Jelinek 
82*385cc6b4SJerry Jelinek void
83*385cc6b4SJerry Jelinek AcpiDmDisplayTargetPathname (
84*385cc6b4SJerry Jelinek     ACPI_PARSE_OBJECT       *Op)
85*385cc6b4SJerry Jelinek {
86*385cc6b4SJerry Jelinek     ACPI_PARSE_OBJECT       *NextOp;
87*385cc6b4SJerry Jelinek     ACPI_PARSE_OBJECT       *PrevOp = NULL;
88*385cc6b4SJerry Jelinek     char                    *Pathname;
89*385cc6b4SJerry Jelinek     const ACPI_OPCODE_INFO  *OpInfo;
90*385cc6b4SJerry Jelinek 
91*385cc6b4SJerry Jelinek 
92*385cc6b4SJerry Jelinek     if (Op->Common.AmlOpcode == AML_RETURN_OP)
93*385cc6b4SJerry Jelinek     {
94*385cc6b4SJerry Jelinek         PrevOp = Op->Asl.Value.Arg;
95*385cc6b4SJerry Jelinek     }
96*385cc6b4SJerry Jelinek     else
97*385cc6b4SJerry Jelinek     {
98*385cc6b4SJerry Jelinek         OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
99*385cc6b4SJerry Jelinek         if (!(OpInfo->Flags & AML_HAS_TARGET))
100*385cc6b4SJerry Jelinek         {
101*385cc6b4SJerry Jelinek             return;
102*385cc6b4SJerry Jelinek         }
103*385cc6b4SJerry Jelinek 
104*385cc6b4SJerry Jelinek         /* Target is the last Op in the arg list */
105*385cc6b4SJerry Jelinek 
106*385cc6b4SJerry Jelinek         NextOp = Op->Asl.Value.Arg;
107*385cc6b4SJerry Jelinek         while (NextOp)
108*385cc6b4SJerry Jelinek         {
109*385cc6b4SJerry Jelinek             PrevOp = NextOp;
110*385cc6b4SJerry Jelinek             NextOp = PrevOp->Asl.Next;
111*385cc6b4SJerry Jelinek         }
112*385cc6b4SJerry Jelinek     }
113*385cc6b4SJerry Jelinek 
114*385cc6b4SJerry Jelinek     if (!PrevOp)
115*385cc6b4SJerry Jelinek     {
116*385cc6b4SJerry Jelinek         return;
117*385cc6b4SJerry Jelinek     }
118*385cc6b4SJerry Jelinek 
119*385cc6b4SJerry Jelinek     /* We must have a namepath AML opcode */
120*385cc6b4SJerry Jelinek 
121*385cc6b4SJerry Jelinek     if (PrevOp->Asl.AmlOpcode != AML_INT_NAMEPATH_OP)
122*385cc6b4SJerry Jelinek     {
123*385cc6b4SJerry Jelinek         return;
124*385cc6b4SJerry Jelinek     }
125*385cc6b4SJerry Jelinek 
126*385cc6b4SJerry Jelinek     /* A null string is the "no target specified" case */
127*385cc6b4SJerry Jelinek 
128*385cc6b4SJerry Jelinek     if (!PrevOp->Asl.Value.String)
129*385cc6b4SJerry Jelinek     {
130*385cc6b4SJerry Jelinek         return;
131*385cc6b4SJerry Jelinek     }
132*385cc6b4SJerry Jelinek 
133*385cc6b4SJerry Jelinek     /* No node means "unresolved external reference" */
134*385cc6b4SJerry Jelinek 
135*385cc6b4SJerry Jelinek     if (!PrevOp->Asl.Node)
136*385cc6b4SJerry Jelinek     {
137*385cc6b4SJerry Jelinek         AcpiOsPrintf (" /* External reference */");
138*385cc6b4SJerry Jelinek         return;
139*385cc6b4SJerry Jelinek     }
140*385cc6b4SJerry Jelinek 
141*385cc6b4SJerry Jelinek     /* Ignore if path is already from the root */
142*385cc6b4SJerry Jelinek 
143*385cc6b4SJerry Jelinek     if (*PrevOp->Asl.Value.String == '\\')
144*385cc6b4SJerry Jelinek     {
145*385cc6b4SJerry Jelinek         return;
146*385cc6b4SJerry Jelinek     }
147*385cc6b4SJerry Jelinek 
148*385cc6b4SJerry Jelinek     /* Now: we can get the full pathname */
149*385cc6b4SJerry Jelinek 
150*385cc6b4SJerry Jelinek     Pathname = AcpiNsGetExternalPathname (PrevOp->Asl.Node);
151*385cc6b4SJerry Jelinek     if (!Pathname)
152*385cc6b4SJerry Jelinek     {
153*385cc6b4SJerry Jelinek         return;
154*385cc6b4SJerry Jelinek     }
155*385cc6b4SJerry Jelinek 
156*385cc6b4SJerry Jelinek     AcpiOsPrintf (" /* %s */", Pathname);
157*385cc6b4SJerry Jelinek     ACPI_FREE (Pathname);
158*385cc6b4SJerry Jelinek }
159*385cc6b4SJerry Jelinek 
160*385cc6b4SJerry Jelinek 
161*385cc6b4SJerry Jelinek /*******************************************************************************
162*385cc6b4SJerry Jelinek  *
163*385cc6b4SJerry Jelinek  * FUNCTION:    AcpiDmNotifyDescription
164*385cc6b4SJerry Jelinek  *
165*385cc6b4SJerry Jelinek  * PARAMETERS:  Op              - Name() parse object
166*385cc6b4SJerry Jelinek  *
167*385cc6b4SJerry Jelinek  * RETURN:      None
168*385cc6b4SJerry Jelinek  *
169*385cc6b4SJerry Jelinek  * DESCRIPTION: Emit a description comment for the value associated with a
170*385cc6b4SJerry Jelinek  *              Notify() operator.
171*385cc6b4SJerry Jelinek  *
172*385cc6b4SJerry Jelinek  ******************************************************************************/
173*385cc6b4SJerry Jelinek 
174*385cc6b4SJerry Jelinek void
175*385cc6b4SJerry Jelinek AcpiDmNotifyDescription (
176*385cc6b4SJerry Jelinek     ACPI_PARSE_OBJECT       *Op)
177*385cc6b4SJerry Jelinek {
178*385cc6b4SJerry Jelinek     ACPI_PARSE_OBJECT       *NextOp;
179*385cc6b4SJerry Jelinek     ACPI_NAMESPACE_NODE     *Node;
180*385cc6b4SJerry Jelinek     UINT8                   NotifyValue;
181*385cc6b4SJerry Jelinek     UINT8                   Type = ACPI_TYPE_ANY;
182*385cc6b4SJerry Jelinek 
183*385cc6b4SJerry Jelinek 
184*385cc6b4SJerry Jelinek     /* The notify value is the second argument */
185*385cc6b4SJerry Jelinek 
186*385cc6b4SJerry Jelinek     NextOp = Op->Asl.Value.Arg;
187*385cc6b4SJerry Jelinek     NextOp = NextOp->Asl.Next;
188*385cc6b4SJerry Jelinek 
189*385cc6b4SJerry Jelinek     switch (NextOp->Common.AmlOpcode)
190*385cc6b4SJerry Jelinek     {
191*385cc6b4SJerry Jelinek     case AML_ZERO_OP:
192*385cc6b4SJerry Jelinek     case AML_ONE_OP:
193*385cc6b4SJerry Jelinek 
194*385cc6b4SJerry Jelinek         NotifyValue = (UINT8) NextOp->Common.AmlOpcode;
195*385cc6b4SJerry Jelinek         break;
196*385cc6b4SJerry Jelinek 
197*385cc6b4SJerry Jelinek     case AML_BYTE_OP:
198*385cc6b4SJerry Jelinek 
199*385cc6b4SJerry Jelinek         NotifyValue = (UINT8) NextOp->Asl.Value.Integer;
200*385cc6b4SJerry Jelinek         break;
201*385cc6b4SJerry Jelinek 
202*385cc6b4SJerry Jelinek     default:
203*385cc6b4SJerry Jelinek         return;
204*385cc6b4SJerry Jelinek     }
205*385cc6b4SJerry Jelinek 
206*385cc6b4SJerry Jelinek     /*
207*385cc6b4SJerry Jelinek      * Attempt to get the namespace node so we can determine the object type.
208*385cc6b4SJerry Jelinek      * Some notify values are dependent on the object type (Device, Thermal,
209*385cc6b4SJerry Jelinek      * or Processor).
210*385cc6b4SJerry Jelinek      */
211*385cc6b4SJerry Jelinek     Node = Op->Asl.Node;
212*385cc6b4SJerry Jelinek     if (Node)
213*385cc6b4SJerry Jelinek     {
214*385cc6b4SJerry Jelinek         Type = Node->Type;
215*385cc6b4SJerry Jelinek     }
216*385cc6b4SJerry Jelinek 
217*385cc6b4SJerry Jelinek     AcpiOsPrintf (" // %s", AcpiUtGetNotifyName (NotifyValue, Type));
218*385cc6b4SJerry Jelinek }
219*385cc6b4SJerry Jelinek 
220*385cc6b4SJerry Jelinek 
221*385cc6b4SJerry Jelinek /*******************************************************************************
222*385cc6b4SJerry Jelinek  *
223*385cc6b4SJerry Jelinek  * FUNCTION:    AcpiDmPredefinedDescription
224*385cc6b4SJerry Jelinek  *
225*385cc6b4SJerry Jelinek  * PARAMETERS:  Op              - Name() parse object
226*385cc6b4SJerry Jelinek  *
227*385cc6b4SJerry Jelinek  * RETURN:      None
228*385cc6b4SJerry Jelinek  *
229*385cc6b4SJerry Jelinek  * DESCRIPTION: Emit a description comment for a predefined ACPI name.
230*385cc6b4SJerry Jelinek  *              Used for iASL compiler only.
231*385cc6b4SJerry Jelinek  *
232*385cc6b4SJerry Jelinek  ******************************************************************************/
233*385cc6b4SJerry Jelinek 
234*385cc6b4SJerry Jelinek void
235*385cc6b4SJerry Jelinek AcpiDmPredefinedDescription (
236*385cc6b4SJerry Jelinek     ACPI_PARSE_OBJECT       *Op)
237*385cc6b4SJerry Jelinek {
238*385cc6b4SJerry Jelinek #ifdef ACPI_ASL_COMPILER
239*385cc6b4SJerry Jelinek     const AH_PREDEFINED_NAME    *Info;
240*385cc6b4SJerry Jelinek     char                        *NameString;
241*385cc6b4SJerry Jelinek     int                         LastCharIsDigit;
242*385cc6b4SJerry Jelinek     int                         LastCharsAreHex;
243*385cc6b4SJerry Jelinek 
244*385cc6b4SJerry Jelinek 
245*385cc6b4SJerry Jelinek     if (!Op)
246*385cc6b4SJerry Jelinek     {
247*385cc6b4SJerry Jelinek         return;
248*385cc6b4SJerry Jelinek     }
249*385cc6b4SJerry Jelinek 
250*385cc6b4SJerry Jelinek     /* Ensure that the comment field is emitted only once */
251*385cc6b4SJerry Jelinek 
252*385cc6b4SJerry Jelinek     if (Op->Common.DisasmFlags & ACPI_PARSEOP_PREDEFINED_CHECKED)
253*385cc6b4SJerry Jelinek     {
254*385cc6b4SJerry Jelinek         return;
255*385cc6b4SJerry Jelinek     }
256*385cc6b4SJerry Jelinek     Op->Common.DisasmFlags |= ACPI_PARSEOP_PREDEFINED_CHECKED;
257*385cc6b4SJerry Jelinek 
258*385cc6b4SJerry Jelinek     /* Predefined name must start with an underscore */
259*385cc6b4SJerry Jelinek 
260*385cc6b4SJerry Jelinek     NameString = ACPI_CAST_PTR (char, &Op->Named.Name);
261*385cc6b4SJerry Jelinek     if (NameString[0] != '_')
262*385cc6b4SJerry Jelinek     {
263*385cc6b4SJerry Jelinek         return;
264*385cc6b4SJerry Jelinek     }
265*385cc6b4SJerry Jelinek 
266*385cc6b4SJerry Jelinek     /*
267*385cc6b4SJerry Jelinek      * Check for the special ACPI names:
268*385cc6b4SJerry Jelinek      * _ACd, _ALd, _EJd, _Exx, _Lxx, _Qxx, _Wxx, _T_a
269*385cc6b4SJerry Jelinek      * (where d=decimal_digit, x=hex_digit, a=anything)
270*385cc6b4SJerry Jelinek      *
271*385cc6b4SJerry Jelinek      * Convert these to the generic name for table lookup.
272*385cc6b4SJerry Jelinek      * Note: NameString is guaranteed to be upper case here.
273*385cc6b4SJerry Jelinek      */
274*385cc6b4SJerry Jelinek     LastCharIsDigit =
275*385cc6b4SJerry Jelinek         (isdigit ((int) NameString[3]));    /* d */
276*385cc6b4SJerry Jelinek     LastCharsAreHex =
277*385cc6b4SJerry Jelinek         (isxdigit ((int) NameString[2]) &&  /* xx */
278*385cc6b4SJerry Jelinek          isxdigit ((int) NameString[3]));
279*385cc6b4SJerry Jelinek 
280*385cc6b4SJerry Jelinek     switch (NameString[1])
281*385cc6b4SJerry Jelinek     {
282*385cc6b4SJerry Jelinek     case 'A':
283*385cc6b4SJerry Jelinek 
284*385cc6b4SJerry Jelinek         if ((NameString[2] == 'C') && (LastCharIsDigit))
285*385cc6b4SJerry Jelinek         {
286*385cc6b4SJerry Jelinek             NameString = "_ACx";
287*385cc6b4SJerry Jelinek         }
288*385cc6b4SJerry Jelinek         else if ((NameString[2] == 'L') && (LastCharIsDigit))
289*385cc6b4SJerry Jelinek         {
290*385cc6b4SJerry Jelinek             NameString = "_ALx";
291*385cc6b4SJerry Jelinek         }
292*385cc6b4SJerry Jelinek         break;
293*385cc6b4SJerry Jelinek 
294*385cc6b4SJerry Jelinek     case 'E':
295*385cc6b4SJerry Jelinek 
296*385cc6b4SJerry Jelinek         if ((NameString[2] == 'J') && (LastCharIsDigit))
297*385cc6b4SJerry Jelinek         {
298*385cc6b4SJerry Jelinek             NameString = "_EJx";
299*385cc6b4SJerry Jelinek         }
300*385cc6b4SJerry Jelinek         else if (LastCharsAreHex)
301*385cc6b4SJerry Jelinek         {
302*385cc6b4SJerry Jelinek             NameString = "_Exx";
303*385cc6b4SJerry Jelinek         }
304*385cc6b4SJerry Jelinek         break;
305*385cc6b4SJerry Jelinek 
306*385cc6b4SJerry Jelinek     case 'L':
307*385cc6b4SJerry Jelinek 
308*385cc6b4SJerry Jelinek         if (LastCharsAreHex)
309*385cc6b4SJerry Jelinek         {
310*385cc6b4SJerry Jelinek             NameString = "_Lxx";
311*385cc6b4SJerry Jelinek         }
312*385cc6b4SJerry Jelinek         break;
313*385cc6b4SJerry Jelinek 
314*385cc6b4SJerry Jelinek     case 'Q':
315*385cc6b4SJerry Jelinek 
316*385cc6b4SJerry Jelinek         if (LastCharsAreHex)
317*385cc6b4SJerry Jelinek         {
318*385cc6b4SJerry Jelinek             NameString = "_Qxx";
319*385cc6b4SJerry Jelinek         }
320*385cc6b4SJerry Jelinek         break;
321*385cc6b4SJerry Jelinek 
322*385cc6b4SJerry Jelinek     case 'T':
323*385cc6b4SJerry Jelinek 
324*385cc6b4SJerry Jelinek         if (NameString[2] == '_')
325*385cc6b4SJerry Jelinek         {
326*385cc6b4SJerry Jelinek             NameString = "_T_x";
327*385cc6b4SJerry Jelinek         }
328*385cc6b4SJerry Jelinek         break;
329*385cc6b4SJerry Jelinek 
330*385cc6b4SJerry Jelinek     case 'W':
331*385cc6b4SJerry Jelinek 
332*385cc6b4SJerry Jelinek         if (LastCharsAreHex)
333*385cc6b4SJerry Jelinek         {
334*385cc6b4SJerry Jelinek             NameString = "_Wxx";
335*385cc6b4SJerry Jelinek         }
336*385cc6b4SJerry Jelinek         break;
337*385cc6b4SJerry Jelinek 
338*385cc6b4SJerry Jelinek     default:
339*385cc6b4SJerry Jelinek 
340*385cc6b4SJerry Jelinek         break;
341*385cc6b4SJerry Jelinek     }
342*385cc6b4SJerry Jelinek 
343*385cc6b4SJerry Jelinek     /* Match the name in the info table */
344*385cc6b4SJerry Jelinek 
345*385cc6b4SJerry Jelinek     Info = AcpiAhMatchPredefinedName (NameString);
346*385cc6b4SJerry Jelinek     if (Info)
347*385cc6b4SJerry Jelinek     {
348*385cc6b4SJerry Jelinek         AcpiOsPrintf ("  // %4.4s: %s",
349*385cc6b4SJerry Jelinek             NameString, ACPI_CAST_PTR (char, Info->Description));
350*385cc6b4SJerry Jelinek     }
351*385cc6b4SJerry Jelinek 
352*385cc6b4SJerry Jelinek #endif
353*385cc6b4SJerry Jelinek     return;
354*385cc6b4SJerry Jelinek }
355*385cc6b4SJerry Jelinek 
356*385cc6b4SJerry Jelinek 
357*385cc6b4SJerry Jelinek /*******************************************************************************
358*385cc6b4SJerry Jelinek  *
359*385cc6b4SJerry Jelinek  * FUNCTION:    AcpiDmFieldPredefinedDescription
360*385cc6b4SJerry Jelinek  *
361*385cc6b4SJerry Jelinek  * PARAMETERS:  Op              - Parse object
362*385cc6b4SJerry Jelinek  *
363*385cc6b4SJerry Jelinek  * RETURN:      None
364*385cc6b4SJerry Jelinek  *
365*385cc6b4SJerry Jelinek  * DESCRIPTION: Emit a description comment for a resource descriptor tag
366*385cc6b4SJerry Jelinek  *              (which is a predefined ACPI name.) Used for iASL compiler only.
367*385cc6b4SJerry Jelinek  *
368*385cc6b4SJerry Jelinek  ******************************************************************************/
369*385cc6b4SJerry Jelinek 
370*385cc6b4SJerry Jelinek void
371*385cc6b4SJerry Jelinek AcpiDmFieldPredefinedDescription (
372*385cc6b4SJerry Jelinek     ACPI_PARSE_OBJECT       *Op)
373*385cc6b4SJerry Jelinek {
374*385cc6b4SJerry Jelinek #ifdef ACPI_ASL_COMPILER
375*385cc6b4SJerry Jelinek     ACPI_PARSE_OBJECT       *IndexOp;
376*385cc6b4SJerry Jelinek     char                    *Tag;
377*385cc6b4SJerry Jelinek     const ACPI_OPCODE_INFO  *OpInfo;
378*385cc6b4SJerry Jelinek     const AH_PREDEFINED_NAME *Info;
379*385cc6b4SJerry Jelinek 
380*385cc6b4SJerry Jelinek 
381*385cc6b4SJerry Jelinek     if (!Op)
382*385cc6b4SJerry Jelinek     {
383*385cc6b4SJerry Jelinek         return;
384*385cc6b4SJerry Jelinek     }
385*385cc6b4SJerry Jelinek 
386*385cc6b4SJerry Jelinek     /* Ensure that the comment field is emitted only once */
387*385cc6b4SJerry Jelinek 
388*385cc6b4SJerry Jelinek     if (Op->Common.DisasmFlags & ACPI_PARSEOP_PREDEFINED_CHECKED)
389*385cc6b4SJerry Jelinek     {
390*385cc6b4SJerry Jelinek         return;
391*385cc6b4SJerry Jelinek     }
392*385cc6b4SJerry Jelinek     Op->Common.DisasmFlags |= ACPI_PARSEOP_PREDEFINED_CHECKED;
393*385cc6b4SJerry Jelinek 
394*385cc6b4SJerry Jelinek     /*
395*385cc6b4SJerry Jelinek      * Op must be one of the Create* operators: CreateField, CreateBitField,
396*385cc6b4SJerry Jelinek      * CreateByteField, CreateWordField, CreateDwordField, CreateQwordField
397*385cc6b4SJerry Jelinek      */
398*385cc6b4SJerry Jelinek     OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
399*385cc6b4SJerry Jelinek     if (!(OpInfo->Flags & AML_CREATE))
400*385cc6b4SJerry Jelinek     {
401*385cc6b4SJerry Jelinek         return;
402*385cc6b4SJerry Jelinek     }
403*385cc6b4SJerry Jelinek 
404*385cc6b4SJerry Jelinek     /* Second argument is the Index argument */
405*385cc6b4SJerry Jelinek 
406*385cc6b4SJerry Jelinek     IndexOp = Op->Common.Value.Arg;
407*385cc6b4SJerry Jelinek     IndexOp = IndexOp->Common.Next;
408*385cc6b4SJerry Jelinek 
409*385cc6b4SJerry Jelinek     /* Index argument must be a namepath */
410*385cc6b4SJerry Jelinek 
411*385cc6b4SJerry Jelinek     if (IndexOp->Common.AmlOpcode != AML_INT_NAMEPATH_OP)
412*385cc6b4SJerry Jelinek     {
413*385cc6b4SJerry Jelinek         return;
414*385cc6b4SJerry Jelinek     }
415*385cc6b4SJerry Jelinek 
416*385cc6b4SJerry Jelinek     /* Major cheat: We previously put the Tag ptr in the Node field */
417*385cc6b4SJerry Jelinek 
418*385cc6b4SJerry Jelinek     Tag = ACPI_CAST_PTR (char, IndexOp->Common.Node);
419*385cc6b4SJerry Jelinek     if (!Tag)
420*385cc6b4SJerry Jelinek     {
421*385cc6b4SJerry Jelinek         return;
422*385cc6b4SJerry Jelinek     }
423*385cc6b4SJerry Jelinek 
424*385cc6b4SJerry Jelinek     /* Match the name in the info table */
425*385cc6b4SJerry Jelinek 
426*385cc6b4SJerry Jelinek     Info = AcpiAhMatchPredefinedName (Tag);
427*385cc6b4SJerry Jelinek     if (Info)
428*385cc6b4SJerry Jelinek     {
429*385cc6b4SJerry Jelinek         AcpiOsPrintf ("  // %4.4s: %s", Tag,
430*385cc6b4SJerry Jelinek             ACPI_CAST_PTR (char, Info->Description));
431*385cc6b4SJerry Jelinek     }
432*385cc6b4SJerry Jelinek 
433*385cc6b4SJerry Jelinek #endif
434*385cc6b4SJerry Jelinek     return;
435*385cc6b4SJerry Jelinek }
436*385cc6b4SJerry Jelinek 
437ae115bc7Smrj 
438ae115bc7Smrj /*******************************************************************************
439ae115bc7Smrj  *
440ae115bc7Smrj  * FUNCTION:    AcpiDmMethodFlags
441ae115bc7Smrj  *
442ae115bc7Smrj  * PARAMETERS:  Op              - Method Object to be examined
443ae115bc7Smrj  *
444ae115bc7Smrj  * RETURN:      None
445ae115bc7Smrj  *
446ae115bc7Smrj  * DESCRIPTION: Decode control method flags
447ae115bc7Smrj  *
448ae115bc7Smrj  ******************************************************************************/
449ae115bc7Smrj 
450ae115bc7Smrj void
451ae115bc7Smrj AcpiDmMethodFlags (
452ae115bc7Smrj     ACPI_PARSE_OBJECT       *Op)
453ae115bc7Smrj {
454ae115bc7Smrj     UINT32                  Flags;
455ae115bc7Smrj     UINT32                  Args;
456ae115bc7Smrj 
457ae115bc7Smrj 
458ae115bc7Smrj     /* The next Op contains the flags */
459ae115bc7Smrj 
460ae115bc7Smrj     Op = AcpiPsGetDepthNext (NULL, Op);
461ae115bc7Smrj     Flags = (UINT8) Op->Common.Value.Integer;
462ae115bc7Smrj     Args = Flags & 0x07;
463ae115bc7Smrj 
464ae115bc7Smrj     /* Mark the Op as completed */
465ae115bc7Smrj 
466ae115bc7Smrj     Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
467ae115bc7Smrj 
468ae115bc7Smrj     /* 1) Method argument count */
469ae115bc7Smrj 
47026f3cdf0SGordon Ross     AcpiOsPrintf (", %u, ", Args);
471ae115bc7Smrj 
472ae115bc7Smrj     /* 2) Serialize rule */
473ae115bc7Smrj 
474ae115bc7Smrj     if (!(Flags & 0x08))
475ae115bc7Smrj     {
476ae115bc7Smrj         AcpiOsPrintf ("Not");
477ae115bc7Smrj     }
478ae115bc7Smrj 
479ae115bc7Smrj     AcpiOsPrintf ("Serialized");
480ae115bc7Smrj 
481ae115bc7Smrj     /* 3) SyncLevel */
482ae115bc7Smrj 
483ae115bc7Smrj     if (Flags & 0xF0)
484ae115bc7Smrj     {
48526f3cdf0SGordon Ross         AcpiOsPrintf (", %u", Flags >> 4);
486ae115bc7Smrj     }
487ae115bc7Smrj }
488ae115bc7Smrj 
489ae115bc7Smrj 
490ae115bc7Smrj /*******************************************************************************
491ae115bc7Smrj  *
492ae115bc7Smrj  * FUNCTION:    AcpiDmFieldFlags
493ae115bc7Smrj  *
494ae115bc7Smrj  * PARAMETERS:  Op              - Field Object to be examined
495ae115bc7Smrj  *
496ae115bc7Smrj  * RETURN:      None
497ae115bc7Smrj  *
498ae115bc7Smrj  * DESCRIPTION: Decode Field definition flags
499ae115bc7Smrj  *
500ae115bc7Smrj  ******************************************************************************/
501ae115bc7Smrj 
502ae115bc7Smrj void
503ae115bc7Smrj AcpiDmFieldFlags (
504ae115bc7Smrj     ACPI_PARSE_OBJECT       *Op)
505ae115bc7Smrj {
506ae115bc7Smrj     UINT32                  Flags;
507ae115bc7Smrj 
508ae115bc7Smrj 
509ae115bc7Smrj     Op = Op->Common.Next;
510ae115bc7Smrj     Flags = (UINT8) Op->Common.Value.Integer;
511ae115bc7Smrj 
512ae115bc7Smrj     /* Mark the Op as completed */
513ae115bc7Smrj 
514ae115bc7Smrj     Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
515ae115bc7Smrj 
516ae115bc7Smrj     AcpiOsPrintf ("%s, ", AcpiGbl_AccessTypes [Flags & 0x07]);
517ae115bc7Smrj     AcpiOsPrintf ("%s, ", AcpiGbl_LockRule [(Flags & 0x10) >> 4]);
518ae115bc7Smrj     AcpiOsPrintf ("%s)",  AcpiGbl_UpdateRules [(Flags & 0x60) >> 5]);
519ae115bc7Smrj }
520ae115bc7Smrj 
521ae115bc7Smrj 
522ae115bc7Smrj /*******************************************************************************
523ae115bc7Smrj  *
524ae115bc7Smrj  * FUNCTION:    AcpiDmAddressSpace
525ae115bc7Smrj  *
526ae115bc7Smrj  * PARAMETERS:  SpaceId         - ID to be translated
527ae115bc7Smrj  *
528ae115bc7Smrj  * RETURN:      None
529ae115bc7Smrj  *
530ae115bc7Smrj  * DESCRIPTION: Decode a SpaceId to an AddressSpaceKeyword
531ae115bc7Smrj  *
532ae115bc7Smrj  ******************************************************************************/
533ae115bc7Smrj 
534ae115bc7Smrj void
535ae115bc7Smrj AcpiDmAddressSpace (
536ae115bc7Smrj     UINT8                   SpaceId)
537ae115bc7Smrj {
538ae115bc7Smrj 
539ae115bc7Smrj     if (SpaceId >= ACPI_NUM_PREDEFINED_REGIONS)
540ae115bc7Smrj     {
541ae115bc7Smrj         if (SpaceId == 0x7F)
542ae115bc7Smrj         {
543ae115bc7Smrj             AcpiOsPrintf ("FFixedHW, ");
544ae115bc7Smrj         }
545ae115bc7Smrj         else
546ae115bc7Smrj         {
547ae115bc7Smrj             AcpiOsPrintf ("0x%.2X, ", SpaceId);
548ae115bc7Smrj         }
549ae115bc7Smrj     }
550ae115bc7Smrj     else
551ae115bc7Smrj     {
552ae115bc7Smrj         AcpiOsPrintf ("%s, ", AcpiGbl_RegionTypes [SpaceId]);
553ae115bc7Smrj     }
554ae115bc7Smrj }
555ae115bc7Smrj 
556ae115bc7Smrj 
557ae115bc7Smrj /*******************************************************************************
558ae115bc7Smrj  *
559ae115bc7Smrj  * FUNCTION:    AcpiDmRegionFlags
560ae115bc7Smrj  *
561ae115bc7Smrj  * PARAMETERS:  Op              - Object to be examined
562ae115bc7Smrj  *
563ae115bc7Smrj  * RETURN:      None
564ae115bc7Smrj  *
565ae115bc7Smrj  * DESCRIPTION: Decode OperationRegion flags
566ae115bc7Smrj  *
567ae115bc7Smrj  ******************************************************************************/
568ae115bc7Smrj 
569ae115bc7Smrj void
570ae115bc7Smrj AcpiDmRegionFlags (
571ae115bc7Smrj     ACPI_PARSE_OBJECT       *Op)
572ae115bc7Smrj {
573ae115bc7Smrj 
574ae115bc7Smrj     /* The next Op contains the SpaceId */
575ae115bc7Smrj 
576ae115bc7Smrj     Op = AcpiPsGetDepthNext (NULL, Op);
577ae115bc7Smrj 
578ae115bc7Smrj     /* Mark the Op as completed */
579ae115bc7Smrj 
580ae115bc7Smrj     Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
581ae115bc7Smrj 
582ae115bc7Smrj     AcpiOsPrintf (", ");
583ae115bc7Smrj     AcpiDmAddressSpace ((UINT8) Op->Common.Value.Integer);
584ae115bc7Smrj }
585ae115bc7Smrj 
586ae115bc7Smrj 
587ae115bc7Smrj /*******************************************************************************
588ae115bc7Smrj  *
589ae115bc7Smrj  * FUNCTION:    AcpiDmMatchOp
590ae115bc7Smrj  *
591ae115bc7Smrj  * PARAMETERS:  Op              - Match Object to be examined
592ae115bc7Smrj  *
593ae115bc7Smrj  * RETURN:      None
594ae115bc7Smrj  *
595ae115bc7Smrj  * DESCRIPTION: Decode Match opcode operands
596ae115bc7Smrj  *
597ae115bc7Smrj  ******************************************************************************/
598ae115bc7Smrj 
599ae115bc7Smrj void
600ae115bc7Smrj AcpiDmMatchOp (
601ae115bc7Smrj     ACPI_PARSE_OBJECT       *Op)
602ae115bc7Smrj {
603ae115bc7Smrj     ACPI_PARSE_OBJECT       *NextOp;
604ae115bc7Smrj 
605ae115bc7Smrj 
606ae115bc7Smrj     NextOp = AcpiPsGetDepthNext (NULL, Op);
607ae115bc7Smrj     NextOp = NextOp->Common.Next;
608ae115bc7Smrj 
609ae115bc7Smrj     if (!NextOp)
610ae115bc7Smrj     {
611ae115bc7Smrj         /* Handle partial tree during single-step */
612ae115bc7Smrj 
613ae115bc7Smrj         return;
614ae115bc7Smrj     }
615ae115bc7Smrj 
616ae115bc7Smrj     /* Mark the two nodes that contain the encoding for the match keywords */
617ae115bc7Smrj 
618ae115bc7Smrj     NextOp->Common.DisasmOpcode = ACPI_DASM_MATCHOP;
619ae115bc7Smrj 
620ae115bc7Smrj     NextOp = NextOp->Common.Next;
621ae115bc7Smrj     NextOp = NextOp->Common.Next;
622ae115bc7Smrj     NextOp->Common.DisasmOpcode = ACPI_DASM_MATCHOP;
623ae115bc7Smrj }
624ae115bc7Smrj 
625ae115bc7Smrj 
626ae115bc7Smrj /*******************************************************************************
627ae115bc7Smrj  *
628ae115bc7Smrj  * FUNCTION:    AcpiDmMatchKeyword
629ae115bc7Smrj  *
630ae115bc7Smrj  * PARAMETERS:  Op              - Match Object to be examined
631ae115bc7Smrj  *
632ae115bc7Smrj  * RETURN:      None
633ae115bc7Smrj  *
634ae115bc7Smrj  * DESCRIPTION: Decode Match opcode operands
635ae115bc7Smrj  *
636ae115bc7Smrj  ******************************************************************************/
637ae115bc7Smrj 
638ae115bc7Smrj static void
639ae115bc7Smrj AcpiDmMatchKeyword (
640ae115bc7Smrj     ACPI_PARSE_OBJECT       *Op)
641ae115bc7Smrj {
642ae115bc7Smrj 
643ae115bc7Smrj     if (((UINT32) Op->Common.Value.Integer) > ACPI_MAX_MATCH_OPCODE)
644ae115bc7Smrj     {
645ae115bc7Smrj         AcpiOsPrintf ("/* Unknown Match Keyword encoding */");
646ae115bc7Smrj     }
647ae115bc7Smrj     else
648ae115bc7Smrj     {
649*385cc6b4SJerry Jelinek         AcpiOsPrintf ("%s",
650*385cc6b4SJerry Jelinek             AcpiGbl_MatchOps[(ACPI_SIZE) Op->Common.Value.Integer]);
651ae115bc7Smrj     }
652ae115bc7Smrj }
653ae115bc7Smrj 
654ae115bc7Smrj 
655ae115bc7Smrj /*******************************************************************************
656ae115bc7Smrj  *
657ae115bc7Smrj  * FUNCTION:    AcpiDmDisassembleOneOp
658ae115bc7Smrj  *
659ae115bc7Smrj  * PARAMETERS:  WalkState           - Current walk info
660ae115bc7Smrj  *              Info                - Parse tree walk info
661ae115bc7Smrj  *              Op                  - Op that is to be printed
662ae115bc7Smrj  *
663ae115bc7Smrj  * RETURN:      None
664ae115bc7Smrj  *
665ae115bc7Smrj  * DESCRIPTION: Disassemble a single AML opcode
666ae115bc7Smrj  *
667ae115bc7Smrj  ******************************************************************************/
668ae115bc7Smrj 
669ae115bc7Smrj void
670ae115bc7Smrj AcpiDmDisassembleOneOp (
671ae115bc7Smrj     ACPI_WALK_STATE         *WalkState,
672ae115bc7Smrj     ACPI_OP_WALK_INFO       *Info,
673ae115bc7Smrj     ACPI_PARSE_OBJECT       *Op)
674ae115bc7Smrj {
675ae115bc7Smrj     const ACPI_OPCODE_INFO  *OpInfo = NULL;
676ae115bc7Smrj     UINT32                  Offset;
677ae115bc7Smrj     UINT32                  Length;
678ae115bc7Smrj     ACPI_PARSE_OBJECT       *Child;
679db2bae30SDana Myers     ACPI_STATUS             Status;
680*385cc6b4SJerry Jelinek     UINT8                   *Aml;
681*385cc6b4SJerry Jelinek     const AH_DEVICE_ID      *IdInfo;
682ae115bc7Smrj 
683ae115bc7Smrj 
684ae115bc7Smrj     if (!Op)
685ae115bc7Smrj     {
686ae115bc7Smrj         AcpiOsPrintf ("<NULL OP PTR>");
687ae115bc7Smrj         return;
688ae115bc7Smrj     }
689ae115bc7Smrj 
690*385cc6b4SJerry Jelinek     if (Op->Common.DisasmFlags & ACPI_PARSEOP_ELSEIF)
691*385cc6b4SJerry Jelinek     {
692*385cc6b4SJerry Jelinek         return; /* ElseIf macro was already emitted */
693*385cc6b4SJerry Jelinek     }
694*385cc6b4SJerry Jelinek 
695ae115bc7Smrj     switch (Op->Common.DisasmOpcode)
696ae115bc7Smrj     {
697ae115bc7Smrj     case ACPI_DASM_MATCHOP:
698ae115bc7Smrj 
699ae115bc7Smrj         AcpiDmMatchKeyword (Op);
700ae115bc7Smrj         return;
701ae115bc7Smrj 
702ae115bc7Smrj     case ACPI_DASM_LNOT_SUFFIX:
703*385cc6b4SJerry Jelinek 
704*385cc6b4SJerry Jelinek         if (!AcpiGbl_CstyleDisassembly)
705*385cc6b4SJerry Jelinek         {
706ae115bc7Smrj             switch (Op->Common.AmlOpcode)
707ae115bc7Smrj             {
708ae115bc7Smrj             case AML_LEQUAL_OP:
709ae115bc7Smrj                 AcpiOsPrintf ("LNotEqual");
710ae115bc7Smrj                 break;
711ae115bc7Smrj 
712ae115bc7Smrj             case AML_LGREATER_OP:
713ae115bc7Smrj                 AcpiOsPrintf ("LLessEqual");
714ae115bc7Smrj                 break;
715ae115bc7Smrj 
716ae115bc7Smrj             case AML_LLESS_OP:
717ae115bc7Smrj                 AcpiOsPrintf ("LGreaterEqual");
718ae115bc7Smrj                 break;
719db2bae30SDana Myers 
720db2bae30SDana Myers             default:
721db2bae30SDana Myers                 break;
722ae115bc7Smrj             }
723*385cc6b4SJerry Jelinek         }
724*385cc6b4SJerry Jelinek 
725ae115bc7Smrj         Op->Common.DisasmOpcode = 0;
726ae115bc7Smrj         Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
727ae115bc7Smrj         return;
728ae115bc7Smrj 
729ae115bc7Smrj     default:
730ae115bc7Smrj         break;
731ae115bc7Smrj     }
732ae115bc7Smrj 
733ae115bc7Smrj     OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
734ae115bc7Smrj 
735ae115bc7Smrj     /* The op and arguments */
736ae115bc7Smrj 
737ae115bc7Smrj     switch (Op->Common.AmlOpcode)
738ae115bc7Smrj     {
739ae115bc7Smrj     case AML_LNOT_OP:
740ae115bc7Smrj 
741ae115bc7Smrj         Child = Op->Common.Value.Arg;
742ae115bc7Smrj         if ((Child->Common.AmlOpcode == AML_LEQUAL_OP) ||
743ae115bc7Smrj             (Child->Common.AmlOpcode == AML_LGREATER_OP) ||
744ae115bc7Smrj             (Child->Common.AmlOpcode == AML_LLESS_OP))
745ae115bc7Smrj         {
746ae115bc7Smrj             Child->Common.DisasmOpcode = ACPI_DASM_LNOT_SUFFIX;
747ae115bc7Smrj             Op->Common.DisasmOpcode = ACPI_DASM_LNOT_PREFIX;
748ae115bc7Smrj         }
749ae115bc7Smrj         else
750ae115bc7Smrj         {
751ae115bc7Smrj             AcpiOsPrintf ("%s", OpInfo->Name);
752ae115bc7Smrj         }
753ae115bc7Smrj         break;
754ae115bc7Smrj 
755ae115bc7Smrj     case AML_BYTE_OP:
756ae115bc7Smrj 
757ae115bc7Smrj         AcpiOsPrintf ("0x%2.2X", (UINT32) Op->Common.Value.Integer);
758ae115bc7Smrj         break;
759ae115bc7Smrj 
760ae115bc7Smrj     case AML_WORD_OP:
761ae115bc7Smrj 
762ae115bc7Smrj         if (Op->Common.DisasmOpcode == ACPI_DASM_EISAID)
763ae115bc7Smrj         {
764*385cc6b4SJerry Jelinek             AcpiDmDecompressEisaId ((UINT32) Op->Common.Value.Integer);
765ae115bc7Smrj         }
766ae115bc7Smrj         else
767ae115bc7Smrj         {
768ae115bc7Smrj             AcpiOsPrintf ("0x%4.4X", (UINT32) Op->Common.Value.Integer);
769ae115bc7Smrj         }
770ae115bc7Smrj         break;
771ae115bc7Smrj 
772ae115bc7Smrj     case AML_DWORD_OP:
773ae115bc7Smrj 
774ae115bc7Smrj         if (Op->Common.DisasmOpcode == ACPI_DASM_EISAID)
775ae115bc7Smrj         {
776*385cc6b4SJerry Jelinek             AcpiDmDecompressEisaId ((UINT32) Op->Common.Value.Integer);
777ae115bc7Smrj         }
778ae115bc7Smrj         else
779ae115bc7Smrj         {
780ae115bc7Smrj             AcpiOsPrintf ("0x%8.8X", (UINT32) Op->Common.Value.Integer);
781ae115bc7Smrj         }
782ae115bc7Smrj         break;
783ae115bc7Smrj 
784ae115bc7Smrj     case AML_QWORD_OP:
785ae115bc7Smrj 
78626f3cdf0SGordon Ross         AcpiOsPrintf ("0x%8.8X%8.8X",
78726f3cdf0SGordon Ross             ACPI_FORMAT_UINT64 (Op->Common.Value.Integer));
788ae115bc7Smrj         break;
789ae115bc7Smrj 
790ae115bc7Smrj     case AML_STRING_OP:
791ae115bc7Smrj 
792*385cc6b4SJerry Jelinek         AcpiUtPrintString (Op->Common.Value.String, ACPI_UINT16_MAX);
793*385cc6b4SJerry Jelinek 
794*385cc6b4SJerry Jelinek         /* For _HID/_CID strings, attempt to output a descriptive comment */
795*385cc6b4SJerry Jelinek 
796*385cc6b4SJerry Jelinek         if (Op->Common.DisasmOpcode == ACPI_DASM_HID_STRING)
797*385cc6b4SJerry Jelinek         {
798*385cc6b4SJerry Jelinek             /* If we know about the ID, emit the description */
799*385cc6b4SJerry Jelinek 
800*385cc6b4SJerry Jelinek             IdInfo = AcpiAhMatchHardwareId (Op->Common.Value.String);
801*385cc6b4SJerry Jelinek             if (IdInfo)
802*385cc6b4SJerry Jelinek             {
803*385cc6b4SJerry Jelinek                 AcpiOsPrintf (" /* %s */", IdInfo->Description);
804*385cc6b4SJerry Jelinek             }
805*385cc6b4SJerry Jelinek         }
806ae115bc7Smrj         break;
807ae115bc7Smrj 
808ae115bc7Smrj     case AML_BUFFER_OP:
809ae115bc7Smrj         /*
810ae115bc7Smrj          * Determine the type of buffer. We can have one of the following:
811ae115bc7Smrj          *
812ae115bc7Smrj          * 1) ResourceTemplate containing Resource Descriptors.
813ae115bc7Smrj          * 2) Unicode String buffer
814ae115bc7Smrj          * 3) ASCII String buffer
815ae115bc7Smrj          * 4) Raw data buffer (if none of the above)
816ae115bc7Smrj          *
817ae115bc7Smrj          * Since there are no special AML opcodes to differentiate these
818ae115bc7Smrj          * types of buffers, we have to closely look at the data in the
819ae115bc7Smrj          * buffer to determine the type.
820ae115bc7Smrj          */
821*385cc6b4SJerry Jelinek         if (!AcpiGbl_NoResourceDisassembly)
822*385cc6b4SJerry Jelinek         {
823*385cc6b4SJerry Jelinek             Status = AcpiDmIsResourceTemplate (WalkState, Op);
824db2bae30SDana Myers             if (ACPI_SUCCESS (Status))
825ae115bc7Smrj             {
826ae115bc7Smrj                 Op->Common.DisasmOpcode = ACPI_DASM_RESOURCE;
827ae115bc7Smrj                 AcpiOsPrintf ("ResourceTemplate");
828db2bae30SDana Myers                 break;
829ae115bc7Smrj             }
830db2bae30SDana Myers             else if (Status == AE_AML_NO_RESOURCE_END_TAG)
831db2bae30SDana Myers             {
832*385cc6b4SJerry Jelinek                 AcpiOsPrintf (
833*385cc6b4SJerry Jelinek                     "/**** Is ResourceTemplate, "
834*385cc6b4SJerry Jelinek                     "but EndTag not at buffer end ****/ ");
835*385cc6b4SJerry Jelinek             }
836db2bae30SDana Myers         }
837db2bae30SDana Myers 
838*385cc6b4SJerry Jelinek         if (AcpiDmIsUuidBuffer (Op))
839*385cc6b4SJerry Jelinek         {
840*385cc6b4SJerry Jelinek             Op->Common.DisasmOpcode = ACPI_DASM_UUID;
841*385cc6b4SJerry Jelinek             AcpiOsPrintf ("ToUUID (");
842*385cc6b4SJerry Jelinek         }
843*385cc6b4SJerry Jelinek         else if (AcpiDmIsUnicodeBuffer (Op))
844ae115bc7Smrj         {
845ae115bc7Smrj             Op->Common.DisasmOpcode = ACPI_DASM_UNICODE;
846ae115bc7Smrj             AcpiOsPrintf ("Unicode (");
847ae115bc7Smrj         }
848ae115bc7Smrj         else if (AcpiDmIsStringBuffer (Op))
849ae115bc7Smrj         {
850ae115bc7Smrj             Op->Common.DisasmOpcode = ACPI_DASM_STRING;
851ae115bc7Smrj             AcpiOsPrintf ("Buffer");
852ae115bc7Smrj         }
853*385cc6b4SJerry Jelinek         else if (AcpiDmIsPldBuffer (Op))
854*385cc6b4SJerry Jelinek         {
855*385cc6b4SJerry Jelinek             Op->Common.DisasmOpcode = ACPI_DASM_PLD_METHOD;
856*385cc6b4SJerry Jelinek             AcpiOsPrintf ("ToPLD (");
857*385cc6b4SJerry Jelinek         }
858ae115bc7Smrj         else
859ae115bc7Smrj         {
860ae115bc7Smrj             Op->Common.DisasmOpcode = ACPI_DASM_BUFFER;
861ae115bc7Smrj             AcpiOsPrintf ("Buffer");
862ae115bc7Smrj         }
863ae115bc7Smrj         break;
864ae115bc7Smrj 
865ae115bc7Smrj     case AML_INT_NAMEPATH_OP:
866ae115bc7Smrj 
867ae115bc7Smrj         AcpiDmNamestring (Op->Common.Value.Name);
868ae115bc7Smrj         break;
869ae115bc7Smrj 
870ae115bc7Smrj     case AML_INT_NAMEDFIELD_OP:
871ae115bc7Smrj 
872db2bae30SDana Myers         Length = AcpiDmDumpName (Op->Named.Name);
87326f3cdf0SGordon Ross         AcpiOsPrintf (",%*.s  %u", (unsigned) (5 - Length), " ",
874ae115bc7Smrj             (UINT32) Op->Common.Value.Integer);
875ae115bc7Smrj         AcpiDmCommaIfFieldMember (Op);
876ae115bc7Smrj 
877ae115bc7Smrj         Info->BitOffset += (UINT32) Op->Common.Value.Integer;
878ae115bc7Smrj         break;
879ae115bc7Smrj 
880ae115bc7Smrj     case AML_INT_RESERVEDFIELD_OP:
881ae115bc7Smrj 
882ae115bc7Smrj         /* Offset() -- Must account for previous offsets */
883ae115bc7Smrj 
884ae115bc7Smrj         Offset = (UINT32) Op->Common.Value.Integer;
885ae115bc7Smrj         Info->BitOffset += Offset;
886ae115bc7Smrj 
887ae115bc7Smrj         if (Info->BitOffset % 8 == 0)
888ae115bc7Smrj         {
889ae115bc7Smrj             AcpiOsPrintf ("Offset (0x%.2X)", ACPI_DIV_8 (Info->BitOffset));
890ae115bc7Smrj         }
891ae115bc7Smrj         else
892ae115bc7Smrj         {
89326f3cdf0SGordon Ross             AcpiOsPrintf ("    ,   %u", Offset);
894ae115bc7Smrj         }
895ae115bc7Smrj 
896ae115bc7Smrj         AcpiDmCommaIfFieldMember (Op);
897ae115bc7Smrj         break;
898ae115bc7Smrj 
899ae115bc7Smrj     case AML_INT_ACCESSFIELD_OP:
900*385cc6b4SJerry Jelinek     case AML_INT_EXTACCESSFIELD_OP:
901ae115bc7Smrj 
902ae115bc7Smrj         AcpiOsPrintf ("AccessAs (%s, ",
903*385cc6b4SJerry Jelinek             AcpiGbl_AccessTypes [(UINT32) (Op->Common.Value.Integer & 0x7)]);
904ae115bc7Smrj 
905*385cc6b4SJerry Jelinek         AcpiDmDecodeAttribute ((UINT8) (Op->Common.Value.Integer >> 8));
906*385cc6b4SJerry Jelinek 
907*385cc6b4SJerry Jelinek         if (Op->Common.AmlOpcode == AML_INT_EXTACCESSFIELD_OP)
908*385cc6b4SJerry Jelinek         {
909*385cc6b4SJerry Jelinek             AcpiOsPrintf (" (0x%2.2X)", (unsigned)
910*385cc6b4SJerry Jelinek                 ((Op->Common.Value.Integer >> 16) & 0xFF));
911*385cc6b4SJerry Jelinek         }
912*385cc6b4SJerry Jelinek 
913ae115bc7Smrj         AcpiOsPrintf (")");
914ae115bc7Smrj         AcpiDmCommaIfFieldMember (Op);
915ae115bc7Smrj         break;
916ae115bc7Smrj 
917*385cc6b4SJerry Jelinek     case AML_INT_CONNECTION_OP:
918*385cc6b4SJerry Jelinek         /*
919*385cc6b4SJerry Jelinek          * Two types of Connection() - one with a buffer object, the
920*385cc6b4SJerry Jelinek          * other with a namestring that points to a buffer object.
921*385cc6b4SJerry Jelinek          */
922*385cc6b4SJerry Jelinek         AcpiOsPrintf ("Connection (");
923*385cc6b4SJerry Jelinek         Child = Op->Common.Value.Arg;
924*385cc6b4SJerry Jelinek 
925*385cc6b4SJerry Jelinek         if (Child->Common.AmlOpcode == AML_INT_BYTELIST_OP)
926*385cc6b4SJerry Jelinek         {
927*385cc6b4SJerry Jelinek             AcpiOsPrintf ("\n");
928*385cc6b4SJerry Jelinek 
929*385cc6b4SJerry Jelinek             Aml = Child->Named.Data;
930*385cc6b4SJerry Jelinek             Length = (UINT32) Child->Common.Value.Integer;
931*385cc6b4SJerry Jelinek 
932*385cc6b4SJerry Jelinek             Info->Level += 1;
933*385cc6b4SJerry Jelinek             Info->MappingOp = Op;
934*385cc6b4SJerry Jelinek             Op->Common.DisasmOpcode = ACPI_DASM_RESOURCE;
935*385cc6b4SJerry Jelinek 
936*385cc6b4SJerry Jelinek             AcpiDmResourceTemplate (Info, Op->Common.Parent, Aml, Length);
937*385cc6b4SJerry Jelinek 
938*385cc6b4SJerry Jelinek             Info->Level -= 1;
939*385cc6b4SJerry Jelinek             AcpiDmIndent (Info->Level);
940*385cc6b4SJerry Jelinek         }
941*385cc6b4SJerry Jelinek         else
942*385cc6b4SJerry Jelinek         {
943*385cc6b4SJerry Jelinek             AcpiDmNamestring (Child->Common.Value.Name);
944*385cc6b4SJerry Jelinek         }
945*385cc6b4SJerry Jelinek 
946*385cc6b4SJerry Jelinek         AcpiOsPrintf (")");
947*385cc6b4SJerry Jelinek         AcpiDmCommaIfFieldMember (Op);
948*385cc6b4SJerry Jelinek         AcpiOsPrintf ("\n");
949*385cc6b4SJerry Jelinek 
950*385cc6b4SJerry Jelinek         Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; /* for now, ignore in AcpiDmAscendingOp */
951*385cc6b4SJerry Jelinek         Child->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
952*385cc6b4SJerry Jelinek         break;
953ae115bc7Smrj 
954ae115bc7Smrj     case AML_INT_BYTELIST_OP:
955ae115bc7Smrj 
956ae115bc7Smrj         AcpiDmByteList (Info, Op);
957ae115bc7Smrj         break;
958ae115bc7Smrj 
959ae115bc7Smrj     case AML_INT_METHODCALL_OP:
960ae115bc7Smrj 
961ae115bc7Smrj         Op = AcpiPsGetDepthNext (NULL, Op);
962ae115bc7Smrj         Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
963ae115bc7Smrj 
964ae115bc7Smrj         AcpiDmNamestring (Op->Common.Value.Name);
965ae115bc7Smrj         break;
966ae115bc7Smrj 
967*385cc6b4SJerry Jelinek     case AML_ELSE_OP:
968*385cc6b4SJerry Jelinek 
969*385cc6b4SJerry Jelinek         AcpiDmConvertToElseIf (Op);
970*385cc6b4SJerry Jelinek         break;
971*385cc6b4SJerry Jelinek 
972*385cc6b4SJerry Jelinek     case AML_EXTERNAL_OP:
973*385cc6b4SJerry Jelinek 
974*385cc6b4SJerry Jelinek         if (AcpiGbl_DmEmitExternalOpcodes)
975*385cc6b4SJerry Jelinek         {
976*385cc6b4SJerry Jelinek             AcpiOsPrintf ("/* Opcode 0x15 */ ");
977*385cc6b4SJerry Jelinek 
978*385cc6b4SJerry Jelinek             /* Fallthrough */
979*385cc6b4SJerry Jelinek         }
980*385cc6b4SJerry Jelinek         else
981*385cc6b4SJerry Jelinek         {
982*385cc6b4SJerry Jelinek             break;
983*385cc6b4SJerry Jelinek         }
984ae115bc7Smrj 
985ae115bc7Smrj     default:
986ae115bc7Smrj 
987ae115bc7Smrj         /* Just get the opcode name and print it */
988ae115bc7Smrj 
989ae115bc7Smrj         AcpiOsPrintf ("%s", OpInfo->Name);
990ae115bc7Smrj 
991ae115bc7Smrj 
992ae115bc7Smrj #ifdef ACPI_DEBUGGER
993ae115bc7Smrj 
994ae115bc7Smrj         if ((Op->Common.AmlOpcode == AML_INT_RETURN_VALUE_OP) &&
995ae115bc7Smrj             (WalkState) &&
996ae115bc7Smrj             (WalkState->Results) &&
997db2bae30SDana Myers             (WalkState->ResultCount))
998ae115bc7Smrj         {
999*385cc6b4SJerry Jelinek             AcpiDbDecodeInternalObject (
1000ae115bc7Smrj                 WalkState->Results->Results.ObjDesc [
1001db2bae30SDana Myers                     (WalkState->ResultCount - 1) %
1002db2bae30SDana Myers                         ACPI_RESULTS_FRAME_OBJ_NUM]);
1003ae115bc7Smrj         }
1004ae115bc7Smrj #endif
1005db2bae30SDana Myers 
1006ae115bc7Smrj         break;
1007ae115bc7Smrj     }
1008ae115bc7Smrj }
1009ae115bc7Smrj 
1010*385cc6b4SJerry Jelinek 
1011*385cc6b4SJerry Jelinek /*******************************************************************************
1012*385cc6b4SJerry Jelinek  *
1013*385cc6b4SJerry Jelinek  * FUNCTION:    AcpiDmConvertToElseIf
1014*385cc6b4SJerry Jelinek  *
1015*385cc6b4SJerry Jelinek  * PARAMETERS:  OriginalElseOp          - ELSE Object to be examined
1016*385cc6b4SJerry Jelinek  *
1017*385cc6b4SJerry Jelinek  * RETURN:      None. Emits either an "Else" or an "ElseIf" ASL operator.
1018*385cc6b4SJerry Jelinek  *
1019*385cc6b4SJerry Jelinek  * DESCRIPTION: Detect and convert an If..Else..If sequence to If..ElseIf
1020*385cc6b4SJerry Jelinek  *
1021*385cc6b4SJerry Jelinek  * EXAMPLE:
1022*385cc6b4SJerry Jelinek  *
1023*385cc6b4SJerry Jelinek  * This If..Else..If nested sequence:
1024*385cc6b4SJerry Jelinek  *
1025*385cc6b4SJerry Jelinek  *        If (Arg0 == 1)
1026*385cc6b4SJerry Jelinek  *        {
1027*385cc6b4SJerry Jelinek  *            Local0 = 4
1028*385cc6b4SJerry Jelinek  *        }
1029*385cc6b4SJerry Jelinek  *        Else
1030*385cc6b4SJerry Jelinek  *        {
1031*385cc6b4SJerry Jelinek  *            If (Arg0 == 2)
1032*385cc6b4SJerry Jelinek  *            {
1033*385cc6b4SJerry Jelinek  *                Local0 = 5
1034*385cc6b4SJerry Jelinek  *            }
1035*385cc6b4SJerry Jelinek  *        }
1036*385cc6b4SJerry Jelinek  *
1037*385cc6b4SJerry Jelinek  * Is converted to this simpler If..ElseIf sequence:
1038*385cc6b4SJerry Jelinek  *
1039*385cc6b4SJerry Jelinek  *        If (Arg0 == 1)
1040*385cc6b4SJerry Jelinek  *        {
1041*385cc6b4SJerry Jelinek  *            Local0 = 4
1042*385cc6b4SJerry Jelinek  *        }
1043*385cc6b4SJerry Jelinek  *        ElseIf (Arg0 == 2)
1044*385cc6b4SJerry Jelinek  *        {
1045*385cc6b4SJerry Jelinek  *            Local0 = 5
1046*385cc6b4SJerry Jelinek  *        }
1047*385cc6b4SJerry Jelinek  *
1048*385cc6b4SJerry Jelinek  * NOTE: There is no actual ElseIf AML opcode. ElseIf is essentially an ASL
1049*385cc6b4SJerry Jelinek  * macro that emits an Else opcode followed by an If opcode. This function
1050*385cc6b4SJerry Jelinek  * reverses these AML sequences back to an ElseIf macro where possible. This
1051*385cc6b4SJerry Jelinek  * can make the disassembled ASL code simpler and more like the original code.
1052*385cc6b4SJerry Jelinek  *
1053*385cc6b4SJerry Jelinek  ******************************************************************************/
1054*385cc6b4SJerry Jelinek 
1055*385cc6b4SJerry Jelinek static void
1056*385cc6b4SJerry Jelinek AcpiDmConvertToElseIf (
1057*385cc6b4SJerry Jelinek     ACPI_PARSE_OBJECT       *OriginalElseOp)
1058*385cc6b4SJerry Jelinek {
1059*385cc6b4SJerry Jelinek     ACPI_PARSE_OBJECT       *IfOp;
1060*385cc6b4SJerry Jelinek     ACPI_PARSE_OBJECT       *ElseOp;
1061*385cc6b4SJerry Jelinek 
1062*385cc6b4SJerry Jelinek 
1063*385cc6b4SJerry Jelinek     /*
1064*385cc6b4SJerry Jelinek      * To be able to perform the conversion, two conditions must be satisfied:
1065*385cc6b4SJerry Jelinek      * 1) The first child of the Else must be an If statement.
1066*385cc6b4SJerry Jelinek      * 2) The If block can only be followed by an Else block and these must
1067*385cc6b4SJerry Jelinek      *    be the only blocks under the original Else.
1068*385cc6b4SJerry Jelinek      */
1069*385cc6b4SJerry Jelinek     IfOp = OriginalElseOp->Common.Value.Arg;
1070*385cc6b4SJerry Jelinek     if (!IfOp ||
1071*385cc6b4SJerry Jelinek         (IfOp->Common.AmlOpcode != AML_IF_OP) ||
1072*385cc6b4SJerry Jelinek         (IfOp->Asl.Next && (IfOp->Asl.Next->Common.AmlOpcode != AML_ELSE_OP)))
1073*385cc6b4SJerry Jelinek     {
1074*385cc6b4SJerry Jelinek         /* Not an Else..If sequence, cannot convert to ElseIf */
1075*385cc6b4SJerry Jelinek 
1076*385cc6b4SJerry Jelinek         AcpiOsPrintf ("%s", "Else");
1077*385cc6b4SJerry Jelinek         return;
1078*385cc6b4SJerry Jelinek     }
1079*385cc6b4SJerry Jelinek 
1080*385cc6b4SJerry Jelinek     /* Emit ElseIf, mark the IF as now an ELSEIF */
1081*385cc6b4SJerry Jelinek 
1082*385cc6b4SJerry Jelinek     AcpiOsPrintf ("%s", "ElseIf");
1083*385cc6b4SJerry Jelinek     IfOp->Common.DisasmFlags |= ACPI_PARSEOP_ELSEIF;
1084*385cc6b4SJerry Jelinek 
1085*385cc6b4SJerry Jelinek     /* The IF parent will now be the same as the original ELSE parent */
1086*385cc6b4SJerry Jelinek 
1087*385cc6b4SJerry Jelinek     IfOp->Common.Parent = OriginalElseOp->Common.Parent;
1088*385cc6b4SJerry Jelinek 
1089*385cc6b4SJerry Jelinek     /*
1090*385cc6b4SJerry Jelinek      * Update the NEXT pointers to restructure the parse tree, essentially
1091*385cc6b4SJerry Jelinek      * promoting an If..Else block up to the same level as the original
1092*385cc6b4SJerry Jelinek      * Else.
1093*385cc6b4SJerry Jelinek      *
1094*385cc6b4SJerry Jelinek      * Check if the IF has a corresponding ELSE peer
1095*385cc6b4SJerry Jelinek      */
1096*385cc6b4SJerry Jelinek     ElseOp = IfOp->Common.Next;
1097*385cc6b4SJerry Jelinek     if (ElseOp &&
1098*385cc6b4SJerry Jelinek         (ElseOp->Common.AmlOpcode == AML_ELSE_OP))
1099*385cc6b4SJerry Jelinek     {
1100*385cc6b4SJerry Jelinek         /* If an ELSE matches the IF, promote it also */
1101*385cc6b4SJerry Jelinek 
1102*385cc6b4SJerry Jelinek         ElseOp->Common.Parent = OriginalElseOp->Common.Parent;
1103*385cc6b4SJerry Jelinek         ElseOp->Common.Next = OriginalElseOp->Common.Next;
1104*385cc6b4SJerry Jelinek     }
1105*385cc6b4SJerry Jelinek     else
1106*385cc6b4SJerry Jelinek     {
1107*385cc6b4SJerry Jelinek         /* Otherwise, set the IF NEXT to the original ELSE NEXT */
1108*385cc6b4SJerry Jelinek 
1109*385cc6b4SJerry Jelinek         IfOp->Common.Next = OriginalElseOp->Common.Next;
1110*385cc6b4SJerry Jelinek     }
1111*385cc6b4SJerry Jelinek 
1112*385cc6b4SJerry Jelinek     /* Detach the child IF block from the original ELSE */
1113*385cc6b4SJerry Jelinek 
1114*385cc6b4SJerry Jelinek     OriginalElseOp->Common.Value.Arg = NULL;
1115*385cc6b4SJerry Jelinek 
1116*385cc6b4SJerry Jelinek     /* Ignore the original ELSE from now on */
1117*385cc6b4SJerry Jelinek 
1118*385cc6b4SJerry Jelinek     OriginalElseOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
1119*385cc6b4SJerry Jelinek     OriginalElseOp->Common.DisasmOpcode = ACPI_DASM_LNOT_PREFIX;
1120*385cc6b4SJerry Jelinek 
1121*385cc6b4SJerry Jelinek     /* Insert IF (now ELSEIF) as next peer of the original ELSE */
1122*385cc6b4SJerry Jelinek 
1123*385cc6b4SJerry Jelinek     OriginalElseOp->Common.Next = IfOp;
1124*385cc6b4SJerry Jelinek }
1125