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