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