xref: /titanic_44/usr/src/uts/intel/io/acpica/disassembler/dmopcode.c (revision cb56572868bfc488bbd3ab847b09db2a25554d44)
1ae115bc7Smrj /*******************************************************************************
2ae115bc7Smrj  *
3ae115bc7Smrj  * Module Name: dmopcode - AML disassembler, specific AML opcodes
4ae115bc7Smrj  *
5ae115bc7Smrj  ******************************************************************************/
6ae115bc7Smrj 
726f3cdf0SGordon Ross /*
8*cb565728SJerry 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*cb565728SJerry Jelinek #include "acinterp.h"
49*cb565728SJerry Jelinek #include "acnamesp.h"
50*cb565728SJerry Jelinek #include "acdebug.h"
51ae115bc7Smrj 
52ae115bc7Smrj 
53ae115bc7Smrj #define _COMPONENT          ACPI_CA_DEBUGGER
54ae115bc7Smrj         ACPI_MODULE_NAME    ("dmopcode")
55ae115bc7Smrj 
56*cb565728SJerry Jelinek 
57ae115bc7Smrj /* Local prototypes */
58ae115bc7Smrj 
59ae115bc7Smrj static void
60ae115bc7Smrj AcpiDmMatchKeyword (
61ae115bc7Smrj     ACPI_PARSE_OBJECT       *Op);
62ae115bc7Smrj 
63*cb565728SJerry Jelinek static void
64*cb565728SJerry Jelinek AcpiDmConvertToElseIf (
65*cb565728SJerry Jelinek     ACPI_PARSE_OBJECT       *Op);
66*cb565728SJerry Jelinek 
67*cb565728SJerry Jelinek 
68*cb565728SJerry Jelinek /*******************************************************************************
69*cb565728SJerry Jelinek  *
70*cb565728SJerry Jelinek  * FUNCTION:    AcpiDmDisplayTargetPathname
71*cb565728SJerry Jelinek  *
72*cb565728SJerry Jelinek  * PARAMETERS:  Op              - Parse object
73*cb565728SJerry Jelinek  *
74*cb565728SJerry Jelinek  * RETURN:      None
75*cb565728SJerry Jelinek  *
76*cb565728SJerry Jelinek  * DESCRIPTION: For AML opcodes that have a target operand, display the full
77*cb565728SJerry Jelinek  *              pathname for the target, in a comment field. Handles Return()
78*cb565728SJerry Jelinek  *              statements also.
79*cb565728SJerry Jelinek  *
80*cb565728SJerry Jelinek  ******************************************************************************/
81*cb565728SJerry Jelinek 
82*cb565728SJerry Jelinek void
AcpiDmDisplayTargetPathname(ACPI_PARSE_OBJECT * Op)83*cb565728SJerry Jelinek AcpiDmDisplayTargetPathname (
84*cb565728SJerry Jelinek     ACPI_PARSE_OBJECT       *Op)
85*cb565728SJerry Jelinek {
86*cb565728SJerry Jelinek     ACPI_PARSE_OBJECT       *NextOp;
87*cb565728SJerry Jelinek     ACPI_PARSE_OBJECT       *PrevOp = NULL;
88*cb565728SJerry Jelinek     char                    *Pathname;
89*cb565728SJerry Jelinek     const ACPI_OPCODE_INFO  *OpInfo;
90*cb565728SJerry Jelinek 
91*cb565728SJerry Jelinek 
92*cb565728SJerry Jelinek     if (Op->Common.AmlOpcode == AML_RETURN_OP)
93*cb565728SJerry Jelinek     {
94*cb565728SJerry Jelinek         PrevOp = Op->Asl.Value.Arg;
95*cb565728SJerry Jelinek     }
96*cb565728SJerry Jelinek     else
97*cb565728SJerry Jelinek     {
98*cb565728SJerry Jelinek         OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
99*cb565728SJerry Jelinek         if (!(OpInfo->Flags & AML_HAS_TARGET))
100*cb565728SJerry Jelinek         {
101*cb565728SJerry Jelinek             return;
102*cb565728SJerry Jelinek         }
103*cb565728SJerry Jelinek 
104*cb565728SJerry Jelinek         /* Target is the last Op in the arg list */
105*cb565728SJerry Jelinek 
106*cb565728SJerry Jelinek         NextOp = Op->Asl.Value.Arg;
107*cb565728SJerry Jelinek         while (NextOp)
108*cb565728SJerry Jelinek         {
109*cb565728SJerry Jelinek             PrevOp = NextOp;
110*cb565728SJerry Jelinek             NextOp = PrevOp->Asl.Next;
111*cb565728SJerry Jelinek         }
112*cb565728SJerry Jelinek     }
113*cb565728SJerry Jelinek 
114*cb565728SJerry Jelinek     if (!PrevOp)
115*cb565728SJerry Jelinek     {
116*cb565728SJerry Jelinek         return;
117*cb565728SJerry Jelinek     }
118*cb565728SJerry Jelinek 
119*cb565728SJerry Jelinek     /* We must have a namepath AML opcode */
120*cb565728SJerry Jelinek 
121*cb565728SJerry Jelinek     if (PrevOp->Asl.AmlOpcode != AML_INT_NAMEPATH_OP)
122*cb565728SJerry Jelinek     {
123*cb565728SJerry Jelinek         return;
124*cb565728SJerry Jelinek     }
125*cb565728SJerry Jelinek 
126*cb565728SJerry Jelinek     /* A null string is the "no target specified" case */
127*cb565728SJerry Jelinek 
128*cb565728SJerry Jelinek     if (!PrevOp->Asl.Value.String)
129*cb565728SJerry Jelinek     {
130*cb565728SJerry Jelinek         return;
131*cb565728SJerry Jelinek     }
132*cb565728SJerry Jelinek 
133*cb565728SJerry Jelinek     /* No node means "unresolved external reference" */
134*cb565728SJerry Jelinek 
135*cb565728SJerry Jelinek     if (!PrevOp->Asl.Node)
136*cb565728SJerry Jelinek     {
137*cb565728SJerry Jelinek         AcpiOsPrintf (" /* External reference */");
138*cb565728SJerry Jelinek         return;
139*cb565728SJerry Jelinek     }
140*cb565728SJerry Jelinek 
141*cb565728SJerry Jelinek     /* Ignore if path is already from the root */
142*cb565728SJerry Jelinek 
143*cb565728SJerry Jelinek     if (*PrevOp->Asl.Value.String == '\\')
144*cb565728SJerry Jelinek     {
145*cb565728SJerry Jelinek         return;
146*cb565728SJerry Jelinek     }
147*cb565728SJerry Jelinek 
148*cb565728SJerry Jelinek     /* Now: we can get the full pathname */
149*cb565728SJerry Jelinek 
150*cb565728SJerry Jelinek     Pathname = AcpiNsGetExternalPathname (PrevOp->Asl.Node);
151*cb565728SJerry Jelinek     if (!Pathname)
152*cb565728SJerry Jelinek     {
153*cb565728SJerry Jelinek         return;
154*cb565728SJerry Jelinek     }
155*cb565728SJerry Jelinek 
156*cb565728SJerry Jelinek     AcpiOsPrintf (" /* %s */", Pathname);
157*cb565728SJerry Jelinek     ACPI_FREE (Pathname);
158*cb565728SJerry Jelinek }
159*cb565728SJerry Jelinek 
160*cb565728SJerry Jelinek 
161*cb565728SJerry Jelinek /*******************************************************************************
162*cb565728SJerry Jelinek  *
163*cb565728SJerry Jelinek  * FUNCTION:    AcpiDmNotifyDescription
164*cb565728SJerry Jelinek  *
165*cb565728SJerry Jelinek  * PARAMETERS:  Op              - Name() parse object
166*cb565728SJerry Jelinek  *
167*cb565728SJerry Jelinek  * RETURN:      None
168*cb565728SJerry Jelinek  *
169*cb565728SJerry Jelinek  * DESCRIPTION: Emit a description comment for the value associated with a
170*cb565728SJerry Jelinek  *              Notify() operator.
171*cb565728SJerry Jelinek  *
172*cb565728SJerry Jelinek  ******************************************************************************/
173*cb565728SJerry Jelinek 
174*cb565728SJerry Jelinek void
AcpiDmNotifyDescription(ACPI_PARSE_OBJECT * Op)175*cb565728SJerry Jelinek AcpiDmNotifyDescription (
176*cb565728SJerry Jelinek     ACPI_PARSE_OBJECT       *Op)
177*cb565728SJerry Jelinek {
178*cb565728SJerry Jelinek     ACPI_PARSE_OBJECT       *NextOp;
179*cb565728SJerry Jelinek     ACPI_NAMESPACE_NODE     *Node;
180*cb565728SJerry Jelinek     UINT8                   NotifyValue;
181*cb565728SJerry Jelinek     UINT8                   Type = ACPI_TYPE_ANY;
182*cb565728SJerry Jelinek 
183*cb565728SJerry Jelinek 
184*cb565728SJerry Jelinek     /* The notify value is the second argument */
185*cb565728SJerry Jelinek 
186*cb565728SJerry Jelinek     NextOp = Op->Asl.Value.Arg;
187*cb565728SJerry Jelinek     NextOp = NextOp->Asl.Next;
188*cb565728SJerry Jelinek 
189*cb565728SJerry Jelinek     switch (NextOp->Common.AmlOpcode)
190*cb565728SJerry Jelinek     {
191*cb565728SJerry Jelinek     case AML_ZERO_OP:
192*cb565728SJerry Jelinek     case AML_ONE_OP:
193*cb565728SJerry Jelinek 
194*cb565728SJerry Jelinek         NotifyValue = (UINT8) NextOp->Common.AmlOpcode;
195*cb565728SJerry Jelinek         break;
196*cb565728SJerry Jelinek 
197*cb565728SJerry Jelinek     case AML_BYTE_OP:
198*cb565728SJerry Jelinek 
199*cb565728SJerry Jelinek         NotifyValue = (UINT8) NextOp->Asl.Value.Integer;
200*cb565728SJerry Jelinek         break;
201*cb565728SJerry Jelinek 
202*cb565728SJerry Jelinek     default:
203*cb565728SJerry Jelinek         return;
204*cb565728SJerry Jelinek     }
205*cb565728SJerry Jelinek 
206*cb565728SJerry Jelinek     /*
207*cb565728SJerry Jelinek      * Attempt to get the namespace node so we can determine the object type.
208*cb565728SJerry Jelinek      * Some notify values are dependent on the object type (Device, Thermal,
209*cb565728SJerry Jelinek      * or Processor).
210*cb565728SJerry Jelinek      */
211*cb565728SJerry Jelinek     Node = Op->Asl.Node;
212*cb565728SJerry Jelinek     if (Node)
213*cb565728SJerry Jelinek     {
214*cb565728SJerry Jelinek         Type = Node->Type;
215*cb565728SJerry Jelinek     }
216*cb565728SJerry Jelinek 
217*cb565728SJerry Jelinek     AcpiOsPrintf (" // %s", AcpiUtGetNotifyName (NotifyValue, Type));
218*cb565728SJerry Jelinek }
219*cb565728SJerry Jelinek 
220*cb565728SJerry Jelinek 
221*cb565728SJerry Jelinek /*******************************************************************************
222*cb565728SJerry Jelinek  *
223*cb565728SJerry Jelinek  * FUNCTION:    AcpiDmPredefinedDescription
224*cb565728SJerry Jelinek  *
225*cb565728SJerry Jelinek  * PARAMETERS:  Op              - Name() parse object
226*cb565728SJerry Jelinek  *
227*cb565728SJerry Jelinek  * RETURN:      None
228*cb565728SJerry Jelinek  *
229*cb565728SJerry Jelinek  * DESCRIPTION: Emit a description comment for a predefined ACPI name.
230*cb565728SJerry Jelinek  *              Used for iASL compiler only.
231*cb565728SJerry Jelinek  *
232*cb565728SJerry Jelinek  ******************************************************************************/
233*cb565728SJerry Jelinek 
234*cb565728SJerry Jelinek void
AcpiDmPredefinedDescription(ACPI_PARSE_OBJECT * Op)235*cb565728SJerry Jelinek AcpiDmPredefinedDescription (
236*cb565728SJerry Jelinek     ACPI_PARSE_OBJECT       *Op)
237*cb565728SJerry Jelinek {
238*cb565728SJerry Jelinek #ifdef ACPI_ASL_COMPILER
239*cb565728SJerry Jelinek     const AH_PREDEFINED_NAME    *Info;
240*cb565728SJerry Jelinek     char                        *NameString;
241*cb565728SJerry Jelinek     int                         LastCharIsDigit;
242*cb565728SJerry Jelinek     int                         LastCharsAreHex;
243*cb565728SJerry Jelinek 
244*cb565728SJerry Jelinek 
245*cb565728SJerry Jelinek     if (!Op)
246*cb565728SJerry Jelinek     {
247*cb565728SJerry Jelinek         return;
248*cb565728SJerry Jelinek     }
249*cb565728SJerry Jelinek 
250*cb565728SJerry Jelinek     /* Ensure that the comment field is emitted only once */
251*cb565728SJerry Jelinek 
252*cb565728SJerry Jelinek     if (Op->Common.DisasmFlags & ACPI_PARSEOP_PREDEFINED_CHECKED)
253*cb565728SJerry Jelinek     {
254*cb565728SJerry Jelinek         return;
255*cb565728SJerry Jelinek     }
256*cb565728SJerry Jelinek     Op->Common.DisasmFlags |= ACPI_PARSEOP_PREDEFINED_CHECKED;
257*cb565728SJerry Jelinek 
258*cb565728SJerry Jelinek     /* Predefined name must start with an underscore */
259*cb565728SJerry Jelinek 
260*cb565728SJerry Jelinek     NameString = ACPI_CAST_PTR (char, &Op->Named.Name);
261*cb565728SJerry Jelinek     if (NameString[0] != '_')
262*cb565728SJerry Jelinek     {
263*cb565728SJerry Jelinek         return;
264*cb565728SJerry Jelinek     }
265*cb565728SJerry Jelinek 
266*cb565728SJerry Jelinek     /*
267*cb565728SJerry Jelinek      * Check for the special ACPI names:
268*cb565728SJerry Jelinek      * _ACd, _ALd, _EJd, _Exx, _Lxx, _Qxx, _Wxx, _T_a
269*cb565728SJerry Jelinek      * (where d=decimal_digit, x=hex_digit, a=anything)
270*cb565728SJerry Jelinek      *
271*cb565728SJerry Jelinek      * Convert these to the generic name for table lookup.
272*cb565728SJerry Jelinek      * Note: NameString is guaranteed to be upper case here.
273*cb565728SJerry Jelinek      */
274*cb565728SJerry Jelinek     LastCharIsDigit =
275*cb565728SJerry Jelinek         (isdigit ((int) NameString[3]));    /* d */
276*cb565728SJerry Jelinek     LastCharsAreHex =
277*cb565728SJerry Jelinek         (isxdigit ((int) NameString[2]) &&  /* xx */
278*cb565728SJerry Jelinek          isxdigit ((int) NameString[3]));
279*cb565728SJerry Jelinek 
280*cb565728SJerry Jelinek     switch (NameString[1])
281*cb565728SJerry Jelinek     {
282*cb565728SJerry Jelinek     case 'A':
283*cb565728SJerry Jelinek 
284*cb565728SJerry Jelinek         if ((NameString[2] == 'C') && (LastCharIsDigit))
285*cb565728SJerry Jelinek         {
286*cb565728SJerry Jelinek             NameString = "_ACx";
287*cb565728SJerry Jelinek         }
288*cb565728SJerry Jelinek         else if ((NameString[2] == 'L') && (LastCharIsDigit))
289*cb565728SJerry Jelinek         {
290*cb565728SJerry Jelinek             NameString = "_ALx";
291*cb565728SJerry Jelinek         }
292*cb565728SJerry Jelinek         break;
293*cb565728SJerry Jelinek 
294*cb565728SJerry Jelinek     case 'E':
295*cb565728SJerry Jelinek 
296*cb565728SJerry Jelinek         if ((NameString[2] == 'J') && (LastCharIsDigit))
297*cb565728SJerry Jelinek         {
298*cb565728SJerry Jelinek             NameString = "_EJx";
299*cb565728SJerry Jelinek         }
300*cb565728SJerry Jelinek         else if (LastCharsAreHex)
301*cb565728SJerry Jelinek         {
302*cb565728SJerry Jelinek             NameString = "_Exx";
303*cb565728SJerry Jelinek         }
304*cb565728SJerry Jelinek         break;
305*cb565728SJerry Jelinek 
306*cb565728SJerry Jelinek     case 'L':
307*cb565728SJerry Jelinek 
308*cb565728SJerry Jelinek         if (LastCharsAreHex)
309*cb565728SJerry Jelinek         {
310*cb565728SJerry Jelinek             NameString = "_Lxx";
311*cb565728SJerry Jelinek         }
312*cb565728SJerry Jelinek         break;
313*cb565728SJerry Jelinek 
314*cb565728SJerry Jelinek     case 'Q':
315*cb565728SJerry Jelinek 
316*cb565728SJerry Jelinek         if (LastCharsAreHex)
317*cb565728SJerry Jelinek         {
318*cb565728SJerry Jelinek             NameString = "_Qxx";
319*cb565728SJerry Jelinek         }
320*cb565728SJerry Jelinek         break;
321*cb565728SJerry Jelinek 
322*cb565728SJerry Jelinek     case 'T':
323*cb565728SJerry Jelinek 
324*cb565728SJerry Jelinek         if (NameString[2] == '_')
325*cb565728SJerry Jelinek         {
326*cb565728SJerry Jelinek             NameString = "_T_x";
327*cb565728SJerry Jelinek         }
328*cb565728SJerry Jelinek         break;
329*cb565728SJerry Jelinek 
330*cb565728SJerry Jelinek     case 'W':
331*cb565728SJerry Jelinek 
332*cb565728SJerry Jelinek         if (LastCharsAreHex)
333*cb565728SJerry Jelinek         {
334*cb565728SJerry Jelinek             NameString = "_Wxx";
335*cb565728SJerry Jelinek         }
336*cb565728SJerry Jelinek         break;
337*cb565728SJerry Jelinek 
338*cb565728SJerry Jelinek     default:
339*cb565728SJerry Jelinek 
340*cb565728SJerry Jelinek         break;
341*cb565728SJerry Jelinek     }
342*cb565728SJerry Jelinek 
343*cb565728SJerry Jelinek     /* Match the name in the info table */
344*cb565728SJerry Jelinek 
345*cb565728SJerry Jelinek     Info = AcpiAhMatchPredefinedName (NameString);
346*cb565728SJerry Jelinek     if (Info)
347*cb565728SJerry Jelinek     {
348*cb565728SJerry Jelinek         AcpiOsPrintf ("  // %4.4s: %s",
349*cb565728SJerry Jelinek             NameString, ACPI_CAST_PTR (char, Info->Description));
350*cb565728SJerry Jelinek     }
351*cb565728SJerry Jelinek 
352*cb565728SJerry Jelinek #endif
353*cb565728SJerry Jelinek     return;
354*cb565728SJerry Jelinek }
355*cb565728SJerry Jelinek 
356*cb565728SJerry Jelinek 
357*cb565728SJerry Jelinek /*******************************************************************************
358*cb565728SJerry Jelinek  *
359*cb565728SJerry Jelinek  * FUNCTION:    AcpiDmFieldPredefinedDescription
360*cb565728SJerry Jelinek  *
361*cb565728SJerry Jelinek  * PARAMETERS:  Op              - Parse object
362*cb565728SJerry Jelinek  *
363*cb565728SJerry Jelinek  * RETURN:      None
364*cb565728SJerry Jelinek  *
365*cb565728SJerry Jelinek  * DESCRIPTION: Emit a description comment for a resource descriptor tag
366*cb565728SJerry Jelinek  *              (which is a predefined ACPI name.) Used for iASL compiler only.
367*cb565728SJerry Jelinek  *
368*cb565728SJerry Jelinek  ******************************************************************************/
369*cb565728SJerry Jelinek 
370*cb565728SJerry Jelinek void
AcpiDmFieldPredefinedDescription(ACPI_PARSE_OBJECT * Op)371*cb565728SJerry Jelinek AcpiDmFieldPredefinedDescription (
372*cb565728SJerry Jelinek     ACPI_PARSE_OBJECT       *Op)
373*cb565728SJerry Jelinek {
374*cb565728SJerry Jelinek #ifdef ACPI_ASL_COMPILER
375*cb565728SJerry Jelinek     ACPI_PARSE_OBJECT       *IndexOp;
376*cb565728SJerry Jelinek     char                    *Tag;
377*cb565728SJerry Jelinek     const ACPI_OPCODE_INFO  *OpInfo;
378*cb565728SJerry Jelinek     const AH_PREDEFINED_NAME *Info;
379*cb565728SJerry Jelinek 
380*cb565728SJerry Jelinek 
381*cb565728SJerry Jelinek     if (!Op)
382*cb565728SJerry Jelinek     {
383*cb565728SJerry Jelinek         return;
384*cb565728SJerry Jelinek     }
385*cb565728SJerry Jelinek 
386*cb565728SJerry Jelinek     /* Ensure that the comment field is emitted only once */
387*cb565728SJerry Jelinek 
388*cb565728SJerry Jelinek     if (Op->Common.DisasmFlags & ACPI_PARSEOP_PREDEFINED_CHECKED)
389*cb565728SJerry Jelinek     {
390*cb565728SJerry Jelinek         return;
391*cb565728SJerry Jelinek     }
392*cb565728SJerry Jelinek     Op->Common.DisasmFlags |= ACPI_PARSEOP_PREDEFINED_CHECKED;
393*cb565728SJerry Jelinek 
394*cb565728SJerry Jelinek     /*
395*cb565728SJerry Jelinek      * Op must be one of the Create* operators: CreateField, CreateBitField,
396*cb565728SJerry Jelinek      * CreateByteField, CreateWordField, CreateDwordField, CreateQwordField
397*cb565728SJerry Jelinek      */
398*cb565728SJerry Jelinek     OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
399*cb565728SJerry Jelinek     if (!(OpInfo->Flags & AML_CREATE))
400*cb565728SJerry Jelinek     {
401*cb565728SJerry Jelinek         return;
402*cb565728SJerry Jelinek     }
403*cb565728SJerry Jelinek 
404*cb565728SJerry Jelinek     /* Second argument is the Index argument */
405*cb565728SJerry Jelinek 
406*cb565728SJerry Jelinek     IndexOp = Op->Common.Value.Arg;
407*cb565728SJerry Jelinek     IndexOp = IndexOp->Common.Next;
408*cb565728SJerry Jelinek 
409*cb565728SJerry Jelinek     /* Index argument must be a namepath */
410*cb565728SJerry Jelinek 
411*cb565728SJerry Jelinek     if (IndexOp->Common.AmlOpcode != AML_INT_NAMEPATH_OP)
412*cb565728SJerry Jelinek     {
413*cb565728SJerry Jelinek         return;
414*cb565728SJerry Jelinek     }
415*cb565728SJerry Jelinek 
416*cb565728SJerry Jelinek     /* Major cheat: We previously put the Tag ptr in the Node field */
417*cb565728SJerry Jelinek 
418*cb565728SJerry Jelinek     Tag = ACPI_CAST_PTR (char, IndexOp->Common.Node);
419*cb565728SJerry Jelinek     if (!Tag)
420*cb565728SJerry Jelinek     {
421*cb565728SJerry Jelinek         return;
422*cb565728SJerry Jelinek     }
423*cb565728SJerry Jelinek 
424*cb565728SJerry Jelinek     /* Match the name in the info table */
425*cb565728SJerry Jelinek 
426*cb565728SJerry Jelinek     Info = AcpiAhMatchPredefinedName (Tag);
427*cb565728SJerry Jelinek     if (Info)
428*cb565728SJerry Jelinek     {
429*cb565728SJerry Jelinek         AcpiOsPrintf ("  // %4.4s: %s", Tag,
430*cb565728SJerry Jelinek             ACPI_CAST_PTR (char, Info->Description));
431*cb565728SJerry Jelinek     }
432*cb565728SJerry Jelinek 
433*cb565728SJerry Jelinek #endif
434*cb565728SJerry Jelinek     return;
435*cb565728SJerry Jelinek }
436*cb565728SJerry 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
AcpiDmMethodFlags(ACPI_PARSE_OBJECT * Op)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
AcpiDmFieldFlags(ACPI_PARSE_OBJECT * Op)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
AcpiDmAddressSpace(UINT8 SpaceId)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
AcpiDmRegionFlags(ACPI_PARSE_OBJECT * Op)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
AcpiDmMatchOp(ACPI_PARSE_OBJECT * Op)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
AcpiDmMatchKeyword(ACPI_PARSE_OBJECT * Op)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*cb565728SJerry Jelinek         AcpiOsPrintf ("%s",
650*cb565728SJerry 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
AcpiDmDisassembleOneOp(ACPI_WALK_STATE * WalkState,ACPI_OP_WALK_INFO * Info,ACPI_PARSE_OBJECT * Op)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*cb565728SJerry Jelinek     UINT8                   *Aml;
681*cb565728SJerry Jelinek     const AH_DEVICE_ID      *IdInfo;
682ae115bc7Smrj 
683ae115bc7Smrj 
684ae115bc7Smrj     if (!Op)
685ae115bc7Smrj     {
686ae115bc7Smrj         AcpiOsPrintf ("<NULL OP PTR>");
687ae115bc7Smrj         return;
688ae115bc7Smrj     }
689ae115bc7Smrj 
690*cb565728SJerry Jelinek     if (Op->Common.DisasmFlags & ACPI_PARSEOP_ELSEIF)
691*cb565728SJerry Jelinek     {
692*cb565728SJerry Jelinek         return; /* ElseIf macro was already emitted */
693*cb565728SJerry Jelinek     }
694*cb565728SJerry 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*cb565728SJerry Jelinek 
704*cb565728SJerry Jelinek         if (!AcpiGbl_CstyleDisassembly)
705*cb565728SJerry 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*cb565728SJerry Jelinek         }
724*cb565728SJerry 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*cb565728SJerry 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*cb565728SJerry 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*cb565728SJerry Jelinek         AcpiUtPrintString (Op->Common.Value.String, ACPI_UINT16_MAX);
793*cb565728SJerry Jelinek 
794*cb565728SJerry Jelinek         /* For _HID/_CID strings, attempt to output a descriptive comment */
795*cb565728SJerry Jelinek 
796*cb565728SJerry Jelinek         if (Op->Common.DisasmOpcode == ACPI_DASM_HID_STRING)
797*cb565728SJerry Jelinek         {
798*cb565728SJerry Jelinek             /* If we know about the ID, emit the description */
799*cb565728SJerry Jelinek 
800*cb565728SJerry Jelinek             IdInfo = AcpiAhMatchHardwareId (Op->Common.Value.String);
801*cb565728SJerry Jelinek             if (IdInfo)
802*cb565728SJerry Jelinek             {
803*cb565728SJerry Jelinek                 AcpiOsPrintf (" /* %s */", IdInfo->Description);
804*cb565728SJerry Jelinek             }
805*cb565728SJerry 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*cb565728SJerry Jelinek         if (!AcpiGbl_NoResourceDisassembly)
822*cb565728SJerry Jelinek         {
823*cb565728SJerry 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*cb565728SJerry Jelinek                 AcpiOsPrintf (
833*cb565728SJerry Jelinek                     "/**** Is ResourceTemplate, "
834*cb565728SJerry Jelinek                     "but EndTag not at buffer end ****/ ");
835*cb565728SJerry Jelinek             }
836db2bae30SDana Myers         }
837db2bae30SDana Myers 
838*cb565728SJerry Jelinek         if (AcpiDmIsUuidBuffer (Op))
839*cb565728SJerry Jelinek         {
840*cb565728SJerry Jelinek             Op->Common.DisasmOpcode = ACPI_DASM_UUID;
841*cb565728SJerry Jelinek             AcpiOsPrintf ("ToUUID (");
842*cb565728SJerry Jelinek         }
843*cb565728SJerry 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*cb565728SJerry Jelinek         else if (AcpiDmIsPldBuffer (Op))
854*cb565728SJerry Jelinek         {
855*cb565728SJerry Jelinek             Op->Common.DisasmOpcode = ACPI_DASM_PLD_METHOD;
856*cb565728SJerry Jelinek             AcpiOsPrintf ("ToPLD (");
857*cb565728SJerry 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*cb565728SJerry Jelinek     case AML_INT_EXTACCESSFIELD_OP:
901ae115bc7Smrj 
902ae115bc7Smrj         AcpiOsPrintf ("AccessAs (%s, ",
903*cb565728SJerry Jelinek             AcpiGbl_AccessTypes [(UINT32) (Op->Common.Value.Integer & 0x7)]);
904ae115bc7Smrj 
905*cb565728SJerry Jelinek         AcpiDmDecodeAttribute ((UINT8) (Op->Common.Value.Integer >> 8));
906*cb565728SJerry Jelinek 
907*cb565728SJerry Jelinek         if (Op->Common.AmlOpcode == AML_INT_EXTACCESSFIELD_OP)
908*cb565728SJerry Jelinek         {
909*cb565728SJerry Jelinek             AcpiOsPrintf (" (0x%2.2X)", (unsigned)
910*cb565728SJerry Jelinek                 ((Op->Common.Value.Integer >> 16) & 0xFF));
911*cb565728SJerry Jelinek         }
912*cb565728SJerry Jelinek 
913ae115bc7Smrj         AcpiOsPrintf (")");
914ae115bc7Smrj         AcpiDmCommaIfFieldMember (Op);
915ae115bc7Smrj         break;
916ae115bc7Smrj 
917*cb565728SJerry Jelinek     case AML_INT_CONNECTION_OP:
918*cb565728SJerry Jelinek         /*
919*cb565728SJerry Jelinek          * Two types of Connection() - one with a buffer object, the
920*cb565728SJerry Jelinek          * other with a namestring that points to a buffer object.
921*cb565728SJerry Jelinek          */
922*cb565728SJerry Jelinek         AcpiOsPrintf ("Connection (");
923*cb565728SJerry Jelinek         Child = Op->Common.Value.Arg;
924*cb565728SJerry Jelinek 
925*cb565728SJerry Jelinek         if (Child->Common.AmlOpcode == AML_INT_BYTELIST_OP)
926*cb565728SJerry Jelinek         {
927*cb565728SJerry Jelinek             AcpiOsPrintf ("\n");
928*cb565728SJerry Jelinek 
929*cb565728SJerry Jelinek             Aml = Child->Named.Data;
930*cb565728SJerry Jelinek             Length = (UINT32) Child->Common.Value.Integer;
931*cb565728SJerry Jelinek 
932*cb565728SJerry Jelinek             Info->Level += 1;
933*cb565728SJerry Jelinek             Info->MappingOp = Op;
934*cb565728SJerry Jelinek             Op->Common.DisasmOpcode = ACPI_DASM_RESOURCE;
935*cb565728SJerry Jelinek 
936*cb565728SJerry Jelinek             AcpiDmResourceTemplate (Info, Op->Common.Parent, Aml, Length);
937*cb565728SJerry Jelinek 
938*cb565728SJerry Jelinek             Info->Level -= 1;
939*cb565728SJerry Jelinek             AcpiDmIndent (Info->Level);
940*cb565728SJerry Jelinek         }
941*cb565728SJerry Jelinek         else
942*cb565728SJerry Jelinek         {
943*cb565728SJerry Jelinek             AcpiDmNamestring (Child->Common.Value.Name);
944*cb565728SJerry Jelinek         }
945*cb565728SJerry Jelinek 
946*cb565728SJerry Jelinek         AcpiOsPrintf (")");
947*cb565728SJerry Jelinek         AcpiDmCommaIfFieldMember (Op);
948*cb565728SJerry Jelinek         AcpiOsPrintf ("\n");
949*cb565728SJerry Jelinek 
950*cb565728SJerry Jelinek         Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; /* for now, ignore in AcpiDmAscendingOp */
951*cb565728SJerry Jelinek         Child->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
952*cb565728SJerry 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*cb565728SJerry Jelinek     case AML_ELSE_OP:
968*cb565728SJerry Jelinek 
969*cb565728SJerry Jelinek         AcpiDmConvertToElseIf (Op);
970*cb565728SJerry Jelinek         break;
971*cb565728SJerry Jelinek 
972*cb565728SJerry Jelinek     case AML_EXTERNAL_OP:
973*cb565728SJerry Jelinek 
974*cb565728SJerry Jelinek         if (AcpiGbl_DmEmitExternalOpcodes)
975*cb565728SJerry Jelinek         {
976*cb565728SJerry Jelinek             AcpiOsPrintf ("/* Opcode 0x15 */ ");
977*cb565728SJerry Jelinek 
978*cb565728SJerry Jelinek             /* Fallthrough */
979*cb565728SJerry Jelinek         }
980*cb565728SJerry Jelinek         else
981*cb565728SJerry Jelinek         {
982*cb565728SJerry Jelinek             break;
983*cb565728SJerry 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*cb565728SJerry 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*cb565728SJerry Jelinek 
1011*cb565728SJerry Jelinek /*******************************************************************************
1012*cb565728SJerry Jelinek  *
1013*cb565728SJerry Jelinek  * FUNCTION:    AcpiDmConvertToElseIf
1014*cb565728SJerry Jelinek  *
1015*cb565728SJerry Jelinek  * PARAMETERS:  OriginalElseOp          - ELSE Object to be examined
1016*cb565728SJerry Jelinek  *
1017*cb565728SJerry Jelinek  * RETURN:      None. Emits either an "Else" or an "ElseIf" ASL operator.
1018*cb565728SJerry Jelinek  *
1019*cb565728SJerry Jelinek  * DESCRIPTION: Detect and convert an If..Else..If sequence to If..ElseIf
1020*cb565728SJerry Jelinek  *
1021*cb565728SJerry Jelinek  * EXAMPLE:
1022*cb565728SJerry Jelinek  *
1023*cb565728SJerry Jelinek  * This If..Else..If nested sequence:
1024*cb565728SJerry Jelinek  *
1025*cb565728SJerry Jelinek  *        If (Arg0 == 1)
1026*cb565728SJerry Jelinek  *        {
1027*cb565728SJerry Jelinek  *            Local0 = 4
1028*cb565728SJerry Jelinek  *        }
1029*cb565728SJerry Jelinek  *        Else
1030*cb565728SJerry Jelinek  *        {
1031*cb565728SJerry Jelinek  *            If (Arg0 == 2)
1032*cb565728SJerry Jelinek  *            {
1033*cb565728SJerry Jelinek  *                Local0 = 5
1034*cb565728SJerry Jelinek  *            }
1035*cb565728SJerry Jelinek  *        }
1036*cb565728SJerry Jelinek  *
1037*cb565728SJerry Jelinek  * Is converted to this simpler If..ElseIf sequence:
1038*cb565728SJerry Jelinek  *
1039*cb565728SJerry Jelinek  *        If (Arg0 == 1)
1040*cb565728SJerry Jelinek  *        {
1041*cb565728SJerry Jelinek  *            Local0 = 4
1042*cb565728SJerry Jelinek  *        }
1043*cb565728SJerry Jelinek  *        ElseIf (Arg0 == 2)
1044*cb565728SJerry Jelinek  *        {
1045*cb565728SJerry Jelinek  *            Local0 = 5
1046*cb565728SJerry Jelinek  *        }
1047*cb565728SJerry Jelinek  *
1048*cb565728SJerry Jelinek  * NOTE: There is no actual ElseIf AML opcode. ElseIf is essentially an ASL
1049*cb565728SJerry Jelinek  * macro that emits an Else opcode followed by an If opcode. This function
1050*cb565728SJerry Jelinek  * reverses these AML sequences back to an ElseIf macro where possible. This
1051*cb565728SJerry Jelinek  * can make the disassembled ASL code simpler and more like the original code.
1052*cb565728SJerry Jelinek  *
1053*cb565728SJerry Jelinek  ******************************************************************************/
1054*cb565728SJerry Jelinek 
1055*cb565728SJerry Jelinek static void
AcpiDmConvertToElseIf(ACPI_PARSE_OBJECT * OriginalElseOp)1056*cb565728SJerry Jelinek AcpiDmConvertToElseIf (
1057*cb565728SJerry Jelinek     ACPI_PARSE_OBJECT       *OriginalElseOp)
1058*cb565728SJerry Jelinek {
1059*cb565728SJerry Jelinek     ACPI_PARSE_OBJECT       *IfOp;
1060*cb565728SJerry Jelinek     ACPI_PARSE_OBJECT       *ElseOp;
1061*cb565728SJerry Jelinek 
1062*cb565728SJerry Jelinek 
1063*cb565728SJerry Jelinek     /*
1064*cb565728SJerry Jelinek      * To be able to perform the conversion, two conditions must be satisfied:
1065*cb565728SJerry Jelinek      * 1) The first child of the Else must be an If statement.
1066*cb565728SJerry Jelinek      * 2) The If block can only be followed by an Else block and these must
1067*cb565728SJerry Jelinek      *    be the only blocks under the original Else.
1068*cb565728SJerry Jelinek      */
1069*cb565728SJerry Jelinek     IfOp = OriginalElseOp->Common.Value.Arg;
1070*cb565728SJerry Jelinek     if (!IfOp ||
1071*cb565728SJerry Jelinek         (IfOp->Common.AmlOpcode != AML_IF_OP) ||
1072*cb565728SJerry Jelinek         (IfOp->Asl.Next && (IfOp->Asl.Next->Common.AmlOpcode != AML_ELSE_OP)))
1073*cb565728SJerry Jelinek     {
1074*cb565728SJerry Jelinek         /* Not an Else..If sequence, cannot convert to ElseIf */
1075*cb565728SJerry Jelinek 
1076*cb565728SJerry Jelinek         AcpiOsPrintf ("%s", "Else");
1077*cb565728SJerry Jelinek         return;
1078*cb565728SJerry Jelinek     }
1079*cb565728SJerry Jelinek 
1080*cb565728SJerry Jelinek     /* Emit ElseIf, mark the IF as now an ELSEIF */
1081*cb565728SJerry Jelinek 
1082*cb565728SJerry Jelinek     AcpiOsPrintf ("%s", "ElseIf");
1083*cb565728SJerry Jelinek     IfOp->Common.DisasmFlags |= ACPI_PARSEOP_ELSEIF;
1084*cb565728SJerry Jelinek 
1085*cb565728SJerry Jelinek     /* The IF parent will now be the same as the original ELSE parent */
1086*cb565728SJerry Jelinek 
1087*cb565728SJerry Jelinek     IfOp->Common.Parent = OriginalElseOp->Common.Parent;
1088*cb565728SJerry Jelinek 
1089*cb565728SJerry Jelinek     /*
1090*cb565728SJerry Jelinek      * Update the NEXT pointers to restructure the parse tree, essentially
1091*cb565728SJerry Jelinek      * promoting an If..Else block up to the same level as the original
1092*cb565728SJerry Jelinek      * Else.
1093*cb565728SJerry Jelinek      *
1094*cb565728SJerry Jelinek      * Check if the IF has a corresponding ELSE peer
1095*cb565728SJerry Jelinek      */
1096*cb565728SJerry Jelinek     ElseOp = IfOp->Common.Next;
1097*cb565728SJerry Jelinek     if (ElseOp &&
1098*cb565728SJerry Jelinek         (ElseOp->Common.AmlOpcode == AML_ELSE_OP))
1099*cb565728SJerry Jelinek     {
1100*cb565728SJerry Jelinek         /* If an ELSE matches the IF, promote it also */
1101*cb565728SJerry Jelinek 
1102*cb565728SJerry Jelinek         ElseOp->Common.Parent = OriginalElseOp->Common.Parent;
1103*cb565728SJerry Jelinek         ElseOp->Common.Next = OriginalElseOp->Common.Next;
1104*cb565728SJerry Jelinek     }
1105*cb565728SJerry Jelinek     else
1106*cb565728SJerry Jelinek     {
1107*cb565728SJerry Jelinek         /* Otherwise, set the IF NEXT to the original ELSE NEXT */
1108*cb565728SJerry Jelinek 
1109*cb565728SJerry Jelinek         IfOp->Common.Next = OriginalElseOp->Common.Next;
1110*cb565728SJerry Jelinek     }
1111*cb565728SJerry Jelinek 
1112*cb565728SJerry Jelinek     /* Detach the child IF block from the original ELSE */
1113*cb565728SJerry Jelinek 
1114*cb565728SJerry Jelinek     OriginalElseOp->Common.Value.Arg = NULL;
1115*cb565728SJerry Jelinek 
1116*cb565728SJerry Jelinek     /* Ignore the original ELSE from now on */
1117*cb565728SJerry Jelinek 
1118*cb565728SJerry Jelinek     OriginalElseOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
1119*cb565728SJerry Jelinek     OriginalElseOp->Common.DisasmOpcode = ACPI_DASM_LNOT_PREFIX;
1120*cb565728SJerry Jelinek 
1121*cb565728SJerry Jelinek     /* Insert IF (now ELSEIF) as next peer of the original ELSE */
1122*cb565728SJerry Jelinek 
1123*cb565728SJerry Jelinek     OriginalElseOp->Common.Next = IfOp;
1124*cb565728SJerry Jelinek }
1125