1/******************************************************************************
2 *
3 * Module Name: exdump - Interpreter debug output routines
4 *
5 *****************************************************************************/
6
7/*
8 * Copyright (C) 2000 - 2023, Intel Corp.
9 * All rights reserved.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 *    notice, this list of conditions, and the following disclaimer,
16 *    without modification.
17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18 *    substantially similar to the "NO WARRANTY" disclaimer below
19 *    ("Disclaimer") and any redistribution must be conditioned upon
20 *    including a substantially similar Disclaimer requirement for further
21 *    binary redistribution.
22 * 3. Neither the names of the above-listed copyright holders nor the names
23 *    of any contributors may be used to endorse or promote products derived
24 *    from this software without specific prior written permission.
25 *
26 * Alternatively, this software may be distributed under the terms of the
27 * GNU General Public License ("GPL") version 2 as published by the Free
28 * Software Foundation.
29 *
30 * NO WARRANTY
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 * POSSIBILITY OF SUCH DAMAGES.
42 */
43
44#include "acpi.h"
45#include "accommon.h"
46#include "acinterp.h"
47#include "amlcode.h"
48#include "acnamesp.h"
49
50
51#define _COMPONENT          ACPI_EXECUTER
52        ACPI_MODULE_NAME    ("exdump")
53
54/*
55 * The following routines are used for debug output only
56 */
57#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
58
59/* Local prototypes */
60
61static void
62AcpiExOutString (
63    const char              *Title,
64    const char              *Value);
65
66static void
67AcpiExOutPointer (
68    const char              *Title,
69    const void              *Value);
70
71static void
72AcpiExDumpObject (
73    ACPI_OPERAND_OBJECT     *ObjDesc,
74    ACPI_EXDUMP_INFO        *Info);
75
76static void
77AcpiExDumpReferenceObj (
78    ACPI_OPERAND_OBJECT     *ObjDesc);
79
80static void
81AcpiExDumpPackageObj (
82    ACPI_OPERAND_OBJECT     *ObjDesc,
83    UINT32                  Level,
84    UINT32                  Index);
85
86
87/*******************************************************************************
88 *
89 * Object Descriptor info tables
90 *
91 * Note: The first table entry must be an INIT opcode and must contain
92 * the table length (number of table entries)
93 *
94 ******************************************************************************/
95
96static ACPI_EXDUMP_INFO     AcpiExDumpInteger[2] =
97{
98    {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpInteger),        NULL},
99    {ACPI_EXD_UINT64,   ACPI_EXD_OFFSET (Integer.Value),                "Value"}
100};
101
102static ACPI_EXDUMP_INFO     AcpiExDumpString[4] =
103{
104    {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpString),         NULL},
105    {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (String.Length),                "Length"},
106    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (String.Pointer),               "Pointer"},
107    {ACPI_EXD_STRING,   0,                                              NULL}
108};
109
110static ACPI_EXDUMP_INFO     AcpiExDumpBuffer[5] =
111{
112    {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpBuffer),         NULL},
113    {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (Buffer.Length),                "Length"},
114    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Buffer.Pointer),               "Pointer"},
115    {ACPI_EXD_NODE,     ACPI_EXD_OFFSET (Buffer.Node),                  "Parent Node"},
116    {ACPI_EXD_BUFFER,   0,                                              NULL}
117};
118
119static ACPI_EXDUMP_INFO     AcpiExDumpPackage[6] =
120{
121    {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpPackage),        NULL},
122    {ACPI_EXD_NODE,     ACPI_EXD_OFFSET (Package.Node),                 "Parent Node"},
123    {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Package.Flags),                "Flags"},
124    {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (Package.Count),                "Element Count"},
125    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Package.Elements),             "Element List"},
126    {ACPI_EXD_PACKAGE,  0,                                              NULL}
127};
128
129static ACPI_EXDUMP_INFO     AcpiExDumpDevice[4] =
130{
131    {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpDevice),         NULL},
132    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Device.NotifyList[0]),         "System Notify"},
133    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Device.NotifyList[1]),         "Device Notify"},
134    {ACPI_EXD_HDLR_LIST,ACPI_EXD_OFFSET (Device.Handler),               "Handler"}
135};
136
137static ACPI_EXDUMP_INFO     AcpiExDumpEvent[2] =
138{
139    {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpEvent),          NULL},
140    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Event.OsSemaphore),            "OsSemaphore"}
141};
142
143static ACPI_EXDUMP_INFO     AcpiExDumpMethod[9] =
144{
145    {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpMethod),         NULL},
146    {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Method.InfoFlags),             "Info Flags"},
147    {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Method.ParamCount),            "Parameter Count"},
148    {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Method.SyncLevel),             "Sync Level"},
149    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Method.Mutex),                 "Mutex"},
150    {ACPI_EXD_UINT16,   ACPI_EXD_OFFSET (Method.OwnerId),               "Owner Id"},
151    {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Method.ThreadCount),           "Thread Count"},
152    {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (Method.AmlLength),             "Aml Length"},
153    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Method.AmlStart),              "Aml Start"}
154};
155
156static ACPI_EXDUMP_INFO     AcpiExDumpMutex[6] =
157{
158    {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpMutex),          NULL},
159    {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Mutex.SyncLevel),              "Sync Level"},
160    {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Mutex.OriginalSyncLevel),      "Original Sync Level"},
161    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Mutex.OwnerThread),            "Owner Thread"},
162    {ACPI_EXD_UINT16,   ACPI_EXD_OFFSET (Mutex.AcquisitionDepth),       "Acquire Depth"},
163    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Mutex.OsMutex),                "OsMutex"}
164};
165
166static ACPI_EXDUMP_INFO     AcpiExDumpRegion[8] =
167{
168    {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpRegion),         NULL},
169    {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Region.SpaceId),               "Space Id"},
170    {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Region.Flags),                 "Flags"},
171    {ACPI_EXD_NODE,     ACPI_EXD_OFFSET (Region.Node),                  "Parent Node"},
172    {ACPI_EXD_ADDRESS,  ACPI_EXD_OFFSET (Region.Address),               "Address"},
173    {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (Region.Length),                "Length"},
174    {ACPI_EXD_HDLR_LIST,ACPI_EXD_OFFSET (Region.Handler),               "Handler"},
175    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Region.Next),                  "Next"}
176};
177
178static ACPI_EXDUMP_INFO     AcpiExDumpPower[6] =
179{
180    {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpPower),          NULL},
181    {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (PowerResource.SystemLevel),    "System Level"},
182    {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (PowerResource.ResourceOrder),  "Resource Order"},
183    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (PowerResource.NotifyList[0]),  "System Notify"},
184    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (PowerResource.NotifyList[1]),  "Device Notify"},
185    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (PowerResource.Handler),        "Handler"}
186};
187
188static ACPI_EXDUMP_INFO     AcpiExDumpProcessor[7] =
189{
190    {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpProcessor),      NULL},
191    {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Processor.ProcId),             "Processor ID"},
192    {ACPI_EXD_UINT8 ,   ACPI_EXD_OFFSET (Processor.Length),             "Length"},
193    {ACPI_EXD_ADDRESS,  ACPI_EXD_OFFSET (Processor.Address),            "Address"},
194    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Processor.NotifyList[0]),      "System Notify"},
195    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Processor.NotifyList[1]),      "Device Notify"},
196    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Processor.Handler),            "Handler"}
197};
198
199static ACPI_EXDUMP_INFO     AcpiExDumpThermal[4] =
200{
201    {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpThermal),        NULL},
202    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (ThermalZone.NotifyList[0]),    "System Notify"},
203    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (ThermalZone.NotifyList[1]),    "Device Notify"},
204    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (ThermalZone.Handler),          "Handler"}
205};
206
207static ACPI_EXDUMP_INFO     AcpiExDumpBufferField[3] =
208{
209    {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpBufferField),    NULL},
210    {ACPI_EXD_FIELD,    0,                                              NULL},
211    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (BufferField.BufferObj),        "Buffer Object"}
212};
213
214static ACPI_EXDUMP_INFO     AcpiExDumpRegionField[5] =
215{
216    {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpRegionField),    NULL},
217    {ACPI_EXD_FIELD,    0,                                              NULL},
218    {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Field.AccessLength),           "AccessLength"},
219    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Field.RegionObj),              "Region Object"},
220    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Field.ResourceBuffer),         "ResourceBuffer"}
221};
222
223static ACPI_EXDUMP_INFO     AcpiExDumpBankField[5] =
224{
225    {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpBankField),      NULL},
226    {ACPI_EXD_FIELD,    0,                                              NULL},
227    {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (BankField.Value),              "Value"},
228    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (BankField.RegionObj),          "Region Object"},
229    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (BankField.BankObj),            "Bank Object"}
230};
231
232static ACPI_EXDUMP_INFO     AcpiExDumpIndexField[5] =
233{
234    {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpBankField),      NULL},
235    {ACPI_EXD_FIELD,    0,                                              NULL},
236    {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (IndexField.Value),             "Value"},
237    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (IndexField.IndexObj),          "Index Object"},
238    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (IndexField.DataObj),           "Data Object"}
239};
240
241static ACPI_EXDUMP_INFO     AcpiExDumpReference[9] =
242{
243    {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpReference),       NULL},
244    {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Reference.Class),              "Class"},
245    {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Reference.TargetType),         "Target Type"},
246    {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (Reference.Value),              "Value"},
247    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Reference.Object),             "Object Desc"},
248    {ACPI_EXD_NODE,     ACPI_EXD_OFFSET (Reference.Node),               "Node"},
249    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Reference.Where),              "Where"},
250    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Reference.IndexPointer),       "Index Pointer"},
251    {ACPI_EXD_REFERENCE,0,                                              NULL}
252};
253
254static ACPI_EXDUMP_INFO     AcpiExDumpAddressHandler[6] =
255{
256    {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpAddressHandler), NULL},
257    {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (AddressSpace.SpaceId),         "Space Id"},
258    {ACPI_EXD_HDLR_LIST,ACPI_EXD_OFFSET (AddressSpace.Next),            "Next"},
259    {ACPI_EXD_RGN_LIST, ACPI_EXD_OFFSET (AddressSpace.RegionList),      "Region List"},
260    {ACPI_EXD_NODE,     ACPI_EXD_OFFSET (AddressSpace.Node),            "Node"},
261    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (AddressSpace.Context),         "Context"}
262};
263
264static ACPI_EXDUMP_INFO     AcpiExDumpNotify[7] =
265{
266    {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpNotify),         NULL},
267    {ACPI_EXD_NODE,     ACPI_EXD_OFFSET (Notify.Node),                  "Node"},
268    {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (Notify.HandlerType),           "Handler Type"},
269    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Notify.Handler),               "Handler"},
270    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Notify.Context),               "Context"},
271    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Notify.Next[0]),               "Next System Notify"},
272    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Notify.Next[1]),               "Next Device Notify"}
273};
274
275static ACPI_EXDUMP_INFO     AcpiExDumpExtra[6] =
276{
277    {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpExtra),          NULL},
278    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Extra.Method_REG),             "_REG Method"},
279    {ACPI_EXD_NODE,     ACPI_EXD_OFFSET (Extra.ScopeNode),              "Scope Node"},
280    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Extra.RegionContext),          "Region Context"},
281    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Extra.AmlStart),               "Aml Start"},
282    {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (Extra.AmlLength),              "Aml Length"}
283};
284
285static ACPI_EXDUMP_INFO     AcpiExDumpData[3] =
286{
287    {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpData),           NULL},
288    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Data.Handler),                 "Handler"},
289    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Data.Pointer),                 "Raw Data"}
290};
291
292/* Miscellaneous tables */
293
294static ACPI_EXDUMP_INFO     AcpiExDumpCommon[5] =
295{
296    {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpCommon),         NULL},
297    {ACPI_EXD_TYPE ,    0,                                              NULL},
298    {ACPI_EXD_UINT16,   ACPI_EXD_OFFSET (Common.ReferenceCount),        "Reference Count"},
299    {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Common.Flags),                 "Flags"},
300    {ACPI_EXD_LIST,     ACPI_EXD_OFFSET (Common.NextObject),            "Object List"}
301};
302
303static ACPI_EXDUMP_INFO     AcpiExDumpFieldCommon[7] =
304{
305    {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpFieldCommon),    NULL},
306    {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (CommonField.FieldFlags),       "Field Flags"},
307    {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (CommonField.AccessByteWidth),  "Access Byte Width"},
308    {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (CommonField.BitLength),        "Bit Length"},
309    {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (CommonField.StartFieldBitOffset),"Field Bit Offset"},
310    {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (CommonField.BaseByteOffset),   "Base Byte Offset"},
311    {ACPI_EXD_NODE,     ACPI_EXD_OFFSET (CommonField.Node),             "Parent Node"}
312};
313
314static ACPI_EXDUMP_INFO     AcpiExDumpNode[7] =
315{
316    {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpNode),           NULL},
317    {ACPI_EXD_UINT16,   ACPI_EXD_NSOFFSET (Flags),                      "Flags"},
318    {ACPI_EXD_UINT16,   ACPI_EXD_NSOFFSET (OwnerId),                    "Owner Id"},
319    {ACPI_EXD_LIST,     ACPI_EXD_NSOFFSET (Object),                     "Object List"},
320    {ACPI_EXD_NODE,     ACPI_EXD_NSOFFSET (Parent),                     "Parent"},
321    {ACPI_EXD_NODE,     ACPI_EXD_NSOFFSET (Child),                      "Child"},
322    {ACPI_EXD_NODE,     ACPI_EXD_NSOFFSET (Peer),                       "Peer"}
323};
324
325
326/* Dispatch table, indexed by object type */
327
328static ACPI_EXDUMP_INFO     *AcpiExDumpInfo[] =
329{
330    NULL,
331    AcpiExDumpInteger,
332    AcpiExDumpString,
333    AcpiExDumpBuffer,
334    AcpiExDumpPackage,
335    NULL,
336    AcpiExDumpDevice,
337    AcpiExDumpEvent,
338    AcpiExDumpMethod,
339    AcpiExDumpMutex,
340    AcpiExDumpRegion,
341    AcpiExDumpPower,
342    AcpiExDumpProcessor,
343    AcpiExDumpThermal,
344    AcpiExDumpBufferField,
345    NULL,
346    NULL,
347    AcpiExDumpRegionField,
348    AcpiExDumpBankField,
349    AcpiExDumpIndexField,
350    AcpiExDumpReference,
351    NULL,
352    NULL,
353    AcpiExDumpNotify,
354    AcpiExDumpAddressHandler,
355    NULL,
356    NULL,
357    NULL,
358    AcpiExDumpExtra,
359    AcpiExDumpData
360};
361
362
363/*******************************************************************************
364 *
365 * FUNCTION:    AcpiExDumpObject
366 *
367 * PARAMETERS:  ObjDesc             - Descriptor to dump
368 *              Info                - Info table corresponding to this object
369 *                                    type
370 *
371 * RETURN:      None
372 *
373 * DESCRIPTION: Walk the info table for this object
374 *
375 ******************************************************************************/
376
377static void
378AcpiExDumpObject (
379    ACPI_OPERAND_OBJECT     *ObjDesc,
380    ACPI_EXDUMP_INFO        *Info)
381{
382    UINT8                   *Target;
383    const char              *Name;
384    UINT8                   Count;
385    ACPI_OPERAND_OBJECT     *Start;
386    ACPI_OPERAND_OBJECT     *Data = NULL;
387    ACPI_OPERAND_OBJECT     *Next;
388    ACPI_NAMESPACE_NODE     *Node;
389
390
391    if (!Info)
392    {
393        AcpiOsPrintf (
394            "ExDumpObject: Display not implemented for object type %s\n",
395            AcpiUtGetObjectTypeName (ObjDesc));
396        return;
397    }
398
399    /* First table entry must contain the table length (# of table entries) */
400
401    Count = Info->Offset;
402
403    while (Count)
404    {
405        if (!ObjDesc)
406        {
407            return;
408        }
409
410        Target = ACPI_ADD_PTR (UINT8, ObjDesc, Info->Offset);
411        Name = __UNCONST(Info->Name);
412
413        switch (Info->Opcode)
414        {
415        case ACPI_EXD_INIT:
416
417            break;
418
419        case ACPI_EXD_TYPE:
420
421            AcpiOsPrintf ("%20s : %2.2X [%s]\n", "Type",
422                ObjDesc->Common.Type,
423                AcpiUtGetObjectTypeName (ObjDesc));
424            break;
425
426        case ACPI_EXD_UINT8:
427
428            AcpiOsPrintf ("%20s : %2.2X\n", Name, *Target);
429            break;
430
431        case ACPI_EXD_UINT16:
432
433            AcpiOsPrintf ("%20s : %4.4X\n", Name, ACPI_GET16 (Target));
434            break;
435
436        case ACPI_EXD_UINT32:
437
438            AcpiOsPrintf ("%20s : %8.8X\n", Name, ACPI_GET32 (Target));
439            break;
440
441        case ACPI_EXD_UINT64:
442
443            AcpiOsPrintf ("%20s : %8.8X%8.8X\n", "Value",
444                ACPI_FORMAT_UINT64 (ACPI_GET64 (Target)));
445            break;
446
447        case ACPI_EXD_POINTER:
448        case ACPI_EXD_ADDRESS:
449
450            AcpiExOutPointer (Name, *ACPI_CAST_PTR (void *, Target));
451            break;
452
453        case ACPI_EXD_STRING:
454
455            AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX);
456            AcpiOsPrintf ("\n");
457            break;
458
459        case ACPI_EXD_BUFFER:
460
461            ACPI_DUMP_BUFFER (
462                ObjDesc->Buffer.Pointer, ObjDesc->Buffer.Length);
463            break;
464
465        case ACPI_EXD_PACKAGE:
466
467            /* Dump the package contents */
468
469            AcpiOsPrintf ("\nPackage Contents:\n");
470            AcpiExDumpPackageObj (ObjDesc, 0, 0);
471            break;
472
473        case ACPI_EXD_FIELD:
474
475            AcpiExDumpObject (ObjDesc, AcpiExDumpFieldCommon);
476            break;
477
478        case ACPI_EXD_REFERENCE:
479
480            AcpiExOutString ("Class Name", AcpiUtGetReferenceName (ObjDesc));
481            AcpiExDumpReferenceObj (ObjDesc);
482            break;
483
484        case ACPI_EXD_LIST:
485
486            Start = *ACPI_CAST_PTR (void *, Target);
487            Next = Start;
488
489            AcpiOsPrintf ("%20s : %p ", Name, Next);
490            if (Next)
491            {
492                AcpiOsPrintf ("%s (Type %2.2X)",
493                    AcpiUtGetObjectTypeName (Next), Next->Common.Type);
494
495                while (Next->Common.NextObject)
496                {
497                    if ((Next->Common.Type == ACPI_TYPE_LOCAL_DATA) &&
498                        !Data)
499                    {
500                        Data = Next;
501                    }
502
503                    Next = Next->Common.NextObject;
504                    AcpiOsPrintf ("->%p(%s %2.2X)", Next,
505                        AcpiUtGetObjectTypeName (Next), Next->Common.Type);
506
507                    if ((Next == Start) || (Next == Data))
508                    {
509                        AcpiOsPrintf (
510                            "\n**** Error: Object list appears to be circular linked");
511                        break;
512                    }
513                }
514            }
515            else
516            {
517                AcpiOsPrintf ("- No attached objects");
518            }
519
520            AcpiOsPrintf ("\n");
521            break;
522
523        case ACPI_EXD_HDLR_LIST:
524
525            Start = *ACPI_CAST_PTR (void *, Target);
526            Next = Start;
527
528            AcpiOsPrintf ("%20s : %p", Name, Next);
529            if (Next)
530            {
531                AcpiOsPrintf ("(%s %2.2X)",
532                    AcpiUtGetObjectTypeName (Next),
533                    Next->AddressSpace.SpaceId);
534
535                while (Next->AddressSpace.Next)
536                {
537                    if ((Next->Common.Type == ACPI_TYPE_LOCAL_DATA) &&
538                        !Data)
539                    {
540                        Data = Next;
541                    }
542
543                    Next = Next->AddressSpace.Next;
544                    AcpiOsPrintf ("->%p(%s %2.2X)", Next,
545                        AcpiUtGetObjectTypeName (Next),
546                        Next->AddressSpace.SpaceId);
547
548                    if ((Next == Start) || (Next == Data))
549                    {
550                        AcpiOsPrintf (
551                            "\n**** Error: Handler list appears to be circular linked");
552                        break;
553                    }
554                }
555            }
556
557            AcpiOsPrintf ("\n");
558            break;
559
560        case ACPI_EXD_RGN_LIST:
561
562            Start = *ACPI_CAST_PTR (void *, Target);
563            Next = Start;
564
565            AcpiOsPrintf ("%20s : %p", Name, Next);
566            if (Next)
567            {
568                AcpiOsPrintf ("(%s %2.2X)",
569                    AcpiUtGetObjectTypeName (Next), Next->Common.Type);
570
571                while (Next->Region.Next)
572                {
573                    if ((Next->Common.Type == ACPI_TYPE_LOCAL_DATA) &&
574                        !Data)
575                    {
576                        Data = Next;
577                    }
578
579                    Next = Next->Region.Next;
580                    AcpiOsPrintf ("->%p(%s %2.2X)", Next,
581                        AcpiUtGetObjectTypeName (Next), Next->Common.Type);
582
583                    if ((Next == Start) || (Next == Data))
584                    {
585                        AcpiOsPrintf (
586                            "\n**** Error: Region list appears to be circular linked");
587                        break;
588                    }
589                }
590            }
591
592            AcpiOsPrintf ("\n");
593            break;
594
595        case ACPI_EXD_NODE:
596
597            Node = *ACPI_CAST_PTR (ACPI_NAMESPACE_NODE *, Target);
598
599            AcpiOsPrintf ("%20s : %p", Name, Node);
600            if (Node)
601            {
602                AcpiOsPrintf (" [%4.4s]", Node->Name.Ascii);
603            }
604            AcpiOsPrintf ("\n");
605            break;
606
607        default:
608
609            AcpiOsPrintf ("**** Invalid table opcode [%X] ****\n",
610                Info->Opcode);
611            return;
612        }
613
614        Info++;
615        Count--;
616    }
617}
618
619
620/*******************************************************************************
621 *
622 * FUNCTION:    AcpiExDumpOperand
623 *
624 * PARAMETERS:  *ObjDesc        - Pointer to entry to be dumped
625 *              Depth           - Current nesting depth
626 *
627 * RETURN:      None
628 *
629 * DESCRIPTION: Dump an operand object
630 *
631 ******************************************************************************/
632
633void
634AcpiExDumpOperand (
635    ACPI_OPERAND_OBJECT     *ObjDesc,
636    UINT32                  Depth)
637{
638    UINT32                  Length;
639    UINT32                  Index;
640
641
642    ACPI_FUNCTION_NAME (ExDumpOperand);
643
644
645    /* Check if debug output enabled */
646
647    if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_EXEC, _COMPONENT))
648    {
649        return;
650    }
651
652    if (!ObjDesc)
653    {
654        /* This could be a null element of a package */
655
656        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Null Object Descriptor\n"));
657        return;
658    }
659
660    if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED)
661    {
662        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p Namespace Node: ", ObjDesc));
663        ACPI_DUMP_ENTRY (ObjDesc, ACPI_LV_EXEC);
664        return;
665    }
666
667    if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND)
668    {
669        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
670            "%p is not a node or operand object: [%s]\n",
671            ObjDesc, AcpiUtGetDescriptorName (ObjDesc)));
672        ACPI_DUMP_BUFFER (ObjDesc, sizeof (ACPI_OPERAND_OBJECT));
673        return;
674    }
675
676    /* ObjDesc is a valid object */
677
678    if (Depth > 0)
679    {
680        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%*s[%u] %p Refs=%u ",
681            Depth, " ", Depth, ObjDesc, ObjDesc->Common.ReferenceCount));
682    }
683    else
684    {
685        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p Refs=%u ",
686            ObjDesc, ObjDesc->Common.ReferenceCount));
687    }
688
689    /* Decode object type */
690
691    switch (ObjDesc->Common.Type)
692    {
693    case ACPI_TYPE_LOCAL_REFERENCE:
694
695        AcpiOsPrintf ("Reference: [%s] ",
696            AcpiUtGetReferenceName (ObjDesc));
697
698        switch (ObjDesc->Reference.Class)
699        {
700        case ACPI_REFCLASS_DEBUG:
701
702            AcpiOsPrintf ("\n");
703            break;
704
705        case ACPI_REFCLASS_INDEX:
706
707            AcpiOsPrintf ("%p\n", ObjDesc->Reference.Object);
708            break;
709
710        case ACPI_REFCLASS_TABLE:
711
712            AcpiOsPrintf ("Table Index %X\n", ObjDesc->Reference.Value);
713            break;
714
715        case ACPI_REFCLASS_REFOF:
716
717            AcpiOsPrintf ("%p [%s]\n", ObjDesc->Reference.Object,
718                AcpiUtGetTypeName (((ACPI_OPERAND_OBJECT *)
719                    ObjDesc->Reference.Object)->Common.Type));
720            break;
721
722        case ACPI_REFCLASS_NAME:
723
724            AcpiUtRepairName (ObjDesc->Reference.Node->Name.Ascii);
725            AcpiOsPrintf ("- [%4.4s] (Node %p)\n",
726                ObjDesc->Reference.Node->Name.Ascii,
727                ObjDesc->Reference.Node);
728            break;
729
730        case ACPI_REFCLASS_ARG:
731        case ACPI_REFCLASS_LOCAL:
732
733            AcpiOsPrintf ("%X\n", ObjDesc->Reference.Value);
734            break;
735
736        default:    /* Unknown reference class */
737
738            AcpiOsPrintf ("%2.2X\n", ObjDesc->Reference.Class);
739            break;
740        }
741        break;
742
743    case ACPI_TYPE_BUFFER:
744
745        AcpiOsPrintf ("Buffer length %.2X @ %p\n",
746            ObjDesc->Buffer.Length, ObjDesc->Buffer.Pointer);
747
748        /* Debug only -- dump the buffer contents */
749
750        if (ObjDesc->Buffer.Pointer)
751        {
752            Length = ObjDesc->Buffer.Length;
753            if (Length > 128)
754            {
755                Length = 128;
756            }
757
758            AcpiOsPrintf (
759                "Buffer Contents: (displaying length 0x%.2X)\n", Length);
760            ACPI_DUMP_BUFFER (ObjDesc->Buffer.Pointer, Length);
761        }
762        break;
763
764    case ACPI_TYPE_INTEGER:
765
766        AcpiOsPrintf ("Integer %8.8X%8.8X\n",
767            ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
768        break;
769
770    case ACPI_TYPE_PACKAGE:
771
772        AcpiOsPrintf ("Package [Len %X] ElementArray %p\n",
773            ObjDesc->Package.Count, ObjDesc->Package.Elements);
774
775        /*
776         * If elements exist, package element pointer is valid,
777         * and debug_level exceeds 1, dump package's elements.
778         */
779        if (ObjDesc->Package.Count &&
780            ObjDesc->Package.Elements &&
781            AcpiDbgLevel > 1)
782        {
783            for (Index = 0; Index < ObjDesc->Package.Count; Index++)
784            {
785                AcpiExDumpOperand (
786                    ObjDesc->Package.Elements[Index], Depth + 1);
787            }
788        }
789        break;
790
791    case ACPI_TYPE_REGION:
792
793        AcpiOsPrintf ("Region %s (%X)",
794            AcpiUtGetRegionName (ObjDesc->Region.SpaceId),
795            ObjDesc->Region.SpaceId);
796
797        /*
798         * If the address and length have not been evaluated,
799         * don't print them.
800         */
801        if (!(ObjDesc->Region.Flags & AOPOBJ_DATA_VALID))
802        {
803            AcpiOsPrintf ("\n");
804        }
805        else
806        {
807            AcpiOsPrintf (" base %8.8X%8.8X Length %X\n",
808                ACPI_FORMAT_UINT64 (ObjDesc->Region.Address),
809                ObjDesc->Region.Length);
810        }
811        break;
812
813    case ACPI_TYPE_STRING:
814
815        AcpiOsPrintf ("String length %X @ %p ",
816            ObjDesc->String.Length,
817            ObjDesc->String.Pointer);
818
819        AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX);
820        AcpiOsPrintf ("\n");
821        break;
822
823    case ACPI_TYPE_LOCAL_BANK_FIELD:
824
825        AcpiOsPrintf ("BankField\n");
826        break;
827
828    case ACPI_TYPE_LOCAL_REGION_FIELD:
829
830        AcpiOsPrintf ("RegionField: Bits=%X AccWidth=%X Lock=%X Update=%X at "
831            "byte=%X bit=%X of below:\n",
832            ObjDesc->Field.BitLength,
833            ObjDesc->Field.AccessByteWidth,
834            ObjDesc->Field.FieldFlags & AML_FIELD_LOCK_RULE_MASK,
835            ObjDesc->Field.FieldFlags & AML_FIELD_UPDATE_RULE_MASK,
836            ObjDesc->Field.BaseByteOffset,
837            ObjDesc->Field.StartFieldBitOffset);
838
839        AcpiExDumpOperand (ObjDesc->Field.RegionObj, Depth + 1);
840        break;
841
842    case ACPI_TYPE_LOCAL_INDEX_FIELD:
843
844        AcpiOsPrintf ("IndexField\n");
845        break;
846
847    case ACPI_TYPE_BUFFER_FIELD:
848
849        AcpiOsPrintf ("BufferField: %X bits at byte %X bit %X of\n",
850            ObjDesc->BufferField.BitLength,
851            ObjDesc->BufferField.BaseByteOffset,
852            ObjDesc->BufferField.StartFieldBitOffset);
853
854        if (!ObjDesc->BufferField.BufferObj)
855        {
856            ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "*NULL*\n"));
857        }
858        else if ((ObjDesc->BufferField.BufferObj)->Common.Type !=
859            ACPI_TYPE_BUFFER)
860        {
861            AcpiOsPrintf ("*not a Buffer*\n");
862        }
863        else
864        {
865            AcpiExDumpOperand (ObjDesc->BufferField.BufferObj, Depth + 1);
866        }
867        break;
868
869    case ACPI_TYPE_EVENT:
870
871        AcpiOsPrintf ("Event\n");
872        break;
873
874    case ACPI_TYPE_METHOD:
875
876        AcpiOsPrintf ("Method(%X) @ %p:%X\n",
877            ObjDesc->Method.ParamCount,
878            ObjDesc->Method.AmlStart,
879            ObjDesc->Method.AmlLength);
880        break;
881
882    case ACPI_TYPE_MUTEX:
883
884        AcpiOsPrintf ("Mutex\n");
885        break;
886
887    case ACPI_TYPE_DEVICE:
888
889        AcpiOsPrintf ("Device\n");
890        break;
891
892    case ACPI_TYPE_POWER:
893
894        AcpiOsPrintf ("Power\n");
895        break;
896
897    case ACPI_TYPE_PROCESSOR:
898
899        AcpiOsPrintf ("Processor\n");
900        break;
901
902    case ACPI_TYPE_THERMAL:
903
904        AcpiOsPrintf ("Thermal\n");
905        break;
906
907    default:
908
909        /* Unknown Type */
910
911        AcpiOsPrintf ("Unknown Type %X\n", ObjDesc->Common.Type);
912        break;
913    }
914
915    return;
916}
917
918
919/*******************************************************************************
920 *
921 * FUNCTION:    AcpiExDumpOperands
922 *
923 * PARAMETERS:  Operands            - A list of Operand objects
924 *              OpcodeName          - AML opcode name
925 *              NumOperands         - Operand count for this opcode
926 *
927 * DESCRIPTION: Dump the operands associated with the opcode
928 *
929 ******************************************************************************/
930
931void
932AcpiExDumpOperands (
933    ACPI_OPERAND_OBJECT     **Operands,
934    const char              *OpcodeName,
935    UINT32                  NumOperands)
936{
937    ACPI_FUNCTION_TRACE (ExDumpOperands);
938
939
940    if (!OpcodeName)
941    {
942        OpcodeName = "UNKNOWN";
943    }
944
945    ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
946        "**** Start operand dump for opcode [%s], %u operands\n",
947        OpcodeName, NumOperands));
948
949    if (NumOperands == 0)
950    {
951        NumOperands = 1;
952    }
953
954    /* Dump the individual operands */
955
956    while (NumOperands)
957    {
958        AcpiExDumpOperand (*Operands, 0);
959        Operands++;
960        NumOperands--;
961    }
962
963    ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
964        "**** End operand dump for [%s]\n", OpcodeName));
965    return_VOID;
966}
967
968
969/*******************************************************************************
970 *
971 * FUNCTION:    AcpiExOut* functions
972 *
973 * PARAMETERS:  Title               - Descriptive text
974 *              Value               - Value to be displayed
975 *
976 * DESCRIPTION: Object dump output formatting functions. These functions
977 *              reduce the number of format strings required and keeps them
978 *              all in one place for easy modification.
979 *
980 ******************************************************************************/
981
982static void
983AcpiExOutString (
984    const char              *Title,
985    const char              *Value)
986{
987    AcpiOsPrintf ("%20s : %s\n", Title, Value);
988}
989
990static void
991AcpiExOutPointer (
992    const char              *Title,
993    const void              *Value)
994{
995    AcpiOsPrintf ("%20s : %p\n", Title, Value);
996}
997
998
999/*******************************************************************************
1000 *
1001 * FUNCTION:    AcpiExDumpNamespaceNode
1002 *
1003 * PARAMETERS:  Node                - Descriptor to dump
1004 *              Flags               - Force display if TRUE
1005 *
1006 * DESCRIPTION: Dumps the members of the given.Node
1007 *
1008 ******************************************************************************/
1009
1010void
1011AcpiExDumpNamespaceNode (
1012    ACPI_NAMESPACE_NODE     *Node,
1013    UINT32                  Flags)
1014{
1015
1016    ACPI_FUNCTION_ENTRY ();
1017
1018
1019    if (!Flags)
1020    {
1021        /* Check if debug output enabled */
1022
1023        if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_OBJECTS, _COMPONENT))
1024        {
1025            return;
1026        }
1027    }
1028
1029    AcpiOsPrintf ("%20s : %4.4s\n", "Name", AcpiUtGetNodeName (Node));
1030    AcpiOsPrintf ("%20s : %2.2X [%s]\n", "Type",
1031        Node->Type, AcpiUtGetTypeName (Node->Type));
1032
1033    AcpiExDumpObject (ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Node),
1034        AcpiExDumpNode);
1035}
1036
1037
1038/*******************************************************************************
1039 *
1040 * FUNCTION:    AcpiExDumpReferenceObj
1041 *
1042 * PARAMETERS:  Object              - Descriptor to dump
1043 *
1044 * DESCRIPTION: Dumps a reference object
1045 *
1046 ******************************************************************************/
1047
1048static void
1049AcpiExDumpReferenceObj (
1050    ACPI_OPERAND_OBJECT     *ObjDesc)
1051{
1052    ACPI_BUFFER             RetBuf;
1053    ACPI_STATUS             Status;
1054
1055
1056    RetBuf.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
1057
1058    if (ObjDesc->Reference.Class == ACPI_REFCLASS_NAME)
1059    {
1060        AcpiOsPrintf (" %p ", ObjDesc->Reference.Node);
1061
1062        Status = AcpiNsHandleToPathname (ObjDesc->Reference.Node,
1063            &RetBuf, TRUE);
1064        if (ACPI_FAILURE (Status))
1065        {
1066            AcpiOsPrintf (" Could not convert name to pathname: %s\n",
1067                AcpiFormatException (Status));
1068        }
1069        else
1070        {
1071            AcpiOsPrintf ("%s: %s\n",
1072                AcpiUtGetTypeName (ObjDesc->Reference.Node->Type),
1073                (char *) RetBuf.Pointer);
1074            ACPI_FREE (RetBuf.Pointer);
1075        }
1076    }
1077    else if (ObjDesc->Reference.Object)
1078    {
1079        if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_OPERAND)
1080        {
1081            AcpiOsPrintf ("%22s %p", "Target :",
1082                ObjDesc->Reference.Object);
1083            if (ObjDesc->Reference.Class == ACPI_REFCLASS_TABLE)
1084            {
1085                AcpiOsPrintf (" Table Index: %X\n",
1086                    ObjDesc->Reference.Value);
1087            }
1088            else
1089            {
1090                AcpiOsPrintf (" [%s]\n",
1091                    AcpiUtGetTypeName (((ACPI_OPERAND_OBJECT *)
1092                    ObjDesc->Reference.Object)->Common.Type));
1093            }
1094        }
1095        else
1096        {
1097            AcpiOsPrintf (" Target: %p\n", ObjDesc->Reference.Object);
1098        }
1099    }
1100}
1101
1102
1103/*******************************************************************************
1104 *
1105 * FUNCTION:    AcpiExDumpPackageObj
1106 *
1107 * PARAMETERS:  ObjDesc             - Descriptor to dump
1108 *              Level               - Indentation Level
1109 *              Index               - Package index for this object
1110 *
1111 * DESCRIPTION: Dumps the elements of the package
1112 *
1113 ******************************************************************************/
1114
1115static void
1116AcpiExDumpPackageObj (
1117    ACPI_OPERAND_OBJECT     *ObjDesc,
1118    UINT32                  Level,
1119    UINT32                  Index)
1120{
1121    UINT32                  i;
1122
1123
1124    /* Indentation and index output */
1125
1126    if (Level > 0)
1127    {
1128        for (i = 0; i < Level; i++)
1129        {
1130            AcpiOsPrintf ("  ");
1131        }
1132
1133        AcpiOsPrintf ("[%.2d] ", Index);
1134    }
1135
1136    AcpiOsPrintf ("%p ", ObjDesc);
1137
1138    /* Null package elements are allowed */
1139
1140    if (!ObjDesc)
1141    {
1142        AcpiOsPrintf ("[Null Object]\n");
1143        return;
1144    }
1145
1146    /* Packages may only contain a few object types */
1147
1148    switch (ObjDesc->Common.Type)
1149    {
1150    case ACPI_TYPE_INTEGER:
1151
1152        AcpiOsPrintf ("[Integer] = %8.8X%8.8X\n",
1153            ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
1154        break;
1155
1156    case ACPI_TYPE_STRING:
1157
1158        AcpiOsPrintf ("[String]  Value: ");
1159        AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX);
1160        AcpiOsPrintf ("\n");
1161        break;
1162
1163    case ACPI_TYPE_BUFFER:
1164
1165        AcpiOsPrintf ("[Buffer] Length %.2X = ", ObjDesc->Buffer.Length);
1166        if (ObjDesc->Buffer.Length)
1167        {
1168            AcpiUtDebugDumpBuffer (
1169                ACPI_CAST_PTR (UINT8, ObjDesc->Buffer.Pointer),
1170                ObjDesc->Buffer.Length, DB_DWORD_DISPLAY, _COMPONENT);
1171        }
1172        else
1173        {
1174            AcpiOsPrintf ("\n");
1175        }
1176        break;
1177
1178    case ACPI_TYPE_PACKAGE:
1179
1180        AcpiOsPrintf ("[Package] Contains %u Elements:\n",
1181            ObjDesc->Package.Count);
1182
1183        for (i = 0; i < ObjDesc->Package.Count; i++)
1184        {
1185            AcpiExDumpPackageObj (
1186                ObjDesc->Package.Elements[i], Level + 1, i);
1187        }
1188        break;
1189
1190    case ACPI_TYPE_LOCAL_REFERENCE:
1191
1192        AcpiOsPrintf ("[Object Reference] Class [%s]",
1193            AcpiUtGetReferenceName (ObjDesc));
1194        AcpiExDumpReferenceObj (ObjDesc);
1195        break;
1196
1197    default:
1198
1199        AcpiOsPrintf ("[%s] Type: %2.2X\n",
1200            AcpiUtGetTypeName (ObjDesc->Common.Type), ObjDesc->Common.Type);
1201        break;
1202    }
1203}
1204
1205
1206/*******************************************************************************
1207 *
1208 * FUNCTION:    AcpiExDumpObjectDescriptor
1209 *
1210 * PARAMETERS:  ObjDesc             - Descriptor to dump
1211 *              Flags               - Force display if TRUE
1212 *
1213 * DESCRIPTION: Dumps the members of the object descriptor given.
1214 *
1215 ******************************************************************************/
1216
1217void
1218AcpiExDumpObjectDescriptor (
1219    ACPI_OPERAND_OBJECT     *ObjDesc,
1220    UINT32                  Flags)
1221{
1222    ACPI_FUNCTION_TRACE (ExDumpObjectDescriptor);
1223
1224
1225    if (!ObjDesc)
1226    {
1227        return_VOID;
1228    }
1229
1230    if (!Flags)
1231    {
1232        /* Check if debug output enabled */
1233
1234        if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_OBJECTS, _COMPONENT))
1235        {
1236            return_VOID;
1237        }
1238    }
1239
1240    if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED)
1241    {
1242        AcpiExDumpNamespaceNode ((ACPI_NAMESPACE_NODE *) ObjDesc, Flags);
1243
1244        ObjDesc = ((ACPI_NAMESPACE_NODE *) ObjDesc)->Object;
1245        if (!ObjDesc)
1246        {
1247            return_VOID;
1248        }
1249
1250        AcpiOsPrintf ("\nAttached Object %p", ObjDesc);
1251        if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED)
1252        {
1253            AcpiOsPrintf (" - Namespace Node");
1254        }
1255
1256        AcpiOsPrintf (":\n");
1257        goto DumpObject;
1258    }
1259
1260    if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND)
1261    {
1262        AcpiOsPrintf (
1263            "%p is not an ACPI operand object: [%s]\n",
1264            ObjDesc, AcpiUtGetDescriptorName (ObjDesc));
1265        return_VOID;
1266    }
1267
1268    /* Validate the object type */
1269
1270    if (ObjDesc->Common.Type > ACPI_TYPE_LOCAL_MAX)
1271    {
1272        AcpiOsPrintf ("Not a known object type: %2.2X\n",
1273            ObjDesc->Common.Type);
1274        return_VOID;
1275    }
1276
1277
1278DumpObject:
1279
1280    if (!ObjDesc)
1281    {
1282        return_VOID;
1283    }
1284
1285    /* Common Fields */
1286
1287    AcpiExDumpObject (ObjDesc, AcpiExDumpCommon);
1288
1289    /* Object-specific fields */
1290
1291    AcpiExDumpObject (ObjDesc, AcpiExDumpInfo[ObjDesc->Common.Type]);
1292
1293    if (ObjDesc->Common.Type == ACPI_TYPE_REGION)
1294    {
1295        ObjDesc = ObjDesc->Common.NextObject;
1296        if (ObjDesc->Common.Type > ACPI_TYPE_LOCAL_MAX)
1297        {
1298            AcpiOsPrintf (
1299                "Secondary object is not a known object type: %2.2X\n",
1300                ObjDesc->Common.Type);
1301
1302            return_VOID;
1303        }
1304
1305        AcpiOsPrintf ("\nExtra attached Object (%p):\n", ObjDesc);
1306        AcpiExDumpObject (ObjDesc, AcpiExDumpInfo[ObjDesc->Common.Type]);
1307    }
1308
1309    return_VOID;
1310}
1311
1312#endif
1313