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