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