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