Initial import of binutils 2.22 on the new vendor branch
[dragonfly.git] / sys / contrib / dev / acpica-unix / disassembler / dmobject.c
1 /*******************************************************************************
2  *
3  * Module Name: dmobject - ACPI object decode and display
4  *
5  ******************************************************************************/
6
7 /******************************************************************************
8  *
9  * 1. Copyright Notice
10  *
11  * Some or all of this work - Copyright (c) 1999 - 2011, Intel Corp.
12  * All rights reserved.
13  *
14  * 2. License
15  *
16  * 2.1. This is your license from Intel Corp. under its intellectual property
17  * rights.  You may have additional license terms from the party that provided
18  * you this software, covering your right to use that party's intellectual
19  * property rights.
20  *
21  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22  * copy of the source code appearing in this file ("Covered Code") an
23  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24  * base code distributed originally by Intel ("Original Intel Code") to copy,
25  * make derivatives, distribute, use and display any portion of the Covered
26  * Code in any form, with the right to sublicense such rights; and
27  *
28  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29  * license (with the right to sublicense), under only those claims of Intel
30  * patents that are infringed by the Original Intel Code, to make, use, sell,
31  * offer to sell, and import the Covered Code and derivative works thereof
32  * solely to the minimum extent necessary to exercise the above copyright
33  * license, and in no event shall the patent license extend to any additions
34  * to or modifications of the Original Intel Code.  No other license or right
35  * is granted directly or by implication, estoppel or otherwise;
36  *
37  * The above copyright and patent license is granted only if the following
38  * conditions are met:
39  *
40  * 3. Conditions
41  *
42  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43  * Redistribution of source code of any substantial portion of the Covered
44  * Code or modification with rights to further distribute source must include
45  * the above Copyright Notice, the above License, this list of Conditions,
46  * and the following Disclaimer and Export Compliance provision.  In addition,
47  * Licensee must cause all Covered Code to which Licensee contributes to
48  * contain a file documenting the changes Licensee made to create that Covered
49  * Code and the date of any change.  Licensee must include in that file the
50  * documentation of any changes made by any predecessor Licensee.  Licensee
51  * must include a prominent statement that the modification is derived,
52  * directly or indirectly, from Original Intel Code.
53  *
54  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55  * Redistribution of source code of any substantial portion of the Covered
56  * Code or modification without rights to further distribute source must
57  * include the following Disclaimer and Export Compliance provision in the
58  * documentation and/or other materials provided with distribution.  In
59  * addition, Licensee may not authorize further sublicense of source of any
60  * portion of the Covered Code, and must include terms to the effect that the
61  * license from Licensee to its licensee is limited to the intellectual
62  * property embodied in the software Licensee provides to its licensee, and
63  * not to intellectual property embodied in modifications its licensee may
64  * make.
65  *
66  * 3.3. Redistribution of Executable. Redistribution in executable form of any
67  * substantial portion of the Covered Code or modification must reproduce the
68  * above Copyright Notice, and the following Disclaimer and Export Compliance
69  * provision in the documentation and/or other materials provided with the
70  * distribution.
71  *
72  * 3.4. Intel retains all right, title, and interest in and to the Original
73  * Intel Code.
74  *
75  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76  * Intel shall be used in advertising or otherwise to promote the sale, use or
77  * other dealings in products derived from or relating to the Covered Code
78  * without prior written authorization from Intel.
79  *
80  * 4. Disclaimer and Export Compliance
81  *
82  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83  * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
85  * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
86  * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
87  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88  * PARTICULAR PURPOSE.
89  *
90  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
96  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97  * LIMITED REMEDY.
98  *
99  * 4.3. Licensee shall not export, either directly or indirectly, any of this
100  * software or system incorporating such software without first obtaining any
101  * required license or other approval from the U. S. Department of Commerce or
102  * any other agency or department of the United States Government.  In the
103  * event Licensee exports any such software from the United States or
104  * re-exports any such software from a foreign destination, Licensee shall
105  * ensure that the distribution and export/re-export of the software is in
106  * compliance with all laws, regulations, orders, or other restrictions of the
107  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108  * any of its subsidiaries will export/re-export any technical data, process,
109  * software, or service, directly or indirectly, to any country for which the
110  * United States government or any agency thereof requires an export license,
111  * other governmental approval, or letter of assurance, without first obtaining
112  * such license, approval or letter.
113  *
114  *****************************************************************************/
115
116
117 #include "acpi.h"
118 #include "accommon.h"
119 #include "acnamesp.h"
120 #include "acdisasm.h"
121
122
123 #ifdef ACPI_DISASSEMBLER
124
125 #define _COMPONENT          ACPI_CA_DEBUGGER
126         ACPI_MODULE_NAME    ("dmnames")
127
128 /* Local prototypes */
129
130 static void
131 AcpiDmDecodeNode (
132     ACPI_NAMESPACE_NODE     *Node);
133
134
135 /*******************************************************************************
136  *
137  * FUNCTION:    AcpiDmDumpMethodInfo
138  *
139  * PARAMETERS:  Status          - Method execution status
140  *              WalkState       - Current state of the parse tree walk
141  *              Op              - Executing parse op
142  *
143  * RETURN:      None
144  *
145  * DESCRIPTION: Called when a method has been aborted because of an error.
146  *              Dumps the method execution stack, and the method locals/args,
147  *              and disassembles the AML opcode that failed.
148  *
149  ******************************************************************************/
150
151 void
152 AcpiDmDumpMethodInfo (
153     ACPI_STATUS             Status,
154     ACPI_WALK_STATE         *WalkState,
155     ACPI_PARSE_OBJECT       *Op)
156 {
157     ACPI_PARSE_OBJECT       *Next;
158     ACPI_THREAD_STATE       *Thread;
159     ACPI_WALK_STATE         *NextWalkState;
160     ACPI_NAMESPACE_NODE     *PreviousMethod = NULL;
161
162
163     /* Ignore control codes, they are not errors */
164
165     if ((Status & AE_CODE_MASK) == AE_CODE_CONTROL)
166     {
167         return;
168     }
169
170     /* We may be executing a deferred opcode */
171
172     if (WalkState->DeferredNode)
173     {
174         AcpiOsPrintf ("Executing subtree for Buffer/Package/Region\n");
175         return;
176     }
177
178     /*
179      * If there is no Thread, we are not actually executing a method.
180      * This can happen when the iASL compiler calls the interpreter
181      * to perform constant folding.
182      */
183     Thread = WalkState->Thread;
184     if (!Thread)
185     {
186         return;
187     }
188
189     /* Display exception and method name */
190
191     AcpiOsPrintf ("\n**** Exception %s during execution of method ",
192         AcpiFormatException (Status));
193     AcpiNsPrintNodePathname (WalkState->MethodNode, NULL);
194
195     /* Display stack of executing methods */
196
197     AcpiOsPrintf ("\n\nMethod Execution Stack:\n");
198     NextWalkState = Thread->WalkStateList;
199
200     /* Walk list of linked walk states */
201
202     while (NextWalkState)
203     {
204         AcpiOsPrintf ("    Method [%4.4s] executing: ",
205                 AcpiUtGetNodeName (NextWalkState->MethodNode));
206
207         /* First method is the currently executing method */
208
209         if (NextWalkState == WalkState)
210         {
211             if (Op)
212             {
213                 /* Display currently executing ASL statement */
214
215                 Next = Op->Common.Next;
216                 Op->Common.Next = NULL;
217
218                 AcpiDmDisassemble (NextWalkState, Op, ACPI_UINT32_MAX);
219                 Op->Common.Next = Next;
220             }
221         }
222         else
223         {
224             /*
225              * This method has called another method
226              * NOTE: the method call parse subtree is already deleted at this
227              * point, so we cannot disassemble the method invocation.
228              */
229             AcpiOsPrintf ("Call to method ");
230             AcpiNsPrintNodePathname (PreviousMethod, NULL);
231         }
232
233         PreviousMethod = NextWalkState->MethodNode;
234         NextWalkState = NextWalkState->Next;
235         AcpiOsPrintf ("\n");
236     }
237
238     /* Display the method locals and arguments */
239
240     AcpiOsPrintf ("\n");
241     AcpiDmDisplayLocals (WalkState);
242     AcpiOsPrintf ("\n");
243     AcpiDmDisplayArguments (WalkState);
244     AcpiOsPrintf ("\n");
245 }
246
247
248 /*******************************************************************************
249  *
250  * FUNCTION:    AcpiDmDecodeInternalObject
251  *
252  * PARAMETERS:  ObjDesc         - Object to be displayed
253  *
254  * RETURN:      None
255  *
256  * DESCRIPTION: Short display of an internal object.  Numbers/Strings/Buffers.
257  *
258  ******************************************************************************/
259
260 void
261 AcpiDmDecodeInternalObject (
262     ACPI_OPERAND_OBJECT     *ObjDesc)
263 {
264     UINT32                  i;
265
266
267     if (!ObjDesc)
268     {
269         AcpiOsPrintf (" Uninitialized");
270         return;
271     }
272
273     if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND)
274     {
275         AcpiOsPrintf (" %p [%s]", ObjDesc, AcpiUtGetDescriptorName (ObjDesc));
276         return;
277     }
278
279     AcpiOsPrintf (" %s", AcpiUtGetObjectTypeName (ObjDesc));
280
281     switch (ObjDesc->Common.Type)
282     {
283     case ACPI_TYPE_INTEGER:
284
285         AcpiOsPrintf (" %8.8X%8.8X",
286                 ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
287         break;
288
289
290     case ACPI_TYPE_STRING:
291
292         AcpiOsPrintf ("(%u) \"%.24s",
293                 ObjDesc->String.Length, ObjDesc->String.Pointer);
294
295         if (ObjDesc->String.Length > 24)
296         {
297             AcpiOsPrintf ("...");
298         }
299         else
300         {
301             AcpiOsPrintf ("\"");
302         }
303         break;
304
305
306     case ACPI_TYPE_BUFFER:
307
308         AcpiOsPrintf ("(%u)", ObjDesc->Buffer.Length);
309         for (i = 0; (i < 8) && (i < ObjDesc->Buffer.Length); i++)
310         {
311             AcpiOsPrintf (" %2.2X", ObjDesc->Buffer.Pointer[i]);
312         }
313         break;
314
315
316     default:
317
318         AcpiOsPrintf (" %p", ObjDesc);
319         break;
320     }
321 }
322
323
324 /*******************************************************************************
325  *
326  * FUNCTION:    AcpiDmDecodeNode
327  *
328  * PARAMETERS:  Node        - Object to be displayed
329  *
330  * RETURN:      None
331  *
332  * DESCRIPTION: Short display of a namespace node
333  *
334  ******************************************************************************/
335
336 static void
337 AcpiDmDecodeNode (
338     ACPI_NAMESPACE_NODE     *Node)
339 {
340
341     AcpiOsPrintf ("<Node>            Name %4.4s",
342             AcpiUtGetNodeName (Node));
343
344     if (Node->Flags & ANOBJ_METHOD_ARG)
345     {
346         AcpiOsPrintf (" [Method Arg]");
347     }
348     if (Node->Flags & ANOBJ_METHOD_LOCAL)
349     {
350         AcpiOsPrintf (" [Method Local]");
351     }
352
353     switch (Node->Type)
354     {
355     /* These types have no attached object */
356
357     case ACPI_TYPE_DEVICE:
358         AcpiOsPrintf (" Device");
359         break;
360
361     case ACPI_TYPE_THERMAL:
362         AcpiOsPrintf (" Thermal Zone");
363         break;
364
365     default:
366         AcpiDmDecodeInternalObject (AcpiNsGetAttachedObject (Node));
367         break;
368     }
369 }
370
371
372 /*******************************************************************************
373  *
374  * FUNCTION:    AcpiDmDisplayInternalObject
375  *
376  * PARAMETERS:  ObjDesc         - Object to be displayed
377  *              WalkState       - Current walk state
378  *
379  * RETURN:      None
380  *
381  * DESCRIPTION: Short display of an internal object
382  *
383  ******************************************************************************/
384
385 void
386 AcpiDmDisplayInternalObject (
387     ACPI_OPERAND_OBJECT     *ObjDesc,
388     ACPI_WALK_STATE         *WalkState)
389 {
390     UINT8                   Type;
391
392
393     AcpiOsPrintf ("%p ", ObjDesc);
394
395     if (!ObjDesc)
396     {
397         AcpiOsPrintf ("<Null Object>\n");
398         return;
399     }
400
401     /* Decode the object type */
402
403     switch (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc))
404     {
405     case ACPI_DESC_TYPE_PARSER:
406
407         AcpiOsPrintf ("<Parser>  ");
408         break;
409
410
411     case ACPI_DESC_TYPE_NAMED:
412
413         AcpiDmDecodeNode ((ACPI_NAMESPACE_NODE *) ObjDesc);
414         break;
415
416
417     case ACPI_DESC_TYPE_OPERAND:
418
419         Type = ObjDesc->Common.Type;
420         if (Type > ACPI_TYPE_LOCAL_MAX)
421         {
422             AcpiOsPrintf (" Type %X [Invalid Type]", (UINT32) Type);
423             return;
424         }
425
426         /* Decode the ACPI object type */
427
428         switch (ObjDesc->Common.Type)
429         {
430         case ACPI_TYPE_LOCAL_REFERENCE:
431
432             AcpiOsPrintf ("[%s] ", AcpiUtGetReferenceName (ObjDesc));
433
434             /* Decode the refererence */
435
436             switch (ObjDesc->Reference.Class)
437             {
438             case ACPI_REFCLASS_LOCAL:
439
440                 AcpiOsPrintf ("%X ", ObjDesc->Reference.Value);
441                 if (WalkState)
442                 {
443                     ObjDesc = WalkState->LocalVariables
444                                 [ObjDesc->Reference.Value].Object;
445                     AcpiOsPrintf ("%p", ObjDesc);
446                     AcpiDmDecodeInternalObject (ObjDesc);
447                 }
448                 break;
449
450
451             case ACPI_REFCLASS_ARG:
452
453                 AcpiOsPrintf ("%X ", ObjDesc->Reference.Value);
454                 if (WalkState)
455                 {
456                     ObjDesc = WalkState->Arguments
457                                 [ObjDesc->Reference.Value].Object;
458                     AcpiOsPrintf ("%p", ObjDesc);
459                     AcpiDmDecodeInternalObject (ObjDesc);
460                 }
461                 break;
462
463
464             case ACPI_REFCLASS_INDEX:
465
466                 switch (ObjDesc->Reference.TargetType)
467                 {
468                 case ACPI_TYPE_BUFFER_FIELD:
469
470                     AcpiOsPrintf ("%p", ObjDesc->Reference.Object);
471                     AcpiDmDecodeInternalObject (ObjDesc->Reference.Object);
472                     break;
473
474                 case ACPI_TYPE_PACKAGE:
475
476                     AcpiOsPrintf ("%p", ObjDesc->Reference.Where);
477                     if (!ObjDesc->Reference.Where)
478                     {
479                         AcpiOsPrintf (" Uninitialized WHERE pointer");
480                     }
481                     else
482                     {
483                         AcpiDmDecodeInternalObject (
484                             *(ObjDesc->Reference.Where));
485                     }
486                     break;
487
488                 default:
489
490                     AcpiOsPrintf ("Unknown index target type");
491                     break;
492                 }
493                 break;
494
495
496             case ACPI_REFCLASS_REFOF:
497
498                 if (!ObjDesc->Reference.Object)
499                 {
500                     AcpiOsPrintf ("Uninitialized reference subobject pointer");
501                     break;
502                 }
503
504                 /* Reference can be to a Node or an Operand object */
505
506                 switch (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc->Reference.Object))
507                 {
508                 case ACPI_DESC_TYPE_NAMED:
509                     AcpiDmDecodeNode (ObjDesc->Reference.Object);
510                     break;
511
512                 case ACPI_DESC_TYPE_OPERAND:
513                     AcpiDmDecodeInternalObject (ObjDesc->Reference.Object);
514                     break;
515
516                 default:
517                     break;
518                 }
519                 break;
520
521
522             case ACPI_REFCLASS_NAME:
523
524                 AcpiDmDecodeNode (ObjDesc->Reference.Node);
525                 break;
526
527
528             case ACPI_REFCLASS_DEBUG:
529             case ACPI_REFCLASS_TABLE:
530
531                 AcpiOsPrintf ("\n");
532                 break;
533
534
535             default:    /* Unknown reference class */
536
537                 AcpiOsPrintf ("%2.2X\n", ObjDesc->Reference.Class);
538                 break;
539             }
540             break;
541
542
543         default:
544
545             AcpiOsPrintf ("<Obj>            ");
546             AcpiDmDecodeInternalObject (ObjDesc);
547             break;
548         }
549         break;
550
551
552     default:
553
554         AcpiOsPrintf ("<Not a valid ACPI Object Descriptor> [%s]",
555             AcpiUtGetDescriptorName (ObjDesc));
556         break;
557     }
558
559     AcpiOsPrintf ("\n");
560 }
561
562
563 /*******************************************************************************
564  *
565  * FUNCTION:    AcpiDmDisplayLocals
566  *
567  * PARAMETERS:  WalkState       - State for current method
568  *
569  * RETURN:      None
570  *
571  * DESCRIPTION: Display all locals for the currently running control method
572  *
573  ******************************************************************************/
574
575 void
576 AcpiDmDisplayLocals (
577     ACPI_WALK_STATE         *WalkState)
578 {
579     UINT32                  i;
580     ACPI_OPERAND_OBJECT     *ObjDesc;
581     ACPI_NAMESPACE_NODE     *Node;
582
583
584     ObjDesc = WalkState->MethodDesc;
585     Node    = WalkState->MethodNode;
586     if (!Node)
587     {
588         AcpiOsPrintf (
589             "No method node (Executing subtree for buffer or opregion)\n");
590         return;
591     }
592
593     if (Node->Type != ACPI_TYPE_METHOD)
594     {
595         AcpiOsPrintf ("Executing subtree for Buffer/Package/Region\n");
596         return;
597     }
598
599     AcpiOsPrintf ("Local Variables for method [%4.4s]:\n",
600             AcpiUtGetNodeName (Node));
601
602     for (i = 0; i < ACPI_METHOD_NUM_LOCALS; i++)
603     {
604         ObjDesc = WalkState->LocalVariables[i].Object;
605         AcpiOsPrintf ("    Local%X: ", i);
606         AcpiDmDisplayInternalObject (ObjDesc, WalkState);
607     }
608 }
609
610
611 /*******************************************************************************
612  *
613  * FUNCTION:    AcpiDmDisplayArguments
614  *
615  * PARAMETERS:  WalkState       - State for current method
616  *
617  * RETURN:      None
618  *
619  * DESCRIPTION: Display all arguments for the currently running control method
620  *
621  ******************************************************************************/
622
623 void
624 AcpiDmDisplayArguments (
625     ACPI_WALK_STATE         *WalkState)
626 {
627     UINT32                  i;
628     ACPI_OPERAND_OBJECT     *ObjDesc;
629     ACPI_NAMESPACE_NODE     *Node;
630
631
632     ObjDesc = WalkState->MethodDesc;
633     Node    = WalkState->MethodNode;
634     if (!Node)
635     {
636         AcpiOsPrintf (
637             "No method node (Executing subtree for buffer or opregion)\n");
638         return;
639     }
640
641     if (Node->Type != ACPI_TYPE_METHOD)
642     {
643         AcpiOsPrintf ("Executing subtree for Buffer/Package/Region\n");
644         return;
645     }
646
647     AcpiOsPrintf (
648         "Arguments for Method [%4.4s]:  (%X arguments defined, max concurrency = %X)\n",
649         AcpiUtGetNodeName (Node), ObjDesc->Method.ParamCount, ObjDesc->Method.SyncLevel);
650
651     for (i = 0; i < ACPI_METHOD_NUM_ARGS; i++)
652     {
653         ObjDesc = WalkState->Arguments[i].Object;
654         AcpiOsPrintf ("    Arg%u:   ", i);
655         AcpiDmDisplayInternalObject (ObjDesc, WalkState);
656     }
657 }
658
659 #endif
660
661