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 - 2016, 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 1358