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