1100966Siwasaki/*******************************************************************************
2100966Siwasaki *
3100966Siwasaki * Module Name: dmwalk - AML disassembly tree walk
4100966Siwasaki *
5100966Siwasaki ******************************************************************************/
6100966Siwasaki
7217365Sjkim/*
8306536Sjkim * Copyright (C) 2000 - 2016, 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
117306536Sjkim    memset (&Info, 0, sizeof (ACPI_OP_WALK_INFO));
118151937Sjkim    Info.WalkState = WalkState;
119306536Sjkim    Info.StartAml = Op->Common.Aml - sizeof (ACPI_TABLE_HEADER);
120306536Sjkim    Info.AmlOffset = Op->Common.Aml - Info.StartAml;
121306536Sjkim
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
285281075Sdim        if ((Op->Common.DisasmOpcode == ACPI_DASM_UNICODE) ||
286281075Sdim            (Op->Common.DisasmOpcode == ACPI_DASM_UUID) ||
287281075Sdim            (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
303281075Sdim    case AML_INT_METHODCALL_OP:
304281075Sdim
305281075Sdim        if (Op->Common.Parent &&
306281075Sdim            ((Op->Common.Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
307281075Sdim             (Op->Common.Parent->Common.AmlOpcode == AML_VAR_PACKAGE_OP)))
308281075Sdim        {
309281075Sdim            /* This is a reference to a method, not an invocation */
310281075Sdim
311281075Sdim            return (BLOCK_NONE);
312281075Sdim        }
313281075Sdim
314306536Sjkim        /*lint -fallthrough */
315306536Sjkim
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;
413306536Sjkim    ACPI_PARSE_OBJECT       *NextOp2;
414306536Sjkim    UINT32                  AmlOffset;
415100966Siwasaki
416100966Siwasaki
417306536Sjkim    OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
418306536Sjkim
419306536Sjkim    /* Listing support to dump the AML code after the ASL statement */
420306536Sjkim
421306536Sjkim    if (AcpiGbl_DmOpt_Listing)
422306536Sjkim    {
423306536Sjkim        /* We only care about these classes of objects */
424306536Sjkim
425306536Sjkim        if ((OpInfo->Class == AML_CLASS_NAMED_OBJECT) ||
426306536Sjkim            (OpInfo->Class == AML_CLASS_CONTROL) ||
427306536Sjkim            (OpInfo->Class == AML_CLASS_CREATE) ||
428306536Sjkim            ((OpInfo->Class == AML_CLASS_EXECUTE) && (!Op->Common.Next)))
429306536Sjkim        {
430306536Sjkim            if (AcpiGbl_DmOpt_Listing && Info->PreviousAml)
431306536Sjkim            {
432306536Sjkim                /* Dump the AML byte code for the previous Op */
433306536Sjkim
434306536Sjkim                if (Op->Common.Aml > Info->PreviousAml)
435306536Sjkim                {
436306536Sjkim                    AcpiOsPrintf ("\n");
437306536Sjkim                    AcpiUtDumpBuffer (
438306536Sjkim                        (Info->StartAml + Info->AmlOffset),
439306536Sjkim                        (Op->Common.Aml - Info->PreviousAml),
440306536Sjkim                        DB_BYTE_DISPLAY, Info->AmlOffset);
441306536Sjkim                    AcpiOsPrintf ("\n");
442306536Sjkim                }
443306536Sjkim
444306536Sjkim                Info->AmlOffset = (Op->Common.Aml - Info->StartAml);
445306536Sjkim            }
446306536Sjkim
447306536Sjkim            Info->PreviousAml = Op->Common.Aml;
448306536Sjkim        }
449306536Sjkim    }
450306536Sjkim
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
458306536Sjkim    if (Op->Common.AmlOpcode == AML_IF_OP)
459306536Sjkim    {
460306536Sjkim        NextOp = AcpiPsGetDepthNext (NULL, Op);
461306536Sjkim        if (NextOp)
462306536Sjkim        {
463306536Sjkim            NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMETER_LIST;
464306536Sjkim
465306536Sjkim            /* Don't emit the actual embedded externals unless asked */
466306536Sjkim
467306536Sjkim            if (!AcpiGbl_DmEmitExternalOpcodes)
468306536Sjkim            {
469306536Sjkim                /*
470306536Sjkim                 * A Zero predicate indicates the possibility of one or more
471306536Sjkim                 * External() opcodes within the If() block.
472306536Sjkim                 */
473306536Sjkim                if (NextOp->Common.AmlOpcode == AML_ZERO_OP)
474306536Sjkim                {
475306536Sjkim                    NextOp2 = NextOp->Common.Next;
476306536Sjkim
477306536Sjkim                    if (NextOp2 &&
478306536Sjkim                        (NextOp2->Common.AmlOpcode == AML_EXTERNAL_OP))
479306536Sjkim                    {
480306536Sjkim                        /* Ignore the If 0 block and all children */
481306536Sjkim
482306536Sjkim                        Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
483306536Sjkim                        return (AE_CTRL_DEPTH);
484306536Sjkim                    }
485306536Sjkim                }
486306536Sjkim            }
487306536Sjkim        }
488306536Sjkim    }
489306536Sjkim
490128212Snjl    /* Level 0 is at the Definition Block level */
491100966Siwasaki
492100966Siwasaki    if (Level == 0)
493100966Siwasaki    {
494100966Siwasaki        /* In verbose mode, print the AML offset, opcode and depth count */
495100966Siwasaki
496151937Sjkim        if (Info->WalkState)
497151937Sjkim        {
498306536Sjkim            AmlOffset = (UINT32) ACPI_PTR_DIFF (Op->Common.Aml,
499306536Sjkim                Info->WalkState->ParserState.AmlStart);
500306536Sjkim            if (AcpiGbl_DmOpt_Verbose)
501306536Sjkim            {
502306536Sjkim                AcpiOsPrintf (DB_FULL_OP_INFO,
503306536Sjkim                    (Info->WalkState->MethodNode ?
504306536Sjkim                        Info->WalkState->MethodNode->Name.Ascii : "   "),
505306536Sjkim                    AmlOffset, (UINT32) Op->Common.AmlOpcode);
506306536Sjkim            }
507151937Sjkim        }
508100966Siwasaki
509100966Siwasaki        if (Op->Common.AmlOpcode == AML_SCOPE_OP)
510100966Siwasaki        {
511128212Snjl            /* This is the beginning of the Definition Block */
512128212Snjl
513100966Siwasaki            AcpiOsPrintf ("{\n");
514128212Snjl
515128212Snjl            /* Emit all External() declarations here */
516128212Snjl
517198237Sjkim            AcpiDmEmitExternals ();
518100966Siwasaki            return (AE_OK);
519100966Siwasaki        }
520100966Siwasaki    }
521100966Siwasaki    else if ((AcpiDmBlockType (Op->Common.Parent) & BLOCK_BRACE) &&
522306536Sjkim         (!(Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMETER_LIST)) &&
523306536Sjkim         (!(Op->Common.DisasmFlags & ACPI_PARSEOP_ELSEIF)) &&
524306536Sjkim         (Op->Common.AmlOpcode != AML_INT_BYTELIST_OP))
525100966Siwasaki    {
526306536Sjkim        /*
527306536Sjkim         * This is a first-level element of a term list,
528306536Sjkim         * indent a new line
529306536Sjkim         */
530306536Sjkim        switch (Op->Common.AmlOpcode)
531306536Sjkim        {
532306536Sjkim        case AML_NOOP_OP:
533151937Sjkim            /*
534306536Sjkim             * Optionally just ignore this opcode. Some tables use
535306536Sjkim             * NoOp opcodes for "padding" out packages that the BIOS
536306536Sjkim             * changes dynamically. This can leave hundreds or
537306536Sjkim             * thousands of NoOp opcodes that if disassembled,
538306536Sjkim             * cannot be compiled because they are syntactically
539306536Sjkim             * incorrect.
540151937Sjkim             */
541306536Sjkim            if (AcpiGbl_IgnoreNoopOperator)
542245582Sjkim            {
543306536Sjkim                Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
544306536Sjkim                return (AE_OK);
545306536Sjkim            }
546245582Sjkim
547306536Sjkim            /* Fallthrough */
548245582Sjkim
549306536Sjkim        default:
550250838Sjkim
551306536Sjkim            AcpiDmIndent (Level);
552306536Sjkim            break;
553306536Sjkim        }
554245582Sjkim
555306536Sjkim        Info->LastLevel = Level;
556306536Sjkim        Info->Count = 0;
557100966Siwasaki    }
558100966Siwasaki
559167802Sjkim    /*
560167802Sjkim     * This is an inexpensive mechanism to try and keep lines from getting
561167802Sjkim     * too long. When the limit is hit, start a new line at the previous
562167802Sjkim     * indent plus one. A better but more expensive mechanism would be to
563167802Sjkim     * keep track of the current column.
564167802Sjkim     */
565167802Sjkim    Info->Count++;
566281075Sdim    if (Info->Count /* +Info->LastLevel */ > 12)
567167802Sjkim    {
568167802Sjkim        Info->Count = 0;
569167802Sjkim        AcpiOsPrintf ("\n");
570167802Sjkim        AcpiDmIndent (Info->LastLevel + 1);
571167802Sjkim    }
572167802Sjkim
573281075Sdim    /* If ASL+ is enabled, check for a C-style operator */
574281075Sdim
575281075Sdim    if (AcpiDmCheckForSymbolicOpcode (Op, Info))
576281075Sdim    {
577281075Sdim        return (AE_OK);
578281075Sdim    }
579281075Sdim
580100966Siwasaki    /* Print the opcode name */
581100966Siwasaki
582100966Siwasaki    AcpiDmDisassembleOneOp (NULL, Info, Op);
583100966Siwasaki
584228110Sjkim    if ((Op->Common.DisasmOpcode == ACPI_DASM_LNOT_PREFIX) ||
585228110Sjkim        (Op->Common.AmlOpcode == AML_INT_CONNECTION_OP))
586167802Sjkim    {
587167802Sjkim        return (AE_OK);
588167802Sjkim    }
589167802Sjkim
590100966Siwasaki    if ((Op->Common.AmlOpcode == AML_NAME_OP) ||
591100966Siwasaki        (Op->Common.AmlOpcode == AML_RETURN_OP))
592100966Siwasaki    {
593100966Siwasaki        Info->Level--;
594100966Siwasaki    }
595100966Siwasaki
596117521Snjl    /* Start the opcode argument list if necessary */
597117521Snjl
598102550Siwasaki    if ((OpInfo->Flags & AML_HAS_ARGS) ||
599100966Siwasaki        (Op->Common.AmlOpcode == AML_EVENT_OP))
600100966Siwasaki    {
601100966Siwasaki        /* This opcode has an argument list */
602100966Siwasaki
603100966Siwasaki        if (AcpiDmBlockType (Op) & BLOCK_PAREN)
604100966Siwasaki        {
605100966Siwasaki            AcpiOsPrintf (" (");
606100966Siwasaki        }
607100966Siwasaki
608117521Snjl        /* If this is a named opcode, print the associated name value */
609117521Snjl
610100966Siwasaki        if (OpInfo->Flags & AML_NAMED)
611100966Siwasaki        {
612100966Siwasaki            switch (Op->Common.AmlOpcode)
613100966Siwasaki            {
614100966Siwasaki            case AML_ALIAS_OP:
615100966Siwasaki
616100966Siwasaki                NextOp = AcpiPsGetDepthNext (NULL, Op);
617100966Siwasaki                NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
618100966Siwasaki                AcpiDmNamestring (NextOp->Common.Value.Name);
619100966Siwasaki                AcpiOsPrintf (", ");
620100966Siwasaki
621100966Siwasaki                /*lint -fallthrough */
622100966Siwasaki
623100966Siwasaki            default:
624100966Siwasaki
625100966Siwasaki                Name = AcpiPsGetName (Op);
626100966Siwasaki                if (Op->Named.Path)
627100966Siwasaki                {
628100966Siwasaki                    AcpiDmNamestring ((char *) Op->Named.Path);
629100966Siwasaki                }
630100966Siwasaki                else
631100966Siwasaki                {
632193267Sjkim                    AcpiDmDumpName (Name);
633100966Siwasaki                }
634100966Siwasaki
635100966Siwasaki                if (Op->Common.AmlOpcode != AML_INT_NAMEDFIELD_OP)
636100966Siwasaki                {
637306536Sjkim                    if (AcpiGbl_DmOpt_Verbose)
638100966Siwasaki                    {
639100966Siwasaki                        (void) AcpiPsDisplayObjectPathname (NULL, Op);
640100966Siwasaki                    }
641100966Siwasaki                }
642100966Siwasaki                break;
643100966Siwasaki            }
644100966Siwasaki
645100966Siwasaki            switch (Op->Common.AmlOpcode)
646100966Siwasaki            {
647100966Siwasaki            case AML_METHOD_OP:
648100966Siwasaki
649100966Siwasaki                AcpiDmMethodFlags (Op);
650100966Siwasaki                AcpiOsPrintf (")");
651237412Sjkim
652237412Sjkim                /* Emit description comment for Method() with a predefined ACPI name */
653237412Sjkim
654237412Sjkim                AcpiDmPredefinedDescription (Op);
655100966Siwasaki                break;
656100966Siwasaki
657100966Siwasaki            case AML_NAME_OP:
658100966Siwasaki
659100966Siwasaki                /* Check for _HID and related EISAID() */
660100966Siwasaki
661281075Sdim                AcpiDmCheckForHardwareId (Op);
662100966Siwasaki                AcpiOsPrintf (", ");
663100966Siwasaki                break;
664100966Siwasaki
665100966Siwasaki            case AML_REGION_OP:
666100966Siwasaki
667100966Siwasaki                AcpiDmRegionFlags (Op);
668100966Siwasaki                break;
669100966Siwasaki
670100966Siwasaki            case AML_POWER_RES_OP:
671100966Siwasaki
672100966Siwasaki                /* Mark the next two Ops as part of the parameter list */
673100966Siwasaki
674100966Siwasaki                AcpiOsPrintf (", ");
675100966Siwasaki                NextOp = AcpiPsGetDepthNext (NULL, Op);
676306536Sjkim                NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMETER_LIST;
677100966Siwasaki
678100966Siwasaki                NextOp = NextOp->Common.Next;
679306536Sjkim                NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMETER_LIST;
680100966Siwasaki                return (AE_OK);
681100966Siwasaki
682100966Siwasaki            case AML_PROCESSOR_OP:
683100966Siwasaki
684100966Siwasaki                /* Mark the next three Ops as part of the parameter list */
685100966Siwasaki
686100966Siwasaki                AcpiOsPrintf (", ");
687100966Siwasaki                NextOp = AcpiPsGetDepthNext (NULL, Op);
688306536Sjkim                NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMETER_LIST;
689100966Siwasaki
690100966Siwasaki                NextOp = NextOp->Common.Next;
691306536Sjkim                NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMETER_LIST;
692100966Siwasaki
693100966Siwasaki                NextOp = NextOp->Common.Next;
694306536Sjkim                NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMETER_LIST;
695100966Siwasaki                return (AE_OK);
696100966Siwasaki
697100966Siwasaki            case AML_MUTEX_OP:
698167802Sjkim            case AML_DATA_REGION_OP:
699100966Siwasaki
700100966Siwasaki                AcpiOsPrintf (", ");
701100966Siwasaki                return (AE_OK);
702100966Siwasaki
703100966Siwasaki            case AML_EVENT_OP:
704100966Siwasaki            case AML_ALIAS_OP:
705100966Siwasaki
706100966Siwasaki                return (AE_OK);
707100966Siwasaki
708100966Siwasaki            case AML_SCOPE_OP:
709100966Siwasaki            case AML_DEVICE_OP:
710100966Siwasaki            case AML_THERMAL_ZONE_OP:
711100966Siwasaki
712100966Siwasaki                AcpiOsPrintf (")");
713100966Siwasaki                break;
714100966Siwasaki
715100966Siwasaki            default:
716100966Siwasaki
717237412Sjkim                AcpiOsPrintf ("*** Unhandled named opcode %X\n",
718237412Sjkim                    Op->Common.AmlOpcode);
719100966Siwasaki                break;
720100966Siwasaki            }
721100966Siwasaki        }
722100966Siwasaki
723100966Siwasaki        else switch (Op->Common.AmlOpcode)
724100966Siwasaki        {
725100966Siwasaki        case AML_FIELD_OP:
726100966Siwasaki        case AML_BANK_FIELD_OP:
727100966Siwasaki        case AML_INDEX_FIELD_OP:
728100966Siwasaki
729100966Siwasaki            Info->BitOffset = 0;
730100966Siwasaki
731100966Siwasaki            /* Name of the parent OperationRegion */
732100966Siwasaki
733100966Siwasaki            NextOp = AcpiPsGetDepthNext (NULL, Op);
734100966Siwasaki            AcpiDmNamestring (NextOp->Common.Value.Name);
735100966Siwasaki            AcpiOsPrintf (", ");
736100966Siwasaki            NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
737100966Siwasaki
738100966Siwasaki            switch (Op->Common.AmlOpcode)
739100966Siwasaki            {
740100966Siwasaki            case AML_BANK_FIELD_OP:
741100966Siwasaki
742167802Sjkim                /* Namestring - Bank Name */
743100966Siwasaki
744100966Siwasaki                NextOp = AcpiPsGetDepthNext (NULL, NextOp);
745100966Siwasaki                AcpiDmNamestring (NextOp->Common.Value.Name);
746100966Siwasaki                NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
747100966Siwasaki                AcpiOsPrintf (", ");
748100966Siwasaki
749167802Sjkim                /*
750167802Sjkim                 * Bank Value. This is a TermArg in the middle of the parameter
751167802Sjkim                 * list, must handle it here.
752167802Sjkim                 *
753306536Sjkim                 * Disassemble the TermArg parse tree. ACPI_PARSEOP_PARAMETER_LIST
754167802Sjkim                 * eliminates newline in the output.
755167802Sjkim                 */
756167802Sjkim                NextOp = NextOp->Common.Next;
757100966Siwasaki
758306536Sjkim                Info->Flags = ACPI_PARSEOP_PARAMETER_LIST;
759237412Sjkim                AcpiDmWalkParseTree (NextOp, AcpiDmDescendingOp,
760237412Sjkim                    AcpiDmAscendingOp, Info);
761167802Sjkim                Info->Flags = 0;
762167802Sjkim                Info->Level = Level;
763167802Sjkim
764100966Siwasaki                NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
765100966Siwasaki                AcpiOsPrintf (", ");
766100966Siwasaki                break;
767100966Siwasaki
768100966Siwasaki            case AML_INDEX_FIELD_OP:
769100966Siwasaki
770167802Sjkim                /* Namestring - Data Name */
771100966Siwasaki
772100966Siwasaki                NextOp = AcpiPsGetDepthNext (NULL, NextOp);
773100966Siwasaki                AcpiDmNamestring (NextOp->Common.Value.Name);
774100966Siwasaki                AcpiOsPrintf (", ");
775100966Siwasaki                NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
776100966Siwasaki                break;
777100966Siwasaki
778100966Siwasaki            default:
779100966Siwasaki
780100966Siwasaki                break;
781100966Siwasaki            }
782100966Siwasaki
783100966Siwasaki            AcpiDmFieldFlags (NextOp);
784100966Siwasaki            break;
785100966Siwasaki
786100966Siwasaki        case AML_BUFFER_OP:
787100966Siwasaki
788100966Siwasaki            /* The next op is the size parameter */
789100966Siwasaki
790100966Siwasaki            NextOp = AcpiPsGetDepthNext (NULL, Op);
791100966Siwasaki            if (!NextOp)
792100966Siwasaki            {
793100966Siwasaki                /* Single-step support */
794100966Siwasaki
795100966Siwasaki                return (AE_OK);
796100966Siwasaki            }
797100966Siwasaki
798100966Siwasaki            if (Op->Common.DisasmOpcode == ACPI_DASM_RESOURCE)
799100966Siwasaki            {
800100966Siwasaki                /*
801237412Sjkim                 * We have a resource list. Don't need to output
802237412Sjkim                 * the buffer size Op. Open up a new block
803100966Siwasaki                 */
804100966Siwasaki                NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
805100966Siwasaki                NextOp = NextOp->Common.Next;
806237412Sjkim                AcpiOsPrintf (")");
807237412Sjkim
808237412Sjkim                /* Emit description comment for Name() with a predefined ACPI name */
809237412Sjkim
810237412Sjkim                AcpiDmPredefinedDescription (Op->Asl.Parent);
811237412Sjkim
812237412Sjkim                AcpiOsPrintf ("\n");
813100966Siwasaki                AcpiDmIndent (Info->Level);
814100966Siwasaki                AcpiOsPrintf ("{\n");
815100966Siwasaki                return (AE_OK);
816100966Siwasaki            }
817100966Siwasaki
818100966Siwasaki            /* Normal Buffer, mark size as in the parameter list */
819100966Siwasaki
820306536Sjkim            NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMETER_LIST;
821100966Siwasaki            return (AE_OK);
822100966Siwasaki
823306536Sjkim        case AML_IF_OP:
824100966Siwasaki        case AML_VAR_PACKAGE_OP:
825100966Siwasaki        case AML_WHILE_OP:
826100966Siwasaki
827100966Siwasaki            /* The next op is the size or predicate parameter */
828100966Siwasaki
829100966Siwasaki            NextOp = AcpiPsGetDepthNext (NULL, Op);
830100966Siwasaki            if (NextOp)
831100966Siwasaki            {
832306536Sjkim                NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMETER_LIST;
833100966Siwasaki            }
834100966Siwasaki            return (AE_OK);
835100966Siwasaki
836100966Siwasaki        case AML_PACKAGE_OP:
837100966Siwasaki
838237412Sjkim            /* The next op is the size parameter */
839100966Siwasaki
840100966Siwasaki            NextOp = AcpiPsGetDepthNext (NULL, Op);
841100966Siwasaki            if (NextOp)
842100966Siwasaki            {
843306536Sjkim                NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMETER_LIST;
844100966Siwasaki            }
845100966Siwasaki            return (AE_OK);
846100966Siwasaki
847100966Siwasaki        case AML_MATCH_OP:
848100966Siwasaki
849100966Siwasaki            AcpiDmMatchOp (Op);
850100966Siwasaki            break;
851100966Siwasaki
852100966Siwasaki        default:
853100966Siwasaki
854100966Siwasaki            break;
855100966Siwasaki        }
856100966Siwasaki
857100966Siwasaki        if (AcpiDmBlockType (Op) & BLOCK_BRACE)
858100966Siwasaki        {
859100966Siwasaki            AcpiOsPrintf ("\n");
860100966Siwasaki            AcpiDmIndent (Level);
861100966Siwasaki            AcpiOsPrintf ("{\n");
862100966Siwasaki        }
863100966Siwasaki    }
864100966Siwasaki
865100966Siwasaki    return (AE_OK);
866100966Siwasaki}
867100966Siwasaki
868100966Siwasaki
869100966Siwasaki/*******************************************************************************
870100966Siwasaki *
871100966Siwasaki * FUNCTION:    AcpiDmAscendingOp
872100966Siwasaki *
873100966Siwasaki * PARAMETERS:  ASL_WALK_CALLBACK
874100966Siwasaki *
875100966Siwasaki * RETURN:      Status
876100966Siwasaki *
877100966Siwasaki * DESCRIPTION: Second visitation of a parse object, during ascent of parse
878241973Sjkim *              tree. Close out any parameter lists and complete the opcode.
879100966Siwasaki *
880100966Siwasaki ******************************************************************************/
881100966Siwasaki
882151937Sjkimstatic ACPI_STATUS
883100966SiwasakiAcpiDmAscendingOp (
884100966Siwasaki    ACPI_PARSE_OBJECT       *Op,
885100966Siwasaki    UINT32                  Level,
886100966Siwasaki    void                    *Context)
887100966Siwasaki{
888100966Siwasaki    ACPI_OP_WALK_INFO       *Info = Context;
889237412Sjkim    ACPI_PARSE_OBJECT       *ParentOp;
890100966Siwasaki
891100966Siwasaki
892100966Siwasaki    if (Op->Common.DisasmFlags & ACPI_PARSEOP_IGNORE)
893100966Siwasaki    {
894100966Siwasaki        /* Ignore this op -- it was handled elsewhere */
895100966Siwasaki
896100966Siwasaki        return (AE_OK);
897100966Siwasaki    }
898100966Siwasaki
899100966Siwasaki    if ((Level == 0) && (Op->Common.AmlOpcode == AML_SCOPE_OP))
900100966Siwasaki    {
901100966Siwasaki        /* Indicates the end of the current descriptor block (table) */
902100966Siwasaki
903100966Siwasaki        AcpiOsPrintf ("}\n\n");
904100966Siwasaki        return (AE_OK);
905100966Siwasaki    }
906100966Siwasaki
907100966Siwasaki    switch (AcpiDmBlockType (Op))
908100966Siwasaki    {
909100966Siwasaki    case BLOCK_PAREN:
910100966Siwasaki
911281075Sdim        /* Completed an op that has arguments, add closing paren if needed */
912100966Siwasaki
913281075Sdim        AcpiDmCloseOperator (Op);
914100966Siwasaki
915237412Sjkim        if (Op->Common.AmlOpcode == AML_NAME_OP)
916237412Sjkim        {
917237412Sjkim            /* Emit description comment for Name() with a predefined ACPI name */
918237412Sjkim
919237412Sjkim            AcpiDmPredefinedDescription (Op);
920237412Sjkim        }
921237412Sjkim        else
922237412Sjkim        {
923237412Sjkim            /* For Create* operators, attempt to emit resource tag description */
924237412Sjkim
925237412Sjkim            AcpiDmFieldPredefinedDescription (Op);
926237412Sjkim        }
927237412Sjkim
928281075Sdim        /* Decode Notify() values */
929281075Sdim
930281075Sdim        if (Op->Common.AmlOpcode == AML_NOTIFY_OP)
931281075Sdim        {
932281075Sdim            AcpiDmNotifyDescription (Op);
933281075Sdim        }
934281075Sdim
935281075Sdim        AcpiDmDisplayTargetPathname (Op);
936281075Sdim
937100966Siwasaki        /* Could be a nested operator, check if comma required */
938100966Siwasaki
939100966Siwasaki        if (!AcpiDmCommaIfListMember (Op))
940100966Siwasaki        {
941100966Siwasaki            if ((AcpiDmBlockType (Op->Common.Parent) & BLOCK_BRACE) &&
942306536Sjkim                 (!(Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMETER_LIST)) &&
943306536Sjkim                 (Op->Common.AmlOpcode != AML_INT_BYTELIST_OP))
944100966Siwasaki            {
945151937Sjkim                /*
946151937Sjkim                 * This is a first-level element of a term list
947151937Sjkim                 * start a new line
948151937Sjkim                 */
949306536Sjkim                if (!(Info->Flags & ACPI_PARSEOP_PARAMETER_LIST))
950167802Sjkim                {
951167802Sjkim                    AcpiOsPrintf ("\n");
952167802Sjkim                }
953100966Siwasaki            }
954100966Siwasaki        }
955100966Siwasaki        break;
956100966Siwasaki
957100966Siwasaki    case BLOCK_BRACE:
958100966Siwasaki    case (BLOCK_BRACE | BLOCK_PAREN):
959100966Siwasaki
960100966Siwasaki        /* Completed an op that has a term list, add closing brace */
961100966Siwasaki
962100966Siwasaki        if (Op->Common.DisasmFlags & ACPI_PARSEOP_EMPTY_TERMLIST)
963100966Siwasaki        {
964100966Siwasaki            AcpiOsPrintf ("}");
965100966Siwasaki        }
966100966Siwasaki        else
967100966Siwasaki        {
968100966Siwasaki            AcpiDmIndent (Level);
969100966Siwasaki            AcpiOsPrintf ("}");
970100966Siwasaki        }
971100966Siwasaki
972100966Siwasaki        AcpiDmCommaIfListMember (Op);
973100966Siwasaki
974100966Siwasaki        if (AcpiDmBlockType (Op->Common.Parent) != BLOCK_PAREN)
975100966Siwasaki        {
976100966Siwasaki            AcpiOsPrintf ("\n");
977100966Siwasaki            if (!(Op->Common.DisasmFlags & ACPI_PARSEOP_EMPTY_TERMLIST))
978100966Siwasaki            {
979100966Siwasaki                if ((Op->Common.AmlOpcode == AML_IF_OP)  &&
980100966Siwasaki                    (Op->Common.Next) &&
981100966Siwasaki                    (Op->Common.Next->Common.AmlOpcode == AML_ELSE_OP))
982100966Siwasaki                {
983100966Siwasaki                    break;
984100966Siwasaki                }
985100966Siwasaki
986100966Siwasaki                if ((AcpiDmBlockType (Op->Common.Parent) & BLOCK_BRACE) &&
987100966Siwasaki                    (!Op->Common.Next))
988100966Siwasaki                {
989100966Siwasaki                    break;
990100966Siwasaki                }
991100966Siwasaki                AcpiOsPrintf ("\n");
992100966Siwasaki            }
993100966Siwasaki        }
994100966Siwasaki        break;
995100966Siwasaki
996100966Siwasaki    case BLOCK_NONE:
997100966Siwasaki    default:
998100966Siwasaki
999100966Siwasaki        /* Could be a nested operator, check if comma required */
1000100966Siwasaki
1001100966Siwasaki        if (!AcpiDmCommaIfListMember (Op))
1002100966Siwasaki        {
1003100966Siwasaki            if ((AcpiDmBlockType (Op->Common.Parent) & BLOCK_BRACE) &&
1004306536Sjkim                 (!(Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMETER_LIST)) &&
1005306536Sjkim                 (Op->Common.AmlOpcode != AML_INT_BYTELIST_OP))
1006100966Siwasaki            {
1007151937Sjkim                /*
1008151937Sjkim                 * This is a first-level element of a term list
1009151937Sjkim                 * start a new line
1010151937Sjkim                 */
1011100966Siwasaki                AcpiOsPrintf ("\n");
1012100966Siwasaki            }
1013100966Siwasaki        }
1014100966Siwasaki        else if (Op->Common.Parent)
1015100966Siwasaki        {
1016100966Siwasaki            switch (Op->Common.Parent->Common.AmlOpcode)
1017100966Siwasaki            {
1018100966Siwasaki            case AML_PACKAGE_OP:
1019100966Siwasaki            case AML_VAR_PACKAGE_OP:
1020100966Siwasaki
1021306536Sjkim                if (!(Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMETER_LIST))
1022100966Siwasaki                {
1023100966Siwasaki                    AcpiOsPrintf ("\n");
1024100966Siwasaki                }
1025100966Siwasaki                break;
1026100966Siwasaki
1027100966Siwasaki            default:
1028100966Siwasaki
1029100966Siwasaki                break;
1030100966Siwasaki            }
1031100966Siwasaki        }
1032100966Siwasaki        break;
1033100966Siwasaki    }
1034100966Siwasaki
1035306536Sjkim    if (Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMETER_LIST)
1036100966Siwasaki    {
1037100966Siwasaki        if ((Op->Common.Next) &&
1038306536Sjkim            (Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_PARAMETER_LIST))
1039100966Siwasaki        {
1040100966Siwasaki            return (AE_OK);
1041100966Siwasaki        }
1042100966Siwasaki
1043100966Siwasaki        /*
1044281075Sdim         * The parent Op is guaranteed to be valid because of the flag
1045306536Sjkim         * ACPI_PARSEOP_PARAMETER_LIST -- which means that this op is part of
1046281075Sdim         * a parameter list and thus has a valid parent.
1047281075Sdim         */
1048281075Sdim        ParentOp = Op->Common.Parent;
1049281075Sdim
1050281075Sdim        /*
1051100966Siwasaki         * Just completed a parameter node for something like "Buffer (param)".
1052100966Siwasaki         * Close the paren and open up the term list block with a brace
1053100966Siwasaki         */
1054100966Siwasaki        if (Op->Common.Next)
1055100966Siwasaki        {
1056237412Sjkim            AcpiOsPrintf (")");
1057237412Sjkim
1058281075Sdim            /*
1059281075Sdim             * Emit a description comment for a Name() operator that is a
1060281075Sdim             * predefined ACPI name. Must check the grandparent.
1061281075Sdim             */
1062281075Sdim            ParentOp = ParentOp->Common.Parent;
1063281075Sdim            if (ParentOp &&
1064281075Sdim                (ParentOp->Asl.AmlOpcode == AML_NAME_OP))
1065237412Sjkim            {
1066281075Sdim                AcpiDmPredefinedDescription (ParentOp);
1067237412Sjkim            }
1068281075Sdim
1069237412Sjkim            AcpiOsPrintf ("\n");
1070100966Siwasaki            AcpiDmIndent (Level - 1);
1071100966Siwasaki            AcpiOsPrintf ("{\n");
1072100966Siwasaki        }
1073100966Siwasaki        else
1074100966Siwasaki        {
1075281075Sdim            ParentOp->Common.DisasmFlags |= ACPI_PARSEOP_EMPTY_TERMLIST;
1076100966Siwasaki            AcpiOsPrintf (") {");
1077100966Siwasaki        }
1078100966Siwasaki    }
1079100966Siwasaki
1080100966Siwasaki    if ((Op->Common.AmlOpcode == AML_NAME_OP) ||
1081100966Siwasaki        (Op->Common.AmlOpcode == AML_RETURN_OP))
1082100966Siwasaki    {
1083100966Siwasaki        Info->Level++;
1084100966Siwasaki    }
1085281075Sdim
1086281075Sdim    /*
1087281075Sdim     * For ASL+, check for and emit a C-style symbol. If valid, the
1088281075Sdim     * symbol string has been deferred until after the first operand
1089281075Sdim     */
1090281075Sdim    if (AcpiGbl_CstyleDisassembly)
1091281075Sdim    {
1092281075Sdim        if (Op->Asl.OperatorSymbol)
1093281075Sdim        {
1094281075Sdim            AcpiOsPrintf ("%s", Op->Asl.OperatorSymbol);
1095281075Sdim            Op->Asl.OperatorSymbol = NULL;
1096281075Sdim        }
1097281075Sdim    }
1098281075Sdim
1099100966Siwasaki    return (AE_OK);
1100100966Siwasaki}
1101