xref: /dflybsd-src/sys/contrib/dev/acpica/source/components/executer/exdump.c (revision 0cf7fc2c82ff74133aba14fda9c476d564ce3506)
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
1284