dmopcode.c revision 237412
1100966Siwasaki/*******************************************************************************
2100966Siwasaki *
3100966Siwasaki * Module Name: dmopcode - AML disassembler, specific AML opcodes
4100966Siwasaki *
5100966Siwasaki ******************************************************************************/
6100966Siwasaki
7217365Sjkim/*
8229989Sjkim * Copyright (C) 2000 - 2012, 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/acdisasm.h>
49237412Sjkim#include <contrib/dev/acpica/include/acnamesp.h>
50100966Siwasaki
51100966Siwasaki#ifdef ACPI_DISASSEMBLER
52100966Siwasaki
53102550Siwasaki#define _COMPONENT          ACPI_CA_DEBUGGER
54100966Siwasaki        ACPI_MODULE_NAME    ("dmopcode")
55100966Siwasaki
56151937Sjkim/* Local prototypes */
57100966Siwasaki
58151937Sjkimstatic void
59151937SjkimAcpiDmMatchKeyword (
60151937Sjkim    ACPI_PARSE_OBJECT       *Op);
61151937Sjkim
62151937Sjkim
63100966Siwasaki/*******************************************************************************
64100966Siwasaki *
65237412Sjkim * FUNCTION:    AcpiDmPredefinedDescription
66237412Sjkim *
67237412Sjkim * PARAMETERS:  Op              - Name() parse object
68237412Sjkim *
69237412Sjkim * RETURN:      None
70237412Sjkim *
71237412Sjkim * DESCRIPTION: Emit a description comment for a predefined ACPI name.
72237412Sjkim *              Used for iASL compiler only.
73237412Sjkim *
74237412Sjkim ******************************************************************************/
75237412Sjkim
76237412Sjkimvoid
77237412SjkimAcpiDmPredefinedDescription (
78237412Sjkim    ACPI_PARSE_OBJECT       *Op)
79237412Sjkim{
80237412Sjkim#ifdef ACPI_ASL_COMPILER
81237412Sjkim    const AH_PREDEFINED_NAME    *Info;
82237412Sjkim    char                        *NameString;
83237412Sjkim    int                         LastCharIsDigit;
84237412Sjkim    int                         LastCharsAreHex;
85237412Sjkim
86237412Sjkim
87237412Sjkim    if (!Op)
88237412Sjkim    {
89237412Sjkim        return;
90237412Sjkim    }
91237412Sjkim
92237412Sjkim    /* Ensure that the comment field is emitted only once */
93237412Sjkim
94237412Sjkim    if (Op->Common.DisasmFlags & ACPI_PARSEOP_PREDEF_CHECKED)
95237412Sjkim    {
96237412Sjkim        return;
97237412Sjkim    }
98237412Sjkim    Op->Common.DisasmFlags |= ACPI_PARSEOP_PREDEF_CHECKED;
99237412Sjkim
100237412Sjkim    /* Predefined name must start with an underscore */
101237412Sjkim
102237412Sjkim    NameString = ACPI_CAST_PTR (char, &Op->Named.Name);
103237412Sjkim    if (NameString[0] != '_')
104237412Sjkim    {
105237412Sjkim        return;
106237412Sjkim    }
107237412Sjkim
108237412Sjkim    /*
109237412Sjkim     * Check for the special ACPI names:
110237412Sjkim     * _ACd, _ALd, _EJd, _Exx, _Lxx, _Qxx, _Wxx, _T_a
111237412Sjkim     * (where d=decimal_digit, x=hex_digit, a=anything)
112237412Sjkim     *
113237412Sjkim     * Convert these to the generic name for table lookup.
114237412Sjkim     * Note: NameString is guaranteed to be upper case here.
115237412Sjkim     */
116237412Sjkim    LastCharIsDigit =
117237412Sjkim        (ACPI_IS_DIGIT (NameString[3]));    /* d */
118237412Sjkim    LastCharsAreHex =
119237412Sjkim        (ACPI_IS_XDIGIT (NameString[2]) &&  /* xx */
120237412Sjkim         ACPI_IS_XDIGIT (NameString[3]));
121237412Sjkim
122237412Sjkim    switch (NameString[1])
123237412Sjkim    {
124237412Sjkim    case 'A':
125237412Sjkim        if ((NameString[2] == 'C') && (LastCharIsDigit))
126237412Sjkim        {
127237412Sjkim            NameString = "_ACx";
128237412Sjkim        }
129237412Sjkim        else if ((NameString[2] == 'L') && (LastCharIsDigit))
130237412Sjkim        {
131237412Sjkim            NameString = "_ALx";
132237412Sjkim        }
133237412Sjkim        break;
134237412Sjkim
135237412Sjkim    case 'E':
136237412Sjkim        if ((NameString[2] == 'J') && (LastCharIsDigit))
137237412Sjkim        {
138237412Sjkim            NameString = "_EJx";
139237412Sjkim        }
140237412Sjkim        else if (LastCharsAreHex)
141237412Sjkim        {
142237412Sjkim            NameString = "_Exx";
143237412Sjkim        }
144237412Sjkim        break;
145237412Sjkim
146237412Sjkim    case 'L':
147237412Sjkim        if (LastCharsAreHex)
148237412Sjkim        {
149237412Sjkim            NameString = "_Lxx";
150237412Sjkim        }
151237412Sjkim        break;
152237412Sjkim
153237412Sjkim    case 'Q':
154237412Sjkim        if (LastCharsAreHex)
155237412Sjkim        {
156237412Sjkim            NameString = "_Qxx";
157237412Sjkim        }
158237412Sjkim        break;
159237412Sjkim
160237412Sjkim    case 'T':
161237412Sjkim        if (NameString[2] == '_')
162237412Sjkim        {
163237412Sjkim            NameString = "_T_x";
164237412Sjkim        }
165237412Sjkim        break;
166237412Sjkim
167237412Sjkim    case 'W':
168237412Sjkim        if (LastCharsAreHex)
169237412Sjkim        {
170237412Sjkim            NameString = "_Wxx";
171237412Sjkim        }
172237412Sjkim        break;
173237412Sjkim
174237412Sjkim    default:
175237412Sjkim        break;
176237412Sjkim    }
177237412Sjkim
178237412Sjkim    /* Match the name in the info table */
179237412Sjkim
180237412Sjkim    for (Info = AslPredefinedInfo; Info->Name; Info++)
181237412Sjkim    {
182237412Sjkim        if (ACPI_COMPARE_NAME (NameString, Info->Name))
183237412Sjkim        {
184237412Sjkim            AcpiOsPrintf ("  // %4.4s: %s",
185237412Sjkim                NameString, ACPI_CAST_PTR (char, Info->Description));
186237412Sjkim            return;
187237412Sjkim        }
188237412Sjkim    }
189237412Sjkim
190237412Sjkim#endif
191237412Sjkim    return;
192237412Sjkim}
193237412Sjkim
194237412Sjkim
195237412Sjkim/*******************************************************************************
196237412Sjkim *
197237412Sjkim * FUNCTION:    AcpiDmFieldPredefinedDescription
198237412Sjkim *
199237412Sjkim * PARAMETERS:  Op              - Parse object
200237412Sjkim *
201237412Sjkim * RETURN:      None
202237412Sjkim *
203237412Sjkim * DESCRIPTION: Emit a description comment for a resource descriptor tag
204237412Sjkim *              (which is a predefined ACPI name.) Used for iASL compiler only.
205237412Sjkim *
206237412Sjkim ******************************************************************************/
207237412Sjkim
208237412Sjkimvoid
209237412SjkimAcpiDmFieldPredefinedDescription (
210237412Sjkim    ACPI_PARSE_OBJECT       *Op)
211237412Sjkim{
212237412Sjkim#ifdef ACPI_ASL_COMPILER
213237412Sjkim    ACPI_PARSE_OBJECT       *IndexOp;
214237412Sjkim    char                    *Tag;
215237412Sjkim    const ACPI_OPCODE_INFO  *OpInfo;
216237412Sjkim    const AH_PREDEFINED_NAME *Info;
217237412Sjkim
218237412Sjkim
219237412Sjkim    if (!Op)
220237412Sjkim    {
221237412Sjkim        return;
222237412Sjkim    }
223237412Sjkim
224237412Sjkim    /* Ensure that the comment field is emitted only once */
225237412Sjkim
226237412Sjkim    if (Op->Common.DisasmFlags & ACPI_PARSEOP_PREDEF_CHECKED)
227237412Sjkim    {
228237412Sjkim        return;
229237412Sjkim    }
230237412Sjkim    Op->Common.DisasmFlags |= ACPI_PARSEOP_PREDEF_CHECKED;
231237412Sjkim
232237412Sjkim    /*
233237412Sjkim     * Op must be one of the Create* operators: CreateField, CreateBitField,
234237412Sjkim     * CreateByteField, CreateWordField, CreateDwordField, CreateQwordField
235237412Sjkim     */
236237412Sjkim    OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
237237412Sjkim    if (!(OpInfo->Flags & AML_CREATE))
238237412Sjkim    {
239237412Sjkim        return;
240237412Sjkim    }
241237412Sjkim
242237412Sjkim    /* Second argument is the Index argument */
243237412Sjkim
244237412Sjkim    IndexOp = Op->Common.Value.Arg;
245237412Sjkim    IndexOp = IndexOp->Common.Next;
246237412Sjkim
247237412Sjkim    /* Index argument must be a namepath */
248237412Sjkim
249237412Sjkim    if (IndexOp->Common.AmlOpcode != AML_INT_NAMEPATH_OP)
250237412Sjkim    {
251237412Sjkim        return;
252237412Sjkim    }
253237412Sjkim
254237412Sjkim    /* Major cheat: We previously put the Tag ptr in the Node field */
255237412Sjkim
256237412Sjkim    Tag = ACPI_CAST_PTR (char, IndexOp->Common.Node);
257237412Sjkim
258237412Sjkim    /* Match the name in the info table */
259237412Sjkim
260237412Sjkim    for (Info = AslPredefinedInfo; Info->Name; Info++)
261237412Sjkim    {
262237412Sjkim        if (ACPI_COMPARE_NAME (Tag, Info->Name))
263237412Sjkim        {
264237412Sjkim            AcpiOsPrintf ("  // %4.4s: %s", Tag,
265237412Sjkim                ACPI_CAST_PTR (char, Info->Description));
266237412Sjkim            return;
267237412Sjkim        }
268237412Sjkim    }
269237412Sjkim
270237412Sjkim#endif
271237412Sjkim    return;
272237412Sjkim}
273237412Sjkim
274237412Sjkim
275237412Sjkim/*******************************************************************************
276237412Sjkim *
277100966Siwasaki * FUNCTION:    AcpiDmMethodFlags
278100966Siwasaki *
279100966Siwasaki * PARAMETERS:  Op              - Method Object to be examined
280100966Siwasaki *
281100966Siwasaki * RETURN:      None
282100966Siwasaki *
283100966Siwasaki * DESCRIPTION: Decode control method flags
284100966Siwasaki *
285100966Siwasaki ******************************************************************************/
286100966Siwasaki
287100966Siwasakivoid
288100966SiwasakiAcpiDmMethodFlags (
289100966Siwasaki    ACPI_PARSE_OBJECT       *Op)
290100966Siwasaki{
291100966Siwasaki    UINT32                  Flags;
292100966Siwasaki    UINT32                  Args;
293100966Siwasaki
294100966Siwasaki
295100966Siwasaki    /* The next Op contains the flags */
296100966Siwasaki
297100966Siwasaki    Op = AcpiPsGetDepthNext (NULL, Op);
298117521Snjl    Flags = (UINT8) Op->Common.Value.Integer;
299100966Siwasaki    Args = Flags & 0x07;
300100966Siwasaki
301100966Siwasaki    /* Mark the Op as completed */
302100966Siwasaki
303100966Siwasaki    Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
304100966Siwasaki
305100966Siwasaki    /* 1) Method argument count */
306100966Siwasaki
307209746Sjkim    AcpiOsPrintf (", %u, ", Args);
308100966Siwasaki
309100966Siwasaki    /* 2) Serialize rule */
310100966Siwasaki
311100966Siwasaki    if (!(Flags & 0x08))
312100966Siwasaki    {
313100966Siwasaki        AcpiOsPrintf ("Not");
314100966Siwasaki    }
315100966Siwasaki
316100966Siwasaki    AcpiOsPrintf ("Serialized");
317100966Siwasaki
318100966Siwasaki    /* 3) SyncLevel */
319100966Siwasaki
320100966Siwasaki    if (Flags & 0xF0)
321100966Siwasaki    {
322209746Sjkim        AcpiOsPrintf (", %u", Flags >> 4);
323100966Siwasaki    }
324100966Siwasaki}
325100966Siwasaki
326100966Siwasaki
327100966Siwasaki/*******************************************************************************
328100966Siwasaki *
329100966Siwasaki * FUNCTION:    AcpiDmFieldFlags
330100966Siwasaki *
331100966Siwasaki * PARAMETERS:  Op              - Field Object to be examined
332100966Siwasaki *
333100966Siwasaki * RETURN:      None
334100966Siwasaki *
335100966Siwasaki * DESCRIPTION: Decode Field definition flags
336100966Siwasaki *
337100966Siwasaki ******************************************************************************/
338100966Siwasaki
339100966Siwasakivoid
340100966SiwasakiAcpiDmFieldFlags (
341100966Siwasaki    ACPI_PARSE_OBJECT       *Op)
342100966Siwasaki{
343100966Siwasaki    UINT32                  Flags;
344100966Siwasaki
345100966Siwasaki
346167802Sjkim    Op = Op->Common.Next;
347117521Snjl    Flags = (UINT8) Op->Common.Value.Integer;
348100966Siwasaki
349100966Siwasaki    /* Mark the Op as completed */
350100966Siwasaki
351100966Siwasaki    Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
352100966Siwasaki
353167802Sjkim    AcpiOsPrintf ("%s, ", AcpiGbl_AccessTypes [Flags & 0x07]);
354100966Siwasaki    AcpiOsPrintf ("%s, ", AcpiGbl_LockRule [(Flags & 0x10) >> 4]);
355100966Siwasaki    AcpiOsPrintf ("%s)",  AcpiGbl_UpdateRules [(Flags & 0x60) >> 5]);
356100966Siwasaki}
357100966Siwasaki
358100966Siwasaki
359100966Siwasaki/*******************************************************************************
360100966Siwasaki *
361100966Siwasaki * FUNCTION:    AcpiDmAddressSpace
362100966Siwasaki *
363100966Siwasaki * PARAMETERS:  SpaceId         - ID to be translated
364100966Siwasaki *
365100966Siwasaki * RETURN:      None
366100966Siwasaki *
367100966Siwasaki * DESCRIPTION: Decode a SpaceId to an AddressSpaceKeyword
368100966Siwasaki *
369100966Siwasaki ******************************************************************************/
370100966Siwasaki
371100966Siwasakivoid
372100966SiwasakiAcpiDmAddressSpace (
373100966Siwasaki    UINT8                   SpaceId)
374100966Siwasaki{
375100966Siwasaki
376100966Siwasaki    if (SpaceId >= ACPI_NUM_PREDEFINED_REGIONS)
377100966Siwasaki    {
378100966Siwasaki        if (SpaceId == 0x7F)
379100966Siwasaki        {
380100966Siwasaki            AcpiOsPrintf ("FFixedHW, ");
381100966Siwasaki        }
382100966Siwasaki        else
383100966Siwasaki        {
384100966Siwasaki            AcpiOsPrintf ("0x%.2X, ", SpaceId);
385100966Siwasaki        }
386100966Siwasaki    }
387100966Siwasaki    else
388100966Siwasaki    {
389100966Siwasaki        AcpiOsPrintf ("%s, ", AcpiGbl_RegionTypes [SpaceId]);
390100966Siwasaki    }
391100966Siwasaki}
392100966Siwasaki
393100966Siwasaki
394100966Siwasaki/*******************************************************************************
395100966Siwasaki *
396100966Siwasaki * FUNCTION:    AcpiDmRegionFlags
397100966Siwasaki *
398100966Siwasaki * PARAMETERS:  Op              - Object to be examined
399100966Siwasaki *
400100966Siwasaki * RETURN:      None
401100966Siwasaki *
402100966Siwasaki * DESCRIPTION: Decode OperationRegion flags
403100966Siwasaki *
404100966Siwasaki ******************************************************************************/
405100966Siwasaki
406100966Siwasakivoid
407100966SiwasakiAcpiDmRegionFlags (
408100966Siwasaki    ACPI_PARSE_OBJECT       *Op)
409100966Siwasaki{
410100966Siwasaki
411100966Siwasaki
412100966Siwasaki    /* The next Op contains the SpaceId */
413100966Siwasaki
414100966Siwasaki    Op = AcpiPsGetDepthNext (NULL, Op);
415100966Siwasaki
416100966Siwasaki    /* Mark the Op as completed */
417100966Siwasaki
418100966Siwasaki    Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
419100966Siwasaki
420100966Siwasaki    AcpiOsPrintf (", ");
421117521Snjl    AcpiDmAddressSpace ((UINT8) Op->Common.Value.Integer);
422100966Siwasaki}
423100966Siwasaki
424100966Siwasaki
425100966Siwasaki/*******************************************************************************
426100966Siwasaki *
427100966Siwasaki * FUNCTION:    AcpiDmMatchOp
428100966Siwasaki *
429100966Siwasaki * PARAMETERS:  Op              - Match Object to be examined
430100966Siwasaki *
431100966Siwasaki * RETURN:      None
432100966Siwasaki *
433100966Siwasaki * DESCRIPTION: Decode Match opcode operands
434100966Siwasaki *
435100966Siwasaki ******************************************************************************/
436100966Siwasaki
437100966Siwasakivoid
438100966SiwasakiAcpiDmMatchOp (
439100966Siwasaki    ACPI_PARSE_OBJECT       *Op)
440100966Siwasaki{
441100966Siwasaki    ACPI_PARSE_OBJECT       *NextOp;
442100966Siwasaki
443100966Siwasaki
444100966Siwasaki    NextOp = AcpiPsGetDepthNext (NULL, Op);
445100966Siwasaki    NextOp = NextOp->Common.Next;
446100966Siwasaki
447100966Siwasaki    if (!NextOp)
448100966Siwasaki    {
449100966Siwasaki        /* Handle partial tree during single-step */
450100966Siwasaki
451100966Siwasaki        return;
452100966Siwasaki    }
453100966Siwasaki
454100966Siwasaki    /* Mark the two nodes that contain the encoding for the match keywords */
455100966Siwasaki
456100966Siwasaki    NextOp->Common.DisasmOpcode = ACPI_DASM_MATCHOP;
457100966Siwasaki
458100966Siwasaki    NextOp = NextOp->Common.Next;
459100966Siwasaki    NextOp = NextOp->Common.Next;
460100966Siwasaki    NextOp->Common.DisasmOpcode = ACPI_DASM_MATCHOP;
461100966Siwasaki}
462100966Siwasaki
463100966Siwasaki
464100966Siwasaki/*******************************************************************************
465100966Siwasaki *
466100966Siwasaki * FUNCTION:    AcpiDmMatchKeyword
467100966Siwasaki *
468100966Siwasaki * PARAMETERS:  Op              - Match Object to be examined
469100966Siwasaki *
470100966Siwasaki * RETURN:      None
471100966Siwasaki *
472100966Siwasaki * DESCRIPTION: Decode Match opcode operands
473100966Siwasaki *
474100966Siwasaki ******************************************************************************/
475100966Siwasaki
476151937Sjkimstatic void
477100966SiwasakiAcpiDmMatchKeyword (
478100966Siwasaki    ACPI_PARSE_OBJECT       *Op)
479100966Siwasaki{
480100966Siwasaki
481100966Siwasaki
482167802Sjkim    if (((UINT32) Op->Common.Value.Integer) > ACPI_MAX_MATCH_OPCODE)
483100966Siwasaki    {
484100966Siwasaki        AcpiOsPrintf ("/* Unknown Match Keyword encoding */");
485100966Siwasaki    }
486100966Siwasaki    else
487100966Siwasaki    {
488167802Sjkim        AcpiOsPrintf ("%s", ACPI_CAST_PTR (char,
489167802Sjkim            AcpiGbl_MatchOps[(ACPI_SIZE) Op->Common.Value.Integer]));
490100966Siwasaki    }
491100966Siwasaki}
492100966Siwasaki
493100966Siwasaki
494100966Siwasaki/*******************************************************************************
495100966Siwasaki *
496100966Siwasaki * FUNCTION:    AcpiDmDisassembleOneOp
497100966Siwasaki *
498100966Siwasaki * PARAMETERS:  WalkState           - Current walk info
499100966Siwasaki *              Info                - Parse tree walk info
500100966Siwasaki *              Op                  - Op that is to be printed
501100966Siwasaki *
502100966Siwasaki * RETURN:      None
503100966Siwasaki *
504100966Siwasaki * DESCRIPTION: Disassemble a single AML opcode
505100966Siwasaki *
506100966Siwasaki ******************************************************************************/
507100966Siwasaki
508100966Siwasakivoid
509100966SiwasakiAcpiDmDisassembleOneOp (
510100966Siwasaki    ACPI_WALK_STATE         *WalkState,
511100966Siwasaki    ACPI_OP_WALK_INFO       *Info,
512100966Siwasaki    ACPI_PARSE_OBJECT       *Op)
513100966Siwasaki{
514100966Siwasaki    const ACPI_OPCODE_INFO  *OpInfo = NULL;
515100966Siwasaki    UINT32                  Offset;
516100966Siwasaki    UINT32                  Length;
517167802Sjkim    ACPI_PARSE_OBJECT       *Child;
518167802Sjkim    ACPI_STATUS             Status;
519228110Sjkim    UINT8                   *Aml;
520100966Siwasaki
521100966Siwasaki
522100966Siwasaki    if (!Op)
523100966Siwasaki    {
524100966Siwasaki        AcpiOsPrintf ("<NULL OP PTR>");
525100966Siwasaki        return;
526100966Siwasaki    }
527100966Siwasaki
528100966Siwasaki    switch (Op->Common.DisasmOpcode)
529100966Siwasaki    {
530100966Siwasaki    case ACPI_DASM_MATCHOP:
531100966Siwasaki
532100966Siwasaki        AcpiDmMatchKeyword (Op);
533100966Siwasaki        return;
534100966Siwasaki
535167802Sjkim    case ACPI_DASM_LNOT_SUFFIX:
536167802Sjkim        switch (Op->Common.AmlOpcode)
537167802Sjkim        {
538167802Sjkim        case AML_LEQUAL_OP:
539167802Sjkim            AcpiOsPrintf ("LNotEqual");
540167802Sjkim            break;
541167802Sjkim
542167802Sjkim        case AML_LGREATER_OP:
543167802Sjkim            AcpiOsPrintf ("LLessEqual");
544167802Sjkim            break;
545167802Sjkim
546167802Sjkim        case AML_LLESS_OP:
547167802Sjkim            AcpiOsPrintf ("LGreaterEqual");
548167802Sjkim            break;
549193267Sjkim
550193267Sjkim        default:
551193267Sjkim            break;
552167802Sjkim        }
553167802Sjkim        Op->Common.DisasmOpcode = 0;
554167802Sjkim        Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
555167802Sjkim        return;
556167802Sjkim
557100966Siwasaki    default:
558100966Siwasaki        break;
559100966Siwasaki    }
560100966Siwasaki
561167802Sjkim
562167802Sjkim    OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
563167802Sjkim
564117521Snjl    /* The op and arguments */
565100966Siwasaki
566100966Siwasaki    switch (Op->Common.AmlOpcode)
567100966Siwasaki    {
568167802Sjkim    case AML_LNOT_OP:
569100966Siwasaki
570167802Sjkim        Child = Op->Common.Value.Arg;
571167802Sjkim        if ((Child->Common.AmlOpcode == AML_LEQUAL_OP) ||
572167802Sjkim            (Child->Common.AmlOpcode == AML_LGREATER_OP) ||
573167802Sjkim            (Child->Common.AmlOpcode == AML_LLESS_OP))
574167802Sjkim        {
575167802Sjkim            Child->Common.DisasmOpcode = ACPI_DASM_LNOT_SUFFIX;
576167802Sjkim            Op->Common.DisasmOpcode = ACPI_DASM_LNOT_PREFIX;
577167802Sjkim        }
578167802Sjkim        else
579167802Sjkim        {
580167802Sjkim            AcpiOsPrintf ("%s", OpInfo->Name);
581167802Sjkim        }
582100966Siwasaki        break;
583100966Siwasaki
584100966Siwasaki    case AML_BYTE_OP:
585100966Siwasaki
586117521Snjl        AcpiOsPrintf ("0x%2.2X", (UINT32) Op->Common.Value.Integer);
587100966Siwasaki        break;
588100966Siwasaki
589100966Siwasaki
590100966Siwasaki    case AML_WORD_OP:
591100966Siwasaki
592100966Siwasaki        if (Op->Common.DisasmOpcode == ACPI_DASM_EISAID)
593100966Siwasaki        {
594117521Snjl            AcpiDmEisaId ((UINT32) Op->Common.Value.Integer);
595100966Siwasaki        }
596100966Siwasaki        else
597100966Siwasaki        {
598117521Snjl            AcpiOsPrintf ("0x%4.4X", (UINT32) Op->Common.Value.Integer);
599100966Siwasaki        }
600100966Siwasaki        break;
601100966Siwasaki
602100966Siwasaki
603100966Siwasaki    case AML_DWORD_OP:
604100966Siwasaki
605100966Siwasaki        if (Op->Common.DisasmOpcode == ACPI_DASM_EISAID)
606100966Siwasaki        {
607117521Snjl            AcpiDmEisaId ((UINT32) Op->Common.Value.Integer);
608100966Siwasaki        }
609100966Siwasaki        else
610100966Siwasaki        {
611117521Snjl            AcpiOsPrintf ("0x%8.8X", (UINT32) Op->Common.Value.Integer);
612100966Siwasaki        }
613100966Siwasaki        break;
614100966Siwasaki
615100966Siwasaki
616100966Siwasaki    case AML_QWORD_OP:
617100966Siwasaki
618202771Sjkim        AcpiOsPrintf ("0x%8.8X%8.8X",
619202771Sjkim            ACPI_FORMAT_UINT64 (Op->Common.Value.Integer));
620100966Siwasaki        break;
621100966Siwasaki
622100966Siwasaki
623100966Siwasaki    case AML_STRING_OP:
624100966Siwasaki
625107325Siwasaki        AcpiUtPrintString (Op->Common.Value.String, ACPI_UINT8_MAX);
626100966Siwasaki        break;
627100966Siwasaki
628100966Siwasaki
629100966Siwasaki    case AML_BUFFER_OP:
630100966Siwasaki
631100966Siwasaki        /*
632100966Siwasaki         * Determine the type of buffer.  We can have one of the following:
633100966Siwasaki         *
634100966Siwasaki         * 1) ResourceTemplate containing Resource Descriptors.
635100966Siwasaki         * 2) Unicode String buffer
636100966Siwasaki         * 3) ASCII String buffer
637100966Siwasaki         * 4) Raw data buffer (if none of the above)
638100966Siwasaki         *
639100966Siwasaki         * Since there are no special AML opcodes to differentiate these
640100966Siwasaki         * types of buffers, we have to closely look at the data in the
641100966Siwasaki         * buffer to determine the type.
642100966Siwasaki         */
643228110Sjkim        if (!AcpiGbl_NoResourceDisassembly)
644100966Siwasaki        {
645228110Sjkim            Status = AcpiDmIsResourceTemplate (Op);
646228110Sjkim            if (ACPI_SUCCESS (Status))
647228110Sjkim            {
648228110Sjkim                Op->Common.DisasmOpcode = ACPI_DASM_RESOURCE;
649228110Sjkim                AcpiOsPrintf ("ResourceTemplate");
650228110Sjkim                break;
651228110Sjkim            }
652228110Sjkim            else if (Status == AE_AML_NO_RESOURCE_END_TAG)
653228110Sjkim            {
654228110Sjkim                AcpiOsPrintf ("/**** Is ResourceTemplate, but EndTag not at buffer end ****/ ");
655228110Sjkim            }
656100966Siwasaki        }
657167802Sjkim
658167802Sjkim        if (AcpiDmIsUnicodeBuffer (Op))
659167802Sjkim        {
660100966Siwasaki            Op->Common.DisasmOpcode = ACPI_DASM_UNICODE;
661100966Siwasaki            AcpiOsPrintf ("Unicode (");
662100966Siwasaki        }
663100966Siwasaki        else if (AcpiDmIsStringBuffer (Op))
664100966Siwasaki        {
665100966Siwasaki            Op->Common.DisasmOpcode = ACPI_DASM_STRING;
666100966Siwasaki            AcpiOsPrintf ("Buffer");
667100966Siwasaki        }
668100966Siwasaki        else
669100966Siwasaki        {
670100966Siwasaki            Op->Common.DisasmOpcode = ACPI_DASM_BUFFER;
671100966Siwasaki            AcpiOsPrintf ("Buffer");
672100966Siwasaki        }
673100966Siwasaki        break;
674100966Siwasaki
675100966Siwasaki
676100966Siwasaki    case AML_INT_STATICSTRING_OP:
677100966Siwasaki
678100966Siwasaki        if (Op->Common.Value.String)
679100966Siwasaki        {
680100966Siwasaki            AcpiOsPrintf ("%s", Op->Common.Value.String);
681100966Siwasaki        }
682100966Siwasaki        else
683100966Siwasaki        {
684100966Siwasaki            AcpiOsPrintf ("\"<NULL STATIC STRING PTR>\"");
685100966Siwasaki        }
686100966Siwasaki        break;
687100966Siwasaki
688100966Siwasaki
689100966Siwasaki    case AML_INT_NAMEPATH_OP:
690100966Siwasaki
691100966Siwasaki        AcpiDmNamestring (Op->Common.Value.Name);
692100966Siwasaki        break;
693100966Siwasaki
694100966Siwasaki
695100966Siwasaki    case AML_INT_NAMEDFIELD_OP:
696100966Siwasaki
697193267Sjkim        Length = AcpiDmDumpName (Op->Named.Name);
698209746Sjkim        AcpiOsPrintf (",%*.s  %u", (unsigned) (5 - Length), " ",
699151937Sjkim            (UINT32) Op->Common.Value.Integer);
700100966Siwasaki        AcpiDmCommaIfFieldMember (Op);
701100966Siwasaki
702117521Snjl        Info->BitOffset += (UINT32) Op->Common.Value.Integer;
703100966Siwasaki        break;
704100966Siwasaki
705100966Siwasaki
706100966Siwasaki    case AML_INT_RESERVEDFIELD_OP:
707100966Siwasaki
708100966Siwasaki        /* Offset() -- Must account for previous offsets */
709100966Siwasaki
710117521Snjl        Offset = (UINT32) Op->Common.Value.Integer;
711100966Siwasaki        Info->BitOffset += Offset;
712100966Siwasaki
713100966Siwasaki        if (Info->BitOffset % 8 == 0)
714100966Siwasaki        {
715228110Sjkim            AcpiOsPrintf ("Offset (0x%.2X)", ACPI_DIV_8 (Info->BitOffset));
716100966Siwasaki        }
717100966Siwasaki        else
718100966Siwasaki        {
719209746Sjkim            AcpiOsPrintf ("    ,   %u", Offset);
720100966Siwasaki        }
721100966Siwasaki
722100966Siwasaki        AcpiDmCommaIfFieldMember (Op);
723100966Siwasaki        break;
724100966Siwasaki
725100966Siwasaki
726100966Siwasaki    case AML_INT_ACCESSFIELD_OP:
727228110Sjkim    case AML_INT_EXTACCESSFIELD_OP:
728100966Siwasaki
729228110Sjkim        AcpiOsPrintf ("AccessAs (%s, ",
730228110Sjkim            AcpiGbl_AccessTypes [(UINT32) (Op->Common.Value.Integer & 0x7)]);
731100966Siwasaki
732228110Sjkim        AcpiDmDecodeAttribute ((UINT8) (Op->Common.Value.Integer >> 8));
733228110Sjkim
734228110Sjkim        if (Op->Common.AmlOpcode == AML_INT_EXTACCESSFIELD_OP)
735228110Sjkim        {
736228110Sjkim            AcpiOsPrintf (" (0x%2.2X)", (unsigned) ((Op->Common.Value.Integer >> 16) & 0xFF));
737228110Sjkim        }
738228110Sjkim
739107325Siwasaki        AcpiOsPrintf (")");
740100966Siwasaki        AcpiDmCommaIfFieldMember (Op);
741100966Siwasaki        break;
742100966Siwasaki
743100966Siwasaki
744228110Sjkim    case AML_INT_CONNECTION_OP:
745228110Sjkim
746228110Sjkim        /*
747228110Sjkim         * Two types of Connection() - one with a buffer object, the
748228110Sjkim         * other with a namestring that points to a buffer object.
749228110Sjkim         */
750228110Sjkim        AcpiOsPrintf ("Connection (");
751228110Sjkim        Child = Op->Common.Value.Arg;
752228110Sjkim
753228110Sjkim        if (Child->Common.AmlOpcode == AML_INT_BYTELIST_OP)
754228110Sjkim        {
755228110Sjkim            AcpiOsPrintf ("\n");
756228110Sjkim
757228110Sjkim            Aml = Child->Named.Data;
758228110Sjkim            Length = (UINT32) Child->Common.Value.Integer;
759228110Sjkim
760228110Sjkim            Info->Level += 1;
761228110Sjkim            Op->Common.DisasmOpcode = ACPI_DASM_RESOURCE;
762228110Sjkim            AcpiDmResourceTemplate (Info, Op->Common.Parent, Aml, Length);
763228110Sjkim
764228110Sjkim            Info->Level -= 1;
765228110Sjkim            AcpiDmIndent (Info->Level);
766228110Sjkim        }
767228110Sjkim        else
768228110Sjkim        {
769228110Sjkim            AcpiDmNamestring (Child->Common.Value.Name);
770228110Sjkim        }
771228110Sjkim
772228110Sjkim        AcpiOsPrintf (")");
773228110Sjkim        AcpiDmCommaIfFieldMember (Op);
774228110Sjkim        AcpiOsPrintf ("\n");
775228110Sjkim
776228110Sjkim        Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; /* for now, ignore in AcpiDmAscendingOp */
777228110Sjkim        Child->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
778228110Sjkim        break;
779228110Sjkim
780100966Siwasaki    case AML_INT_BYTELIST_OP:
781100966Siwasaki
782100966Siwasaki        AcpiDmByteList (Info, Op);
783100966Siwasaki        break;
784100966Siwasaki
785100966Siwasaki
786100966Siwasaki    case AML_INT_METHODCALL_OP:
787100966Siwasaki
788100966Siwasaki        Op = AcpiPsGetDepthNext (NULL, Op);
789100966Siwasaki        Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
790100966Siwasaki
791100966Siwasaki        AcpiDmNamestring (Op->Common.Value.Name);
792100966Siwasaki        break;
793100966Siwasaki
794100966Siwasaki
795100966Siwasaki    default:
796100966Siwasaki
797100966Siwasaki        /* Just get the opcode name and print it */
798100966Siwasaki
799100966Siwasaki        AcpiOsPrintf ("%s", OpInfo->Name);
800100966Siwasaki
801100966Siwasaki
802102550Siwasaki#ifdef ACPI_DEBUGGER
803100966Siwasaki
804100966Siwasaki        if ((Op->Common.AmlOpcode == AML_INT_RETURN_VALUE_OP) &&
805100966Siwasaki            (WalkState) &&
806100966Siwasaki            (WalkState->Results) &&
807167802Sjkim            (WalkState->ResultCount))
808100966Siwasaki        {
809117521Snjl            AcpiDmDecodeInternalObject (
810151937Sjkim                WalkState->Results->Results.ObjDesc [
811167802Sjkim                    (WalkState->ResultCount - 1) %
812167802Sjkim                        ACPI_RESULTS_FRAME_OBJ_NUM]);
813100966Siwasaki        }
814100966Siwasaki#endif
815167802Sjkim
816100966Siwasaki        break;
817100966Siwasaki    }
818100966Siwasaki}
819100966Siwasaki
820100966Siwasaki#endif  /* ACPI_DISASSEMBLER */
821