exdump.c revision 1.1.1.4 1 /******************************************************************************
2 *
3 * Module Name: exdump - Interpreter debug output routines
4 *
5 *****************************************************************************/
6
7 /*
8 * Copyright (C) 2000 - 2014, 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 #define __EXDUMP_C__
45
46 #include "acpi.h"
47 #include "accommon.h"
48 #include "acinterp.h"
49 #include "amlcode.h"
50 #include "acnamesp.h"
51
52
53 #define _COMPONENT ACPI_EXECUTER
54 ACPI_MODULE_NAME ("exdump")
55
56 /*
57 * The following routines are used for debug output only
58 */
59 #if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
60
61 /* Local prototypes */
62
63 static void
64 AcpiExOutString (
65 char *Title,
66 char *Value);
67
68 static void
69 AcpiExOutPointer (
70 char *Title,
71 void *Value);
72
73 static void
74 AcpiExDumpObject (
75 ACPI_OPERAND_OBJECT *ObjDesc,
76 ACPI_EXDUMP_INFO *Info);
77
78 static void
79 AcpiExDumpReferenceObj (
80 ACPI_OPERAND_OBJECT *ObjDesc);
81
82 static void
83 AcpiExDumpPackageObj (
84 ACPI_OPERAND_OBJECT *ObjDesc,
85 UINT32 Level,
86 UINT32 Index);
87
88
89 /*******************************************************************************
90 *
91 * Object Descriptor info tables
92 *
93 * Note: The first table entry must be an INIT opcode and must contain
94 * the table length (number of table entries)
95 *
96 ******************************************************************************/
97
98 static ACPI_EXDUMP_INFO AcpiExDumpInteger[2] =
99 {
100 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpInteger), NULL},
101 {ACPI_EXD_UINT64, ACPI_EXD_OFFSET (Integer.Value), "Value"}
102 };
103
104 static ACPI_EXDUMP_INFO AcpiExDumpString[4] =
105 {
106 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpString), NULL},
107 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (String.Length), "Length"},
108 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (String.Pointer), "Pointer"},
109 {ACPI_EXD_STRING, 0, NULL}
110 };
111
112 static ACPI_EXDUMP_INFO AcpiExDumpBuffer[5] =
113 {
114 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpBuffer), NULL},
115 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (Buffer.Length), "Length"},
116 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Buffer.Pointer), "Pointer"},
117 {ACPI_EXD_NODE, ACPI_EXD_OFFSET (Buffer.Node), "Parent Node"},
118 {ACPI_EXD_BUFFER, 0, NULL}
119 };
120
121 static ACPI_EXDUMP_INFO AcpiExDumpPackage[6] =
122 {
123 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpPackage), NULL},
124 {ACPI_EXD_NODE, ACPI_EXD_OFFSET (Package.Node), "Parent Node"},
125 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Package.Flags), "Flags"},
126 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (Package.Count), "Elements"},
127 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Package.Elements), "Element List"},
128 {ACPI_EXD_PACKAGE, 0, NULL}
129 };
130
131 static ACPI_EXDUMP_INFO AcpiExDumpDevice[4] =
132 {
133 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpDevice), NULL},
134 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Device.NotifyList[0]), "System Notify"},
135 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Device.NotifyList[1]), "Device Notify"},
136 {ACPI_EXD_HDLR_LIST,ACPI_EXD_OFFSET (Device.Handler), "Handler"}
137 };
138
139 static ACPI_EXDUMP_INFO AcpiExDumpEvent[2] =
140 {
141 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpEvent), NULL},
142 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Event.OsSemaphore), "OsSemaphore"}
143 };
144
145 static ACPI_EXDUMP_INFO AcpiExDumpMethod[9] =
146 {
147 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpMethod), NULL},
148 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Method.InfoFlags), "Info Flags"},
149 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Method.ParamCount), "Parameter Count"},
150 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Method.SyncLevel), "Sync Level"},
151 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Method.Mutex), "Mutex"},
152 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Method.OwnerId), "Owner Id"},
153 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Method.ThreadCount), "Thread Count"},
154 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (Method.AmlLength), "Aml Length"},
155 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Method.AmlStart), "Aml Start"}
156 };
157
158 static ACPI_EXDUMP_INFO AcpiExDumpMutex[6] =
159 {
160 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpMutex), NULL},
161 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Mutex.SyncLevel), "Sync Level"},
162 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Mutex.OriginalSyncLevel), "Original Sync Level"},
163 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Mutex.OwnerThread), "Owner Thread"},
164 {ACPI_EXD_UINT16, ACPI_EXD_OFFSET (Mutex.AcquisitionDepth), "Acquire Depth"},
165 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Mutex.OsMutex), "OsMutex"}
166 };
167
168 static ACPI_EXDUMP_INFO AcpiExDumpRegion[8] =
169 {
170 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpRegion), NULL},
171 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Region.SpaceId), "Space Id"},
172 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Region.Flags), "Flags"},
173 {ACPI_EXD_NODE, ACPI_EXD_OFFSET (Region.Node), "Parent Node"},
174 {ACPI_EXD_ADDRESS, ACPI_EXD_OFFSET (Region.Address), "Address"},
175 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (Region.Length), "Length"},
176 {ACPI_EXD_HDLR_LIST,ACPI_EXD_OFFSET (Region.Handler), "Handler"},
177 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Region.Next), "Next"}
178 };
179
180 static ACPI_EXDUMP_INFO AcpiExDumpPower[6] =
181 {
182 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpPower), NULL},
183 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (PowerResource.SystemLevel), "System Level"},
184 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (PowerResource.ResourceOrder), "Resource Order"},
185 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (PowerResource.NotifyList[0]), "System Notify"},
186 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (PowerResource.NotifyList[1]), "Device Notify"},
187 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (PowerResource.Handler), "Handler"}
188 };
189
190 static ACPI_EXDUMP_INFO AcpiExDumpProcessor[7] =
191 {
192 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpProcessor), NULL},
193 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Processor.ProcId), "Processor ID"},
194 {ACPI_EXD_UINT8 , ACPI_EXD_OFFSET (Processor.Length), "Length"},
195 {ACPI_EXD_ADDRESS, ACPI_EXD_OFFSET (Processor.Address), "Address"},
196 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Processor.NotifyList[0]), "System Notify"},
197 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Processor.NotifyList[1]), "Device Notify"},
198 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Processor.Handler), "Handler"}
199 };
200
201 static ACPI_EXDUMP_INFO AcpiExDumpThermal[4] =
202 {
203 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpThermal), NULL},
204 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (ThermalZone.NotifyList[0]), "System Notify"},
205 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (ThermalZone.NotifyList[1]), "Device Notify"},
206 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (ThermalZone.Handler), "Handler"}
207 };
208
209 static ACPI_EXDUMP_INFO AcpiExDumpBufferField[3] =
210 {
211 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpBufferField), NULL},
212 {ACPI_EXD_FIELD, 0, NULL},
213 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (BufferField.BufferObj), "Buffer Object"}
214 };
215
216 static ACPI_EXDUMP_INFO AcpiExDumpRegionField[5] =
217 {
218 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpRegionField), NULL},
219 {ACPI_EXD_FIELD, 0, NULL},
220 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Field.AccessLength), "AccessLength"},
221 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Field.RegionObj), "Region Object"},
222 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Field.ResourceBuffer), "ResourceBuffer"}
223 };
224
225 static ACPI_EXDUMP_INFO AcpiExDumpBankField[5] =
226 {
227 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpBankField), NULL},
228 {ACPI_EXD_FIELD, 0, NULL},
229 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (BankField.Value), "Value"},
230 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (BankField.RegionObj), "Region Object"},
231 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (BankField.BankObj), "Bank Object"}
232 };
233
234 static ACPI_EXDUMP_INFO AcpiExDumpIndexField[5] =
235 {
236 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpBankField), NULL},
237 {ACPI_EXD_FIELD, 0, NULL},
238 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (IndexField.Value), "Value"},
239 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (IndexField.IndexObj), "Index Object"},
240 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (IndexField.DataObj), "Data Object"}
241 };
242
243 static ACPI_EXDUMP_INFO AcpiExDumpReference[8] =
244 {
245 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpReference), NULL},
246 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Reference.Class), "Class"},
247 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Reference.TargetType), "Target Type"},
248 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (Reference.Value), "Value"},
249 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Reference.Object), "Object Desc"},
250 {ACPI_EXD_NODE, ACPI_EXD_OFFSET (Reference.Node), "Node"},
251 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Reference.Where), "Where"},
252 {ACPI_EXD_REFERENCE,0, NULL}
253 };
254
255 static ACPI_EXDUMP_INFO AcpiExDumpAddressHandler[6] =
256 {
257 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpAddressHandler), NULL},
258 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (AddressSpace.SpaceId), "Space Id"},
259 {ACPI_EXD_HDLR_LIST,ACPI_EXD_OFFSET (AddressSpace.Next), "Next"},
260 {ACPI_EXD_RGN_LIST, ACPI_EXD_OFFSET (AddressSpace.RegionList), "Region List"},
261 {ACPI_EXD_NODE, ACPI_EXD_OFFSET (AddressSpace.Node), "Node"},
262 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (AddressSpace.Context), "Context"}
263 };
264
265 static ACPI_EXDUMP_INFO AcpiExDumpNotify[7] =
266 {
267 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpNotify), NULL},
268 {ACPI_EXD_NODE, ACPI_EXD_OFFSET (Notify.Node), "Node"},
269 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (Notify.HandlerType), "Handler Type"},
270 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Notify.Handler), "Handler"},
271 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Notify.Context), "Context"},
272 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Notify.Next[0]), "Next System Notify"},
273 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Notify.Next[1]), "Next Device Notify"}
274 };
275
276 static ACPI_EXDUMP_INFO AcpiExDumpExtra[6] =
277 {
278 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpExtra), NULL},
279 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Extra.Method_REG), "_REG Method"},
280 {ACPI_EXD_NODE, ACPI_EXD_OFFSET (Extra.ScopeNode), "Scope Node"},
281 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Extra.RegionContext), "Region Context"},
282 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Extra.AmlStart), "Aml Start"},
283 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (Extra.AmlLength), "Aml Length"}
284 };
285
286 static ACPI_EXDUMP_INFO AcpiExDumpData[3] =
287 {
288 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpData), NULL},
289 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Data.Handler), "Handler"},
290 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Data.Pointer), "Raw Data"}
291 };
292
293 /* Miscellaneous tables */
294
295 static ACPI_EXDUMP_INFO AcpiExDumpCommon[5] =
296 {
297 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpCommon), NULL},
298 {ACPI_EXD_TYPE , 0, NULL},
299 {ACPI_EXD_UINT16, ACPI_EXD_OFFSET (Common.ReferenceCount), "Reference Count"},
300 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Common.Flags), "Flags"},
301 {ACPI_EXD_LIST, ACPI_EXD_OFFSET (Common.NextObject), "Object List"}
302 };
303
304 static ACPI_EXDUMP_INFO AcpiExDumpFieldCommon[7] =
305 {
306 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpFieldCommon), NULL},
307 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (CommonField.FieldFlags), "Field Flags"},
308 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (CommonField.AccessByteWidth), "Access Byte Width"},
309 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (CommonField.BitLength), "Bit Length"},
310 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (CommonField.StartFieldBitOffset),"Field Bit Offset"},
311 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (CommonField.BaseByteOffset), "Base Byte Offset"},
312 {ACPI_EXD_NODE, ACPI_EXD_OFFSET (CommonField.Node), "Parent Node"}
313 };
314
315 static ACPI_EXDUMP_INFO AcpiExDumpNode[7] =
316 {
317 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpNode), NULL},
318 {ACPI_EXD_UINT8, ACPI_EXD_NSOFFSET (Flags), "Flags"},
319 {ACPI_EXD_UINT8, ACPI_EXD_NSOFFSET (OwnerId), "Owner Id"},
320 {ACPI_EXD_LIST, ACPI_EXD_NSOFFSET (Object), "Object List"},
321 {ACPI_EXD_NODE, ACPI_EXD_NSOFFSET (Parent), "Parent"},
322 {ACPI_EXD_NODE, ACPI_EXD_NSOFFSET (Child), "Child"},
323 {ACPI_EXD_NODE, ACPI_EXD_NSOFFSET (Peer), "Peer"}
324 };
325
326
327 /* Dispatch table, indexed by object type */
328
329 static ACPI_EXDUMP_INFO *AcpiExDumpInfo[] =
330 {
331 NULL,
332 AcpiExDumpInteger,
333 AcpiExDumpString,
334 AcpiExDumpBuffer,
335 AcpiExDumpPackage,
336 NULL,
337 AcpiExDumpDevice,
338 AcpiExDumpEvent,
339 AcpiExDumpMethod,
340 AcpiExDumpMutex,
341 AcpiExDumpRegion,
342 AcpiExDumpPower,
343 AcpiExDumpProcessor,
344 AcpiExDumpThermal,
345 AcpiExDumpBufferField,
346 NULL,
347 NULL,
348 AcpiExDumpRegionField,
349 AcpiExDumpBankField,
350 AcpiExDumpIndexField,
351 AcpiExDumpReference,
352 NULL,
353 NULL,
354 AcpiExDumpNotify,
355 AcpiExDumpAddressHandler,
356 NULL,
357 NULL,
358 NULL,
359 AcpiExDumpExtra,
360 AcpiExDumpData
361 };
362
363
364 /*******************************************************************************
365 *
366 * FUNCTION: AcpiExDumpObject
367 *
368 * PARAMETERS: ObjDesc - Descriptor to dump
369 * Info - Info table corresponding to this object
370 * type
371 *
372 * RETURN: None
373 *
374 * DESCRIPTION: Walk the info table for this object
375 *
376 ******************************************************************************/
377
378 static void
379 AcpiExDumpObject (
380 ACPI_OPERAND_OBJECT *ObjDesc,
381 ACPI_EXDUMP_INFO *Info)
382 {
383 UINT8 *Target;
384 char *Name;
385 const char *ReferenceName;
386 UINT8 Count;
387 ACPI_OPERAND_OBJECT *Start;
388 ACPI_OPERAND_OBJECT *Data = NULL;
389 ACPI_OPERAND_OBJECT *Next;
390 ACPI_NAMESPACE_NODE *Node;
391
392
393 if (!Info)
394 {
395 AcpiOsPrintf (
396 "ExDumpObject: Display not implemented for object type %s\n",
397 AcpiUtGetObjectTypeName (ObjDesc));
398 return;
399 }
400
401 /* First table entry must contain the table length (# of table entries) */
402
403 Count = Info->Offset;
404
405 while (Count)
406 {
407 Target = ACPI_ADD_PTR (UINT8, ObjDesc, Info->Offset);
408 Name = Info->Name;
409
410 switch (Info->Opcode)
411 {
412 case ACPI_EXD_INIT:
413
414 break;
415
416 case ACPI_EXD_TYPE:
417
418 AcpiOsPrintf ("%20s : %2.2X [%s]\n", "Type",
419 ObjDesc->Common.Type, AcpiUtGetObjectTypeName (ObjDesc));
420 break;
421
422 case ACPI_EXD_UINT8:
423
424 AcpiOsPrintf ("%20s : %2.2X\n", Name, *Target);
425 break;
426
427 case ACPI_EXD_UINT16:
428
429 AcpiOsPrintf ("%20s : %4.4X\n", Name, ACPI_GET16 (Target));
430 break;
431
432 case ACPI_EXD_UINT32:
433
434 AcpiOsPrintf ("%20s : %8.8X\n", Name, ACPI_GET32 (Target));
435 break;
436
437 case ACPI_EXD_UINT64:
438
439 AcpiOsPrintf ("%20s : %8.8X%8.8X\n", "Value",
440 ACPI_FORMAT_UINT64 (ACPI_GET64 (Target)));
441 break;
442
443 case ACPI_EXD_POINTER:
444 case ACPI_EXD_ADDRESS:
445
446 AcpiExOutPointer (Name, *ACPI_CAST_PTR (void *, Target));
447 break;
448
449 case ACPI_EXD_STRING:
450
451 AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX);
452 AcpiOsPrintf ("\n");
453 break;
454
455 case ACPI_EXD_BUFFER:
456
457 ACPI_DUMP_BUFFER (ObjDesc->Buffer.Pointer, ObjDesc->Buffer.Length);
458 break;
459
460 case ACPI_EXD_PACKAGE:
461
462 /* Dump the package contents */
463
464 AcpiOsPrintf ("\nPackage Contents:\n");
465 AcpiExDumpPackageObj (ObjDesc, 0, 0);
466 break;
467
468 case ACPI_EXD_FIELD:
469
470 AcpiExDumpObject (ObjDesc, AcpiExDumpFieldCommon);
471 break;
472
473 case ACPI_EXD_REFERENCE:
474
475 ReferenceName = AcpiUtGetReferenceName (ObjDesc);
476 AcpiExOutString ("Class Name", ACPI_CAST_PTR (char, ReferenceName));
477 AcpiExDumpReferenceObj (ObjDesc);
478 break;
479
480 case ACPI_EXD_LIST:
481
482 Start = *ACPI_CAST_PTR (void *, Target);
483 Next = Start;
484
485 AcpiOsPrintf ("%20s : %p", Name, Next);
486 if (Next)
487 {
488 AcpiOsPrintf ("(%s %2.2X)",
489 AcpiUtGetObjectTypeName (Next), Next->Common.Type);
490
491 while (Next->Common.NextObject)
492 {
493 if ((Next->Common.Type == ACPI_TYPE_LOCAL_DATA) &&
494 !Data)
495 {
496 Data = Next;
497 }
498
499 Next = Next->Common.NextObject;
500 AcpiOsPrintf ("->%p(%s %2.2X)", Next,
501 AcpiUtGetObjectTypeName (Next), Next->Common.Type);
502
503 if ((Next == Start) || (Next == Data))
504 {
505 AcpiOsPrintf ("\n**** Error: Object list appears to be circular linked");
506 break;
507 }
508 }
509 }
510
511 AcpiOsPrintf ("\n");
512 break;
513
514 case ACPI_EXD_HDLR_LIST:
515
516 Start = *ACPI_CAST_PTR (void *, Target);
517 Next = Start;
518
519 AcpiOsPrintf ("%20s : %p", Name, Next);
520 if (Next)
521 {
522 AcpiOsPrintf ("(%s %2.2X)",
523 AcpiUtGetObjectTypeName (Next), Next->Common.Type);
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), Next->Common.Type);
536
537 if ((Next == Start) || (Next == Data))
538 {
539 AcpiOsPrintf ("\n**** Error: Handler list appears to be circular linked");
540 break;
541 }
542 }
543 }
544
545 AcpiOsPrintf ("\n");
546 break;
547
548 case ACPI_EXD_RGN_LIST:
549
550 Start = *ACPI_CAST_PTR (void *, Target);
551 Next = Start;
552
553 AcpiOsPrintf ("%20s : %p", Name, Next);
554 if (Next)
555 {
556 AcpiOsPrintf ("(%s %2.2X)",
557 AcpiUtGetObjectTypeName (Next), Next->Common.Type);
558
559 while (Next->Region.Next)
560 {
561 if ((Next->Common.Type == ACPI_TYPE_LOCAL_DATA) &&
562 !Data)
563 {
564 Data = Next;
565 }
566
567 Next = Next->Region.Next;
568 AcpiOsPrintf ("->%p(%s %2.2X)", Next,
569 AcpiUtGetObjectTypeName (Next), Next->Common.Type);
570
571 if ((Next == Start) || (Next == Data))
572 {
573 AcpiOsPrintf ("\n**** Error: Region list appears to be circular linked");
574 break;
575 }
576 }
577 }
578
579 AcpiOsPrintf ("\n");
580 break;
581
582 case ACPI_EXD_NODE:
583
584 Node = *ACPI_CAST_PTR (ACPI_NAMESPACE_NODE *, Target);
585
586 AcpiOsPrintf ("%20s : %p", Name, Node);
587 if (Node)
588 {
589 AcpiOsPrintf (" [%4.4s]", Node->Name.Ascii);
590 }
591 AcpiOsPrintf ("\n");
592 break;
593
594 default:
595
596 AcpiOsPrintf ("**** Invalid table opcode [%X] ****\n",
597 Info->Opcode);
598 return;
599 }
600
601 Info++;
602 Count--;
603 }
604 }
605
606
607 /*******************************************************************************
608 *
609 * FUNCTION: AcpiExDumpOperand
610 *
611 * PARAMETERS: *ObjDesc - Pointer to entry to be dumped
612 * Depth - Current nesting depth
613 *
614 * RETURN: None
615 *
616 * DESCRIPTION: Dump an operand object
617 *
618 ******************************************************************************/
619
620 void
621 AcpiExDumpOperand (
622 ACPI_OPERAND_OBJECT *ObjDesc,
623 UINT32 Depth)
624 {
625 UINT32 Length;
626 UINT32 Index;
627
628
629 ACPI_FUNCTION_NAME (ExDumpOperand)
630
631
632 /* Check if debug output enabled */
633
634 if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_EXEC, _COMPONENT))
635 {
636 return;
637 }
638
639 if (!ObjDesc)
640 {
641 /* This could be a null element of a package */
642
643 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Null Object Descriptor\n"));
644 return;
645 }
646
647 if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED)
648 {
649 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p Namespace Node: ", ObjDesc));
650 ACPI_DUMP_ENTRY (ObjDesc, ACPI_LV_EXEC);
651 return;
652 }
653
654 if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND)
655 {
656 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
657 "%p is not a node or operand object: [%s]\n",
658 ObjDesc, AcpiUtGetDescriptorName (ObjDesc)));
659 ACPI_DUMP_BUFFER (ObjDesc, sizeof (ACPI_OPERAND_OBJECT));
660 return;
661 }
662
663 /* ObjDesc is a valid object */
664
665 if (Depth > 0)
666 {
667 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%*s[%u] %p ",
668 Depth, " ", Depth, ObjDesc));
669 }
670 else
671 {
672 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p ", ObjDesc));
673 }
674
675 /* Decode object type */
676
677 switch (ObjDesc->Common.Type)
678 {
679 case ACPI_TYPE_LOCAL_REFERENCE:
680
681 AcpiOsPrintf ("Reference: [%s] ", AcpiUtGetReferenceName (ObjDesc));
682
683 switch (ObjDesc->Reference.Class)
684 {
685 case ACPI_REFCLASS_DEBUG:
686
687 AcpiOsPrintf ("\n");
688 break;
689
690 case ACPI_REFCLASS_INDEX:
691
692 AcpiOsPrintf ("%p\n", ObjDesc->Reference.Object);
693 break;
694
695 case ACPI_REFCLASS_TABLE:
696
697 AcpiOsPrintf ("Table Index %X\n", ObjDesc->Reference.Value);
698 break;
699
700 case ACPI_REFCLASS_REFOF:
701
702 AcpiOsPrintf ("%p [%s]\n", ObjDesc->Reference.Object,
703 AcpiUtGetTypeName (((ACPI_OPERAND_OBJECT *)
704 ObjDesc->Reference.Object)->Common.Type));
705 break;
706
707 case ACPI_REFCLASS_NAME:
708
709 AcpiOsPrintf ("- [%4.4s]\n", ObjDesc->Reference.Node->Name.Ascii);
710 break;
711
712 case ACPI_REFCLASS_ARG:
713 case ACPI_REFCLASS_LOCAL:
714
715 AcpiOsPrintf ("%X\n", ObjDesc->Reference.Value);
716 break;
717
718 default: /* Unknown reference class */
719
720 AcpiOsPrintf ("%2.2X\n", ObjDesc->Reference.Class);
721 break;
722 }
723 break;
724
725 case ACPI_TYPE_BUFFER:
726
727 AcpiOsPrintf ("Buffer length %.2X @ %p\n",
728 ObjDesc->Buffer.Length, ObjDesc->Buffer.Pointer);
729
730 /* Debug only -- dump the buffer contents */
731
732 if (ObjDesc->Buffer.Pointer)
733 {
734 Length = ObjDesc->Buffer.Length;
735 if (Length > 128)
736 {
737 Length = 128;
738 }
739
740 AcpiOsPrintf ("Buffer Contents: (displaying length 0x%.2X)\n",
741 Length);
742 ACPI_DUMP_BUFFER (ObjDesc->Buffer.Pointer, Length);
743 }
744 break;
745
746 case ACPI_TYPE_INTEGER:
747
748 AcpiOsPrintf ("Integer %8.8X%8.8X\n",
749 ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
750 break;
751
752 case ACPI_TYPE_PACKAGE:
753
754 AcpiOsPrintf ("Package [Len %X] ElementArray %p\n",
755 ObjDesc->Package.Count, ObjDesc->Package.Elements);
756
757 /*
758 * If elements exist, package element pointer is valid,
759 * and debug_level exceeds 1, dump package's elements.
760 */
761 if (ObjDesc->Package.Count &&
762 ObjDesc->Package.Elements &&
763 AcpiDbgLevel > 1)
764 {
765 for (Index = 0; Index < ObjDesc->Package.Count; Index++)
766 {
767 AcpiExDumpOperand (ObjDesc->Package.Elements[Index], Depth+1);
768 }
769 }
770 break;
771
772 case ACPI_TYPE_REGION:
773
774 AcpiOsPrintf ("Region %s (%X)",
775 AcpiUtGetRegionName (ObjDesc->Region.SpaceId),
776 ObjDesc->Region.SpaceId);
777
778 /*
779 * If the address and length have not been evaluated,
780 * don't print them.
781 */
782 if (!(ObjDesc->Region.Flags & AOPOBJ_DATA_VALID))
783 {
784 AcpiOsPrintf ("\n");
785 }
786 else
787 {
788 AcpiOsPrintf (" base %8.8X%8.8X Length %X\n",
789 ACPI_FORMAT_NATIVE_UINT (ObjDesc->Region.Address),
790 ObjDesc->Region.Length);
791 }
792 break;
793
794 case ACPI_TYPE_STRING:
795
796 AcpiOsPrintf ("String length %X @ %p ",
797 ObjDesc->String.Length,
798 ObjDesc->String.Pointer);
799
800 AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX);
801 AcpiOsPrintf ("\n");
802 break;
803
804 case ACPI_TYPE_LOCAL_BANK_FIELD:
805
806 AcpiOsPrintf ("BankField\n");
807 break;
808
809 case ACPI_TYPE_LOCAL_REGION_FIELD:
810
811 AcpiOsPrintf ("RegionField: Bits=%X AccWidth=%X Lock=%X Update=%X at "
812 "byte=%X bit=%X of below:\n",
813 ObjDesc->Field.BitLength,
814 ObjDesc->Field.AccessByteWidth,
815 ObjDesc->Field.FieldFlags & AML_FIELD_LOCK_RULE_MASK,
816 ObjDesc->Field.FieldFlags & AML_FIELD_UPDATE_RULE_MASK,
817 ObjDesc->Field.BaseByteOffset,
818 ObjDesc->Field.StartFieldBitOffset);
819
820 AcpiExDumpOperand (ObjDesc->Field.RegionObj, Depth+1);
821 break;
822
823 case ACPI_TYPE_LOCAL_INDEX_FIELD:
824
825 AcpiOsPrintf ("IndexField\n");
826 break;
827
828 case ACPI_TYPE_BUFFER_FIELD:
829
830 AcpiOsPrintf ("BufferField: %X bits at byte %X bit %X of\n",
831 ObjDesc->BufferField.BitLength,
832 ObjDesc->BufferField.BaseByteOffset,
833 ObjDesc->BufferField.StartFieldBitOffset);
834
835 if (!ObjDesc->BufferField.BufferObj)
836 {
837 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "*NULL*\n"));
838 }
839 else if ((ObjDesc->BufferField.BufferObj)->Common.Type !=
840 ACPI_TYPE_BUFFER)
841 {
842 AcpiOsPrintf ("*not a Buffer*\n");
843 }
844 else
845 {
846 AcpiExDumpOperand (ObjDesc->BufferField.BufferObj, Depth+1);
847 }
848 break;
849
850 case ACPI_TYPE_EVENT:
851
852 AcpiOsPrintf ("Event\n");
853 break;
854
855 case ACPI_TYPE_METHOD:
856
857 AcpiOsPrintf ("Method(%X) @ %p:%X\n",
858 ObjDesc->Method.ParamCount,
859 ObjDesc->Method.AmlStart,
860 ObjDesc->Method.AmlLength);
861 break;
862
863 case ACPI_TYPE_MUTEX:
864
865 AcpiOsPrintf ("Mutex\n");
866 break;
867
868 case ACPI_TYPE_DEVICE:
869
870 AcpiOsPrintf ("Device\n");
871 break;
872
873 case ACPI_TYPE_POWER:
874
875 AcpiOsPrintf ("Power\n");
876 break;
877
878 case ACPI_TYPE_PROCESSOR:
879
880 AcpiOsPrintf ("Processor\n");
881 break;
882
883 case ACPI_TYPE_THERMAL:
884
885 AcpiOsPrintf ("Thermal\n");
886 break;
887
888 default:
889
890 /* Unknown Type */
891
892 AcpiOsPrintf ("Unknown Type %X\n", ObjDesc->Common.Type);
893 break;
894 }
895
896 return;
897 }
898
899
900 /*******************************************************************************
901 *
902 * FUNCTION: AcpiExDumpOperands
903 *
904 * PARAMETERS: Operands - A list of Operand objects
905 * OpcodeName - AML opcode name
906 * NumOperands - Operand count for this opcode
907 *
908 * DESCRIPTION: Dump the operands associated with the opcode
909 *
910 ******************************************************************************/
911
912 void
913 AcpiExDumpOperands (
914 ACPI_OPERAND_OBJECT **Operands,
915 const char *OpcodeName,
916 UINT32 NumOperands)
917 {
918 ACPI_FUNCTION_NAME (ExDumpOperands);
919
920
921 if (!OpcodeName)
922 {
923 OpcodeName = "UNKNOWN";
924 }
925
926 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
927 "**** Start operand dump for opcode [%s], %u operands\n",
928 OpcodeName, NumOperands));
929
930 if (NumOperands == 0)
931 {
932 NumOperands = 1;
933 }
934
935 /* Dump the individual operands */
936
937 while (NumOperands)
938 {
939 AcpiExDumpOperand (*Operands, 0);
940 Operands++;
941 NumOperands--;
942 }
943
944 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
945 "**** End operand dump for [%s]\n", OpcodeName));
946 return;
947 }
948
949
950 /*******************************************************************************
951 *
952 * FUNCTION: AcpiExOut* functions
953 *
954 * PARAMETERS: Title - Descriptive text
955 * Value - Value to be displayed
956 *
957 * DESCRIPTION: Object dump output formatting functions. These functions
958 * reduce the number of format strings required and keeps them
959 * all in one place for easy modification.
960 *
961 ******************************************************************************/
962
963 static void
964 AcpiExOutString (
965 char *Title,
966 char *Value)
967 {
968 AcpiOsPrintf ("%20s : %s\n", Title, Value);
969 }
970
971 static void
972 AcpiExOutPointer (
973 char *Title,
974 void *Value)
975 {
976 AcpiOsPrintf ("%20s : %p\n", Title, Value);
977 }
978
979
980 /*******************************************************************************
981 *
982 * FUNCTION: AcpiExDumpNamespaceNode
983 *
984 * PARAMETERS: Node - Descriptor to dump
985 * Flags - Force display if TRUE
986 *
987 * DESCRIPTION: Dumps the members of the given.Node
988 *
989 ******************************************************************************/
990
991 void
992 AcpiExDumpNamespaceNode (
993 ACPI_NAMESPACE_NODE *Node,
994 UINT32 Flags)
995 {
996
997 ACPI_FUNCTION_ENTRY ();
998
999
1000 if (!Flags)
1001 {
1002 /* Check if debug output enabled */
1003
1004 if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_OBJECTS, _COMPONENT))
1005 {
1006 return;
1007 }
1008 }
1009
1010 AcpiOsPrintf ("%20s : %4.4s\n", "Name", AcpiUtGetNodeName (Node));
1011 AcpiOsPrintf ("%20s : %2.2X [%s]\n", "Type",
1012 Node->Type, AcpiUtGetTypeName (Node->Type));
1013
1014 AcpiExDumpObject (ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Node),
1015 AcpiExDumpNode);
1016 }
1017
1018
1019 /*******************************************************************************
1020 *
1021 * FUNCTION: AcpiExDumpReferenceObj
1022 *
1023 * PARAMETERS: Object - Descriptor to dump
1024 *
1025 * DESCRIPTION: Dumps a reference object
1026 *
1027 ******************************************************************************/
1028
1029 static void
1030 AcpiExDumpReferenceObj (
1031 ACPI_OPERAND_OBJECT *ObjDesc)
1032 {
1033 ACPI_BUFFER RetBuf;
1034 ACPI_STATUS Status;
1035
1036
1037 RetBuf.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
1038
1039 if (ObjDesc->Reference.Class == ACPI_REFCLASS_NAME)
1040 {
1041 AcpiOsPrintf (" %p ", ObjDesc->Reference.Node);
1042
1043 Status = AcpiNsHandleToPathname (ObjDesc->Reference.Node, &RetBuf);
1044 if (ACPI_FAILURE (Status))
1045 {
1046 AcpiOsPrintf (" Could not convert name to pathname\n");
1047 }
1048 else
1049 {
1050 AcpiOsPrintf ("%s\n", (char *) RetBuf.Pointer);
1051 ACPI_FREE (RetBuf.Pointer);
1052 }
1053 }
1054 else if (ObjDesc->Reference.Object)
1055 {
1056 if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_OPERAND)
1057 {
1058 AcpiOsPrintf (" Target: %p", ObjDesc->Reference.Object);
1059 if (ObjDesc->Reference.Class == ACPI_REFCLASS_TABLE)
1060 {
1061 AcpiOsPrintf (" Table Index: %X\n", ObjDesc->Reference.Value);
1062 }
1063 else
1064 {
1065 AcpiOsPrintf (" Target: %p [%s]\n", ObjDesc->Reference.Object,
1066 AcpiUtGetTypeName (((ACPI_OPERAND_OBJECT *)
1067 ObjDesc->Reference.Object)->Common.Type));
1068 }
1069 }
1070 else
1071 {
1072 AcpiOsPrintf (" Target: %p\n", ObjDesc->Reference.Object);
1073 }
1074 }
1075 }
1076
1077
1078 /*******************************************************************************
1079 *
1080 * FUNCTION: AcpiExDumpPackageObj
1081 *
1082 * PARAMETERS: ObjDesc - Descriptor to dump
1083 * Level - Indentation Level
1084 * Index - Package index for this object
1085 *
1086 * DESCRIPTION: Dumps the elements of the package
1087 *
1088 ******************************************************************************/
1089
1090 static void
1091 AcpiExDumpPackageObj (
1092 ACPI_OPERAND_OBJECT *ObjDesc,
1093 UINT32 Level,
1094 UINT32 Index)
1095 {
1096 UINT32 i;
1097
1098
1099 /* Indentation and index output */
1100
1101 if (Level > 0)
1102 {
1103 for (i = 0; i < Level; i++)
1104 {
1105 AcpiOsPrintf (" ");
1106 }
1107
1108 AcpiOsPrintf ("[%.2d] ", Index);
1109 }
1110
1111 AcpiOsPrintf ("%p ", ObjDesc);
1112
1113 /* Null package elements are allowed */
1114
1115 if (!ObjDesc)
1116 {
1117 AcpiOsPrintf ("[Null Object]\n");
1118 return;
1119 }
1120
1121 /* Packages may only contain a few object types */
1122
1123 switch (ObjDesc->Common.Type)
1124 {
1125 case ACPI_TYPE_INTEGER:
1126
1127 AcpiOsPrintf ("[Integer] = %8.8X%8.8X\n",
1128 ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
1129 break;
1130
1131 case ACPI_TYPE_STRING:
1132
1133 AcpiOsPrintf ("[String] Value: ");
1134 AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX);
1135 AcpiOsPrintf ("\n");
1136 break;
1137
1138 case ACPI_TYPE_BUFFER:
1139
1140 AcpiOsPrintf ("[Buffer] Length %.2X = ", ObjDesc->Buffer.Length);
1141 if (ObjDesc->Buffer.Length)
1142 {
1143 AcpiUtDebugDumpBuffer (ACPI_CAST_PTR (UINT8, ObjDesc->Buffer.Pointer),
1144 ObjDesc->Buffer.Length, DB_DWORD_DISPLAY, _COMPONENT);
1145 }
1146 else
1147 {
1148 AcpiOsPrintf ("\n");
1149 }
1150 break;
1151
1152 case ACPI_TYPE_PACKAGE:
1153
1154 AcpiOsPrintf ("[Package] Contains %u Elements:\n",
1155 ObjDesc->Package.Count);
1156
1157 for (i = 0; i < ObjDesc->Package.Count; i++)
1158 {
1159 AcpiExDumpPackageObj (ObjDesc->Package.Elements[i], Level+1, i);
1160 }
1161 break;
1162
1163 case ACPI_TYPE_LOCAL_REFERENCE:
1164
1165 AcpiOsPrintf ("[Object Reference] Type [%s] %2.2X",
1166 AcpiUtGetReferenceName (ObjDesc),
1167 ObjDesc->Reference.Class);
1168 AcpiExDumpReferenceObj (ObjDesc);
1169 break;
1170
1171 default:
1172
1173 AcpiOsPrintf ("[Unknown Type] %X\n", ObjDesc->Common.Type);
1174 break;
1175 }
1176 }
1177
1178
1179 /*******************************************************************************
1180 *
1181 * FUNCTION: AcpiExDumpObjectDescriptor
1182 *
1183 * PARAMETERS: ObjDesc - Descriptor to dump
1184 * Flags - Force display if TRUE
1185 *
1186 * DESCRIPTION: Dumps the members of the object descriptor given.
1187 *
1188 ******************************************************************************/
1189
1190 void
1191 AcpiExDumpObjectDescriptor (
1192 ACPI_OPERAND_OBJECT *ObjDesc,
1193 UINT32 Flags)
1194 {
1195 ACPI_FUNCTION_TRACE (ExDumpObjectDescriptor);
1196
1197
1198 if (!ObjDesc)
1199 {
1200 return_VOID;
1201 }
1202
1203 if (!Flags)
1204 {
1205 /* Check if debug output enabled */
1206
1207 if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_OBJECTS, _COMPONENT))
1208 {
1209 return_VOID;
1210 }
1211 }
1212
1213 if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED)
1214 {
1215 AcpiExDumpNamespaceNode ((ACPI_NAMESPACE_NODE *) ObjDesc, Flags);
1216
1217 AcpiOsPrintf ("\nAttached Object (%p):\n",
1218 ((ACPI_NAMESPACE_NODE *) ObjDesc)->Object);
1219
1220 ObjDesc = ((ACPI_NAMESPACE_NODE *) ObjDesc)->Object;
1221 goto DumpObject;
1222 }
1223
1224 if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND)
1225 {
1226 AcpiOsPrintf (
1227 "%p is not an ACPI operand object: [%s]\n",
1228 ObjDesc, AcpiUtGetDescriptorName (ObjDesc));
1229 return_VOID;
1230 }
1231
1232 /* Validate the object type */
1233
1234 if (ObjDesc->Common.Type > ACPI_TYPE_LOCAL_MAX)
1235 {
1236 AcpiOsPrintf ("Not a known object type: %2.2X\n",
1237 ObjDesc->Common.Type);
1238 return_VOID;
1239 }
1240
1241
1242 DumpObject:
1243
1244 /* Common Fields */
1245
1246 AcpiExDumpObject (ObjDesc, AcpiExDumpCommon);
1247
1248 /* Object-specific fields */
1249
1250 AcpiExDumpObject (ObjDesc, AcpiExDumpInfo[ObjDesc->Common.Type]);
1251
1252 if (ObjDesc->Common.Type == ACPI_TYPE_REGION)
1253 {
1254 ObjDesc = ObjDesc->Common.NextObject;
1255 if (ObjDesc->Common.Type > ACPI_TYPE_LOCAL_MAX)
1256 {
1257 AcpiOsPrintf ("Secondary object is not a known object type: %2.2X\n",
1258 ObjDesc->Common.Type);
1259
1260 return_VOID;
1261 }
1262
1263 AcpiOsPrintf ("\nExtra attached Object (%p):\n", ObjDesc);
1264 AcpiExDumpObject (ObjDesc, AcpiExDumpInfo[ObjDesc->Common.Type]);
1265 }
1266
1267 return_VOID;
1268 }
1269
1270 #endif
1271