dmwalk.c revision 287168
1100966Siwasaki/*******************************************************************************
2100966Siwasaki *
3100966Siwasaki * Module Name: dmwalk - AML disassembly tree walk
4100966Siwasaki *
5100966Siwasaki ******************************************************************************/
6100966Siwasaki
7217365Sjkim/*
8278970Sjkim * Copyright (C) 2000 - 2015, Intel Corp.
9100966Siwasaki * All rights reserved.
10100966Siwasaki *
11217365Sjkim * Redistribution and use in source and binary forms, with or without
12217365Sjkim * modification, are permitted provided that the following conditions
13217365Sjkim * are met:
14217365Sjkim * 1. Redistributions of source code must retain the above copyright
15217365Sjkim *    notice, this list of conditions, and the following disclaimer,
16217365Sjkim *    without modification.
17217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18217365Sjkim *    substantially similar to the "NO WARRANTY" disclaimer below
19217365Sjkim *    ("Disclaimer") and any redistribution must be conditioned upon
20217365Sjkim *    including a substantially similar Disclaimer requirement for further
21217365Sjkim *    binary redistribution.
22217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names
23217365Sjkim *    of any contributors may be used to endorse or promote products derived
24217365Sjkim *    from this software without specific prior written permission.
25100966Siwasaki *
26217365Sjkim * Alternatively, this software may be distributed under the terms of the
27217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free
28217365Sjkim * Software Foundation.
29100966Siwasaki *
30217365Sjkim * NO WARRANTY
31217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41217365Sjkim * POSSIBILITY OF SUCH DAMAGES.
42217365Sjkim */
43100966Siwasaki
44193341Sjkim#include <contrib/dev/acpica/include/acpi.h>
45193341Sjkim#include <contrib/dev/acpica/include/accommon.h>
46193341Sjkim#include <contrib/dev/acpica/include/acparser.h>
47193341Sjkim#include <contrib/dev/acpica/include/amlcode.h>
48193341Sjkim#include <contrib/dev/acpica/include/acdebug.h>
49100966Siwasaki
50100966Siwasaki
51102550Siwasaki#define _COMPONENT          ACPI_CA_DEBUGGER
52100966Siwasaki        ACPI_MODULE_NAME    ("dmwalk")
53100966Siwasaki
54100966Siwasaki
55151937Sjkim#define DB_FULL_OP_INFO     "[%4.4s] @%5.5X #%4.4X:  "
56100966Siwasaki
57198237Sjkim/* Stub for non-compiler code */
58198237Sjkim
59198237Sjkim#ifndef ACPI_ASL_COMPILER
60198237Sjkimvoid
61198237SjkimAcpiDmEmitExternals (
62198237Sjkim    void)
63198237Sjkim{
64198237Sjkim    return;
65198237Sjkim}
66198237Sjkim#endif
67198237Sjkim
68151937Sjkim/* Local prototypes */
69100966Siwasaki
70151937Sjkimstatic ACPI_STATUS
71151937SjkimAcpiDmDescendingOp (
72151937Sjkim    ACPI_PARSE_OBJECT       *Op,
73151937Sjkim    UINT32                  Level,
74151937Sjkim    void                    *Context);
75151937Sjkim
76151937Sjkimstatic ACPI_STATUS
77151937SjkimAcpiDmAscendingOp (
78151937Sjkim    ACPI_PARSE_OBJECT       *Op,
79151937Sjkim    UINT32                  Level,
80151937Sjkim    void                    *Context);
81151937Sjkim
82151937Sjkimstatic UINT32
83151937SjkimAcpiDmBlockType (
84151937Sjkim    ACPI_PARSE_OBJECT       *Op);
85151937Sjkim
86151937Sjkim
87100966Siwasaki/*******************************************************************************
88100966Siwasaki *
89100966Siwasaki * FUNCTION:    AcpiDmDisassemble
90100966Siwasaki *
91151937Sjkim * PARAMETERS:  WalkState       - Current state
92151937Sjkim *              Origin          - Starting object
93100966Siwasaki *              NumOpcodes      - Max number of opcodes to be displayed
94100966Siwasaki *
95100966Siwasaki * RETURN:      None
96100966Siwasaki *
97241973Sjkim * DESCRIPTION: Disassemble parser object and its children. This is the
98100966Siwasaki *              main entry point of the disassembler.
99100966Siwasaki *
100100966Siwasaki ******************************************************************************/
101100966Siwasaki
102100966Siwasakivoid
103100966SiwasakiAcpiDmDisassemble (
104100966Siwasaki    ACPI_WALK_STATE         *WalkState,
105100966Siwasaki    ACPI_PARSE_OBJECT       *Origin,
106100966Siwasaki    UINT32                  NumOpcodes)
107100966Siwasaki{
108100966Siwasaki    ACPI_PARSE_OBJECT       *Op = Origin;
109100966Siwasaki    ACPI_OP_WALK_INFO       Info;
110100966Siwasaki
111100966Siwasaki
112100966Siwasaki    if (!Op)
113100966Siwasaki    {
114100966Siwasaki        return;
115100966Siwasaki    }
116100966Siwasaki
117287168Sjkim    memset (&Info, 0, sizeof (ACPI_OP_WALK_INFO));
118151937Sjkim    Info.WalkState = WalkState;
119287168Sjkim    Info.StartAml = Op->Common.Aml - sizeof (ACPI_TABLE_HEADER);
120287168Sjkim    Info.AmlOffset = Op->Common.Aml - Info.StartAml;
121287168Sjkim
122100966Siwasaki    AcpiDmWalkParseTree (Op, AcpiDmDescendingOp, AcpiDmAscendingOp, &Info);
123100966Siwasaki    return;
124100966Siwasaki}
125100966Siwasaki
126100966Siwasaki
127100966Siwasaki/*******************************************************************************
128100966Siwasaki *
129100966Siwasaki * FUNCTION:    AcpiDmWalkParseTree
130100966Siwasaki *
131151937Sjkim * PARAMETERS:  Op                      - Root Op object
132151937Sjkim *              DescendingCallback      - Called during tree descent
133100966Siwasaki *              AscendingCallback       - Called during tree ascent
134100966Siwasaki *              Context                 - To be passed to the callbacks
135100966Siwasaki *
136100966Siwasaki * RETURN:      Status from callback(s)
137100966Siwasaki *
138100966Siwasaki * DESCRIPTION: Walk the entire parse tree.
139100966Siwasaki *
140100966Siwasaki ******************************************************************************/
141100966Siwasaki
142167802Sjkimvoid
143100966SiwasakiAcpiDmWalkParseTree (
144100966Siwasaki    ACPI_PARSE_OBJECT       *Op,
145100966Siwasaki    ASL_WALK_CALLBACK       DescendingCallback,
146100966Siwasaki    ASL_WALK_CALLBACK       AscendingCallback,
147100966Siwasaki    void                    *Context)
148100966Siwasaki{
149100966Siwasaki    BOOLEAN                 NodePreviouslyVisited;
150100966Siwasaki    ACPI_PARSE_OBJECT       *StartOp = Op;
151100966Siwasaki    ACPI_STATUS             Status;
152100966Siwasaki    ACPI_PARSE_OBJECT       *Next;
153100966Siwasaki    ACPI_OP_WALK_INFO       *Info = Context;
154100966Siwasaki
155100966Siwasaki
156100966Siwasaki    Info->Level = 0;
157100966Siwasaki    NodePreviouslyVisited = FALSE;
158100966Siwasaki
159100966Siwasaki    while (Op)
160100966Siwasaki    {
161100966Siwasaki        if (NodePreviouslyVisited)
162100966Siwasaki        {
163167802Sjkim            if (AscendingCallback)
164100966Siwasaki            {
165167802Sjkim                Status = AscendingCallback (Op, Info->Level, Context);
166167802Sjkim                if (ACPI_FAILURE (Status))
167167802Sjkim                {
168167802Sjkim                    return;
169167802Sjkim                }
170100966Siwasaki            }
171100966Siwasaki        }
172100966Siwasaki        else
173100966Siwasaki        {
174117521Snjl            /* Let the callback process the node */
175117521Snjl
176100966Siwasaki            Status = DescendingCallback (Op, Info->Level, Context);
177100966Siwasaki            if (ACPI_SUCCESS (Status))
178100966Siwasaki            {
179100966Siwasaki                /* Visit children first, once */
180100966Siwasaki
181100966Siwasaki                Next = AcpiPsGetArg (Op, 0);
182100966Siwasaki                if (Next)
183100966Siwasaki                {
184100966Siwasaki                    Info->Level++;
185100966Siwasaki                    Op = Next;
186100966Siwasaki                    continue;
187100966Siwasaki                }
188100966Siwasaki            }
189100966Siwasaki            else if (Status != AE_CTRL_DEPTH)
190100966Siwasaki            {
191100966Siwasaki                /* Exit immediately on any error */
192100966Siwasaki
193100966Siwasaki                return;
194100966Siwasaki            }
195100966Siwasaki        }
196100966Siwasaki
197100966Siwasaki        /* Terminate walk at start op */
198100966Siwasaki
199100966Siwasaki        if (Op == StartOp)
200100966Siwasaki        {
201100966Siwasaki            break;
202100966Siwasaki        }
203100966Siwasaki
204100966Siwasaki        /* No more children, re-visit this node */
205100966Siwasaki
206100966Siwasaki        if (!NodePreviouslyVisited)
207100966Siwasaki        {
208100966Siwasaki            NodePreviouslyVisited = TRUE;
209100966Siwasaki            continue;
210100966Siwasaki        }
211100966Siwasaki
212100966Siwasaki        /* No more children, visit peers */
213100966Siwasaki
214100966Siwasaki        if (Op->Common.Next)
215100966Siwasaki        {
216100966Siwasaki            Op = Op->Common.Next;
217100966Siwasaki            NodePreviouslyVisited = FALSE;
218100966Siwasaki        }
219100966Siwasaki        else
220100966Siwasaki        {
221100966Siwasaki            /* No peers, re-visit parent */
222100966Siwasaki
223100966Siwasaki            if (Info->Level != 0 )
224100966Siwasaki            {
225100966Siwasaki                Info->Level--;
226100966Siwasaki            }
227100966Siwasaki
228100966Siwasaki            Op = Op->Common.Parent;
229100966Siwasaki            NodePreviouslyVisited = TRUE;
230100966Siwasaki        }
231100966Siwasaki    }
232100966Siwasaki
233100966Siwasaki    /* If we get here, the walk completed with no errors */
234100966Siwasaki
235100966Siwasaki    return;
236100966Siwasaki}
237100966Siwasaki
238100966Siwasaki
239100966Siwasaki/*******************************************************************************
240100966Siwasaki *
241100966Siwasaki * FUNCTION:    AcpiDmBlockType
242100966Siwasaki *
243100966Siwasaki * PARAMETERS:  Op              - Object to be examined
244100966Siwasaki *
245151937Sjkim * RETURN:      BlockType - not a block, parens, braces, or even both.
246100966Siwasaki *
247100966Siwasaki * DESCRIPTION: Type of block for this op (parens or braces)
248100966Siwasaki *
249100966Siwasaki ******************************************************************************/
250100966Siwasaki
251151937Sjkimstatic UINT32
252100966SiwasakiAcpiDmBlockType (
253100966Siwasaki    ACPI_PARSE_OBJECT       *Op)
254100966Siwasaki{
255100966Siwasaki    const ACPI_OPCODE_INFO  *OpInfo;
256100966Siwasaki
257100966Siwasaki
258100966Siwasaki    if (!Op)
259100966Siwasaki    {
260100966Siwasaki        return (BLOCK_NONE);
261100966Siwasaki    }
262100966Siwasaki
263100966Siwasaki    switch (Op->Common.AmlOpcode)
264100966Siwasaki    {
265100966Siwasaki    case AML_ELSE_OP:
266100966Siwasaki
267100966Siwasaki        return (BLOCK_BRACE);
268100966Siwasaki
269100966Siwasaki    case AML_METHOD_OP:
270100966Siwasaki    case AML_DEVICE_OP:
271100966Siwasaki    case AML_SCOPE_OP:
272100966Siwasaki    case AML_PROCESSOR_OP:
273100966Siwasaki    case AML_POWER_RES_OP:
274100966Siwasaki    case AML_THERMAL_ZONE_OP:
275100966Siwasaki    case AML_IF_OP:
276100966Siwasaki    case AML_WHILE_OP:
277100966Siwasaki    case AML_FIELD_OP:
278100966Siwasaki    case AML_INDEX_FIELD_OP:
279100966Siwasaki    case AML_BANK_FIELD_OP:
280100966Siwasaki
281100966Siwasaki        return (BLOCK_PAREN | BLOCK_BRACE);
282100966Siwasaki
283100966Siwasaki    case AML_BUFFER_OP:
284100966Siwasaki
285272444Sjkim        if ((Op->Common.DisasmOpcode == ACPI_DASM_UNICODE) ||
286278970Sjkim            (Op->Common.DisasmOpcode == ACPI_DASM_UUID) ||
287278970Sjkim            (Op->Common.DisasmOpcode == ACPI_DASM_PLD_METHOD))
288100966Siwasaki        {
289100966Siwasaki            return (BLOCK_NONE);
290100966Siwasaki        }
291100966Siwasaki
292100966Siwasaki        /*lint -fallthrough */
293100966Siwasaki
294100966Siwasaki    case AML_PACKAGE_OP:
295100966Siwasaki    case AML_VAR_PACKAGE_OP:
296100966Siwasaki
297100966Siwasaki        return (BLOCK_PAREN | BLOCK_BRACE);
298100966Siwasaki
299100966Siwasaki    case AML_EVENT_OP:
300100966Siwasaki
301100966Siwasaki        return (BLOCK_PAREN);
302100966Siwasaki
303278970Sjkim    case AML_INT_METHODCALL_OP:
304278970Sjkim
305278970Sjkim        if (Op->Common.Parent &&
306278970Sjkim            ((Op->Common.Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
307278970Sjkim             (Op->Common.Parent->Common.AmlOpcode == AML_VAR_PACKAGE_OP)))
308278970Sjkim        {
309278970Sjkim            /* This is a reference to a method, not an invocation */
310278970Sjkim
311278970Sjkim            return (BLOCK_NONE);
312278970Sjkim        }
313278970Sjkim
314285797Sjkim        /*lint -fallthrough */
315285797Sjkim
316100966Siwasaki    default:
317100966Siwasaki
318100966Siwasaki        OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
319100966Siwasaki        if (OpInfo->Flags & AML_HAS_ARGS)
320100966Siwasaki        {
321100966Siwasaki            return (BLOCK_PAREN);
322100966Siwasaki        }
323100966Siwasaki
324100966Siwasaki        return (BLOCK_NONE);
325100966Siwasaki    }
326100966Siwasaki}
327100966Siwasaki
328100966Siwasaki
329100966Siwasaki/*******************************************************************************
330100966Siwasaki *
331100966Siwasaki * FUNCTION:    AcpiDmListType
332100966Siwasaki *
333100966Siwasaki * PARAMETERS:  Op              - Object to be examined
334100966Siwasaki *
335151937Sjkim * RETURN:      ListType - has commas or not.
336100966Siwasaki *
337100966Siwasaki * DESCRIPTION: Type of block for this op (parens or braces)
338100966Siwasaki *
339100966Siwasaki ******************************************************************************/
340100966Siwasaki
341100966SiwasakiUINT32
342100966SiwasakiAcpiDmListType (
343100966Siwasaki    ACPI_PARSE_OBJECT       *Op)
344100966Siwasaki{
345100966Siwasaki    const ACPI_OPCODE_INFO  *OpInfo;
346100966Siwasaki
347100966Siwasaki
348100966Siwasaki    if (!Op)
349100966Siwasaki    {
350100966Siwasaki        return (BLOCK_NONE);
351100966Siwasaki    }
352100966Siwasaki
353100966Siwasaki    switch (Op->Common.AmlOpcode)
354100966Siwasaki    {
355100966Siwasaki
356100966Siwasaki    case AML_ELSE_OP:
357100966Siwasaki    case AML_METHOD_OP:
358100966Siwasaki    case AML_DEVICE_OP:
359100966Siwasaki    case AML_SCOPE_OP:
360100966Siwasaki    case AML_POWER_RES_OP:
361100966Siwasaki    case AML_PROCESSOR_OP:
362100966Siwasaki    case AML_THERMAL_ZONE_OP:
363100966Siwasaki    case AML_IF_OP:
364100966Siwasaki    case AML_WHILE_OP:
365100966Siwasaki    case AML_FIELD_OP:
366100966Siwasaki    case AML_INDEX_FIELD_OP:
367100966Siwasaki    case AML_BANK_FIELD_OP:
368100966Siwasaki
369151937Sjkim        return (BLOCK_NONE);
370100966Siwasaki
371100966Siwasaki    case AML_BUFFER_OP:
372100966Siwasaki    case AML_PACKAGE_OP:
373100966Siwasaki    case AML_VAR_PACKAGE_OP:
374100966Siwasaki
375100966Siwasaki        return (BLOCK_COMMA_LIST);
376100966Siwasaki
377100966Siwasaki    default:
378100966Siwasaki
379100966Siwasaki        OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
380100966Siwasaki        if (OpInfo->Flags & AML_HAS_ARGS)
381100966Siwasaki        {
382100966Siwasaki            return (BLOCK_COMMA_LIST);
383100966Siwasaki        }
384100966Siwasaki
385100966Siwasaki        return (BLOCK_NONE);
386100966Siwasaki    }
387100966Siwasaki}
388100966Siwasaki
389100966Siwasaki
390100966Siwasaki/*******************************************************************************
391100966Siwasaki *
392100966Siwasaki * FUNCTION:    AcpiDmDescendingOp
393100966Siwasaki *
394100966Siwasaki * PARAMETERS:  ASL_WALK_CALLBACK
395100966Siwasaki *
396100966Siwasaki * RETURN:      Status
397100966Siwasaki *
398102550Siwasaki * DESCRIPTION: First visitation of a parse object during tree descent.
399100966Siwasaki *              Decode opcode name and begin parameter list(s), if any.
400100966Siwasaki *
401100966Siwasaki ******************************************************************************/
402100966Siwasaki
403151937Sjkimstatic ACPI_STATUS
404100966SiwasakiAcpiDmDescendingOp (
405100966Siwasaki    ACPI_PARSE_OBJECT       *Op,
406100966Siwasaki    UINT32                  Level,
407100966Siwasaki    void                    *Context)
408100966Siwasaki{
409100966Siwasaki    ACPI_OP_WALK_INFO       *Info = Context;
410100966Siwasaki    const ACPI_OPCODE_INFO  *OpInfo;
411100966Siwasaki    UINT32                  Name;
412100966Siwasaki    ACPI_PARSE_OBJECT       *NextOp;
413285797Sjkim    UINT32                  AmlOffset;
414100966Siwasaki
415100966Siwasaki
416287168Sjkim    OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
417287168Sjkim
418287168Sjkim    /* Listing support to dump the AML code after the ASL statement */
419287168Sjkim
420287168Sjkim    if (AcpiGbl_DmOpt_Listing)
421285797Sjkim    {
422287168Sjkim        /* We only care about these classes of objects */
423285797Sjkim
424287168Sjkim        if ((OpInfo->Class == AML_CLASS_NAMED_OBJECT) ||
425287168Sjkim            (OpInfo->Class == AML_CLASS_CONTROL) ||
426287168Sjkim            (OpInfo->Class == AML_CLASS_CREATE) ||
427287168Sjkim            ((OpInfo->Class == AML_CLASS_EXECUTE) && (!Op->Common.Next)))
428285797Sjkim        {
429287168Sjkim            if (AcpiGbl_DmOpt_Listing && Info->PreviousAml)
430287168Sjkim            {
431287168Sjkim                /* Dump the AML byte code for the previous Op */
432287168Sjkim
433287168Sjkim                if (Op->Common.Aml > Info->PreviousAml)
434287168Sjkim                {
435287168Sjkim                    AcpiOsPrintf ("\n");
436287168Sjkim                    AcpiUtDumpBuffer (
437287168Sjkim                        (Info->StartAml + Info->AmlOffset),
438287168Sjkim                        (Op->Common.Aml - Info->PreviousAml),
439287168Sjkim                        DB_BYTE_DISPLAY,
440287168Sjkim                        Info->AmlOffset);
441287168Sjkim                    AcpiOsPrintf ("\n");
442287168Sjkim                }
443287168Sjkim
444287168Sjkim                Info->AmlOffset = (Op->Common.Aml - Info->StartAml);
445287168Sjkim            }
446287168Sjkim
447287168Sjkim            Info->PreviousAml = Op->Common.Aml;
448285797Sjkim        }
449285797Sjkim    }
450285797Sjkim
451100966Siwasaki    if (Op->Common.DisasmFlags & ACPI_PARSEOP_IGNORE)
452100966Siwasaki    {
453100966Siwasaki        /* Ignore this op -- it was handled elsewhere */
454100966Siwasaki
455100966Siwasaki        return (AE_CTRL_DEPTH);
456100966Siwasaki    }
457100966Siwasaki
458128212Snjl    /* Level 0 is at the Definition Block level */
459100966Siwasaki
460100966Siwasaki    if (Level == 0)
461100966Siwasaki    {
462100966Siwasaki        /* In verbose mode, print the AML offset, opcode and depth count */
463100966Siwasaki
464151937Sjkim        if (Info->WalkState)
465151937Sjkim        {
466285797Sjkim            AmlOffset = (UINT32) ACPI_PTR_DIFF (Op->Common.Aml,
467285797Sjkim                            Info->WalkState->ParserState.AmlStart);
468287168Sjkim            if (AcpiGbl_DmOpt_Verbose)
469287168Sjkim            {
470287168Sjkim                AcpiOsPrintf (DB_FULL_OP_INFO,
471287168Sjkim                    (Info->WalkState->MethodNode ?
472287168Sjkim                        Info->WalkState->MethodNode->Name.Ascii : "   "),
473287168Sjkim                    AmlOffset, (UINT32) Op->Common.AmlOpcode);
474287168Sjkim            }
475151937Sjkim        }
476100966Siwasaki
477100966Siwasaki        if (Op->Common.AmlOpcode == AML_SCOPE_OP)
478100966Siwasaki        {
479128212Snjl            /* This is the beginning of the Definition Block */
480128212Snjl
481100966Siwasaki            AcpiOsPrintf ("{\n");
482128212Snjl
483128212Snjl            /* Emit all External() declarations here */
484128212Snjl
485198237Sjkim            AcpiDmEmitExternals ();
486100966Siwasaki            return (AE_OK);
487100966Siwasaki        }
488100966Siwasaki    }
489100966Siwasaki    else if ((AcpiDmBlockType (Op->Common.Parent) & BLOCK_BRACE) &&
490100966Siwasaki             (!(Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST)) &&
491100966Siwasaki             (Op->Common.AmlOpcode != AML_INT_BYTELIST_OP))
492100966Siwasaki    {
493151937Sjkim            /*
494151937Sjkim             * This is a first-level element of a term list,
495151937Sjkim             * indent a new line
496151937Sjkim             */
497245582Sjkim            switch (Op->Common.AmlOpcode)
498245582Sjkim            {
499245582Sjkim            case AML_NOOP_OP:
500245582Sjkim                /*
501245582Sjkim                 * Optionally just ignore this opcode. Some tables use
502245582Sjkim                 * NoOp opcodes for "padding" out packages that the BIOS
503245582Sjkim                 * changes dynamically. This can leave hundreds or
504245582Sjkim                 * thousands of NoOp opcodes that if disassembled,
505245582Sjkim                 * cannot be compiled because they are syntactically
506245582Sjkim                 * incorrect.
507245582Sjkim                 */
508245582Sjkim                if (AcpiGbl_IgnoreNoopOperator)
509245582Sjkim                {
510245582Sjkim                    Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
511245582Sjkim                    return (AE_OK);
512245582Sjkim                }
513245582Sjkim
514245582Sjkim                /* Fallthrough */
515245582Sjkim
516245582Sjkim            default:
517250838Sjkim
518245582Sjkim                AcpiDmIndent (Level);
519245582Sjkim                break;
520245582Sjkim            }
521245582Sjkim
522167802Sjkim            Info->LastLevel = Level;
523167802Sjkim            Info->Count = 0;
524100966Siwasaki    }
525100966Siwasaki
526167802Sjkim    /*
527167802Sjkim     * This is an inexpensive mechanism to try and keep lines from getting
528167802Sjkim     * too long. When the limit is hit, start a new line at the previous
529167802Sjkim     * indent plus one. A better but more expensive mechanism would be to
530167802Sjkim     * keep track of the current column.
531167802Sjkim     */
532167802Sjkim    Info->Count++;
533278970Sjkim    if (Info->Count /* +Info->LastLevel */ > 12)
534167802Sjkim    {
535167802Sjkim        Info->Count = 0;
536167802Sjkim        AcpiOsPrintf ("\n");
537167802Sjkim        AcpiDmIndent (Info->LastLevel + 1);
538167802Sjkim    }
539167802Sjkim
540278970Sjkim    /* If ASL+ is enabled, check for a C-style operator */
541278970Sjkim
542278970Sjkim    if (AcpiDmCheckForSymbolicOpcode (Op, Info))
543278970Sjkim    {
544278970Sjkim        return (AE_OK);
545278970Sjkim    }
546278970Sjkim
547100966Siwasaki    /* Print the opcode name */
548100966Siwasaki
549100966Siwasaki    AcpiDmDisassembleOneOp (NULL, Info, Op);
550100966Siwasaki
551228110Sjkim    if ((Op->Common.DisasmOpcode == ACPI_DASM_LNOT_PREFIX) ||
552228110Sjkim        (Op->Common.AmlOpcode == AML_INT_CONNECTION_OP))
553167802Sjkim    {
554167802Sjkim        return (AE_OK);
555167802Sjkim    }
556167802Sjkim
557100966Siwasaki    if ((Op->Common.AmlOpcode == AML_NAME_OP) ||
558100966Siwasaki        (Op->Common.AmlOpcode == AML_RETURN_OP))
559100966Siwasaki    {
560100966Siwasaki        Info->Level--;
561100966Siwasaki    }
562100966Siwasaki
563117521Snjl    /* Start the opcode argument list if necessary */
564117521Snjl
565102550Siwasaki    if ((OpInfo->Flags & AML_HAS_ARGS) ||
566100966Siwasaki        (Op->Common.AmlOpcode == AML_EVENT_OP))
567100966Siwasaki    {
568100966Siwasaki        /* This opcode has an argument list */
569100966Siwasaki
570100966Siwasaki        if (AcpiDmBlockType (Op) & BLOCK_PAREN)
571100966Siwasaki        {
572100966Siwasaki            AcpiOsPrintf (" (");
573100966Siwasaki        }
574100966Siwasaki
575117521Snjl        /* If this is a named opcode, print the associated name value */
576117521Snjl
577100966Siwasaki        if (OpInfo->Flags & AML_NAMED)
578100966Siwasaki        {
579100966Siwasaki            switch (Op->Common.AmlOpcode)
580100966Siwasaki            {
581100966Siwasaki            case AML_ALIAS_OP:
582100966Siwasaki
583100966Siwasaki                NextOp = AcpiPsGetDepthNext (NULL, Op);
584100966Siwasaki                NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
585100966Siwasaki                AcpiDmNamestring (NextOp->Common.Value.Name);
586100966Siwasaki                AcpiOsPrintf (", ");
587100966Siwasaki
588100966Siwasaki                /*lint -fallthrough */
589100966Siwasaki
590100966Siwasaki            default:
591100966Siwasaki
592100966Siwasaki                Name = AcpiPsGetName (Op);
593100966Siwasaki                if (Op->Named.Path)
594100966Siwasaki                {
595100966Siwasaki                    AcpiDmNamestring ((char *) Op->Named.Path);
596100966Siwasaki                }
597100966Siwasaki                else
598100966Siwasaki                {
599193267Sjkim                    AcpiDmDumpName (Name);
600100966Siwasaki                }
601100966Siwasaki
602100966Siwasaki                if (Op->Common.AmlOpcode != AML_INT_NAMEDFIELD_OP)
603100966Siwasaki                {
604287168Sjkim                    if (AcpiGbl_DmOpt_Verbose)
605100966Siwasaki                    {
606100966Siwasaki                        (void) AcpiPsDisplayObjectPathname (NULL, Op);
607100966Siwasaki                    }
608100966Siwasaki                }
609100966Siwasaki                break;
610100966Siwasaki            }
611100966Siwasaki
612100966Siwasaki            switch (Op->Common.AmlOpcode)
613100966Siwasaki            {
614100966Siwasaki            case AML_METHOD_OP:
615100966Siwasaki
616100966Siwasaki                AcpiDmMethodFlags (Op);
617100966Siwasaki                AcpiOsPrintf (")");
618237412Sjkim
619237412Sjkim                /* Emit description comment for Method() with a predefined ACPI name */
620237412Sjkim
621237412Sjkim                AcpiDmPredefinedDescription (Op);
622100966Siwasaki                break;
623100966Siwasaki
624100966Siwasaki            case AML_NAME_OP:
625100966Siwasaki
626100966Siwasaki                /* Check for _HID and related EISAID() */
627100966Siwasaki
628272444Sjkim                AcpiDmCheckForHardwareId (Op);
629100966Siwasaki                AcpiOsPrintf (", ");
630100966Siwasaki                break;
631100966Siwasaki
632100966Siwasaki            case AML_REGION_OP:
633100966Siwasaki
634100966Siwasaki                AcpiDmRegionFlags (Op);
635100966Siwasaki                break;
636100966Siwasaki
637100966Siwasaki            case AML_POWER_RES_OP:
638100966Siwasaki
639100966Siwasaki                /* Mark the next two Ops as part of the parameter list */
640100966Siwasaki
641100966Siwasaki                AcpiOsPrintf (", ");
642100966Siwasaki                NextOp = AcpiPsGetDepthNext (NULL, Op);
643100966Siwasaki                NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMLIST;
644100966Siwasaki
645100966Siwasaki                NextOp = NextOp->Common.Next;
646100966Siwasaki                NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMLIST;
647100966Siwasaki                return (AE_OK);
648100966Siwasaki
649100966Siwasaki            case AML_PROCESSOR_OP:
650100966Siwasaki
651100966Siwasaki                /* Mark the next three Ops as part of the parameter list */
652100966Siwasaki
653100966Siwasaki                AcpiOsPrintf (", ");
654100966Siwasaki                NextOp = AcpiPsGetDepthNext (NULL, Op);
655100966Siwasaki                NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMLIST;
656100966Siwasaki
657100966Siwasaki                NextOp = NextOp->Common.Next;
658100966Siwasaki                NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMLIST;
659100966Siwasaki
660100966Siwasaki                NextOp = NextOp->Common.Next;
661100966Siwasaki                NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMLIST;
662100966Siwasaki                return (AE_OK);
663100966Siwasaki
664100966Siwasaki            case AML_MUTEX_OP:
665167802Sjkim            case AML_DATA_REGION_OP:
666100966Siwasaki
667100966Siwasaki                AcpiOsPrintf (", ");
668100966Siwasaki                return (AE_OK);
669100966Siwasaki
670100966Siwasaki            case AML_EVENT_OP:
671100966Siwasaki            case AML_ALIAS_OP:
672100966Siwasaki
673100966Siwasaki                return (AE_OK);
674100966Siwasaki
675100966Siwasaki            case AML_SCOPE_OP:
676100966Siwasaki            case AML_DEVICE_OP:
677100966Siwasaki            case AML_THERMAL_ZONE_OP:
678100966Siwasaki
679100966Siwasaki                AcpiOsPrintf (")");
680100966Siwasaki                break;
681100966Siwasaki
682100966Siwasaki            default:
683100966Siwasaki
684237412Sjkim                AcpiOsPrintf ("*** Unhandled named opcode %X\n",
685237412Sjkim                    Op->Common.AmlOpcode);
686100966Siwasaki                break;
687100966Siwasaki            }
688100966Siwasaki        }
689100966Siwasaki
690100966Siwasaki        else switch (Op->Common.AmlOpcode)
691100966Siwasaki        {
692100966Siwasaki        case AML_FIELD_OP:
693100966Siwasaki        case AML_BANK_FIELD_OP:
694100966Siwasaki        case AML_INDEX_FIELD_OP:
695100966Siwasaki
696100966Siwasaki            Info->BitOffset = 0;
697100966Siwasaki
698100966Siwasaki            /* Name of the parent OperationRegion */
699100966Siwasaki
700100966Siwasaki            NextOp = AcpiPsGetDepthNext (NULL, Op);
701100966Siwasaki            AcpiDmNamestring (NextOp->Common.Value.Name);
702100966Siwasaki            AcpiOsPrintf (", ");
703100966Siwasaki            NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
704100966Siwasaki
705100966Siwasaki            switch (Op->Common.AmlOpcode)
706100966Siwasaki            {
707100966Siwasaki            case AML_BANK_FIELD_OP:
708100966Siwasaki
709167802Sjkim                /* Namestring - Bank Name */
710100966Siwasaki
711100966Siwasaki                NextOp = AcpiPsGetDepthNext (NULL, NextOp);
712100966Siwasaki                AcpiDmNamestring (NextOp->Common.Value.Name);
713100966Siwasaki                NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
714100966Siwasaki                AcpiOsPrintf (", ");
715100966Siwasaki
716167802Sjkim                /*
717167802Sjkim                 * Bank Value. This is a TermArg in the middle of the parameter
718167802Sjkim                 * list, must handle it here.
719167802Sjkim                 *
720167802Sjkim                 * Disassemble the TermArg parse tree. ACPI_PARSEOP_PARAMLIST
721167802Sjkim                 * eliminates newline in the output.
722167802Sjkim                 */
723167802Sjkim                NextOp = NextOp->Common.Next;
724100966Siwasaki
725167802Sjkim                Info->Flags = ACPI_PARSEOP_PARAMLIST;
726237412Sjkim                AcpiDmWalkParseTree (NextOp, AcpiDmDescendingOp,
727237412Sjkim                    AcpiDmAscendingOp, Info);
728167802Sjkim                Info->Flags = 0;
729167802Sjkim                Info->Level = Level;
730167802Sjkim
731100966Siwasaki                NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
732100966Siwasaki                AcpiOsPrintf (", ");
733100966Siwasaki                break;
734100966Siwasaki
735100966Siwasaki            case AML_INDEX_FIELD_OP:
736100966Siwasaki
737167802Sjkim                /* Namestring - Data Name */
738100966Siwasaki
739100966Siwasaki                NextOp = AcpiPsGetDepthNext (NULL, NextOp);
740100966Siwasaki                AcpiDmNamestring (NextOp->Common.Value.Name);
741100966Siwasaki                AcpiOsPrintf (", ");
742100966Siwasaki                NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
743100966Siwasaki                break;
744100966Siwasaki
745100966Siwasaki            default:
746100966Siwasaki
747100966Siwasaki                break;
748100966Siwasaki            }
749100966Siwasaki
750100966Siwasaki            AcpiDmFieldFlags (NextOp);
751100966Siwasaki            break;
752100966Siwasaki
753100966Siwasaki        case AML_BUFFER_OP:
754100966Siwasaki
755100966Siwasaki            /* The next op is the size parameter */
756100966Siwasaki
757100966Siwasaki            NextOp = AcpiPsGetDepthNext (NULL, Op);
758100966Siwasaki            if (!NextOp)
759100966Siwasaki            {
760100966Siwasaki                /* Single-step support */
761100966Siwasaki
762100966Siwasaki                return (AE_OK);
763100966Siwasaki            }
764100966Siwasaki
765100966Siwasaki            if (Op->Common.DisasmOpcode == ACPI_DASM_RESOURCE)
766100966Siwasaki            {
767100966Siwasaki                /*
768237412Sjkim                 * We have a resource list. Don't need to output
769237412Sjkim                 * the buffer size Op. Open up a new block
770100966Siwasaki                 */
771100966Siwasaki                NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
772100966Siwasaki                NextOp = NextOp->Common.Next;
773237412Sjkim                AcpiOsPrintf (")");
774237412Sjkim
775237412Sjkim                /* Emit description comment for Name() with a predefined ACPI name */
776237412Sjkim
777237412Sjkim                AcpiDmPredefinedDescription (Op->Asl.Parent);
778237412Sjkim
779237412Sjkim                AcpiOsPrintf ("\n");
780100966Siwasaki                AcpiDmIndent (Info->Level);
781100966Siwasaki                AcpiOsPrintf ("{\n");
782100966Siwasaki                return (AE_OK);
783100966Siwasaki            }
784100966Siwasaki
785100966Siwasaki            /* Normal Buffer, mark size as in the parameter list */
786100966Siwasaki
787100966Siwasaki            NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMLIST;
788100966Siwasaki            return (AE_OK);
789100966Siwasaki
790100966Siwasaki        case AML_VAR_PACKAGE_OP:
791100966Siwasaki        case AML_IF_OP:
792100966Siwasaki        case AML_WHILE_OP:
793100966Siwasaki
794100966Siwasaki            /* The next op is the size or predicate parameter */
795100966Siwasaki
796100966Siwasaki            NextOp = AcpiPsGetDepthNext (NULL, Op);
797100966Siwasaki            if (NextOp)
798100966Siwasaki            {
799100966Siwasaki                NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMLIST;
800100966Siwasaki            }
801100966Siwasaki            return (AE_OK);
802100966Siwasaki
803100966Siwasaki        case AML_PACKAGE_OP:
804100966Siwasaki
805237412Sjkim            /* The next op is the size parameter */
806100966Siwasaki
807100966Siwasaki            NextOp = AcpiPsGetDepthNext (NULL, Op);
808100966Siwasaki            if (NextOp)
809100966Siwasaki            {
810100966Siwasaki                NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMLIST;
811100966Siwasaki            }
812100966Siwasaki            return (AE_OK);
813100966Siwasaki
814100966Siwasaki        case AML_MATCH_OP:
815100966Siwasaki
816100966Siwasaki            AcpiDmMatchOp (Op);
817100966Siwasaki            break;
818100966Siwasaki
819100966Siwasaki        default:
820100966Siwasaki
821100966Siwasaki            break;
822100966Siwasaki        }
823100966Siwasaki
824100966Siwasaki        if (AcpiDmBlockType (Op) & BLOCK_BRACE)
825100966Siwasaki        {
826100966Siwasaki            AcpiOsPrintf ("\n");
827100966Siwasaki            AcpiDmIndent (Level);
828100966Siwasaki            AcpiOsPrintf ("{\n");
829100966Siwasaki        }
830100966Siwasaki    }
831100966Siwasaki
832100966Siwasaki    return (AE_OK);
833100966Siwasaki}
834100966Siwasaki
835100966Siwasaki
836100966Siwasaki/*******************************************************************************
837100966Siwasaki *
838100966Siwasaki * FUNCTION:    AcpiDmAscendingOp
839100966Siwasaki *
840100966Siwasaki * PARAMETERS:  ASL_WALK_CALLBACK
841100966Siwasaki *
842100966Siwasaki * RETURN:      Status
843100966Siwasaki *
844100966Siwasaki * DESCRIPTION: Second visitation of a parse object, during ascent of parse
845241973Sjkim *              tree. Close out any parameter lists and complete the opcode.
846100966Siwasaki *
847100966Siwasaki ******************************************************************************/
848100966Siwasaki
849151937Sjkimstatic ACPI_STATUS
850100966SiwasakiAcpiDmAscendingOp (
851100966Siwasaki    ACPI_PARSE_OBJECT       *Op,
852100966Siwasaki    UINT32                  Level,
853100966Siwasaki    void                    *Context)
854100966Siwasaki{
855100966Siwasaki    ACPI_OP_WALK_INFO       *Info = Context;
856237412Sjkim    ACPI_PARSE_OBJECT       *ParentOp;
857100966Siwasaki
858100966Siwasaki
859100966Siwasaki    if (Op->Common.DisasmFlags & ACPI_PARSEOP_IGNORE)
860100966Siwasaki    {
861100966Siwasaki        /* Ignore this op -- it was handled elsewhere */
862100966Siwasaki
863100966Siwasaki        return (AE_OK);
864100966Siwasaki    }
865100966Siwasaki
866100966Siwasaki    if ((Level == 0) && (Op->Common.AmlOpcode == AML_SCOPE_OP))
867100966Siwasaki    {
868100966Siwasaki        /* Indicates the end of the current descriptor block (table) */
869100966Siwasaki
870100966Siwasaki        AcpiOsPrintf ("}\n\n");
871100966Siwasaki        return (AE_OK);
872100966Siwasaki    }
873100966Siwasaki
874100966Siwasaki    switch (AcpiDmBlockType (Op))
875100966Siwasaki    {
876100966Siwasaki    case BLOCK_PAREN:
877100966Siwasaki
878278970Sjkim        /* Completed an op that has arguments, add closing paren if needed */
879100966Siwasaki
880278970Sjkim        AcpiDmCloseOperator (Op);
881100966Siwasaki
882237412Sjkim        if (Op->Common.AmlOpcode == AML_NAME_OP)
883237412Sjkim        {
884237412Sjkim            /* Emit description comment for Name() with a predefined ACPI name */
885237412Sjkim
886237412Sjkim            AcpiDmPredefinedDescription (Op);
887237412Sjkim        }
888237412Sjkim        else
889237412Sjkim        {
890237412Sjkim            /* For Create* operators, attempt to emit resource tag description */
891237412Sjkim
892237412Sjkim            AcpiDmFieldPredefinedDescription (Op);
893237412Sjkim        }
894237412Sjkim
895272444Sjkim        /* Decode Notify() values */
896272444Sjkim
897272444Sjkim        if (Op->Common.AmlOpcode == AML_NOTIFY_OP)
898272444Sjkim        {
899272444Sjkim            AcpiDmNotifyDescription (Op);
900272444Sjkim        }
901272444Sjkim
902272444Sjkim        AcpiDmDisplayTargetPathname (Op);
903272444Sjkim
904100966Siwasaki        /* Could be a nested operator, check if comma required */
905100966Siwasaki
906100966Siwasaki        if (!AcpiDmCommaIfListMember (Op))
907100966Siwasaki        {
908100966Siwasaki            if ((AcpiDmBlockType (Op->Common.Parent) & BLOCK_BRACE) &&
909100966Siwasaki                     (!(Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST)) &&
910100966Siwasaki                     (Op->Common.AmlOpcode != AML_INT_BYTELIST_OP))
911100966Siwasaki            {
912151937Sjkim                /*
913151937Sjkim                 * This is a first-level element of a term list
914151937Sjkim                 * start a new line
915151937Sjkim                 */
916167802Sjkim                if (!(Info->Flags & ACPI_PARSEOP_PARAMLIST))
917167802Sjkim                {
918167802Sjkim                    AcpiOsPrintf ("\n");
919167802Sjkim                }
920100966Siwasaki            }
921100966Siwasaki        }
922100966Siwasaki        break;
923100966Siwasaki
924100966Siwasaki    case BLOCK_BRACE:
925100966Siwasaki    case (BLOCK_BRACE | BLOCK_PAREN):
926100966Siwasaki
927100966Siwasaki        /* Completed an op that has a term list, add closing brace */
928100966Siwasaki
929100966Siwasaki        if (Op->Common.DisasmFlags & ACPI_PARSEOP_EMPTY_TERMLIST)
930100966Siwasaki        {
931100966Siwasaki            AcpiOsPrintf ("}");
932100966Siwasaki        }
933100966Siwasaki        else
934100966Siwasaki        {
935100966Siwasaki            AcpiDmIndent (Level);
936100966Siwasaki            AcpiOsPrintf ("}");
937100966Siwasaki        }
938100966Siwasaki
939100966Siwasaki        AcpiDmCommaIfListMember (Op);
940100966Siwasaki
941100966Siwasaki        if (AcpiDmBlockType (Op->Common.Parent) != BLOCK_PAREN)
942100966Siwasaki        {
943100966Siwasaki            AcpiOsPrintf ("\n");
944100966Siwasaki            if (!(Op->Common.DisasmFlags & ACPI_PARSEOP_EMPTY_TERMLIST))
945100966Siwasaki            {
946100966Siwasaki                if ((Op->Common.AmlOpcode == AML_IF_OP)  &&
947100966Siwasaki                    (Op->Common.Next) &&
948100966Siwasaki                    (Op->Common.Next->Common.AmlOpcode == AML_ELSE_OP))
949100966Siwasaki                {
950100966Siwasaki                    break;
951100966Siwasaki                }
952100966Siwasaki
953100966Siwasaki                if ((AcpiDmBlockType (Op->Common.Parent) & BLOCK_BRACE) &&
954100966Siwasaki                    (!Op->Common.Next))
955100966Siwasaki                {
956100966Siwasaki                    break;
957100966Siwasaki                }
958100966Siwasaki                AcpiOsPrintf ("\n");
959100966Siwasaki            }
960100966Siwasaki        }
961100966Siwasaki        break;
962100966Siwasaki
963100966Siwasaki    case BLOCK_NONE:
964100966Siwasaki    default:
965100966Siwasaki
966100966Siwasaki        /* Could be a nested operator, check if comma required */
967100966Siwasaki
968100966Siwasaki        if (!AcpiDmCommaIfListMember (Op))
969100966Siwasaki        {
970100966Siwasaki            if ((AcpiDmBlockType (Op->Common.Parent) & BLOCK_BRACE) &&
971100966Siwasaki                     (!(Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST)) &&
972100966Siwasaki                     (Op->Common.AmlOpcode != AML_INT_BYTELIST_OP))
973100966Siwasaki            {
974151937Sjkim                /*
975151937Sjkim                 * This is a first-level element of a term list
976151937Sjkim                 * start a new line
977151937Sjkim                 */
978100966Siwasaki                AcpiOsPrintf ("\n");
979100966Siwasaki            }
980100966Siwasaki        }
981100966Siwasaki        else if (Op->Common.Parent)
982100966Siwasaki        {
983100966Siwasaki            switch (Op->Common.Parent->Common.AmlOpcode)
984100966Siwasaki            {
985100966Siwasaki            case AML_PACKAGE_OP:
986100966Siwasaki            case AML_VAR_PACKAGE_OP:
987100966Siwasaki
988100966Siwasaki                if (!(Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST))
989100966Siwasaki                {
990100966Siwasaki                    AcpiOsPrintf ("\n");
991100966Siwasaki                }
992100966Siwasaki                break;
993100966Siwasaki
994100966Siwasaki            default:
995100966Siwasaki
996100966Siwasaki                break;
997100966Siwasaki            }
998100966Siwasaki        }
999100966Siwasaki        break;
1000100966Siwasaki    }
1001100966Siwasaki
1002100966Siwasaki    if (Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST)
1003100966Siwasaki    {
1004100966Siwasaki        if ((Op->Common.Next) &&
1005100966Siwasaki            (Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST))
1006100966Siwasaki        {
1007100966Siwasaki            return (AE_OK);
1008100966Siwasaki        }
1009100966Siwasaki
1010100966Siwasaki        /*
1011272444Sjkim         * The parent Op is guaranteed to be valid because of the flag
1012272444Sjkim         * ACPI_PARSEOP_PARAMLIST -- which means that this op is part of
1013272444Sjkim         * a parameter list and thus has a valid parent.
1014272444Sjkim         */
1015272444Sjkim        ParentOp = Op->Common.Parent;
1016272444Sjkim
1017272444Sjkim        /*
1018100966Siwasaki         * Just completed a parameter node for something like "Buffer (param)".
1019100966Siwasaki         * Close the paren and open up the term list block with a brace
1020100966Siwasaki         */
1021100966Siwasaki        if (Op->Common.Next)
1022100966Siwasaki        {
1023237412Sjkim            AcpiOsPrintf (")");
1024237412Sjkim
1025272444Sjkim            /*
1026272444Sjkim             * Emit a description comment for a Name() operator that is a
1027272444Sjkim             * predefined ACPI name. Must check the grandparent.
1028272444Sjkim             */
1029272444Sjkim            ParentOp = ParentOp->Common.Parent;
1030272444Sjkim            if (ParentOp &&
1031272444Sjkim                (ParentOp->Asl.AmlOpcode == AML_NAME_OP))
1032237412Sjkim            {
1033272444Sjkim                AcpiDmPredefinedDescription (ParentOp);
1034237412Sjkim            }
1035272444Sjkim
1036237412Sjkim            AcpiOsPrintf ("\n");
1037100966Siwasaki            AcpiDmIndent (Level - 1);
1038100966Siwasaki            AcpiOsPrintf ("{\n");
1039100966Siwasaki        }
1040100966Siwasaki        else
1041100966Siwasaki        {
1042272444Sjkim            ParentOp->Common.DisasmFlags |= ACPI_PARSEOP_EMPTY_TERMLIST;
1043100966Siwasaki            AcpiOsPrintf (") {");
1044100966Siwasaki        }
1045100966Siwasaki    }
1046100966Siwasaki
1047100966Siwasaki    if ((Op->Common.AmlOpcode == AML_NAME_OP) ||
1048100966Siwasaki        (Op->Common.AmlOpcode == AML_RETURN_OP))
1049100966Siwasaki    {
1050100966Siwasaki        Info->Level++;
1051100966Siwasaki    }
1052278970Sjkim
1053278970Sjkim    /*
1054278970Sjkim     * For ASL+, check for and emit a C-style symbol. If valid, the
1055278970Sjkim     * symbol string has been deferred until after the first operand
1056278970Sjkim     */
1057278970Sjkim    if (AcpiGbl_CstyleDisassembly)
1058278970Sjkim    {
1059278970Sjkim        if (Op->Asl.OperatorSymbol)
1060278970Sjkim        {
1061278970Sjkim            AcpiOsPrintf ("%s", Op->Asl.OperatorSymbol);
1062278970Sjkim            Op->Asl.OperatorSymbol = NULL;
1063278970Sjkim        }
1064278970Sjkim    }
1065278970Sjkim
1066100966Siwasaki    return (AE_OK);
1067100966Siwasaki}
1068