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