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