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