exdump.c revision 281075
1/******************************************************************************
2 *
3 * Module Name: exdump - Interpreter debug output routines
4 *
5 *****************************************************************************/
6
7/*
8 * Copyright (C) 2000 - 2015, 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    char                    *Title,
64    char                    *Value);
65
66static void
67AcpiExOutPointer (
68    char                    *Title,
69    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[8] =
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_REFERENCE,0,                                              NULL}
251};
252
253static ACPI_EXDUMP_INFO     AcpiExDumpAddressHandler[6] =
254{
255    {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpAddressHandler), NULL},
256    {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (AddressSpace.SpaceId),         "Space Id"},
257    {ACPI_EXD_HDLR_LIST,ACPI_EXD_OFFSET (AddressSpace.Next),            "Next"},
258    {ACPI_EXD_RGN_LIST, ACPI_EXD_OFFSET (AddressSpace.RegionList),      "Region List"},
259    {ACPI_EXD_NODE,     ACPI_EXD_OFFSET (AddressSpace.Node),            "Node"},
260    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (AddressSpace.Context),         "Context"}
261};
262
263static ACPI_EXDUMP_INFO     AcpiExDumpNotify[7] =
264{
265    {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpNotify),         NULL},
266    {ACPI_EXD_NODE,     ACPI_EXD_OFFSET (Notify.Node),                  "Node"},
267    {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (Notify.HandlerType),           "Handler Type"},
268    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Notify.Handler),               "Handler"},
269    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Notify.Context),               "Context"},
270    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Notify.Next[0]),               "Next System Notify"},
271    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Notify.Next[1]),               "Next Device Notify"}
272};
273
274static ACPI_EXDUMP_INFO     AcpiExDumpExtra[6] =
275{
276    {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpExtra),          NULL},
277    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Extra.Method_REG),             "_REG Method"},
278    {ACPI_EXD_NODE,     ACPI_EXD_OFFSET (Extra.ScopeNode),              "Scope Node"},
279    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Extra.RegionContext),          "Region Context"},
280    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Extra.AmlStart),               "Aml Start"},
281    {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (Extra.AmlLength),              "Aml Length"}
282};
283
284static ACPI_EXDUMP_INFO     AcpiExDumpData[3] =
285{
286    {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpData),           NULL},
287    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Data.Handler),                 "Handler"},
288    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Data.Pointer),                 "Raw Data"}
289};
290
291/* Miscellaneous tables */
292
293static ACPI_EXDUMP_INFO     AcpiExDumpCommon[5] =
294{
295    {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpCommon),         NULL},
296    {ACPI_EXD_TYPE ,    0,                                              NULL},
297    {ACPI_EXD_UINT16,   ACPI_EXD_OFFSET (Common.ReferenceCount),        "Reference Count"},
298    {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Common.Flags),                 "Flags"},
299    {ACPI_EXD_LIST,     ACPI_EXD_OFFSET (Common.NextObject),            "Object List"}
300};
301
302static ACPI_EXDUMP_INFO     AcpiExDumpFieldCommon[7] =
303{
304    {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpFieldCommon),    NULL},
305    {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (CommonField.FieldFlags),       "Field Flags"},
306    {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (CommonField.AccessByteWidth),  "Access Byte Width"},
307    {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (CommonField.BitLength),        "Bit Length"},
308    {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (CommonField.StartFieldBitOffset),"Field Bit Offset"},
309    {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (CommonField.BaseByteOffset),   "Base Byte Offset"},
310    {ACPI_EXD_NODE,     ACPI_EXD_OFFSET (CommonField.Node),             "Parent Node"}
311};
312
313static ACPI_EXDUMP_INFO     AcpiExDumpNode[7] =
314{
315    {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpNode),           NULL},
316    {ACPI_EXD_UINT8,    ACPI_EXD_NSOFFSET (Flags),                      "Flags"},
317    {ACPI_EXD_UINT8,    ACPI_EXD_NSOFFSET (OwnerId),                    "Owner Id"},
318    {ACPI_EXD_LIST,     ACPI_EXD_NSOFFSET (Object),                     "Object List"},
319    {ACPI_EXD_NODE,     ACPI_EXD_NSOFFSET (Parent),                     "Parent"},
320    {ACPI_EXD_NODE,     ACPI_EXD_NSOFFSET (Child),                      "Child"},
321    {ACPI_EXD_NODE,     ACPI_EXD_NSOFFSET (Peer),                       "Peer"}
322};
323
324
325/* Dispatch table, indexed by object type */
326
327static ACPI_EXDUMP_INFO     *AcpiExDumpInfo[] =
328{
329    NULL,
330    AcpiExDumpInteger,
331    AcpiExDumpString,
332    AcpiExDumpBuffer,
333    AcpiExDumpPackage,
334    NULL,
335    AcpiExDumpDevice,
336    AcpiExDumpEvent,
337    AcpiExDumpMethod,
338    AcpiExDumpMutex,
339    AcpiExDumpRegion,
340    AcpiExDumpPower,
341    AcpiExDumpProcessor,
342    AcpiExDumpThermal,
343    AcpiExDumpBufferField,
344    NULL,
345    NULL,
346    AcpiExDumpRegionField,
347    AcpiExDumpBankField,
348    AcpiExDumpIndexField,
349    AcpiExDumpReference,
350    NULL,
351    NULL,
352    AcpiExDumpNotify,
353    AcpiExDumpAddressHandler,
354    NULL,
355    NULL,
356    NULL,
357    AcpiExDumpExtra,
358    AcpiExDumpData
359};
360
361
362/*******************************************************************************
363 *
364 * FUNCTION:    AcpiExDumpObject
365 *
366 * PARAMETERS:  ObjDesc             - Descriptor to dump
367 *              Info                - Info table corresponding to this object
368 *                                    type
369 *
370 * RETURN:      None
371 *
372 * DESCRIPTION: Walk the info table for this object
373 *
374 ******************************************************************************/
375
376static void
377AcpiExDumpObject (
378    ACPI_OPERAND_OBJECT     *ObjDesc,
379    ACPI_EXDUMP_INFO        *Info)
380{
381    UINT8                   *Target;
382    char                    *Name;
383    const char              *ReferenceName;
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 (ObjDesc->Buffer.Pointer, ObjDesc->Buffer.Length);
456            break;
457
458        case ACPI_EXD_PACKAGE:
459
460            /* Dump the package contents */
461
462            AcpiOsPrintf ("\nPackage Contents:\n");
463            AcpiExDumpPackageObj (ObjDesc, 0, 0);
464            break;
465
466        case ACPI_EXD_FIELD:
467
468            AcpiExDumpObject (ObjDesc, AcpiExDumpFieldCommon);
469            break;
470
471        case ACPI_EXD_REFERENCE:
472
473            ReferenceName = AcpiUtGetReferenceName (ObjDesc);
474            AcpiExOutString ("Class Name", ACPI_CAST_PTR (char, ReferenceName));
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 ("\n**** Error: Object list appears to be circular linked");
504                        break;
505                    }
506                }
507            }
508
509            AcpiOsPrintf ("\n");
510            break;
511
512        case ACPI_EXD_HDLR_LIST:
513
514            Start = *ACPI_CAST_PTR (void *, Target);
515            Next = Start;
516
517            AcpiOsPrintf ("%20s : %p", Name, Next);
518            if (Next)
519            {
520                AcpiOsPrintf ("(%s %2.2X)",
521                    AcpiUtGetObjectTypeName (Next), Next->Common.Type);
522
523                while (Next->AddressSpace.Next)
524                {
525                    if ((Next->Common.Type == ACPI_TYPE_LOCAL_DATA) &&
526                        !Data)
527                    {
528                        Data = Next;
529                    }
530
531                    Next = Next->AddressSpace.Next;
532                    AcpiOsPrintf ("->%p(%s %2.2X)", Next,
533                        AcpiUtGetObjectTypeName (Next), Next->Common.Type);
534
535                    if ((Next == Start) || (Next == Data))
536                    {
537                        AcpiOsPrintf ("\n**** Error: Handler list appears to be circular linked");
538                        break;
539                    }
540                }
541            }
542
543            AcpiOsPrintf ("\n");
544            break;
545
546        case ACPI_EXD_RGN_LIST:
547
548            Start = *ACPI_CAST_PTR (void *, Target);
549            Next = Start;
550
551            AcpiOsPrintf ("%20s : %p", Name, Next);
552            if (Next)
553            {
554                AcpiOsPrintf ("(%s %2.2X)",
555                    AcpiUtGetObjectTypeName (Next), Next->Common.Type);
556
557                while (Next->Region.Next)
558                {
559                    if ((Next->Common.Type == ACPI_TYPE_LOCAL_DATA) &&
560                        !Data)
561                    {
562                        Data = Next;
563                    }
564
565                    Next = Next->Region.Next;
566                    AcpiOsPrintf ("->%p(%s %2.2X)", Next,
567                        AcpiUtGetObjectTypeName (Next), Next->Common.Type);
568
569                    if ((Next == Start) || (Next == Data))
570                    {
571                        AcpiOsPrintf ("\n**** Error: Region list appears to be circular linked");
572                        break;
573                    }
574                }
575            }
576
577            AcpiOsPrintf ("\n");
578            break;
579
580        case ACPI_EXD_NODE:
581
582            Node = *ACPI_CAST_PTR (ACPI_NAMESPACE_NODE *, Target);
583
584            AcpiOsPrintf ("%20s : %p", Name, Node);
585            if (Node)
586            {
587                AcpiOsPrintf (" [%4.4s]", Node->Name.Ascii);
588            }
589            AcpiOsPrintf ("\n");
590            break;
591
592        default:
593
594            AcpiOsPrintf ("**** Invalid table opcode [%X] ****\n",
595                Info->Opcode);
596            return;
597        }
598
599        Info++;
600        Count--;
601    }
602}
603
604
605/*******************************************************************************
606 *
607 * FUNCTION:    AcpiExDumpOperand
608 *
609 * PARAMETERS:  *ObjDesc        - Pointer to entry to be dumped
610 *              Depth           - Current nesting depth
611 *
612 * RETURN:      None
613 *
614 * DESCRIPTION: Dump an operand object
615 *
616 ******************************************************************************/
617
618void
619AcpiExDumpOperand (
620    ACPI_OPERAND_OBJECT     *ObjDesc,
621    UINT32                  Depth)
622{
623    UINT32                  Length;
624    UINT32                  Index;
625
626
627    ACPI_FUNCTION_NAME (ExDumpOperand)
628
629
630    /* Check if debug output enabled */
631
632    if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_EXEC, _COMPONENT))
633    {
634        return;
635    }
636
637    if (!ObjDesc)
638    {
639        /* This could be a null element of a package */
640
641        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Null Object Descriptor\n"));
642        return;
643    }
644
645    if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED)
646    {
647        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p Namespace Node: ", ObjDesc));
648        ACPI_DUMP_ENTRY (ObjDesc, ACPI_LV_EXEC);
649        return;
650    }
651
652    if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND)
653    {
654        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
655            "%p is not a node or operand object: [%s]\n",
656            ObjDesc, AcpiUtGetDescriptorName (ObjDesc)));
657        ACPI_DUMP_BUFFER (ObjDesc, sizeof (ACPI_OPERAND_OBJECT));
658        return;
659    }
660
661    /* ObjDesc is a valid object */
662
663    if (Depth > 0)
664    {
665        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%*s[%u] %p ",
666            Depth, " ", Depth, ObjDesc));
667    }
668    else
669    {
670        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p ", ObjDesc));
671    }
672
673    /* Decode object type */
674
675    switch (ObjDesc->Common.Type)
676    {
677    case ACPI_TYPE_LOCAL_REFERENCE:
678
679        AcpiOsPrintf ("Reference: [%s] ", AcpiUtGetReferenceName (ObjDesc));
680
681        switch (ObjDesc->Reference.Class)
682        {
683        case ACPI_REFCLASS_DEBUG:
684
685            AcpiOsPrintf ("\n");
686            break;
687
688        case ACPI_REFCLASS_INDEX:
689
690            AcpiOsPrintf ("%p\n", ObjDesc->Reference.Object);
691            break;
692
693        case ACPI_REFCLASS_TABLE:
694
695            AcpiOsPrintf ("Table Index %X\n", ObjDesc->Reference.Value);
696            break;
697
698        case ACPI_REFCLASS_REFOF:
699
700            AcpiOsPrintf ("%p [%s]\n", ObjDesc->Reference.Object,
701                AcpiUtGetTypeName (((ACPI_OPERAND_OBJECT *)
702                    ObjDesc->Reference.Object)->Common.Type));
703            break;
704
705        case ACPI_REFCLASS_NAME:
706
707            AcpiOsPrintf ("- [%4.4s]\n", ObjDesc->Reference.Node->Name.Ascii);
708            break;
709
710        case ACPI_REFCLASS_ARG:
711        case ACPI_REFCLASS_LOCAL:
712
713            AcpiOsPrintf ("%X\n", ObjDesc->Reference.Value);
714            break;
715
716        default:    /* Unknown reference class */
717
718            AcpiOsPrintf ("%2.2X\n", ObjDesc->Reference.Class);
719            break;
720        }
721        break;
722
723    case ACPI_TYPE_BUFFER:
724
725        AcpiOsPrintf ("Buffer length %.2X @ %p\n",
726            ObjDesc->Buffer.Length, ObjDesc->Buffer.Pointer);
727
728        /* Debug only -- dump the buffer contents */
729
730        if (ObjDesc->Buffer.Pointer)
731        {
732            Length = ObjDesc->Buffer.Length;
733            if (Length > 128)
734            {
735                Length = 128;
736            }
737
738            AcpiOsPrintf ("Buffer Contents: (displaying length 0x%.2X)\n",
739                Length);
740            ACPI_DUMP_BUFFER (ObjDesc->Buffer.Pointer, Length);
741        }
742        break;
743
744    case ACPI_TYPE_INTEGER:
745
746        AcpiOsPrintf ("Integer %8.8X%8.8X\n",
747            ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
748        break;
749
750    case ACPI_TYPE_PACKAGE:
751
752        AcpiOsPrintf ("Package [Len %X] ElementArray %p\n",
753            ObjDesc->Package.Count, ObjDesc->Package.Elements);
754
755        /*
756         * If elements exist, package element pointer is valid,
757         * and debug_level exceeds 1, dump package's elements.
758         */
759        if (ObjDesc->Package.Count &&
760            ObjDesc->Package.Elements &&
761            AcpiDbgLevel > 1)
762        {
763            for (Index = 0; Index < ObjDesc->Package.Count; Index++)
764            {
765                AcpiExDumpOperand (ObjDesc->Package.Elements[Index], Depth+1);
766            }
767        }
768        break;
769
770    case ACPI_TYPE_REGION:
771
772        AcpiOsPrintf ("Region %s (%X)",
773            AcpiUtGetRegionName (ObjDesc->Region.SpaceId),
774            ObjDesc->Region.SpaceId);
775
776        /*
777         * If the address and length have not been evaluated,
778         * don't print them.
779         */
780        if (!(ObjDesc->Region.Flags & AOPOBJ_DATA_VALID))
781        {
782            AcpiOsPrintf ("\n");
783        }
784        else
785        {
786            AcpiOsPrintf (" base %8.8X%8.8X Length %X\n",
787                ACPI_FORMAT_NATIVE_UINT (ObjDesc->Region.Address),
788                ObjDesc->Region.Length);
789        }
790        break;
791
792    case ACPI_TYPE_STRING:
793
794        AcpiOsPrintf ("String length %X @ %p ",
795            ObjDesc->String.Length,
796            ObjDesc->String.Pointer);
797
798        AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX);
799        AcpiOsPrintf ("\n");
800        break;
801
802    case ACPI_TYPE_LOCAL_BANK_FIELD:
803
804        AcpiOsPrintf ("BankField\n");
805        break;
806
807    case ACPI_TYPE_LOCAL_REGION_FIELD:
808
809        AcpiOsPrintf ("RegionField: Bits=%X AccWidth=%X Lock=%X Update=%X at "
810            "byte=%X bit=%X of below:\n",
811            ObjDesc->Field.BitLength,
812            ObjDesc->Field.AccessByteWidth,
813            ObjDesc->Field.FieldFlags & AML_FIELD_LOCK_RULE_MASK,
814            ObjDesc->Field.FieldFlags & AML_FIELD_UPDATE_RULE_MASK,
815            ObjDesc->Field.BaseByteOffset,
816            ObjDesc->Field.StartFieldBitOffset);
817
818        AcpiExDumpOperand (ObjDesc->Field.RegionObj, Depth+1);
819        break;
820
821    case ACPI_TYPE_LOCAL_INDEX_FIELD:
822
823        AcpiOsPrintf ("IndexField\n");
824        break;
825
826    case ACPI_TYPE_BUFFER_FIELD:
827
828        AcpiOsPrintf ("BufferField: %X bits at byte %X bit %X of\n",
829            ObjDesc->BufferField.BitLength,
830            ObjDesc->BufferField.BaseByteOffset,
831            ObjDesc->BufferField.StartFieldBitOffset);
832
833        if (!ObjDesc->BufferField.BufferObj)
834        {
835            ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "*NULL*\n"));
836        }
837        else if ((ObjDesc->BufferField.BufferObj)->Common.Type !=
838                    ACPI_TYPE_BUFFER)
839        {
840            AcpiOsPrintf ("*not a Buffer*\n");
841        }
842        else
843        {
844            AcpiExDumpOperand (ObjDesc->BufferField.BufferObj, Depth+1);
845        }
846        break;
847
848    case ACPI_TYPE_EVENT:
849
850        AcpiOsPrintf ("Event\n");
851        break;
852
853    case ACPI_TYPE_METHOD:
854
855        AcpiOsPrintf ("Method(%X) @ %p:%X\n",
856            ObjDesc->Method.ParamCount,
857            ObjDesc->Method.AmlStart,
858            ObjDesc->Method.AmlLength);
859        break;
860
861    case ACPI_TYPE_MUTEX:
862
863        AcpiOsPrintf ("Mutex\n");
864        break;
865
866    case ACPI_TYPE_DEVICE:
867
868        AcpiOsPrintf ("Device\n");
869        break;
870
871    case ACPI_TYPE_POWER:
872
873        AcpiOsPrintf ("Power\n");
874        break;
875
876    case ACPI_TYPE_PROCESSOR:
877
878        AcpiOsPrintf ("Processor\n");
879        break;
880
881    case ACPI_TYPE_THERMAL:
882
883        AcpiOsPrintf ("Thermal\n");
884        break;
885
886    default:
887
888        /* Unknown Type */
889
890        AcpiOsPrintf ("Unknown Type %X\n", ObjDesc->Common.Type);
891        break;
892    }
893
894    return;
895}
896
897
898/*******************************************************************************
899 *
900 * FUNCTION:    AcpiExDumpOperands
901 *
902 * PARAMETERS:  Operands            - A list of Operand objects
903 *              OpcodeName          - AML opcode name
904 *              NumOperands         - Operand count for this opcode
905 *
906 * DESCRIPTION: Dump the operands associated with the opcode
907 *
908 ******************************************************************************/
909
910void
911AcpiExDumpOperands (
912    ACPI_OPERAND_OBJECT     **Operands,
913    const char              *OpcodeName,
914    UINT32                  NumOperands)
915{
916    ACPI_FUNCTION_NAME (ExDumpOperands);
917
918
919    if (!OpcodeName)
920    {
921        OpcodeName = "UNKNOWN";
922    }
923
924    ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
925        "**** Start operand dump for opcode [%s], %u operands\n",
926        OpcodeName, NumOperands));
927
928    if (NumOperands == 0)
929    {
930        NumOperands = 1;
931    }
932
933    /* Dump the individual operands */
934
935    while (NumOperands)
936    {
937        AcpiExDumpOperand (*Operands, 0);
938        Operands++;
939        NumOperands--;
940    }
941
942    ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
943        "**** End operand dump for [%s]\n", OpcodeName));
944    return;
945}
946
947
948/*******************************************************************************
949 *
950 * FUNCTION:    AcpiExOut* functions
951 *
952 * PARAMETERS:  Title               - Descriptive text
953 *              Value               - Value to be displayed
954 *
955 * DESCRIPTION: Object dump output formatting functions. These functions
956 *              reduce the number of format strings required and keeps them
957 *              all in one place for easy modification.
958 *
959 ******************************************************************************/
960
961static void
962AcpiExOutString (
963    char                    *Title,
964    char                    *Value)
965{
966    AcpiOsPrintf ("%20s : %s\n", Title, Value);
967}
968
969static void
970AcpiExOutPointer (
971    char                    *Title,
972    void                    *Value)
973{
974    AcpiOsPrintf ("%20s : %p\n", Title, Value);
975}
976
977
978/*******************************************************************************
979 *
980 * FUNCTION:    AcpiExDumpNamespaceNode
981 *
982 * PARAMETERS:  Node                - Descriptor to dump
983 *              Flags               - Force display if TRUE
984 *
985 * DESCRIPTION: Dumps the members of the given.Node
986 *
987 ******************************************************************************/
988
989void
990AcpiExDumpNamespaceNode (
991    ACPI_NAMESPACE_NODE     *Node,
992    UINT32                  Flags)
993{
994
995    ACPI_FUNCTION_ENTRY ();
996
997
998    if (!Flags)
999    {
1000        /* Check if debug output enabled */
1001
1002        if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_OBJECTS, _COMPONENT))
1003        {
1004            return;
1005        }
1006    }
1007
1008    AcpiOsPrintf ("%20s : %4.4s\n", "Name", AcpiUtGetNodeName (Node));
1009    AcpiOsPrintf ("%20s : %2.2X [%s]\n", "Type",
1010        Node->Type, AcpiUtGetTypeName (Node->Type));
1011
1012    AcpiExDumpObject (ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Node),
1013        AcpiExDumpNode);
1014}
1015
1016
1017/*******************************************************************************
1018 *
1019 * FUNCTION:    AcpiExDumpReferenceObj
1020 *
1021 * PARAMETERS:  Object              - Descriptor to dump
1022 *
1023 * DESCRIPTION: Dumps a reference object
1024 *
1025 ******************************************************************************/
1026
1027static void
1028AcpiExDumpReferenceObj (
1029    ACPI_OPERAND_OBJECT     *ObjDesc)
1030{
1031    ACPI_BUFFER             RetBuf;
1032    ACPI_STATUS             Status;
1033
1034
1035    RetBuf.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
1036
1037    if (ObjDesc->Reference.Class == ACPI_REFCLASS_NAME)
1038    {
1039        AcpiOsPrintf (" %p ", ObjDesc->Reference.Node);
1040
1041        Status = AcpiNsHandleToPathname (ObjDesc->Reference.Node, &RetBuf);
1042        if (ACPI_FAILURE (Status))
1043        {
1044            AcpiOsPrintf (" Could not convert name to pathname\n");
1045        }
1046        else
1047        {
1048           AcpiOsPrintf ("%s\n", (char *) RetBuf.Pointer);
1049           ACPI_FREE (RetBuf.Pointer);
1050        }
1051    }
1052    else if (ObjDesc->Reference.Object)
1053    {
1054        if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_OPERAND)
1055        {
1056            AcpiOsPrintf (" Target: %p", ObjDesc->Reference.Object);
1057            if (ObjDesc->Reference.Class == ACPI_REFCLASS_TABLE)
1058            {
1059                AcpiOsPrintf (" Table Index: %X\n", ObjDesc->Reference.Value);
1060            }
1061            else
1062            {
1063                AcpiOsPrintf (" Target: %p [%s]\n", ObjDesc->Reference.Object,
1064                    AcpiUtGetTypeName (((ACPI_OPERAND_OBJECT *)
1065                        ObjDesc->Reference.Object)->Common.Type));
1066            }
1067        }
1068        else
1069        {
1070            AcpiOsPrintf (" Target: %p\n", ObjDesc->Reference.Object);
1071        }
1072    }
1073}
1074
1075
1076/*******************************************************************************
1077 *
1078 * FUNCTION:    AcpiExDumpPackageObj
1079 *
1080 * PARAMETERS:  ObjDesc             - Descriptor to dump
1081 *              Level               - Indentation Level
1082 *              Index               - Package index for this object
1083 *
1084 * DESCRIPTION: Dumps the elements of the package
1085 *
1086 ******************************************************************************/
1087
1088static void
1089AcpiExDumpPackageObj (
1090    ACPI_OPERAND_OBJECT     *ObjDesc,
1091    UINT32                  Level,
1092    UINT32                  Index)
1093{
1094    UINT32                  i;
1095
1096
1097    /* Indentation and index output */
1098
1099    if (Level > 0)
1100    {
1101        for (i = 0; i < Level; i++)
1102        {
1103            AcpiOsPrintf ("  ");
1104        }
1105
1106        AcpiOsPrintf ("[%.2d] ", Index);
1107    }
1108
1109    AcpiOsPrintf ("%p ", ObjDesc);
1110
1111    /* Null package elements are allowed */
1112
1113    if (!ObjDesc)
1114    {
1115        AcpiOsPrintf ("[Null Object]\n");
1116        return;
1117    }
1118
1119    /* Packages may only contain a few object types */
1120
1121    switch (ObjDesc->Common.Type)
1122    {
1123    case ACPI_TYPE_INTEGER:
1124
1125        AcpiOsPrintf ("[Integer] = %8.8X%8.8X\n",
1126            ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
1127        break;
1128
1129    case ACPI_TYPE_STRING:
1130
1131        AcpiOsPrintf ("[String]  Value: ");
1132        AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX);
1133        AcpiOsPrintf ("\n");
1134        break;
1135
1136    case ACPI_TYPE_BUFFER:
1137
1138        AcpiOsPrintf ("[Buffer] Length %.2X = ", ObjDesc->Buffer.Length);
1139        if (ObjDesc->Buffer.Length)
1140        {
1141            AcpiUtDebugDumpBuffer (ACPI_CAST_PTR (UINT8, ObjDesc->Buffer.Pointer),
1142                ObjDesc->Buffer.Length, DB_DWORD_DISPLAY, _COMPONENT);
1143        }
1144        else
1145        {
1146            AcpiOsPrintf ("\n");
1147        }
1148        break;
1149
1150    case ACPI_TYPE_PACKAGE:
1151
1152        AcpiOsPrintf ("[Package] Contains %u Elements:\n",
1153            ObjDesc->Package.Count);
1154
1155        for (i = 0; i < ObjDesc->Package.Count; i++)
1156        {
1157            AcpiExDumpPackageObj (ObjDesc->Package.Elements[i], Level+1, i);
1158        }
1159        break;
1160
1161    case ACPI_TYPE_LOCAL_REFERENCE:
1162
1163        AcpiOsPrintf ("[Object Reference] Type [%s] %2.2X",
1164            AcpiUtGetReferenceName (ObjDesc),
1165            ObjDesc->Reference.Class);
1166        AcpiExDumpReferenceObj (ObjDesc);
1167        break;
1168
1169    default:
1170
1171        AcpiOsPrintf ("[Unknown Type] %X\n", ObjDesc->Common.Type);
1172        break;
1173    }
1174}
1175
1176
1177/*******************************************************************************
1178 *
1179 * FUNCTION:    AcpiExDumpObjectDescriptor
1180 *
1181 * PARAMETERS:  ObjDesc             - Descriptor to dump
1182 *              Flags               - Force display if TRUE
1183 *
1184 * DESCRIPTION: Dumps the members of the object descriptor given.
1185 *
1186 ******************************************************************************/
1187
1188void
1189AcpiExDumpObjectDescriptor (
1190    ACPI_OPERAND_OBJECT     *ObjDesc,
1191    UINT32                  Flags)
1192{
1193    ACPI_FUNCTION_TRACE (ExDumpObjectDescriptor);
1194
1195
1196    if (!ObjDesc)
1197    {
1198        return_VOID;
1199    }
1200
1201    if (!Flags)
1202    {
1203        /* Check if debug output enabled */
1204
1205        if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_OBJECTS, _COMPONENT))
1206        {
1207            return_VOID;
1208        }
1209    }
1210
1211    if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED)
1212    {
1213        AcpiExDumpNamespaceNode ((ACPI_NAMESPACE_NODE *) ObjDesc, Flags);
1214
1215        AcpiOsPrintf ("\nAttached Object (%p):\n",
1216            ((ACPI_NAMESPACE_NODE *) ObjDesc)->Object);
1217
1218        ObjDesc = ((ACPI_NAMESPACE_NODE *) ObjDesc)->Object;
1219        goto DumpObject;
1220    }
1221
1222    if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND)
1223    {
1224        AcpiOsPrintf (
1225            "%p is not an ACPI operand object: [%s]\n",
1226            ObjDesc, AcpiUtGetDescriptorName (ObjDesc));
1227        return_VOID;
1228    }
1229
1230    /* Validate the object type */
1231
1232    if (ObjDesc->Common.Type > ACPI_TYPE_LOCAL_MAX)
1233    {
1234        AcpiOsPrintf ("Not a known object type: %2.2X\n",
1235            ObjDesc->Common.Type);
1236        return_VOID;
1237    }
1238
1239
1240DumpObject:
1241
1242    /* Common Fields */
1243
1244    AcpiExDumpObject (ObjDesc, AcpiExDumpCommon);
1245
1246    /* Object-specific fields */
1247
1248    AcpiExDumpObject (ObjDesc, AcpiExDumpInfo[ObjDesc->Common.Type]);
1249
1250    if (ObjDesc->Common.Type == ACPI_TYPE_REGION)
1251    {
1252        ObjDesc = ObjDesc->Common.NextObject;
1253        if (ObjDesc->Common.Type > ACPI_TYPE_LOCAL_MAX)
1254        {
1255            AcpiOsPrintf ("Secondary object is not a known object type: %2.2X\n",
1256                ObjDesc->Common.Type);
1257
1258            return_VOID;
1259        }
1260
1261        AcpiOsPrintf ("\nExtra attached Object (%p):\n", ObjDesc);
1262        AcpiExDumpObject (ObjDesc, AcpiExDumpInfo[ObjDesc->Common.Type]);
1263    }
1264
1265    return_VOID;
1266}
1267
1268#endif
1269