exdump.c revision 306536
1/******************************************************************************
2 *
3 * Module Name: exdump - Interpreter debug output routines
4 *
5 *****************************************************************************/
6
7/*
8 * Copyright (C) 2000 - 2016, 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 MERCHANTIBILITY 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 <contrib/dev/acpica/include/acpi.h>
45#include <contrib/dev/acpica/include/accommon.h>
46#include <contrib/dev/acpica/include/acinterp.h>
47#include <contrib/dev/acpica/include/amlcode.h>
48#include <contrib/dev/acpica/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),                "Elements"},
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_UINT8,    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_UINT8,    ACPI_EXD_NSOFFSET (Flags),                      "Flags"},
318    {ACPI_EXD_UINT8,    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        Target = ACPI_ADD_PTR (UINT8, ObjDesc, Info->Offset);
406        Name = Info->Name;
407
408        switch (Info->Opcode)
409        {
410        case ACPI_EXD_INIT:
411
412            break;
413
414        case ACPI_EXD_TYPE:
415
416            AcpiOsPrintf ("%20s : %2.2X [%s]\n", "Type",
417                ObjDesc->Common.Type, AcpiUtGetObjectTypeName (ObjDesc));
418            break;
419
420        case ACPI_EXD_UINT8:
421
422            AcpiOsPrintf ("%20s : %2.2X\n", Name, *Target);
423            break;
424
425        case ACPI_EXD_UINT16:
426
427            AcpiOsPrintf ("%20s : %4.4X\n", Name, ACPI_GET16 (Target));
428            break;
429
430        case ACPI_EXD_UINT32:
431
432            AcpiOsPrintf ("%20s : %8.8X\n", Name, ACPI_GET32 (Target));
433            break;
434
435        case ACPI_EXD_UINT64:
436
437            AcpiOsPrintf ("%20s : %8.8X%8.8X\n", "Value",
438                ACPI_FORMAT_UINT64 (ACPI_GET64 (Target)));
439            break;
440
441        case ACPI_EXD_POINTER:
442        case ACPI_EXD_ADDRESS:
443
444            AcpiExOutPointer (Name, *ACPI_CAST_PTR (void *, Target));
445            break;
446
447        case ACPI_EXD_STRING:
448
449            AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX);
450            AcpiOsPrintf ("\n");
451            break;
452
453        case ACPI_EXD_BUFFER:
454
455            ACPI_DUMP_BUFFER (
456                ObjDesc->Buffer.Pointer, ObjDesc->Buffer.Length);
457            break;
458
459        case ACPI_EXD_PACKAGE:
460
461            /* Dump the package contents */
462
463            AcpiOsPrintf ("\nPackage Contents:\n");
464            AcpiExDumpPackageObj (ObjDesc, 0, 0);
465            break;
466
467        case ACPI_EXD_FIELD:
468
469            AcpiExDumpObject (ObjDesc, AcpiExDumpFieldCommon);
470            break;
471
472        case ACPI_EXD_REFERENCE:
473
474            AcpiExOutString ("Class Name", AcpiUtGetReferenceName (ObjDesc));
475            AcpiExDumpReferenceObj (ObjDesc);
476            break;
477
478        case ACPI_EXD_LIST:
479
480            Start = *ACPI_CAST_PTR (void *, Target);
481            Next = Start;
482
483            AcpiOsPrintf ("%20s : %p", Name, Next);
484            if (Next)
485            {
486                AcpiOsPrintf ("(%s %2.2X)",
487                    AcpiUtGetObjectTypeName (Next), Next->Common.Type);
488
489                while (Next->Common.NextObject)
490                {
491                    if ((Next->Common.Type == ACPI_TYPE_LOCAL_DATA) &&
492                        !Data)
493                    {
494                        Data = Next;
495                    }
496
497                    Next = Next->Common.NextObject;
498                    AcpiOsPrintf ("->%p(%s %2.2X)", Next,
499                        AcpiUtGetObjectTypeName (Next), Next->Common.Type);
500
501                    if ((Next == Start) || (Next == Data))
502                    {
503                        AcpiOsPrintf (
504                            "\n**** Error: Object list appears to be circular linked");
505                        break;
506                    }
507                }
508            }
509
510            AcpiOsPrintf ("\n");
511            break;
512
513        case ACPI_EXD_HDLR_LIST:
514
515            Start = *ACPI_CAST_PTR (void *, Target);
516            Next = Start;
517
518            AcpiOsPrintf ("%20s : %p", Name, Next);
519            if (Next)
520            {
521                AcpiOsPrintf ("(%s %2.2X)",
522                    AcpiUtGetObjectTypeName (Next),
523                    Next->AddressSpace.SpaceId);
524
525                while (Next->AddressSpace.Next)
526                {
527                    if ((Next->Common.Type == ACPI_TYPE_LOCAL_DATA) &&
528                        !Data)
529                    {
530                        Data = Next;
531                    }
532
533                    Next = Next->AddressSpace.Next;
534                    AcpiOsPrintf ("->%p(%s %2.2X)", Next,
535                        AcpiUtGetObjectTypeName (Next),
536                        Next->AddressSpace.SpaceId);
537
538                    if ((Next == Start) || (Next == Data))
539                    {
540                        AcpiOsPrintf (
541                            "\n**** Error: Handler list appears to be circular linked");
542                        break;
543                    }
544                }
545            }
546
547            AcpiOsPrintf ("\n");
548            break;
549
550        case ACPI_EXD_RGN_LIST:
551
552            Start = *ACPI_CAST_PTR (void *, Target);
553            Next = Start;
554
555            AcpiOsPrintf ("%20s : %p", Name, Next);
556            if (Next)
557            {
558                AcpiOsPrintf ("(%s %2.2X)",
559                    AcpiUtGetObjectTypeName (Next), Next->Common.Type);
560
561                while (Next->Region.Next)
562                {
563                    if ((Next->Common.Type == ACPI_TYPE_LOCAL_DATA) &&
564                        !Data)
565                    {
566                        Data = Next;
567                    }
568
569                    Next = Next->Region.Next;
570                    AcpiOsPrintf ("->%p(%s %2.2X)", Next,
571                        AcpiUtGetObjectTypeName (Next), Next->Common.Type);
572
573                    if ((Next == Start) || (Next == Data))
574                    {
575                        AcpiOsPrintf (
576                            "\n**** Error: Region list appears to be circular linked");
577                        break;
578                    }
579                }
580            }
581
582            AcpiOsPrintf ("\n");
583            break;
584
585        case ACPI_EXD_NODE:
586
587            Node = *ACPI_CAST_PTR (ACPI_NAMESPACE_NODE *, Target);
588
589            AcpiOsPrintf ("%20s : %p", Name, Node);
590            if (Node)
591            {
592                AcpiOsPrintf (" [%4.4s]", Node->Name.Ascii);
593            }
594            AcpiOsPrintf ("\n");
595            break;
596
597        default:
598
599            AcpiOsPrintf ("**** Invalid table opcode [%X] ****\n",
600                Info->Opcode);
601            return;
602        }
603
604        Info++;
605        Count--;
606    }
607}
608
609
610/*******************************************************************************
611 *
612 * FUNCTION:    AcpiExDumpOperand
613 *
614 * PARAMETERS:  *ObjDesc        - Pointer to entry to be dumped
615 *              Depth           - Current nesting depth
616 *
617 * RETURN:      None
618 *
619 * DESCRIPTION: Dump an operand object
620 *
621 ******************************************************************************/
622
623void
624AcpiExDumpOperand (
625    ACPI_OPERAND_OBJECT     *ObjDesc,
626    UINT32                  Depth)
627{
628    UINT32                  Length;
629    UINT32                  Index;
630
631
632    ACPI_FUNCTION_NAME (ExDumpOperand)
633
634
635    /* Check if debug output enabled */
636
637    if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_EXEC, _COMPONENT))
638    {
639        return;
640    }
641
642    if (!ObjDesc)
643    {
644        /* This could be a null element of a package */
645
646        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Null Object Descriptor\n"));
647        return;
648    }
649
650    if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED)
651    {
652        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p Namespace Node: ", ObjDesc));
653        ACPI_DUMP_ENTRY (ObjDesc, ACPI_LV_EXEC);
654        return;
655    }
656
657    if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND)
658    {
659        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
660            "%p is not a node or operand object: [%s]\n",
661            ObjDesc, AcpiUtGetDescriptorName (ObjDesc)));
662        ACPI_DUMP_BUFFER (ObjDesc, sizeof (ACPI_OPERAND_OBJECT));
663        return;
664    }
665
666    /* ObjDesc is a valid object */
667
668    if (Depth > 0)
669    {
670        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%*s[%u] %p ",
671            Depth, " ", Depth, ObjDesc));
672    }
673    else
674    {
675        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p ", ObjDesc));
676    }
677
678    /* Decode object type */
679
680    switch (ObjDesc->Common.Type)
681    {
682    case ACPI_TYPE_LOCAL_REFERENCE:
683
684        AcpiOsPrintf ("Reference: [%s] ",
685            AcpiUtGetReferenceName (ObjDesc));
686
687        switch (ObjDesc->Reference.Class)
688        {
689        case ACPI_REFCLASS_DEBUG:
690
691            AcpiOsPrintf ("\n");
692            break;
693
694        case ACPI_REFCLASS_INDEX:
695
696            AcpiOsPrintf ("%p\n", ObjDesc->Reference.Object);
697            break;
698
699        case ACPI_REFCLASS_TABLE:
700
701            AcpiOsPrintf ("Table Index %X\n", ObjDesc->Reference.Value);
702            break;
703
704        case ACPI_REFCLASS_REFOF:
705
706            AcpiOsPrintf ("%p [%s]\n", ObjDesc->Reference.Object,
707                AcpiUtGetTypeName (((ACPI_OPERAND_OBJECT *)
708                    ObjDesc->Reference.Object)->Common.Type));
709            break;
710
711        case ACPI_REFCLASS_NAME:
712
713            AcpiOsPrintf ("- [%4.4s]\n",
714                ObjDesc->Reference.Node->Name.Ascii);
715            break;
716
717        case ACPI_REFCLASS_ARG:
718        case ACPI_REFCLASS_LOCAL:
719
720            AcpiOsPrintf ("%X\n", ObjDesc->Reference.Value);
721            break;
722
723        default:    /* Unknown reference class */
724
725            AcpiOsPrintf ("%2.2X\n", ObjDesc->Reference.Class);
726            break;
727        }
728        break;
729
730    case ACPI_TYPE_BUFFER:
731
732        AcpiOsPrintf ("Buffer length %.2X @ %p\n",
733            ObjDesc->Buffer.Length, ObjDesc->Buffer.Pointer);
734
735        /* Debug only -- dump the buffer contents */
736
737        if (ObjDesc->Buffer.Pointer)
738        {
739            Length = ObjDesc->Buffer.Length;
740            if (Length > 128)
741            {
742                Length = 128;
743            }
744
745            AcpiOsPrintf (
746                "Buffer Contents: (displaying length 0x%.2X)\n", Length);
747            ACPI_DUMP_BUFFER (ObjDesc->Buffer.Pointer, Length);
748        }
749        break;
750
751    case ACPI_TYPE_INTEGER:
752
753        AcpiOsPrintf ("Integer %8.8X%8.8X\n",
754            ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
755        break;
756
757    case ACPI_TYPE_PACKAGE:
758
759        AcpiOsPrintf ("Package [Len %X] ElementArray %p\n",
760            ObjDesc->Package.Count, ObjDesc->Package.Elements);
761
762        /*
763         * If elements exist, package element pointer is valid,
764         * and debug_level exceeds 1, dump package's elements.
765         */
766        if (ObjDesc->Package.Count &&
767            ObjDesc->Package.Elements &&
768            AcpiDbgLevel > 1)
769        {
770            for (Index = 0; Index < ObjDesc->Package.Count; Index++)
771            {
772                AcpiExDumpOperand (
773                    ObjDesc->Package.Elements[Index], Depth + 1);
774            }
775        }
776        break;
777
778    case ACPI_TYPE_REGION:
779
780        AcpiOsPrintf ("Region %s (%X)",
781            AcpiUtGetRegionName (ObjDesc->Region.SpaceId),
782            ObjDesc->Region.SpaceId);
783
784        /*
785         * If the address and length have not been evaluated,
786         * don't print them.
787         */
788        if (!(ObjDesc->Region.Flags & AOPOBJ_DATA_VALID))
789        {
790            AcpiOsPrintf ("\n");
791        }
792        else
793        {
794            AcpiOsPrintf (" base %8.8X%8.8X Length %X\n",
795                ACPI_FORMAT_UINT64 (ObjDesc->Region.Address),
796                ObjDesc->Region.Length);
797        }
798        break;
799
800    case ACPI_TYPE_STRING:
801
802        AcpiOsPrintf ("String length %X @ %p ",
803            ObjDesc->String.Length,
804            ObjDesc->String.Pointer);
805
806        AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX);
807        AcpiOsPrintf ("\n");
808        break;
809
810    case ACPI_TYPE_LOCAL_BANK_FIELD:
811
812        AcpiOsPrintf ("BankField\n");
813        break;
814
815    case ACPI_TYPE_LOCAL_REGION_FIELD:
816
817        AcpiOsPrintf ("RegionField: Bits=%X AccWidth=%X Lock=%X Update=%X at "
818            "byte=%X bit=%X of below:\n",
819            ObjDesc->Field.BitLength,
820            ObjDesc->Field.AccessByteWidth,
821            ObjDesc->Field.FieldFlags & AML_FIELD_LOCK_RULE_MASK,
822            ObjDesc->Field.FieldFlags & AML_FIELD_UPDATE_RULE_MASK,
823            ObjDesc->Field.BaseByteOffset,
824            ObjDesc->Field.StartFieldBitOffset);
825
826        AcpiExDumpOperand (ObjDesc->Field.RegionObj, Depth + 1);
827        break;
828
829    case ACPI_TYPE_LOCAL_INDEX_FIELD:
830
831        AcpiOsPrintf ("IndexField\n");
832        break;
833
834    case ACPI_TYPE_BUFFER_FIELD:
835
836        AcpiOsPrintf ("BufferField: %X bits at byte %X bit %X of\n",
837            ObjDesc->BufferField.BitLength,
838            ObjDesc->BufferField.BaseByteOffset,
839            ObjDesc->BufferField.StartFieldBitOffset);
840
841        if (!ObjDesc->BufferField.BufferObj)
842        {
843            ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "*NULL*\n"));
844        }
845        else if ((ObjDesc->BufferField.BufferObj)->Common.Type !=
846            ACPI_TYPE_BUFFER)
847        {
848            AcpiOsPrintf ("*not a Buffer*\n");
849        }
850        else
851        {
852            AcpiExDumpOperand (ObjDesc->BufferField.BufferObj, Depth + 1);
853        }
854        break;
855
856    case ACPI_TYPE_EVENT:
857
858        AcpiOsPrintf ("Event\n");
859        break;
860
861    case ACPI_TYPE_METHOD:
862
863        AcpiOsPrintf ("Method(%X) @ %p:%X\n",
864            ObjDesc->Method.ParamCount,
865            ObjDesc->Method.AmlStart,
866            ObjDesc->Method.AmlLength);
867        break;
868
869    case ACPI_TYPE_MUTEX:
870
871        AcpiOsPrintf ("Mutex\n");
872        break;
873
874    case ACPI_TYPE_DEVICE:
875
876        AcpiOsPrintf ("Device\n");
877        break;
878
879    case ACPI_TYPE_POWER:
880
881        AcpiOsPrintf ("Power\n");
882        break;
883
884    case ACPI_TYPE_PROCESSOR:
885
886        AcpiOsPrintf ("Processor\n");
887        break;
888
889    case ACPI_TYPE_THERMAL:
890
891        AcpiOsPrintf ("Thermal\n");
892        break;
893
894    default:
895
896        /* Unknown Type */
897
898        AcpiOsPrintf ("Unknown Type %X\n", ObjDesc->Common.Type);
899        break;
900    }
901
902    return;
903}
904
905
906/*******************************************************************************
907 *
908 * FUNCTION:    AcpiExDumpOperands
909 *
910 * PARAMETERS:  Operands            - A list of Operand objects
911 *              OpcodeName          - AML opcode name
912 *              NumOperands         - Operand count for this opcode
913 *
914 * DESCRIPTION: Dump the operands associated with the opcode
915 *
916 ******************************************************************************/
917
918void
919AcpiExDumpOperands (
920    ACPI_OPERAND_OBJECT     **Operands,
921    const char              *OpcodeName,
922    UINT32                  NumOperands)
923{
924    ACPI_FUNCTION_NAME (ExDumpOperands);
925
926
927    if (!OpcodeName)
928    {
929        OpcodeName = "UNKNOWN";
930    }
931
932    ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
933        "**** Start operand dump for opcode [%s], %u operands\n",
934        OpcodeName, NumOperands));
935
936    if (NumOperands == 0)
937    {
938        NumOperands = 1;
939    }
940
941    /* Dump the individual operands */
942
943    while (NumOperands)
944    {
945        AcpiExDumpOperand (*Operands, 0);
946        Operands++;
947        NumOperands--;
948    }
949
950    ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
951        "**** End operand dump for [%s]\n", OpcodeName));
952    return;
953}
954
955
956/*******************************************************************************
957 *
958 * FUNCTION:    AcpiExOut* functions
959 *
960 * PARAMETERS:  Title               - Descriptive text
961 *              Value               - Value to be displayed
962 *
963 * DESCRIPTION: Object dump output formatting functions. These functions
964 *              reduce the number of format strings required and keeps them
965 *              all in one place for easy modification.
966 *
967 ******************************************************************************/
968
969static void
970AcpiExOutString (
971    const char              *Title,
972    const char              *Value)
973{
974    AcpiOsPrintf ("%20s : %s\n", Title, Value);
975}
976
977static void
978AcpiExOutPointer (
979    const char              *Title,
980    const void              *Value)
981{
982    AcpiOsPrintf ("%20s : %p\n", Title, Value);
983}
984
985
986/*******************************************************************************
987 *
988 * FUNCTION:    AcpiExDumpNamespaceNode
989 *
990 * PARAMETERS:  Node                - Descriptor to dump
991 *              Flags               - Force display if TRUE
992 *
993 * DESCRIPTION: Dumps the members of the given.Node
994 *
995 ******************************************************************************/
996
997void
998AcpiExDumpNamespaceNode (
999    ACPI_NAMESPACE_NODE     *Node,
1000    UINT32                  Flags)
1001{
1002
1003    ACPI_FUNCTION_ENTRY ();
1004
1005
1006    if (!Flags)
1007    {
1008        /* Check if debug output enabled */
1009
1010        if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_OBJECTS, _COMPONENT))
1011        {
1012            return;
1013        }
1014    }
1015
1016    AcpiOsPrintf ("%20s : %4.4s\n", "Name", AcpiUtGetNodeName (Node));
1017    AcpiOsPrintf ("%20s : %2.2X [%s]\n", "Type",
1018        Node->Type, AcpiUtGetTypeName (Node->Type));
1019
1020    AcpiExDumpObject (ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Node),
1021        AcpiExDumpNode);
1022}
1023
1024
1025/*******************************************************************************
1026 *
1027 * FUNCTION:    AcpiExDumpReferenceObj
1028 *
1029 * PARAMETERS:  Object              - Descriptor to dump
1030 *
1031 * DESCRIPTION: Dumps a reference object
1032 *
1033 ******************************************************************************/
1034
1035static void
1036AcpiExDumpReferenceObj (
1037    ACPI_OPERAND_OBJECT     *ObjDesc)
1038{
1039    ACPI_BUFFER             RetBuf;
1040    ACPI_STATUS             Status;
1041
1042
1043    RetBuf.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
1044
1045    if (ObjDesc->Reference.Class == ACPI_REFCLASS_NAME)
1046    {
1047        AcpiOsPrintf (" %p ", ObjDesc->Reference.Node);
1048
1049        Status = AcpiNsHandleToPathname (ObjDesc->Reference.Node,
1050            &RetBuf, TRUE);
1051        if (ACPI_FAILURE (Status))
1052        {
1053            AcpiOsPrintf (" Could not convert name to pathname\n");
1054        }
1055        else
1056        {
1057           AcpiOsPrintf ("%s\n", (char *) RetBuf.Pointer);
1058           ACPI_FREE (RetBuf.Pointer);
1059        }
1060    }
1061    else if (ObjDesc->Reference.Object)
1062    {
1063        if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_OPERAND)
1064        {
1065            AcpiOsPrintf ("%22s %p", "Target :",
1066                ObjDesc->Reference.Object);
1067            if (ObjDesc->Reference.Class == ACPI_REFCLASS_TABLE)
1068            {
1069                AcpiOsPrintf (" Table Index: %X\n",
1070                    ObjDesc->Reference.Value);
1071            }
1072            else
1073            {
1074                AcpiOsPrintf (" [%s]\n",
1075                    AcpiUtGetTypeName (((ACPI_OPERAND_OBJECT *)
1076                    ObjDesc->Reference.Object)->Common.Type));
1077            }
1078        }
1079        else
1080        {
1081            AcpiOsPrintf (" Target: %p\n", ObjDesc->Reference.Object);
1082        }
1083    }
1084}
1085
1086
1087/*******************************************************************************
1088 *
1089 * FUNCTION:    AcpiExDumpPackageObj
1090 *
1091 * PARAMETERS:  ObjDesc             - Descriptor to dump
1092 *              Level               - Indentation Level
1093 *              Index               - Package index for this object
1094 *
1095 * DESCRIPTION: Dumps the elements of the package
1096 *
1097 ******************************************************************************/
1098
1099static void
1100AcpiExDumpPackageObj (
1101    ACPI_OPERAND_OBJECT     *ObjDesc,
1102    UINT32                  Level,
1103    UINT32                  Index)
1104{
1105    UINT32                  i;
1106
1107
1108    /* Indentation and index output */
1109
1110    if (Level > 0)
1111    {
1112        for (i = 0; i < Level; i++)
1113        {
1114            AcpiOsPrintf ("  ");
1115        }
1116
1117        AcpiOsPrintf ("[%.2d] ", Index);
1118    }
1119
1120    AcpiOsPrintf ("%p ", ObjDesc);
1121
1122    /* Null package elements are allowed */
1123
1124    if (!ObjDesc)
1125    {
1126        AcpiOsPrintf ("[Null Object]\n");
1127        return;
1128    }
1129
1130    /* Packages may only contain a few object types */
1131
1132    switch (ObjDesc->Common.Type)
1133    {
1134    case ACPI_TYPE_INTEGER:
1135
1136        AcpiOsPrintf ("[Integer] = %8.8X%8.8X\n",
1137            ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
1138        break;
1139
1140    case ACPI_TYPE_STRING:
1141
1142        AcpiOsPrintf ("[String]  Value: ");
1143        AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX);
1144        AcpiOsPrintf ("\n");
1145        break;
1146
1147    case ACPI_TYPE_BUFFER:
1148
1149        AcpiOsPrintf ("[Buffer] Length %.2X = ", ObjDesc->Buffer.Length);
1150        if (ObjDesc->Buffer.Length)
1151        {
1152            AcpiUtDebugDumpBuffer (
1153                ACPI_CAST_PTR (UINT8, ObjDesc->Buffer.Pointer),
1154                ObjDesc->Buffer.Length, DB_DWORD_DISPLAY, _COMPONENT);
1155        }
1156        else
1157        {
1158            AcpiOsPrintf ("\n");
1159        }
1160        break;
1161
1162    case ACPI_TYPE_PACKAGE:
1163
1164        AcpiOsPrintf ("[Package] Contains %u Elements:\n",
1165            ObjDesc->Package.Count);
1166
1167        for (i = 0; i < ObjDesc->Package.Count; i++)
1168        {
1169            AcpiExDumpPackageObj (
1170                ObjDesc->Package.Elements[i], Level + 1, i);
1171        }
1172        break;
1173
1174    case ACPI_TYPE_LOCAL_REFERENCE:
1175
1176        AcpiOsPrintf ("[Object Reference] Type [%s] %2.2X",
1177            AcpiUtGetReferenceName (ObjDesc),
1178            ObjDesc->Reference.Class);
1179        AcpiExDumpReferenceObj (ObjDesc);
1180        break;
1181
1182    default:
1183
1184        AcpiOsPrintf ("[Unknown Type] %X\n", ObjDesc->Common.Type);
1185        break;
1186    }
1187}
1188
1189
1190/*******************************************************************************
1191 *
1192 * FUNCTION:    AcpiExDumpObjectDescriptor
1193 *
1194 * PARAMETERS:  ObjDesc             - Descriptor to dump
1195 *              Flags               - Force display if TRUE
1196 *
1197 * DESCRIPTION: Dumps the members of the object descriptor given.
1198 *
1199 ******************************************************************************/
1200
1201void
1202AcpiExDumpObjectDescriptor (
1203    ACPI_OPERAND_OBJECT     *ObjDesc,
1204    UINT32                  Flags)
1205{
1206    ACPI_FUNCTION_TRACE (ExDumpObjectDescriptor);
1207
1208
1209    if (!ObjDesc)
1210    {
1211        return_VOID;
1212    }
1213
1214    if (!Flags)
1215    {
1216        /* Check if debug output enabled */
1217
1218        if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_OBJECTS, _COMPONENT))
1219        {
1220            return_VOID;
1221        }
1222    }
1223
1224    if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED)
1225    {
1226        AcpiExDumpNamespaceNode ((ACPI_NAMESPACE_NODE *) ObjDesc, Flags);
1227
1228        AcpiOsPrintf ("\nAttached Object (%p):\n",
1229            ((ACPI_NAMESPACE_NODE *) ObjDesc)->Object);
1230
1231        ObjDesc = ((ACPI_NAMESPACE_NODE *) ObjDesc)->Object;
1232        goto DumpObject;
1233    }
1234
1235    if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND)
1236    {
1237        AcpiOsPrintf (
1238            "%p is not an ACPI operand object: [%s]\n",
1239            ObjDesc, AcpiUtGetDescriptorName (ObjDesc));
1240        return_VOID;
1241    }
1242
1243    /* Validate the object type */
1244
1245    if (ObjDesc->Common.Type > ACPI_TYPE_LOCAL_MAX)
1246    {
1247        AcpiOsPrintf ("Not a known object type: %2.2X\n",
1248            ObjDesc->Common.Type);
1249        return_VOID;
1250    }
1251
1252
1253DumpObject:
1254
1255    /* Common Fields */
1256
1257    AcpiExDumpObject (ObjDesc, AcpiExDumpCommon);
1258
1259    /* Object-specific fields */
1260
1261    AcpiExDumpObject (ObjDesc, AcpiExDumpInfo[ObjDesc->Common.Type]);
1262
1263    if (ObjDesc->Common.Type == ACPI_TYPE_REGION)
1264    {
1265        ObjDesc = ObjDesc->Common.NextObject;
1266        if (ObjDesc->Common.Type > ACPI_TYPE_LOCAL_MAX)
1267        {
1268            AcpiOsPrintf (
1269                "Secondary object is not a known object type: %2.2X\n",
1270                ObjDesc->Common.Type);
1271
1272            return_VOID;
1273        }
1274
1275        AcpiOsPrintf ("\nExtra attached Object (%p):\n", ObjDesc);
1276        AcpiExDumpObject (ObjDesc, AcpiExDumpInfo[ObjDesc->Common.Type]);
1277    }
1278
1279    return_VOID;
1280}
1281
1282#endif
1283