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