1 /******************************************************************************
3 * Module Name: exdump - Interpreter debug output routines
5 *****************************************************************************/
8 * Copyright (C) 2000 - 2014, Intel Corp.
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
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.
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.
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.
53 #define _COMPONENT ACPI_EXECUTER
54 ACPI_MODULE_NAME ("exdump")
57 * The following routines are used for debug output only
59 #if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
61 /* Local prototypes */
75 ACPI_OPERAND_OBJECT *ObjDesc,
76 ACPI_EXDUMP_INFO *Info);
79 AcpiExDumpReferenceObj (
80 ACPI_OPERAND_OBJECT *ObjDesc);
83 AcpiExDumpPackageObj (
84 ACPI_OPERAND_OBJECT *ObjDesc,
89 /*******************************************************************************
91 * Object Descriptor info tables
93 * Note: The first table entry must be an INIT opcode and must contain
94 * the table length (number of table entries)
96 ******************************************************************************/
98 static ACPI_EXDUMP_INFO AcpiExDumpInteger[2] =
100 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpInteger), NULL},
101 {ACPI_EXD_UINT64, ACPI_EXD_OFFSET (Integer.Value), "Value"}
104 static ACPI_EXDUMP_INFO AcpiExDumpString[4] =
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}
112 static ACPI_EXDUMP_INFO AcpiExDumpBuffer[5] =
114 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpBuffer), NULL},
115 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (Buffer.Length), "Length"},
116 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Buffer.Pointer), "Pointer"},
117 {ACPI_EXD_NODE, ACPI_EXD_OFFSET (Buffer.Node), "Parent Node"},
118 {ACPI_EXD_BUFFER, 0, NULL}
121 static ACPI_EXDUMP_INFO AcpiExDumpPackage[6] =
123 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpPackage), NULL},
124 {ACPI_EXD_NODE, ACPI_EXD_OFFSET (Package.Node), "Parent Node"},
125 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Package.Flags), "Flags"},
126 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (Package.Count), "Elements"},
127 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Package.Elements), "Element List"},
128 {ACPI_EXD_PACKAGE, 0, NULL}
131 static ACPI_EXDUMP_INFO AcpiExDumpDevice[4] =
133 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpDevice), NULL},
134 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Device.NotifyList[0]), "System Notify"},
135 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Device.NotifyList[1]), "Device Notify"},
136 {ACPI_EXD_HDLR_LIST,ACPI_EXD_OFFSET (Device.Handler), "Handler"}
139 static ACPI_EXDUMP_INFO AcpiExDumpEvent[2] =
141 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpEvent), NULL},
142 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Event.OsSemaphore), "OsSemaphore"}
145 static ACPI_EXDUMP_INFO AcpiExDumpMethod[9] =
147 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpMethod), NULL},
148 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Method.InfoFlags), "Info Flags"},
149 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Method.ParamCount), "Parameter Count"},
150 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Method.SyncLevel), "Sync Level"},
151 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Method.Mutex), "Mutex"},
152 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Method.OwnerId), "Owner Id"},
153 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Method.ThreadCount), "Thread Count"},
154 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (Method.AmlLength), "Aml Length"},
155 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Method.AmlStart), "Aml Start"}
158 static ACPI_EXDUMP_INFO AcpiExDumpMutex[6] =
160 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpMutex), NULL},
161 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Mutex.SyncLevel), "Sync Level"},
162 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Mutex.OriginalSyncLevel), "Original Sync Level"},
163 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Mutex.OwnerThread), "Owner Thread"},
164 {ACPI_EXD_UINT16, ACPI_EXD_OFFSET (Mutex.AcquisitionDepth), "Acquire Depth"},
165 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Mutex.OsMutex), "OsMutex"}
168 static ACPI_EXDUMP_INFO AcpiExDumpRegion[8] =
170 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpRegion), NULL},
171 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Region.SpaceId), "Space Id"},
172 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Region.Flags), "Flags"},
173 {ACPI_EXD_NODE, ACPI_EXD_OFFSET (Region.Node), "Parent Node"},
174 {ACPI_EXD_ADDRESS, ACPI_EXD_OFFSET (Region.Address), "Address"},
175 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (Region.Length), "Length"},
176 {ACPI_EXD_HDLR_LIST,ACPI_EXD_OFFSET (Region.Handler), "Handler"},
177 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Region.Next), "Next"}
180 static ACPI_EXDUMP_INFO AcpiExDumpPower[6] =
182 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpPower), NULL},
183 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (PowerResource.SystemLevel), "System Level"},
184 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (PowerResource.ResourceOrder), "Resource Order"},
185 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (PowerResource.NotifyList[0]), "System Notify"},
186 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (PowerResource.NotifyList[1]), "Device Notify"},
187 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (PowerResource.Handler), "Handler"}
190 static ACPI_EXDUMP_INFO AcpiExDumpProcessor[7] =
192 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpProcessor), NULL},
193 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Processor.ProcId), "Processor ID"},
194 {ACPI_EXD_UINT8 , ACPI_EXD_OFFSET (Processor.Length), "Length"},
195 {ACPI_EXD_ADDRESS, ACPI_EXD_OFFSET (Processor.Address), "Address"},
196 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Processor.NotifyList[0]), "System Notify"},
197 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Processor.NotifyList[1]), "Device Notify"},
198 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Processor.Handler), "Handler"}
201 static ACPI_EXDUMP_INFO AcpiExDumpThermal[4] =
203 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpThermal), NULL},
204 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (ThermalZone.NotifyList[0]), "System Notify"},
205 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (ThermalZone.NotifyList[1]), "Device Notify"},
206 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (ThermalZone.Handler), "Handler"}
209 static ACPI_EXDUMP_INFO AcpiExDumpBufferField[3] =
211 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpBufferField), NULL},
212 {ACPI_EXD_FIELD, 0, NULL},
213 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (BufferField.BufferObj), "Buffer Object"}
216 static ACPI_EXDUMP_INFO AcpiExDumpRegionField[5] =
218 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpRegionField), NULL},
219 {ACPI_EXD_FIELD, 0, NULL},
220 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Field.AccessLength), "AccessLength"},
221 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Field.RegionObj), "Region Object"},
222 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Field.ResourceBuffer), "ResourceBuffer"}
225 static ACPI_EXDUMP_INFO AcpiExDumpBankField[5] =
227 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpBankField), NULL},
228 {ACPI_EXD_FIELD, 0, NULL},
229 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (BankField.Value), "Value"},
230 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (BankField.RegionObj), "Region Object"},
231 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (BankField.BankObj), "Bank Object"}
234 static ACPI_EXDUMP_INFO AcpiExDumpIndexField[5] =
236 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpBankField), NULL},
237 {ACPI_EXD_FIELD, 0, NULL},
238 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (IndexField.Value), "Value"},
239 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (IndexField.IndexObj), "Index Object"},
240 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (IndexField.DataObj), "Data Object"}
243 static ACPI_EXDUMP_INFO AcpiExDumpReference[8] =
245 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpReference), NULL},
246 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Reference.Class), "Class"},
247 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Reference.TargetType), "Target Type"},
248 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (Reference.Value), "Value"},
249 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Reference.Object), "Object Desc"},
250 {ACPI_EXD_NODE, ACPI_EXD_OFFSET (Reference.Node), "Node"},
251 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Reference.Where), "Where"},
252 {ACPI_EXD_REFERENCE,0, NULL}
255 static ACPI_EXDUMP_INFO AcpiExDumpAddressHandler[6] =
257 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpAddressHandler), NULL},
258 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (AddressSpace.SpaceId), "Space Id"},
259 {ACPI_EXD_HDLR_LIST,ACPI_EXD_OFFSET (AddressSpace.Next), "Next"},
260 {ACPI_EXD_RGN_LIST, ACPI_EXD_OFFSET (AddressSpace.RegionList), "Region List"},
261 {ACPI_EXD_NODE, ACPI_EXD_OFFSET (AddressSpace.Node), "Node"},
262 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (AddressSpace.Context), "Context"}
265 static ACPI_EXDUMP_INFO AcpiExDumpNotify[7] =
267 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpNotify), NULL},
268 {ACPI_EXD_NODE, ACPI_EXD_OFFSET (Notify.Node), "Node"},
269 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (Notify.HandlerType), "Handler Type"},
270 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Notify.Handler), "Handler"},
271 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Notify.Context), "Context"},
272 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Notify.Next[0]), "Next System Notify"},
273 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Notify.Next[1]), "Next Device Notify"}
276 static ACPI_EXDUMP_INFO AcpiExDumpExtra[6] =
278 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpExtra), NULL},
279 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Extra.Method_REG), "_REG Method"},
280 {ACPI_EXD_NODE, ACPI_EXD_OFFSET (Extra.ScopeNode), "Scope Node"},
281 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Extra.RegionContext), "Region Context"},
282 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Extra.AmlStart), "Aml Start"},
283 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (Extra.AmlLength), "Aml Length"}
286 static ACPI_EXDUMP_INFO AcpiExDumpData[3] =
288 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpData), NULL},
289 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Data.Handler), "Handler"},
290 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Data.Pointer), "Raw Data"}
293 /* Miscellaneous tables */
295 static ACPI_EXDUMP_INFO AcpiExDumpCommon[5] =
297 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpCommon), NULL},
298 {ACPI_EXD_TYPE , 0, NULL},
299 {ACPI_EXD_UINT16, ACPI_EXD_OFFSET (Common.ReferenceCount), "Reference Count"},
300 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Common.Flags), "Flags"},
301 {ACPI_EXD_LIST, ACPI_EXD_OFFSET (Common.NextObject), "Object List"}
304 static ACPI_EXDUMP_INFO AcpiExDumpFieldCommon[7] =
306 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpFieldCommon), NULL},
307 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (CommonField.FieldFlags), "Field Flags"},
308 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (CommonField.AccessByteWidth), "Access Byte Width"},
309 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (CommonField.BitLength), "Bit Length"},
310 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (CommonField.StartFieldBitOffset),"Field Bit Offset"},
311 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (CommonField.BaseByteOffset), "Base Byte Offset"},
312 {ACPI_EXD_NODE, ACPI_EXD_OFFSET (CommonField.Node), "Parent Node"}
315 static ACPI_EXDUMP_INFO AcpiExDumpNode[7] =
317 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpNode), NULL},
318 {ACPI_EXD_UINT8, ACPI_EXD_NSOFFSET (Flags), "Flags"},
319 {ACPI_EXD_UINT8, ACPI_EXD_NSOFFSET (OwnerId), "Owner Id"},
320 {ACPI_EXD_LIST, ACPI_EXD_NSOFFSET (Object), "Object List"},
321 {ACPI_EXD_NODE, ACPI_EXD_NSOFFSET (Parent), "Parent"},
322 {ACPI_EXD_NODE, ACPI_EXD_NSOFFSET (Child), "Child"},
323 {ACPI_EXD_NODE, ACPI_EXD_NSOFFSET (Peer), "Peer"}
327 /* Dispatch table, indexed by object type */
329 static ACPI_EXDUMP_INFO *AcpiExDumpInfo[] =
345 AcpiExDumpBufferField,
348 AcpiExDumpRegionField,
350 AcpiExDumpIndexField,
355 AcpiExDumpAddressHandler,
364 /*******************************************************************************
366 * FUNCTION: AcpiExDumpObject
368 * PARAMETERS: ObjDesc - Descriptor to dump
369 * Info - Info table corresponding to this object
374 * DESCRIPTION: Walk the info table for this object
376 ******************************************************************************/
380 ACPI_OPERAND_OBJECT *ObjDesc,
381 ACPI_EXDUMP_INFO *Info)
385 const char *ReferenceName;
387 ACPI_OPERAND_OBJECT *Start;
388 ACPI_OPERAND_OBJECT *Data = NULL;
389 ACPI_OPERAND_OBJECT *Next;
390 ACPI_NAMESPACE_NODE *Node;
396 "ExDumpObject: Display not implemented for object type %s\n",
397 AcpiUtGetObjectTypeName (ObjDesc));
401 /* First table entry must contain the table length (# of table entries) */
403 Count = Info->Offset;
407 Target = ACPI_ADD_PTR (UINT8, ObjDesc, Info->Offset);
410 switch (Info->Opcode)
418 AcpiOsPrintf ("%20s : %2.2X [%s]\n", "Type",
419 ObjDesc->Common.Type, AcpiUtGetObjectTypeName (ObjDesc));
424 AcpiOsPrintf ("%20s : %2.2X\n", Name, *Target);
427 case ACPI_EXD_UINT16:
429 AcpiOsPrintf ("%20s : %4.4X\n", Name, ACPI_GET16 (Target));
432 case ACPI_EXD_UINT32:
434 AcpiOsPrintf ("%20s : %8.8X\n", Name, ACPI_GET32 (Target));
437 case ACPI_EXD_UINT64:
439 AcpiOsPrintf ("%20s : %8.8X%8.8X\n", "Value",
440 ACPI_FORMAT_UINT64 (ACPI_GET64 (Target)));
443 case ACPI_EXD_POINTER:
444 case ACPI_EXD_ADDRESS:
446 AcpiExOutPointer (Name, *ACPI_CAST_PTR (void *, Target));
449 case ACPI_EXD_STRING:
451 AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX);
455 case ACPI_EXD_BUFFER:
457 ACPI_DUMP_BUFFER (ObjDesc->Buffer.Pointer, ObjDesc->Buffer.Length);
460 case ACPI_EXD_PACKAGE:
462 /* Dump the package contents */
464 AcpiOsPrintf ("\nPackage Contents:\n");
465 AcpiExDumpPackageObj (ObjDesc, 0, 0);
470 AcpiExDumpObject (ObjDesc, AcpiExDumpFieldCommon);
473 case ACPI_EXD_REFERENCE:
475 ReferenceName = AcpiUtGetReferenceName (ObjDesc);
476 AcpiExOutString ("Class Name", ACPI_CAST_PTR (char, ReferenceName));
477 AcpiExDumpReferenceObj (ObjDesc);
482 Start = *ACPI_CAST_PTR (void *, Target);
485 AcpiOsPrintf ("%20s : %p", Name, Next);
488 AcpiOsPrintf ("(%s %2.2X)",
489 AcpiUtGetObjectTypeName (Next), Next->Common.Type);
491 while (Next->Common.NextObject)
493 if ((Next->Common.Type == ACPI_TYPE_LOCAL_DATA) &&
499 Next = Next->Common.NextObject;
500 AcpiOsPrintf ("->%p(%s %2.2X)", Next,
501 AcpiUtGetObjectTypeName (Next), Next->Common.Type);
503 if ((Next == Start) || (Next == Data))
505 AcpiOsPrintf ("\n**** Error: Object list appears to be circular linked");
511 AcpiOsPrintf ("\n", Next);
514 case ACPI_EXD_HDLR_LIST:
516 Start = *ACPI_CAST_PTR (void *, Target);
519 AcpiOsPrintf ("%20s : %p", Name, Next);
522 AcpiOsPrintf ("(%s %2.2X)",
523 AcpiUtGetObjectTypeName (Next), Next->Common.Type);
525 while (Next->AddressSpace.Next)
527 if ((Next->Common.Type == ACPI_TYPE_LOCAL_DATA) &&
533 Next = Next->AddressSpace.Next;
534 AcpiOsPrintf ("->%p(%s %2.2X)", Next,
535 AcpiUtGetObjectTypeName (Next), Next->Common.Type);
537 if ((Next == Start) || (Next == Data))
539 AcpiOsPrintf ("\n**** Error: Handler list appears to be circular linked");
545 AcpiOsPrintf ("\n", Next);
548 case ACPI_EXD_RGN_LIST:
550 Start = *ACPI_CAST_PTR (void *, Target);
553 AcpiOsPrintf ("%20s : %p", Name, Next);
556 AcpiOsPrintf ("(%s %2.2X)",
557 AcpiUtGetObjectTypeName (Next), Next->Common.Type);
559 while (Next->Region.Next)
561 if ((Next->Common.Type == ACPI_TYPE_LOCAL_DATA) &&
567 Next = Next->Region.Next;
568 AcpiOsPrintf ("->%p(%s %2.2X)", Next,
569 AcpiUtGetObjectTypeName (Next), Next->Common.Type);
571 if ((Next == Start) || (Next == Data))
573 AcpiOsPrintf ("\n**** Error: Region list appears to be circular linked");
579 AcpiOsPrintf ("\n", Next);
584 Node = *ACPI_CAST_PTR (ACPI_NAMESPACE_NODE *, Target);
586 AcpiOsPrintf ("%20s : %p", Name, Node);
589 AcpiOsPrintf (" [%4.4s]", Node->Name.Ascii);
596 AcpiOsPrintf ("**** Invalid table opcode [%X] ****\n",
607 /*******************************************************************************
609 * FUNCTION: AcpiExDumpOperand
611 * PARAMETERS: *ObjDesc - Pointer to entry to be dumped
612 * Depth - Current nesting depth
616 * DESCRIPTION: Dump an operand object
618 ******************************************************************************/
622 ACPI_OPERAND_OBJECT *ObjDesc,
629 ACPI_FUNCTION_NAME (ExDumpOperand)
632 /* Check if debug output enabled */
634 if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_EXEC, _COMPONENT))
641 /* This could be a null element of a package */
643 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Null Object Descriptor\n"));
647 if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED)
649 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p Namespace Node: ", ObjDesc));
650 ACPI_DUMP_ENTRY (ObjDesc, ACPI_LV_EXEC);
654 if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND)
656 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
657 "%p is not a node or operand object: [%s]\n",
658 ObjDesc, AcpiUtGetDescriptorName (ObjDesc)));
659 ACPI_DUMP_BUFFER (ObjDesc, sizeof (ACPI_OPERAND_OBJECT));
663 /* ObjDesc is a valid object */
667 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%*s[%u] %p ",
668 Depth, " ", Depth, ObjDesc));
672 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p ", ObjDesc));
675 /* Decode object type */
677 switch (ObjDesc->Common.Type)
679 case ACPI_TYPE_LOCAL_REFERENCE:
681 AcpiOsPrintf ("Reference: [%s] ", AcpiUtGetReferenceName (ObjDesc));
683 switch (ObjDesc->Reference.Class)
685 case ACPI_REFCLASS_DEBUG:
690 case ACPI_REFCLASS_INDEX:
692 AcpiOsPrintf ("%p\n", ObjDesc->Reference.Object);
695 case ACPI_REFCLASS_TABLE:
697 AcpiOsPrintf ("Table Index %X\n", ObjDesc->Reference.Value);
700 case ACPI_REFCLASS_REFOF:
702 AcpiOsPrintf ("%p [%s]\n", ObjDesc->Reference.Object,
703 AcpiUtGetTypeName (((ACPI_OPERAND_OBJECT *)
704 ObjDesc->Reference.Object)->Common.Type));
707 case ACPI_REFCLASS_NAME:
709 AcpiOsPrintf ("- [%4.4s]\n", ObjDesc->Reference.Node->Name.Ascii);
712 case ACPI_REFCLASS_ARG:
713 case ACPI_REFCLASS_LOCAL:
715 AcpiOsPrintf ("%X\n", ObjDesc->Reference.Value);
718 default: /* Unknown reference class */
720 AcpiOsPrintf ("%2.2X\n", ObjDesc->Reference.Class);
725 case ACPI_TYPE_BUFFER:
727 AcpiOsPrintf ("Buffer length %.2X @ %p\n",
728 ObjDesc->Buffer.Length, ObjDesc->Buffer.Pointer);
730 /* Debug only -- dump the buffer contents */
732 if (ObjDesc->Buffer.Pointer)
734 Length = ObjDesc->Buffer.Length;
740 AcpiOsPrintf ("Buffer Contents: (displaying length 0x%.2X)\n",
742 ACPI_DUMP_BUFFER (ObjDesc->Buffer.Pointer, Length);
746 case ACPI_TYPE_INTEGER:
748 AcpiOsPrintf ("Integer %8.8X%8.8X\n",
749 ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
752 case ACPI_TYPE_PACKAGE:
754 AcpiOsPrintf ("Package [Len %X] ElementArray %p\n",
755 ObjDesc->Package.Count, ObjDesc->Package.Elements);
758 * If elements exist, package element pointer is valid,
759 * and debug_level exceeds 1, dump package's elements.
761 if (ObjDesc->Package.Count &&
762 ObjDesc->Package.Elements &&
765 for (Index = 0; Index < ObjDesc->Package.Count; Index++)
767 AcpiExDumpOperand (ObjDesc->Package.Elements[Index], Depth+1);
772 case ACPI_TYPE_REGION:
774 AcpiOsPrintf ("Region %s (%X)",
775 AcpiUtGetRegionName (ObjDesc->Region.SpaceId),
776 ObjDesc->Region.SpaceId);
779 * If the address and length have not been evaluated,
782 if (!(ObjDesc->Region.Flags & AOPOBJ_DATA_VALID))
788 AcpiOsPrintf (" base %8.8X%8.8X Length %X\n",
789 ACPI_FORMAT_NATIVE_UINT (ObjDesc->Region.Address),
790 ObjDesc->Region.Length);
794 case ACPI_TYPE_STRING:
796 AcpiOsPrintf ("String length %X @ %p ",
797 ObjDesc->String.Length,
798 ObjDesc->String.Pointer);
800 AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX);
804 case ACPI_TYPE_LOCAL_BANK_FIELD:
806 AcpiOsPrintf ("BankField\n");
809 case ACPI_TYPE_LOCAL_REGION_FIELD:
811 AcpiOsPrintf ("RegionField: Bits=%X AccWidth=%X Lock=%X Update=%X at "
812 "byte=%X bit=%X of below:\n",
813 ObjDesc->Field.BitLength,
814 ObjDesc->Field.AccessByteWidth,
815 ObjDesc->Field.FieldFlags & AML_FIELD_LOCK_RULE_MASK,
816 ObjDesc->Field.FieldFlags & AML_FIELD_UPDATE_RULE_MASK,
817 ObjDesc->Field.BaseByteOffset,
818 ObjDesc->Field.StartFieldBitOffset);
820 AcpiExDumpOperand (ObjDesc->Field.RegionObj, Depth+1);
823 case ACPI_TYPE_LOCAL_INDEX_FIELD:
825 AcpiOsPrintf ("IndexField\n");
828 case ACPI_TYPE_BUFFER_FIELD:
830 AcpiOsPrintf ("BufferField: %X bits at byte %X bit %X of\n",
831 ObjDesc->BufferField.BitLength,
832 ObjDesc->BufferField.BaseByteOffset,
833 ObjDesc->BufferField.StartFieldBitOffset);
835 if (!ObjDesc->BufferField.BufferObj)
837 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "*NULL*\n"));
839 else if ((ObjDesc->BufferField.BufferObj)->Common.Type !=
842 AcpiOsPrintf ("*not a Buffer*\n");
846 AcpiExDumpOperand (ObjDesc->BufferField.BufferObj, Depth+1);
850 case ACPI_TYPE_EVENT:
852 AcpiOsPrintf ("Event\n");
855 case ACPI_TYPE_METHOD:
857 AcpiOsPrintf ("Method(%X) @ %p:%X\n",
858 ObjDesc->Method.ParamCount,
859 ObjDesc->Method.AmlStart,
860 ObjDesc->Method.AmlLength);
863 case ACPI_TYPE_MUTEX:
865 AcpiOsPrintf ("Mutex\n");
868 case ACPI_TYPE_DEVICE:
870 AcpiOsPrintf ("Device\n");
873 case ACPI_TYPE_POWER:
875 AcpiOsPrintf ("Power\n");
878 case ACPI_TYPE_PROCESSOR:
880 AcpiOsPrintf ("Processor\n");
883 case ACPI_TYPE_THERMAL:
885 AcpiOsPrintf ("Thermal\n");
892 AcpiOsPrintf ("Unknown Type %X\n", ObjDesc->Common.Type);
900 /*******************************************************************************
902 * FUNCTION: AcpiExDumpOperands
904 * PARAMETERS: Operands - A list of Operand objects
905 * OpcodeName - AML opcode name
906 * NumOperands - Operand count for this opcode
908 * DESCRIPTION: Dump the operands associated with the opcode
910 ******************************************************************************/
914 ACPI_OPERAND_OBJECT **Operands,
915 const char *OpcodeName,
918 ACPI_FUNCTION_NAME (ExDumpOperands);
923 OpcodeName = "UNKNOWN";
926 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
927 "**** Start operand dump for opcode [%s], %u operands\n",
928 OpcodeName, NumOperands));
930 if (NumOperands == 0)
935 /* Dump the individual operands */
939 AcpiExDumpOperand (*Operands, 0);
944 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
945 "**** End operand dump for [%s]\n", OpcodeName));
950 /*******************************************************************************
952 * FUNCTION: AcpiExOut* functions
954 * PARAMETERS: Title - Descriptive text
955 * Value - Value to be displayed
957 * DESCRIPTION: Object dump output formatting functions. These functions
958 * reduce the number of format strings required and keeps them
959 * all in one place for easy modification.
961 ******************************************************************************/
968 AcpiOsPrintf ("%20s : %s\n", Title, Value);
976 AcpiOsPrintf ("%20s : %p\n", Title, Value);
980 /*******************************************************************************
982 * FUNCTION: AcpiExDumpNamespaceNode
984 * PARAMETERS: Node - Descriptor to dump
985 * Flags - Force display if TRUE
987 * DESCRIPTION: Dumps the members of the given.Node
989 ******************************************************************************/
992 AcpiExDumpNamespaceNode (
993 ACPI_NAMESPACE_NODE *Node,
997 ACPI_FUNCTION_ENTRY ();
1002 /* Check if debug output enabled */
1004 if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_OBJECTS, _COMPONENT))
1010 AcpiOsPrintf ("%20s : %4.4s\n", "Name", AcpiUtGetNodeName (Node));
1011 AcpiOsPrintf ("%20s : %2.2X [%s]\n", "Type",
1012 Node->Type, AcpiUtGetTypeName (Node->Type));
1014 AcpiExDumpObject (ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Node),
1019 /*******************************************************************************
1021 * FUNCTION: AcpiExDumpReferenceObj
1023 * PARAMETERS: Object - Descriptor to dump
1025 * DESCRIPTION: Dumps a reference object
1027 ******************************************************************************/
1030 AcpiExDumpReferenceObj (
1031 ACPI_OPERAND_OBJECT *ObjDesc)
1037 RetBuf.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
1039 if (ObjDesc->Reference.Class == ACPI_REFCLASS_NAME)
1041 AcpiOsPrintf (" %p ", ObjDesc->Reference.Node);
1043 Status = AcpiNsHandleToPathname (ObjDesc->Reference.Node, &RetBuf);
1044 if (ACPI_FAILURE (Status))
1046 AcpiOsPrintf (" Could not convert name to pathname\n");
1050 AcpiOsPrintf ("%s\n", (char *) RetBuf.Pointer);
1051 ACPI_FREE (RetBuf.Pointer);
1054 else if (ObjDesc->Reference.Object)
1056 if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_OPERAND)
1058 AcpiOsPrintf (" Target: %p", ObjDesc->Reference.Object);
1059 if (ObjDesc->Reference.Class == ACPI_REFCLASS_TABLE)
1061 AcpiOsPrintf (" Table Index: %X\n", ObjDesc->Reference.Value);
1065 AcpiOsPrintf (" Target: %p [%s]\n", ObjDesc->Reference.Object,
1066 AcpiUtGetTypeName (((ACPI_OPERAND_OBJECT *)
1067 ObjDesc->Reference.Object)->Common.Type));
1072 AcpiOsPrintf (" Target: %p\n", ObjDesc->Reference.Object);
1078 /*******************************************************************************
1080 * FUNCTION: AcpiExDumpPackageObj
1082 * PARAMETERS: ObjDesc - Descriptor to dump
1083 * Level - Indentation Level
1084 * Index - Package index for this object
1086 * DESCRIPTION: Dumps the elements of the package
1088 ******************************************************************************/
1091 AcpiExDumpPackageObj (
1092 ACPI_OPERAND_OBJECT *ObjDesc,
1099 /* Indentation and index output */
1103 for (i = 0; i < Level; i++)
1108 AcpiOsPrintf ("[%.2d] ", Index);
1111 AcpiOsPrintf ("%p ", ObjDesc);
1113 /* Null package elements are allowed */
1117 AcpiOsPrintf ("[Null Object]\n");
1121 /* Packages may only contain a few object types */
1123 switch (ObjDesc->Common.Type)
1125 case ACPI_TYPE_INTEGER:
1127 AcpiOsPrintf ("[Integer] = %8.8X%8.8X\n",
1128 ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
1131 case ACPI_TYPE_STRING:
1133 AcpiOsPrintf ("[String] Value: ");
1134 AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX);
1135 AcpiOsPrintf ("\n");
1138 case ACPI_TYPE_BUFFER:
1140 AcpiOsPrintf ("[Buffer] Length %.2X = ", ObjDesc->Buffer.Length);
1141 if (ObjDesc->Buffer.Length)
1143 AcpiUtDebugDumpBuffer (ACPI_CAST_PTR (UINT8, ObjDesc->Buffer.Pointer),
1144 ObjDesc->Buffer.Length, DB_DWORD_DISPLAY, _COMPONENT);
1148 AcpiOsPrintf ("\n");
1152 case ACPI_TYPE_PACKAGE:
1154 AcpiOsPrintf ("[Package] Contains %u Elements:\n",
1155 ObjDesc->Package.Count);
1157 for (i = 0; i < ObjDesc->Package.Count; i++)
1159 AcpiExDumpPackageObj (ObjDesc->Package.Elements[i], Level+1, i);
1163 case ACPI_TYPE_LOCAL_REFERENCE:
1165 AcpiOsPrintf ("[Object Reference] Type [%s] %2.2X",
1166 AcpiUtGetReferenceName (ObjDesc),
1167 ObjDesc->Reference.Class);
1168 AcpiExDumpReferenceObj (ObjDesc);
1173 AcpiOsPrintf ("[Unknown Type] %X\n", ObjDesc->Common.Type);
1179 /*******************************************************************************
1181 * FUNCTION: AcpiExDumpObjectDescriptor
1183 * PARAMETERS: ObjDesc - Descriptor to dump
1184 * Flags - Force display if TRUE
1186 * DESCRIPTION: Dumps the members of the object descriptor given.
1188 ******************************************************************************/
1191 AcpiExDumpObjectDescriptor (
1192 ACPI_OPERAND_OBJECT *ObjDesc,
1195 ACPI_FUNCTION_TRACE (ExDumpObjectDescriptor);
1205 /* Check if debug output enabled */
1207 if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_OBJECTS, _COMPONENT))
1213 if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED)
1215 AcpiExDumpNamespaceNode ((ACPI_NAMESPACE_NODE *) ObjDesc, Flags);
1217 AcpiOsPrintf ("\nAttached Object (%p):\n",
1218 ((ACPI_NAMESPACE_NODE *) ObjDesc)->Object);
1220 ObjDesc = ((ACPI_NAMESPACE_NODE *) ObjDesc)->Object;
1224 if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND)
1227 "%p is not an ACPI operand object: [%s]\n",
1228 ObjDesc, AcpiUtGetDescriptorName (ObjDesc));
1232 /* Validate the object type */
1234 if (ObjDesc->Common.Type > ACPI_TYPE_LOCAL_MAX)
1236 AcpiOsPrintf ("Not a known object type: %2.2X\n",
1237 ObjDesc->Common.Type);
1246 AcpiExDumpObject (ObjDesc, AcpiExDumpCommon);
1248 /* Object-specific fields */
1250 AcpiExDumpObject (ObjDesc, AcpiExDumpInfo[ObjDesc->Common.Type]);
1252 if (ObjDesc->Common.Type == ACPI_TYPE_REGION)
1254 ObjDesc = ObjDesc->Common.NextObject;
1255 if (ObjDesc->Common.Type > ACPI_TYPE_LOCAL_MAX)
1257 AcpiOsPrintf ("Secondary object is not a known object type: %2.2X\n",
1258 ObjDesc->Common.Type);
1263 AcpiOsPrintf ("\nExtra attached Object (%p):\n", ObjDesc);
1264 AcpiExDumpObject (ObjDesc, AcpiExDumpInfo[ObjDesc->Common.Type]);