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