dmopcode.c revision 151937
1234949Sbapt/*******************************************************************************
2234949Sbapt *
3234949Sbapt * Module Name: dmopcode - AML disassembler, specific AML opcodes
4234949Sbapt *              $Revision: 1.90 $
5234949Sbapt *
6234949Sbapt ******************************************************************************/
7234949Sbapt
8234949Sbapt/******************************************************************************
9234949Sbapt *
10234949Sbapt * 1. Copyright Notice
11234949Sbapt *
12234949Sbapt * Some or all of this work - Copyright (c) 1999 - 2005, Intel Corp.
13234949Sbapt * All rights reserved.
14234949Sbapt *
15234949Sbapt * 2. License
16234949Sbapt *
17234949Sbapt * 2.1. This is your license from Intel Corp. under its intellectual property
18234949Sbapt * rights.  You may have additional license terms from the party that provided
19234949Sbapt * you this software, covering your right to use that party's intellectual
20234949Sbapt * property rights.
21234949Sbapt *
22234949Sbapt * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
23234949Sbapt * copy of the source code appearing in this file ("Covered Code") an
24234949Sbapt * irrevocable, perpetual, worldwide license under Intel's copyrights in the
25234949Sbapt * base code distributed originally by Intel ("Original Intel Code") to copy,
26234949Sbapt * make derivatives, distribute, use and display any portion of the Covered
27234949Sbapt * Code in any form, with the right to sublicense such rights; and
28234949Sbapt *
29234949Sbapt * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
30234949Sbapt * license (with the right to sublicense), under only those claims of Intel
31234949Sbapt * patents that are infringed by the Original Intel Code, to make, use, sell,
32234949Sbapt * offer to sell, and import the Covered Code and derivative works thereof
33234949Sbapt * solely to the minimum extent necessary to exercise the above copyright
34234949Sbapt * license, and in no event shall the patent license extend to any additions
35234949Sbapt * to or modifications of the Original Intel Code.  No other license or right
36234949Sbapt * is granted directly or by implication, estoppel or otherwise;
37234949Sbapt *
38234949Sbapt * The above copyright and patent license is granted only if the following
39234949Sbapt * conditions are met:
40234949Sbapt *
41234949Sbapt * 3. Conditions
42234949Sbapt *
43234949Sbapt * 3.1. Redistribution of Source with Rights to Further Distribute Source.
44234949Sbapt * Redistribution of source code of any substantial portion of the Covered
45234949Sbapt * Code or modification with rights to further distribute source must include
46234949Sbapt * the above Copyright Notice, the above License, this list of Conditions,
47234949Sbapt * and the following Disclaimer and Export Compliance provision.  In addition,
48234949Sbapt * Licensee must cause all Covered Code to which Licensee contributes to
49234949Sbapt * contain a file documenting the changes Licensee made to create that Covered
50234949Sbapt * Code and the date of any change.  Licensee must include in that file the
51234949Sbapt * documentation of any changes made by any predecessor Licensee.  Licensee
52234949Sbapt * must include a prominent statement that the modification is derived,
53234949Sbapt * directly or indirectly, from Original Intel Code.
54234949Sbapt *
55234949Sbapt * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
56234949Sbapt * Redistribution of source code of any substantial portion of the Covered
57234949Sbapt * Code or modification without rights to further distribute source must
58234949Sbapt * include the following Disclaimer and Export Compliance provision in the
59234949Sbapt * documentation and/or other materials provided with distribution.  In
60234949Sbapt * addition, Licensee may not authorize further sublicense of source of any
61234949Sbapt * portion of the Covered Code, and must include terms to the effect that the
62234949Sbapt * license from Licensee to its licensee is limited to the intellectual
63234949Sbapt * property embodied in the software Licensee provides to its licensee, and
64234949Sbapt * not to intellectual property embodied in modifications its licensee may
65234949Sbapt * make.
66234949Sbapt *
67234949Sbapt * 3.3. Redistribution of Executable. Redistribution in executable form of any
68234949Sbapt * substantial portion of the Covered Code or modification must reproduce the
69234949Sbapt * above Copyright Notice, and the following Disclaimer and Export Compliance
70234949Sbapt * provision in the documentation and/or other materials provided with the
71234949Sbapt * distribution.
72234949Sbapt *
73234949Sbapt * 3.4. Intel retains all right, title, and interest in and to the Original
74234949Sbapt * Intel Code.
75234949Sbapt *
76234949Sbapt * 3.5. Neither the name Intel nor any other trademark owned or controlled by
77234949Sbapt * Intel shall be used in advertising or otherwise to promote the sale, use or
78234949Sbapt * other dealings in products derived from or relating to the Covered Code
79234949Sbapt * without prior written authorization from Intel.
80234949Sbapt *
81234949Sbapt * 4. Disclaimer and Export Compliance
82234949Sbapt *
83234949Sbapt * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
84234949Sbapt * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
85234949Sbapt * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
86234949Sbapt * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
87234949Sbapt * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
88234949Sbapt * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
89234949Sbapt * PARTICULAR PURPOSE.
90234949Sbapt *
91234949Sbapt * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
92234949Sbapt * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
93234949Sbapt * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
94234949Sbapt * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
95234949Sbapt * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
96234949Sbapt * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
97234949Sbapt * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
98234949Sbapt * LIMITED REMEDY.
99234949Sbapt *
100234949Sbapt * 4.3. Licensee shall not export, either directly or indirectly, any of this
101234949Sbapt * software or system incorporating such software without first obtaining any
102234949Sbapt * required license or other approval from the U. S. Department of Commerce or
103234949Sbapt * any other agency or department of the United States Government.  In the
104234949Sbapt * event Licensee exports any such software from the United States or
105234949Sbapt * re-exports any such software from a foreign destination, Licensee shall
106234949Sbapt * ensure that the distribution and export/re-export of the software is in
107234949Sbapt * compliance with all laws, regulations, orders, or other restrictions of the
108234949Sbapt * U.S. Export Administration Regulations. Licensee agrees that neither it nor
109234949Sbapt * any of its subsidiaries will export/re-export any technical data, process,
110234949Sbapt * software, or service, directly or indirectly, to any country for which the
111234949Sbapt * United States government or any agency thereof requires an export license,
112234949Sbapt * other governmental approval, or letter of assurance, without first obtaining
113 * such license, approval or letter.
114 *
115 *****************************************************************************/
116
117#include <contrib/dev/acpica/acpi.h>
118#include <contrib/dev/acpica/acparser.h>
119#include <contrib/dev/acpica/amlcode.h>
120#include <contrib/dev/acpica/acdisasm.h>
121
122#ifdef ACPI_DISASSEMBLER
123
124#define _COMPONENT          ACPI_CA_DEBUGGER
125        ACPI_MODULE_NAME    ("dmopcode")
126
127/* Local prototypes */
128
129static void
130AcpiDmMatchKeyword (
131    ACPI_PARSE_OBJECT       *Op);
132
133
134/*******************************************************************************
135 *
136 * FUNCTION:    AcpiDmMethodFlags
137 *
138 * PARAMETERS:  Op              - Method Object to be examined
139 *
140 * RETURN:      None
141 *
142 * DESCRIPTION: Decode control method flags
143 *
144 ******************************************************************************/
145
146void
147AcpiDmMethodFlags (
148    ACPI_PARSE_OBJECT       *Op)
149{
150    UINT32                  Flags;
151    UINT32                  Args;
152
153
154    /* The next Op contains the flags */
155
156    Op = AcpiPsGetDepthNext (NULL, Op);
157    Flags = (UINT8) Op->Common.Value.Integer;
158    Args = Flags & 0x07;
159
160    /* Mark the Op as completed */
161
162    Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
163
164    /* 1) Method argument count */
165
166    AcpiOsPrintf (", %d, ", Args);
167
168    /* 2) Serialize rule */
169
170    if (!(Flags & 0x08))
171    {
172        AcpiOsPrintf ("Not");
173    }
174
175    AcpiOsPrintf ("Serialized");
176
177    /* 3) SyncLevel */
178
179    if (Flags & 0xF0)
180    {
181        AcpiOsPrintf (", %d", Flags >> 4);
182    }
183}
184
185
186/*******************************************************************************
187 *
188 * FUNCTION:    AcpiDmFieldFlags
189 *
190 * PARAMETERS:  Op              - Field Object to be examined
191 *
192 * RETURN:      None
193 *
194 * DESCRIPTION: Decode Field definition flags
195 *
196 ******************************************************************************/
197
198void
199AcpiDmFieldFlags (
200    ACPI_PARSE_OBJECT       *Op)
201{
202    UINT32                  Flags;
203
204
205    /* The next Op contains the flags */
206
207    Op = AcpiPsGetDepthNext (NULL, Op);
208    Flags = (UINT8) Op->Common.Value.Integer;
209
210    /* Mark the Op as completed */
211
212    Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
213
214    AcpiOsPrintf ("%s, ", AcpiGbl_AccessTypes [Flags & 0x0F]);
215    AcpiOsPrintf ("%s, ", AcpiGbl_LockRule [(Flags & 0x10) >> 4]);
216    AcpiOsPrintf ("%s)",  AcpiGbl_UpdateRules [(Flags & 0x60) >> 5]);
217}
218
219
220/*******************************************************************************
221 *
222 * FUNCTION:    AcpiDmAddressSpace
223 *
224 * PARAMETERS:  SpaceId         - ID to be translated
225 *
226 * RETURN:      None
227 *
228 * DESCRIPTION: Decode a SpaceId to an AddressSpaceKeyword
229 *
230 ******************************************************************************/
231
232void
233AcpiDmAddressSpace (
234    UINT8                   SpaceId)
235{
236
237    if (SpaceId >= ACPI_NUM_PREDEFINED_REGIONS)
238    {
239        if (SpaceId == 0x7F)
240        {
241            AcpiOsPrintf ("FFixedHW, ");
242        }
243        else
244        {
245            AcpiOsPrintf ("0x%.2X, ", SpaceId);
246        }
247    }
248    else
249    {
250        AcpiOsPrintf ("%s, ", AcpiGbl_RegionTypes [SpaceId]);
251    }
252}
253
254
255/*******************************************************************************
256 *
257 * FUNCTION:    AcpiDmRegionFlags
258 *
259 * PARAMETERS:  Op              - Object to be examined
260 *
261 * RETURN:      None
262 *
263 * DESCRIPTION: Decode OperationRegion flags
264 *
265 ******************************************************************************/
266
267void
268AcpiDmRegionFlags (
269    ACPI_PARSE_OBJECT       *Op)
270{
271
272
273    /* The next Op contains the SpaceId */
274
275    Op = AcpiPsGetDepthNext (NULL, Op);
276
277    /* Mark the Op as completed */
278
279    Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
280
281    AcpiOsPrintf (", ");
282    AcpiDmAddressSpace ((UINT8) Op->Common.Value.Integer);
283}
284
285
286/*******************************************************************************
287 *
288 * FUNCTION:    AcpiDmMatchOp
289 *
290 * PARAMETERS:  Op              - Match Object to be examined
291 *
292 * RETURN:      None
293 *
294 * DESCRIPTION: Decode Match opcode operands
295 *
296 ******************************************************************************/
297
298void
299AcpiDmMatchOp (
300    ACPI_PARSE_OBJECT       *Op)
301{
302    ACPI_PARSE_OBJECT       *NextOp;
303
304
305    NextOp = AcpiPsGetDepthNext (NULL, Op);
306    NextOp = NextOp->Common.Next;
307
308    if (!NextOp)
309    {
310        /* Handle partial tree during single-step */
311
312        return;
313    }
314
315    /* Mark the two nodes that contain the encoding for the match keywords */
316
317    NextOp->Common.DisasmOpcode = ACPI_DASM_MATCHOP;
318
319    NextOp = NextOp->Common.Next;
320    NextOp = NextOp->Common.Next;
321    NextOp->Common.DisasmOpcode = ACPI_DASM_MATCHOP;
322}
323
324
325/*******************************************************************************
326 *
327 * FUNCTION:    AcpiDmMatchKeyword
328 *
329 * PARAMETERS:  Op              - Match Object to be examined
330 *
331 * RETURN:      None
332 *
333 * DESCRIPTION: Decode Match opcode operands
334 *
335 ******************************************************************************/
336
337static void
338AcpiDmMatchKeyword (
339    ACPI_PARSE_OBJECT       *Op)
340{
341
342
343    if (((UINT32) Op->Common.Value.Integer) >= ACPI_NUM_MATCH_OPS)
344    {
345        AcpiOsPrintf ("/* Unknown Match Keyword encoding */");
346    }
347    else
348    {
349        AcpiOsPrintf ("%s", (char *)
350            AcpiGbl_MatchOps[(ACPI_SIZE) Op->Common.Value.Integer]);
351    }
352}
353
354
355/*******************************************************************************
356 *
357 * FUNCTION:    AcpiDmDisassembleOneOp
358 *
359 * PARAMETERS:  WalkState           - Current walk info
360 *              Info                - Parse tree walk info
361 *              Op                  - Op that is to be printed
362 *
363 * RETURN:      None
364 *
365 * DESCRIPTION: Disassemble a single AML opcode
366 *
367 ******************************************************************************/
368
369void
370AcpiDmDisassembleOneOp (
371    ACPI_WALK_STATE         *WalkState,
372    ACPI_OP_WALK_INFO       *Info,
373    ACPI_PARSE_OBJECT       *Op)
374{
375    const ACPI_OPCODE_INFO  *OpInfo = NULL;
376    UINT32                  Offset;
377    UINT32                  Length;
378
379
380    if (!Op)
381    {
382        AcpiOsPrintf ("<NULL OP PTR>");
383        return;
384    }
385
386    switch (Op->Common.DisasmOpcode)
387    {
388    case ACPI_DASM_MATCHOP:
389
390        AcpiDmMatchKeyword (Op);
391        return;
392
393    default:
394        break;
395    }
396
397    /* The op and arguments */
398
399    switch (Op->Common.AmlOpcode)
400    {
401    case AML_ZERO_OP:
402
403        AcpiOsPrintf ("Zero");
404        break;
405
406
407    case AML_ONE_OP:
408
409        AcpiOsPrintf ("One");
410        break;
411
412
413    case AML_ONES_OP:
414
415        AcpiOsPrintf ("Ones");
416        break;
417
418
419    case AML_REVISION_OP:
420
421        AcpiOsPrintf ("Revision");
422        break;
423
424
425    case AML_BYTE_OP:
426
427        AcpiOsPrintf ("0x%2.2X", (UINT32) Op->Common.Value.Integer);
428        break;
429
430
431    case AML_WORD_OP:
432
433        if (Op->Common.DisasmOpcode == ACPI_DASM_EISAID)
434        {
435            AcpiDmEisaId ((UINT32) Op->Common.Value.Integer);
436        }
437        else
438        {
439            AcpiOsPrintf ("0x%4.4X", (UINT32) Op->Common.Value.Integer);
440        }
441        break;
442
443
444    case AML_DWORD_OP:
445
446        if (Op->Common.DisasmOpcode == ACPI_DASM_EISAID)
447        {
448            AcpiDmEisaId ((UINT32) Op->Common.Value.Integer);
449        }
450        else
451        {
452            AcpiOsPrintf ("0x%8.8X", (UINT32) Op->Common.Value.Integer);
453        }
454        break;
455
456
457    case AML_QWORD_OP:
458
459        AcpiOsPrintf ("0x%8.8X%8.8X", Op->Common.Value.Integer64.Hi,
460                                      Op->Common.Value.Integer64.Lo);
461        break;
462
463
464    case AML_STRING_OP:
465
466        AcpiUtPrintString (Op->Common.Value.String, ACPI_UINT8_MAX);
467        break;
468
469
470    case AML_BUFFER_OP:
471
472        /*
473         * Determine the type of buffer.  We can have one of the following:
474         *
475         * 1) ResourceTemplate containing Resource Descriptors.
476         * 2) Unicode String buffer
477         * 3) ASCII String buffer
478         * 4) Raw data buffer (if none of the above)
479         *
480         * Since there are no special AML opcodes to differentiate these
481         * types of buffers, we have to closely look at the data in the
482         * buffer to determine the type.
483         */
484        if (AcpiDmIsResourceTemplate (Op))
485        {
486            Op->Common.DisasmOpcode = ACPI_DASM_RESOURCE;
487            AcpiOsPrintf ("ResourceTemplate");
488        }
489        else if (AcpiDmIsUnicodeBuffer (Op))
490        {
491            Op->Common.DisasmOpcode = ACPI_DASM_UNICODE;
492            AcpiOsPrintf ("Unicode (");
493        }
494        else if (AcpiDmIsStringBuffer (Op))
495        {
496            Op->Common.DisasmOpcode = ACPI_DASM_STRING;
497            AcpiOsPrintf ("Buffer");
498        }
499        else
500        {
501            Op->Common.DisasmOpcode = ACPI_DASM_BUFFER;
502            AcpiOsPrintf ("Buffer");
503        }
504        break;
505
506
507    case AML_INT_STATICSTRING_OP:
508
509        if (Op->Common.Value.String)
510        {
511            AcpiOsPrintf ("%s", Op->Common.Value.String);
512        }
513        else
514        {
515            AcpiOsPrintf ("\"<NULL STATIC STRING PTR>\"");
516        }
517        break;
518
519
520    case AML_INT_NAMEPATH_OP:
521
522        AcpiDmNamestring (Op->Common.Value.Name);
523        break;
524
525
526    case AML_INT_NAMEDFIELD_OP:
527
528        Length = AcpiDmDumpName ((char *) &Op->Named.Name);
529        AcpiOsPrintf (",%*.s  %d", (int) (5 - Length), " ",
530            (UINT32) Op->Common.Value.Integer);
531        AcpiDmCommaIfFieldMember (Op);
532
533        Info->BitOffset += (UINT32) Op->Common.Value.Integer;
534        break;
535
536
537    case AML_INT_RESERVEDFIELD_OP:
538
539        /* Offset() -- Must account for previous offsets */
540
541        Offset = (UINT32) Op->Common.Value.Integer;
542        Info->BitOffset += Offset;
543
544        if (Info->BitOffset % 8 == 0)
545        {
546            AcpiOsPrintf ("Offset (0x%.2X)", ACPI_DIV_8 (Info->BitOffset));
547        }
548        else
549        {
550            AcpiOsPrintf ("    ,   %d", Offset);
551        }
552
553        AcpiDmCommaIfFieldMember (Op);
554        break;
555
556
557    case AML_INT_ACCESSFIELD_OP:
558
559        AcpiOsPrintf ("AccessAs (%s, ",
560            AcpiGbl_AccessTypes [(UINT32) Op->Common.Value.Integer >> 8]);
561
562        AcpiDmDecodeAttribute ((UINT8) Op->Common.Value.Integer);
563        AcpiOsPrintf (")");
564        AcpiDmCommaIfFieldMember (Op);
565        break;
566
567
568    case AML_INT_BYTELIST_OP:
569
570        AcpiDmByteList (Info, Op);
571        break;
572
573
574    case AML_INT_METHODCALL_OP:
575
576        OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
577        Op = AcpiPsGetDepthNext (NULL, Op);
578        Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
579
580        AcpiDmNamestring (Op->Common.Value.Name);
581        break;
582
583
584    default:
585
586        /* Just get the opcode name and print it */
587
588        OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
589        AcpiOsPrintf ("%s", OpInfo->Name);
590
591
592#ifdef ACPI_DEBUGGER
593
594        if ((Op->Common.AmlOpcode == AML_INT_RETURN_VALUE_OP) &&
595            (WalkState) &&
596            (WalkState->Results) &&
597            (WalkState->Results->Results.NumResults))
598        {
599            AcpiDmDecodeInternalObject (
600                WalkState->Results->Results.ObjDesc [
601                    WalkState->Results->Results.NumResults-1]);
602        }
603#endif
604        break;
605    }
606}
607
608#endif  /* ACPI_DISASSEMBLER */
609