exdump.c revision 151937
1/******************************************************************************
2 *
3 * Module Name: exdump - Interpreter debug output routines
4 *              $Revision: 1.188 $
5 *
6 *****************************************************************************/
7
8/******************************************************************************
9 *
10 * 1. Copyright Notice
11 *
12 * Some or all of this work - Copyright (c) 1999 - 2005, 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#define __EXDUMP_C__
118
119#include <contrib/dev/acpica/acpi.h>
120#include <contrib/dev/acpica/acinterp.h>
121#include <contrib/dev/acpica/amlcode.h>
122#include <contrib/dev/acpica/acnamesp.h>
123#include <contrib/dev/acpica/acparser.h>
124
125#define _COMPONENT          ACPI_EXECUTER
126        ACPI_MODULE_NAME    ("exdump")
127
128/*
129 * The following routines are used for debug output only
130 */
131#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
132
133/* Local prototypes */
134
135static void
136AcpiExOutString (
137    char                    *Title,
138    char                    *Value);
139
140static void
141AcpiExOutPointer (
142    char                    *Title,
143    void                    *Value);
144
145static void
146AcpiExOutInteger (
147    char                    *Title,
148    UINT32                  Value);
149
150static void
151AcpiExOutAddress (
152    char                    *Title,
153    ACPI_PHYSICAL_ADDRESS   Value);
154
155static void
156AcpiExDumpReference (
157    ACPI_OPERAND_OBJECT     *ObjDesc);
158
159static void
160AcpiExDumpPackage (
161    ACPI_OPERAND_OBJECT     *ObjDesc,
162    UINT32                  Level,
163    UINT32                  Index);
164
165
166/*******************************************************************************
167 *
168 * FUNCTION:    AcpiExDumpOperand
169 *
170 * PARAMETERS:  *ObjDesc        - Pointer to entry to be dumped
171 *              Depth           - Current nesting depth
172 *
173 * RETURN:      None
174 *
175 * DESCRIPTION: Dump an operand object
176 *
177 ******************************************************************************/
178
179void
180AcpiExDumpOperand (
181    ACPI_OPERAND_OBJECT     *ObjDesc,
182    UINT32                  Depth)
183{
184    UINT32                  Length;
185    UINT32                  Index;
186
187
188    ACPI_FUNCTION_NAME ("ExDumpOperand")
189
190
191    if (!((ACPI_LV_EXEC & AcpiDbgLevel) && (_COMPONENT & AcpiDbgLayer)))
192    {
193        return;
194    }
195
196    if (!ObjDesc)
197    {
198        /* This could be a null element of a package */
199
200        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Null Object Descriptor\n"));
201        return;
202    }
203
204    if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED)
205    {
206        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p Namespace Node: ", ObjDesc));
207        ACPI_DUMP_ENTRY (ObjDesc, ACPI_LV_EXEC);
208        return;
209    }
210
211    if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND)
212    {
213        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
214            "%p is not a node or operand object: [%s]\n",
215            ObjDesc, AcpiUtGetDescriptorName (ObjDesc)));
216        ACPI_DUMP_BUFFER (ObjDesc, sizeof (ACPI_OPERAND_OBJECT));
217        return;
218    }
219
220    /* ObjDesc is a valid object */
221
222    if (Depth > 0)
223    {
224        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%*s[%u] %p ",
225            Depth, " ", Depth, ObjDesc));
226    }
227    else
228    {
229        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p ", ObjDesc));
230    }
231
232    /* Decode object type */
233
234    switch (ACPI_GET_OBJECT_TYPE (ObjDesc))
235    {
236    case ACPI_TYPE_LOCAL_REFERENCE:
237
238        switch (ObjDesc->Reference.Opcode)
239        {
240        case AML_DEBUG_OP:
241
242            AcpiOsPrintf ("Reference: Debug\n");
243            break;
244
245
246        case AML_NAME_OP:
247
248            ACPI_DUMP_PATHNAME (ObjDesc->Reference.Object,
249                "Reference: Name: ", ACPI_LV_INFO, _COMPONENT);
250            ACPI_DUMP_ENTRY (ObjDesc->Reference.Object, ACPI_LV_INFO);
251            break;
252
253
254        case AML_INDEX_OP:
255
256            AcpiOsPrintf ("Reference: Index %p\n",
257                ObjDesc->Reference.Object);
258            break;
259
260
261        case AML_REF_OF_OP:
262
263            AcpiOsPrintf ("Reference: (RefOf) %p\n",
264                ObjDesc->Reference.Object);
265            break;
266
267
268        case AML_ARG_OP:
269
270            AcpiOsPrintf ("Reference: Arg%d",
271                ObjDesc->Reference.Offset);
272
273            if (ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_INTEGER)
274            {
275                /* Value is an Integer */
276
277                AcpiOsPrintf (" value is [%8.8X%8.8x]",
278                    ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
279            }
280
281            AcpiOsPrintf ("\n");
282            break;
283
284
285        case AML_LOCAL_OP:
286
287            AcpiOsPrintf ("Reference: Local%d",
288                ObjDesc->Reference.Offset);
289
290            if (ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_INTEGER)
291            {
292
293                /* Value is an Integer */
294
295                AcpiOsPrintf (" value is [%8.8X%8.8x]",
296                    ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
297            }
298
299            AcpiOsPrintf ("\n");
300            break;
301
302
303        case AML_INT_NAMEPATH_OP:
304
305            AcpiOsPrintf ("Reference.Node->Name %X\n",
306                ObjDesc->Reference.Node->Name.Integer);
307            break;
308
309
310        default:
311
312            /* Unknown opcode */
313
314            AcpiOsPrintf ("Unknown Reference opcode=%X\n",
315                ObjDesc->Reference.Opcode);
316            break;
317
318        }
319        break;
320
321
322    case ACPI_TYPE_BUFFER:
323
324        AcpiOsPrintf ("Buffer len %X @ %p\n",
325            ObjDesc->Buffer.Length, ObjDesc->Buffer.Pointer);
326
327        Length = ObjDesc->Buffer.Length;
328        if (Length > 64)
329        {
330            Length = 64;
331        }
332
333        /* Debug only -- dump the buffer contents */
334
335        if (ObjDesc->Buffer.Pointer)
336        {
337            AcpiOsPrintf ("Buffer Contents: ");
338
339            for (Index = 0; Index < Length; Index++)
340            {
341                AcpiOsPrintf (" %02x", ObjDesc->Buffer.Pointer[Index]);
342            }
343            AcpiOsPrintf ("\n");
344        }
345        break;
346
347
348    case ACPI_TYPE_INTEGER:
349
350        AcpiOsPrintf ("Integer %8.8X%8.8X\n",
351            ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
352        break;
353
354
355    case ACPI_TYPE_PACKAGE:
356
357        AcpiOsPrintf ("Package [Len %X] ElementArray %p\n",
358            ObjDesc->Package.Count, ObjDesc->Package.Elements);
359
360        /*
361         * If elements exist, package element pointer is valid,
362         * and debug_level exceeds 1, dump package's elements.
363         */
364        if (ObjDesc->Package.Count &&
365            ObjDesc->Package.Elements &&
366            AcpiDbgLevel > 1)
367        {
368            for (Index = 0; Index < ObjDesc->Package.Count; Index++)
369            {
370                AcpiExDumpOperand (ObjDesc->Package.Elements[Index], Depth+1);
371            }
372        }
373        break;
374
375
376    case ACPI_TYPE_REGION:
377
378        AcpiOsPrintf ("Region %s (%X)",
379            AcpiUtGetRegionName (ObjDesc->Region.SpaceId),
380            ObjDesc->Region.SpaceId);
381
382        /*
383         * If the address and length have not been evaluated,
384         * don't print them.
385         */
386        if (!(ObjDesc->Region.Flags & AOPOBJ_DATA_VALID))
387        {
388            AcpiOsPrintf ("\n");
389        }
390        else
391        {
392            AcpiOsPrintf (" base %8.8X%8.8X Length %X\n",
393                ACPI_FORMAT_UINT64 (ObjDesc->Region.Address),
394                ObjDesc->Region.Length);
395        }
396        break;
397
398
399    case ACPI_TYPE_STRING:
400
401        AcpiOsPrintf ("String length %X @ %p ",
402            ObjDesc->String.Length,
403            ObjDesc->String.Pointer);
404
405        AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX);
406        AcpiOsPrintf ("\n");
407        break;
408
409
410    case ACPI_TYPE_LOCAL_BANK_FIELD:
411
412        AcpiOsPrintf ("BankField\n");
413        break;
414
415
416    case ACPI_TYPE_LOCAL_REGION_FIELD:
417
418        AcpiOsPrintf (
419            "RegionField: Bits=%X AccWidth=%X Lock=%X Update=%X at byte=%X bit=%X of below:\n",
420            ObjDesc->Field.BitLength,
421            ObjDesc->Field.AccessByteWidth,
422            ObjDesc->Field.FieldFlags & AML_FIELD_LOCK_RULE_MASK,
423            ObjDesc->Field.FieldFlags & AML_FIELD_UPDATE_RULE_MASK,
424            ObjDesc->Field.BaseByteOffset,
425            ObjDesc->Field.StartFieldBitOffset);
426
427        AcpiExDumpOperand (ObjDesc->Field.RegionObj, Depth+1);
428        break;
429
430
431    case ACPI_TYPE_LOCAL_INDEX_FIELD:
432
433        AcpiOsPrintf ("IndexField\n");
434        break;
435
436
437    case ACPI_TYPE_BUFFER_FIELD:
438
439        AcpiOsPrintf (
440            "BufferField: %X bits at byte %X bit %X of\n",
441            ObjDesc->BufferField.BitLength,
442            ObjDesc->BufferField.BaseByteOffset,
443            ObjDesc->BufferField.StartFieldBitOffset);
444
445        if (!ObjDesc->BufferField.BufferObj)
446        {
447            ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "*NULL*\n"));
448        }
449        else if (ACPI_GET_OBJECT_TYPE (ObjDesc->BufferField.BufferObj) !=
450                    ACPI_TYPE_BUFFER)
451        {
452            AcpiOsPrintf ("*not a Buffer*\n");
453        }
454        else
455        {
456            AcpiExDumpOperand (ObjDesc->BufferField.BufferObj, Depth+1);
457        }
458        break;
459
460
461    case ACPI_TYPE_EVENT:
462
463        AcpiOsPrintf ("Event\n");
464        break;
465
466
467    case ACPI_TYPE_METHOD:
468
469        AcpiOsPrintf ("Method(%X) @ %p:%X\n",
470            ObjDesc->Method.ParamCount,
471            ObjDesc->Method.AmlStart,
472            ObjDesc->Method.AmlLength);
473        break;
474
475
476    case ACPI_TYPE_MUTEX:
477
478        AcpiOsPrintf ("Mutex\n");
479        break;
480
481
482    case ACPI_TYPE_DEVICE:
483
484        AcpiOsPrintf ("Device\n");
485        break;
486
487
488    case ACPI_TYPE_POWER:
489
490        AcpiOsPrintf ("Power\n");
491        break;
492
493
494    case ACPI_TYPE_PROCESSOR:
495
496        AcpiOsPrintf ("Processor\n");
497        break;
498
499
500    case ACPI_TYPE_THERMAL:
501
502        AcpiOsPrintf ("Thermal\n");
503        break;
504
505
506    default:
507        /* Unknown Type */
508
509        AcpiOsPrintf ("Unknown Type %X\n", ACPI_GET_OBJECT_TYPE (ObjDesc));
510        break;
511    }
512
513    return;
514}
515
516
517/*******************************************************************************
518 *
519 * FUNCTION:    AcpiExDumpOperands
520 *
521 * PARAMETERS:  Operands            - Operand list
522 *              InterpreterMode     - Load or Exec
523 *              Ident               - Identification
524 *              NumLevels           - # of stack entries to dump above line
525 *              Note                - Output notation
526 *              ModuleName          - Caller's module name
527 *              LineNumber          - Caller's invocation line number
528 *
529 * DESCRIPTION: Dump the object stack
530 *
531 ******************************************************************************/
532
533void
534AcpiExDumpOperands (
535    ACPI_OPERAND_OBJECT     **Operands,
536    ACPI_INTERPRETER_MODE   InterpreterMode,
537    char                    *Ident,
538    UINT32                  NumLevels,
539    char                    *Note,
540    char                    *ModuleName,
541    UINT32                  LineNumber)
542{
543    ACPI_NATIVE_UINT        i;
544
545
546    ACPI_FUNCTION_NAME ("ExDumpOperands");
547
548
549    if (!Ident)
550    {
551        Ident = "?";
552    }
553
554    if (!Note)
555    {
556        Note = "?";
557    }
558
559    ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
560        "************* Operand Stack Contents (Opcode [%s], %d Operands)\n",
561        Ident, NumLevels));
562
563    if (NumLevels == 0)
564    {
565        NumLevels = 1;
566    }
567
568    /* Dump the operand stack starting at the top */
569
570    for (i = 0; NumLevels > 0; i--, NumLevels--)
571    {
572        AcpiExDumpOperand (Operands[i], 0);
573    }
574
575    ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
576        "************* Operand Stack dump from %s(%d), %s\n",
577        ModuleName, LineNumber, Note));
578    return;
579}
580
581
582/*******************************************************************************
583 *
584 * FUNCTION:    AcpiExOut* functions
585 *
586 * PARAMETERS:  Title               - Descriptive text
587 *              Value               - Value to be displayed
588 *
589 * DESCRIPTION: Object dump output formatting functions.  These functions
590 *              reduce the number of format strings required and keeps them
591 *              all in one place for easy modification.
592 *
593 ******************************************************************************/
594
595static void
596AcpiExOutString (
597    char                    *Title,
598    char                    *Value)
599{
600    AcpiOsPrintf ("%20s : %s\n", Title, Value);
601}
602
603static void
604AcpiExOutPointer (
605    char                    *Title,
606    void                    *Value)
607{
608    AcpiOsPrintf ("%20s : %p\n", Title, Value);
609}
610
611static void
612AcpiExOutInteger (
613    char                    *Title,
614    UINT32                  Value)
615{
616    AcpiOsPrintf ("%20s : %.2X\n", Title, Value);
617}
618
619static void
620AcpiExOutAddress (
621    char                    *Title,
622    ACPI_PHYSICAL_ADDRESS   Value)
623{
624
625#if ACPI_MACHINE_WIDTH == 16
626    AcpiOsPrintf ("%20s : %p\n", Title, Value);
627#else
628    AcpiOsPrintf ("%20s : %8.8X%8.8X\n", Title, ACPI_FORMAT_UINT64 (Value));
629#endif
630}
631
632
633/*******************************************************************************
634 *
635 * FUNCTION:    AcpiExDumpNode
636 *
637 * PARAMETERS:  *Node               - Descriptor to dump
638 *              Flags               - Force display if TRUE
639 *
640 * DESCRIPTION: Dumps the members of the given.Node
641 *
642 ******************************************************************************/
643
644void
645AcpiExDumpNode (
646    ACPI_NAMESPACE_NODE     *Node,
647    UINT32                  Flags)
648{
649
650    ACPI_FUNCTION_ENTRY ();
651
652
653    if (!Flags)
654    {
655        if (!((ACPI_LV_OBJECTS & AcpiDbgLevel) && (_COMPONENT & AcpiDbgLayer)))
656        {
657            return;
658        }
659    }
660
661    AcpiOsPrintf ("%20s : %4.4s\n",       "Name", AcpiUtGetNodeName (Node));
662    AcpiExOutString  ("Type",             AcpiUtGetTypeName (Node->Type));
663    AcpiExOutInteger ("Flags",            Node->Flags);
664    AcpiExOutInteger ("Owner Id",         Node->OwnerId);
665    AcpiExOutInteger ("Reference Count",  Node->ReferenceCount);
666    AcpiExOutPointer ("Attached Object",  AcpiNsGetAttachedObject (Node));
667    AcpiExOutPointer ("ChildList",        Node->Child);
668    AcpiExOutPointer ("NextPeer",         Node->Peer);
669    AcpiExOutPointer ("Parent",           AcpiNsGetParentNode (Node));
670}
671
672
673/*******************************************************************************
674 *
675 * FUNCTION:    AcpiExDumpReference
676 *
677 * PARAMETERS:  Object              - Descriptor to dump
678 *
679 * DESCRIPTION: Dumps a reference object
680 *
681 ******************************************************************************/
682
683static void
684AcpiExDumpReference (
685    ACPI_OPERAND_OBJECT     *ObjDesc)
686{
687    ACPI_BUFFER             RetBuf;
688    ACPI_STATUS             Status;
689
690
691    if (ObjDesc->Reference.Opcode == AML_INT_NAMEPATH_OP)
692    {
693        AcpiOsPrintf ("Named Object %p ", ObjDesc->Reference.Node);
694        RetBuf.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
695        Status = AcpiNsHandleToPathname (ObjDesc->Reference.Node, &RetBuf);
696        if (ACPI_FAILURE (Status))
697        {
698            AcpiOsPrintf ("Could not convert name to pathname\n");
699        }
700        else
701        {
702           AcpiOsPrintf ("%s\n", (char *) RetBuf.Pointer);
703           ACPI_MEM_FREE (RetBuf.Pointer);
704        }
705    }
706    else if (ObjDesc->Reference.Object)
707    {
708        AcpiOsPrintf ("\nReferenced Object: %p\n", ObjDesc->Reference.Object);
709    }
710}
711
712
713/*******************************************************************************
714 *
715 * FUNCTION:    AcpiExDumpPackage
716 *
717 * PARAMETERS:  Object              - Descriptor to dump
718 *              Level               - Indentation Level
719 *              Index               - Package index for this object
720 *
721 * DESCRIPTION: Dumps the elements of the package
722 *
723 ******************************************************************************/
724
725static void
726AcpiExDumpPackage (
727    ACPI_OPERAND_OBJECT     *ObjDesc,
728    UINT32                  Level,
729    UINT32                  Index)
730{
731    UINT32                  i;
732
733
734    /* Indentation and index output */
735
736    if (Level > 0)
737    {
738        for (i = 0; i < Level; i++)
739        {
740            AcpiOsPrintf ("  ");
741        }
742
743        AcpiOsPrintf ("[%.2d] ", Index);
744    }
745
746    AcpiOsPrintf ("%p ", ObjDesc);
747
748    /* Null package elements are allowed */
749
750    if (!ObjDesc)
751    {
752        AcpiOsPrintf ("[Null Object]\n");
753        return;
754    }
755
756    /* Packages may only contain a few object types */
757
758    switch (ACPI_GET_OBJECT_TYPE (ObjDesc))
759    {
760    case ACPI_TYPE_INTEGER:
761
762        AcpiOsPrintf ("[Integer] = %8.8X%8.8X\n",
763                    ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
764        break;
765
766
767    case ACPI_TYPE_STRING:
768
769        AcpiOsPrintf ("[String]  Value: ");
770        for (i = 0; i < ObjDesc->String.Length; i++)
771        {
772            AcpiOsPrintf ("%c", ObjDesc->String.Pointer[i]);
773        }
774        AcpiOsPrintf ("\n");
775        break;
776
777
778    case ACPI_TYPE_BUFFER:
779
780        AcpiOsPrintf ("[Buffer] Length %.2X = ", ObjDesc->Buffer.Length);
781        if (ObjDesc->Buffer.Length)
782        {
783            AcpiUtDumpBuffer ((UINT8 *) ObjDesc->Buffer.Pointer,
784                    ObjDesc->Buffer.Length, DB_DWORD_DISPLAY, _COMPONENT);
785        }
786        else
787        {
788            AcpiOsPrintf ("\n");
789        }
790        break;
791
792
793    case ACPI_TYPE_PACKAGE:
794
795        AcpiOsPrintf ("[Package] Contains %d Elements:\n",
796                ObjDesc->Package.Count);
797
798        for (i = 0; i < ObjDesc->Package.Count; i++)
799        {
800            AcpiExDumpPackage (ObjDesc->Package.Elements[i], Level+1, i);
801        }
802        break;
803
804
805    case ACPI_TYPE_LOCAL_REFERENCE:
806
807        AcpiOsPrintf ("[Object Reference] ");
808        AcpiExDumpReference (ObjDesc);
809        break;
810
811
812    default:
813
814        AcpiOsPrintf ("[Unknown Type] %X\n", ACPI_GET_OBJECT_TYPE (ObjDesc));
815        break;
816    }
817}
818
819
820/*******************************************************************************
821 *
822 * FUNCTION:    AcpiExDumpObjectDescriptor
823 *
824 * PARAMETERS:  Object              - Descriptor to dump
825 *              Flags               - Force display if TRUE
826 *
827 * DESCRIPTION: Dumps the members of the object descriptor given.
828 *
829 ******************************************************************************/
830
831void
832AcpiExDumpObjectDescriptor (
833    ACPI_OPERAND_OBJECT     *ObjDesc,
834    UINT32                  Flags)
835{
836    ACPI_FUNCTION_TRACE ("ExDumpObjectDescriptor");
837
838
839    if (!ObjDesc)
840    {
841        return_VOID;
842    }
843
844    if (!Flags)
845    {
846        if (!((ACPI_LV_OBJECTS & AcpiDbgLevel) && (_COMPONENT & AcpiDbgLayer)))
847        {
848            return_VOID;
849        }
850    }
851
852    if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED)
853    {
854        AcpiExDumpNode ((ACPI_NAMESPACE_NODE *) ObjDesc, Flags);
855        AcpiOsPrintf ("\nAttached Object (%p):\n",
856            ((ACPI_NAMESPACE_NODE *) ObjDesc)->Object);
857        AcpiExDumpObjectDescriptor (
858            ((ACPI_NAMESPACE_NODE *) ObjDesc)->Object, Flags);
859        return_VOID;
860    }
861
862    if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND)
863    {
864        AcpiOsPrintf (
865            "ExDumpObjectDescriptor: %p is not an ACPI operand object: [%s]\n",
866            ObjDesc, AcpiUtGetDescriptorName (ObjDesc));
867        return_VOID;
868    }
869
870    /* Common Fields */
871
872    AcpiExOutString  ("Type",               AcpiUtGetObjectTypeName (ObjDesc));
873    AcpiExOutInteger ("Reference Count",    ObjDesc->Common.ReferenceCount);
874    AcpiExOutInteger ("Flags",              ObjDesc->Common.Flags);
875
876    /* Object-specific Fields */
877
878    switch (ACPI_GET_OBJECT_TYPE (ObjDesc))
879    {
880    case ACPI_TYPE_INTEGER:
881
882        AcpiOsPrintf ("%20s : %8.8X%8.8X\n", "Value",
883                ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
884        break;
885
886
887    case ACPI_TYPE_STRING:
888
889        AcpiExOutInteger ("Length",         ObjDesc->String.Length);
890
891        AcpiOsPrintf ("%20s : %p  ", "Pointer", ObjDesc->String.Pointer);
892        AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX);
893        AcpiOsPrintf ("\n");
894        break;
895
896
897    case ACPI_TYPE_BUFFER:
898
899        AcpiExOutInteger ("Length",         ObjDesc->Buffer.Length);
900        AcpiExOutPointer ("Pointer",        ObjDesc->Buffer.Pointer);
901        ACPI_DUMP_BUFFER (ObjDesc->Buffer.Pointer, ObjDesc->Buffer.Length);
902        break;
903
904
905    case ACPI_TYPE_PACKAGE:
906
907        AcpiExOutInteger ("Flags",          ObjDesc->Package.Flags);
908        AcpiExOutInteger ("Elements",       ObjDesc->Package.Count);
909        AcpiExOutPointer ("Element List",   ObjDesc->Package.Elements);
910
911        /* Dump the package contents */
912
913        AcpiOsPrintf ("\nPackage Contents:\n");
914        AcpiExDumpPackage (ObjDesc, 0, 0);
915        break;
916
917
918    case ACPI_TYPE_DEVICE:
919
920        AcpiExOutPointer ("Handler",        ObjDesc->Device.Handler);
921        AcpiExOutPointer ("SystemNotify",   ObjDesc->Device.SystemNotify);
922        AcpiExOutPointer ("DeviceNotify",   ObjDesc->Device.DeviceNotify);
923        break;
924
925
926    case ACPI_TYPE_EVENT:
927
928        AcpiExOutPointer ("Semaphore",      ObjDesc->Event.Semaphore);
929        break;
930
931
932    case ACPI_TYPE_METHOD:
933
934        AcpiExOutInteger ("ParamCount",     ObjDesc->Method.ParamCount);
935        AcpiExOutInteger ("Concurrency",    ObjDesc->Method.Concurrency);
936        AcpiExOutPointer ("Semaphore",      ObjDesc->Method.Semaphore);
937        AcpiExOutInteger ("OwnerId",        ObjDesc->Method.OwnerId);
938        AcpiExOutInteger ("AmlLength",      ObjDesc->Method.AmlLength);
939        AcpiExOutPointer ("AmlStart",       ObjDesc->Method.AmlStart);
940        break;
941
942
943    case ACPI_TYPE_MUTEX:
944
945        AcpiExOutInteger ("SyncLevel",      ObjDesc->Mutex.SyncLevel);
946        AcpiExOutPointer ("OwnerThread",    ObjDesc->Mutex.OwnerThread);
947        AcpiExOutInteger ("AcquireDepth",   ObjDesc->Mutex.AcquisitionDepth);
948        AcpiExOutPointer ("Semaphore",      ObjDesc->Mutex.Semaphore);
949        break;
950
951
952    case ACPI_TYPE_REGION:
953
954        AcpiExOutInteger ("SpaceId",        ObjDesc->Region.SpaceId);
955        AcpiExOutInteger ("Flags",          ObjDesc->Region.Flags);
956        AcpiExOutAddress ("Address",        ObjDesc->Region.Address);
957        AcpiExOutInteger ("Length",         ObjDesc->Region.Length);
958        AcpiExOutPointer ("Handler",        ObjDesc->Region.Handler);
959        AcpiExOutPointer ("Next",           ObjDesc->Region.Next);
960        break;
961
962
963    case ACPI_TYPE_POWER:
964
965        AcpiExOutInteger ("SystemLevel",    ObjDesc->PowerResource.SystemLevel);
966        AcpiExOutInteger ("ResourceOrder",  ObjDesc->PowerResource.ResourceOrder);
967        AcpiExOutPointer ("SystemNotify",   ObjDesc->PowerResource.SystemNotify);
968        AcpiExOutPointer ("DeviceNotify",   ObjDesc->PowerResource.DeviceNotify);
969        break;
970
971
972    case ACPI_TYPE_PROCESSOR:
973
974        AcpiExOutInteger ("Processor ID",   ObjDesc->Processor.ProcId);
975        AcpiExOutInteger ("Length",         ObjDesc->Processor.Length);
976        AcpiExOutAddress ("Address",        (ACPI_PHYSICAL_ADDRESS) ObjDesc->Processor.Address);
977        AcpiExOutPointer ("SystemNotify",   ObjDesc->Processor.SystemNotify);
978        AcpiExOutPointer ("DeviceNotify",   ObjDesc->Processor.DeviceNotify);
979        AcpiExOutPointer ("Handler",        ObjDesc->Processor.Handler);
980        break;
981
982
983    case ACPI_TYPE_THERMAL:
984
985        AcpiExOutPointer ("SystemNotify",   ObjDesc->ThermalZone.SystemNotify);
986        AcpiExOutPointer ("DeviceNotify",   ObjDesc->ThermalZone.DeviceNotify);
987        AcpiExOutPointer ("Handler",        ObjDesc->ThermalZone.Handler);
988        break;
989
990
991    case ACPI_TYPE_BUFFER_FIELD:
992    case ACPI_TYPE_LOCAL_REGION_FIELD:
993    case ACPI_TYPE_LOCAL_BANK_FIELD:
994    case ACPI_TYPE_LOCAL_INDEX_FIELD:
995
996        AcpiExOutInteger ("FieldFlags",     ObjDesc->CommonField.FieldFlags);
997        AcpiExOutInteger ("AccessByteWidth",ObjDesc->CommonField.AccessByteWidth);
998        AcpiExOutInteger ("BitLength",      ObjDesc->CommonField.BitLength);
999        AcpiExOutInteger ("FldBitOffset",   ObjDesc->CommonField.StartFieldBitOffset);
1000        AcpiExOutInteger ("BaseByteOffset", ObjDesc->CommonField.BaseByteOffset);
1001        AcpiExOutPointer ("ParentNode",     ObjDesc->CommonField.Node);
1002
1003        switch (ACPI_GET_OBJECT_TYPE (ObjDesc))
1004        {
1005        case ACPI_TYPE_BUFFER_FIELD:
1006            AcpiExOutPointer ("BufferObj",  ObjDesc->BufferField.BufferObj);
1007            break;
1008
1009        case ACPI_TYPE_LOCAL_REGION_FIELD:
1010            AcpiExOutPointer ("RegionObj",  ObjDesc->Field.RegionObj);
1011            break;
1012
1013        case ACPI_TYPE_LOCAL_BANK_FIELD:
1014            AcpiExOutInteger ("Value",      ObjDesc->BankField.Value);
1015            AcpiExOutPointer ("RegionObj",  ObjDesc->BankField.RegionObj);
1016            AcpiExOutPointer ("BankObj",    ObjDesc->BankField.BankObj);
1017            break;
1018
1019        case ACPI_TYPE_LOCAL_INDEX_FIELD:
1020            AcpiExOutInteger ("Value",      ObjDesc->IndexField.Value);
1021            AcpiExOutPointer ("Index",      ObjDesc->IndexField.IndexObj);
1022            AcpiExOutPointer ("Data",       ObjDesc->IndexField.DataObj);
1023            break;
1024
1025        default:
1026            /* All object types covered above */
1027            break;
1028        }
1029        break;
1030
1031
1032    case ACPI_TYPE_LOCAL_REFERENCE:
1033
1034        AcpiExOutInteger ("TargetType",     ObjDesc->Reference.TargetType);
1035        AcpiExOutString  ("Opcode",         (AcpiPsGetOpcodeInfo (
1036                                             ObjDesc->Reference.Opcode))->Name);
1037        AcpiExOutInteger ("Offset",         ObjDesc->Reference.Offset);
1038        AcpiExOutPointer ("ObjDesc",        ObjDesc->Reference.Object);
1039        AcpiExOutPointer ("Node",           ObjDesc->Reference.Node);
1040        AcpiExOutPointer ("Where",          ObjDesc->Reference.Where);
1041
1042        AcpiExDumpReference (ObjDesc);
1043        break;
1044
1045
1046    case ACPI_TYPE_LOCAL_ADDRESS_HANDLER:
1047
1048        AcpiExOutInteger ("SpaceId",        ObjDesc->AddressSpace.SpaceId);
1049        AcpiExOutPointer ("Next",           ObjDesc->AddressSpace.Next);
1050        AcpiExOutPointer ("RegionList",     ObjDesc->AddressSpace.RegionList);
1051        AcpiExOutPointer ("Node",           ObjDesc->AddressSpace.Node);
1052        AcpiExOutPointer ("Context",        ObjDesc->AddressSpace.Context);
1053        break;
1054
1055
1056    case ACPI_TYPE_LOCAL_NOTIFY:
1057
1058        AcpiExOutPointer ("Node",           ObjDesc->Notify.Node);
1059        AcpiExOutPointer ("Context",        ObjDesc->Notify.Context);
1060        break;
1061
1062
1063    case ACPI_TYPE_LOCAL_ALIAS:
1064    case ACPI_TYPE_LOCAL_METHOD_ALIAS:
1065    case ACPI_TYPE_LOCAL_EXTRA:
1066    case ACPI_TYPE_LOCAL_DATA:
1067    default:
1068
1069        AcpiOsPrintf (
1070            "ExDumpObjectDescriptor: Display not implemented for object type %s\n",
1071            AcpiUtGetObjectTypeName (ObjDesc));
1072        break;
1073    }
1074
1075    return_VOID;
1076}
1077
1078#endif
1079
1080