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