1 /****************************************************************************** 2 * 3 * Module Name: exdump - Interpreter debug output routines 4 * 5 *****************************************************************************/ 6 7 /* 8 * Copyright (C) 2000 - 2013, 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 <contrib/dev/acpica/include/acpi.h> 47 #include <contrib/dev/acpica/include/accommon.h> 48 #include <contrib/dev/acpica/include/acinterp.h> 49 #include <contrib/dev/acpica/include/amlcode.h> 50 #include <contrib/dev/acpica/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.NotifyList[0]), "System Notify"}, 135 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Device.NotifyList[1]), "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.NotifyList[0]), "System Notify"}, 183 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (PowerResource.NotifyList[1]), "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.NotifyList[0]), "System Notify"}, 193 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Processor.NotifyList[1]), "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.NotifyList[0]), "System Notify"}, 201 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (ThermalZone.NotifyList[1]), "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[5] = 213 { 214 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpRegionField), NULL}, 215 {ACPI_EXD_FIELD, 0, NULL}, 216 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Field.AccessLength), "AccessLength"}, 217 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Field.RegionObj), "Region Object"}, 218 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Field.ResourceBuffer), "ResourceBuffer"} 219 }; 220 221 static ACPI_EXDUMP_INFO AcpiExDumpBankField[5] = 222 { 223 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpBankField), NULL}, 224 {ACPI_EXD_FIELD, 0, NULL}, 225 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (BankField.Value), "Value"}, 226 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (BankField.RegionObj), "Region Object"}, 227 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (BankField.BankObj), "Bank Object"} 228 }; 229 230 static ACPI_EXDUMP_INFO AcpiExDumpIndexField[5] = 231 { 232 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpBankField), NULL}, 233 {ACPI_EXD_FIELD, 0, NULL}, 234 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (IndexField.Value), "Value"}, 235 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (IndexField.IndexObj), "Index Object"}, 236 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (IndexField.DataObj), "Data Object"} 237 }; 238 239 static ACPI_EXDUMP_INFO AcpiExDumpReference[8] = 240 { 241 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpReference), NULL}, 242 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Reference.Class), "Class"}, 243 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Reference.TargetType), "Target Type"}, 244 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (Reference.Value), "Value"}, 245 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Reference.Object), "Object Desc"}, 246 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Reference.Node), "Node"}, 247 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Reference.Where), "Where"}, 248 {ACPI_EXD_REFERENCE,0, NULL} 249 }; 250 251 static ACPI_EXDUMP_INFO AcpiExDumpAddressHandler[6] = 252 { 253 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpAddressHandler), NULL}, 254 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (AddressSpace.SpaceId), "Space Id"}, 255 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (AddressSpace.Next), "Next"}, 256 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (AddressSpace.RegionList), "Region List"}, 257 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (AddressSpace.Node), "Node"}, 258 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (AddressSpace.Context), "Context"} 259 }; 260 261 static ACPI_EXDUMP_INFO AcpiExDumpNotify[7] = 262 { 263 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpNotify), NULL}, 264 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Notify.Node), "Node"}, 265 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (Notify.HandlerType), "Handler Type"}, 266 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Notify.Handler), "Handler"}, 267 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Notify.Context), "Context"}, 268 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Notify.Next[0]), "Next System Notify"}, 269 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Notify.Next[1]), "Next Device Notify"} 270 }; 271 272 273 /* Miscellaneous tables */ 274 275 static ACPI_EXDUMP_INFO AcpiExDumpCommon[4] = 276 { 277 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpCommon), NULL}, 278 {ACPI_EXD_TYPE , 0, NULL}, 279 {ACPI_EXD_UINT16, ACPI_EXD_OFFSET (Common.ReferenceCount), "Reference Count"}, 280 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Common.Flags), "Flags"} 281 }; 282 283 static ACPI_EXDUMP_INFO AcpiExDumpFieldCommon[7] = 284 { 285 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpFieldCommon), NULL}, 286 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (CommonField.FieldFlags), "Field Flags"}, 287 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (CommonField.AccessByteWidth), "Access Byte Width"}, 288 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (CommonField.BitLength), "Bit Length"}, 289 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (CommonField.StartFieldBitOffset),"Field Bit Offset"}, 290 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (CommonField.BaseByteOffset), "Base Byte Offset"}, 291 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (CommonField.Node), "Parent Node"} 292 }; 293 294 static ACPI_EXDUMP_INFO AcpiExDumpNode[5] = 295 { 296 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpNode), NULL}, 297 {ACPI_EXD_UINT8, ACPI_EXD_NSOFFSET (Flags), "Flags"}, 298 {ACPI_EXD_UINT8, ACPI_EXD_NSOFFSET (OwnerId), "Owner Id"}, 299 {ACPI_EXD_POINTER, ACPI_EXD_NSOFFSET (Child), "Child List"}, 300 {ACPI_EXD_POINTER, ACPI_EXD_NSOFFSET (Peer), "Next Peer"} 301 }; 302 303 304 /* Dispatch table, indexed by object type */ 305 306 static ACPI_EXDUMP_INFO *AcpiExDumpInfo[] = 307 { 308 NULL, 309 AcpiExDumpInteger, 310 AcpiExDumpString, 311 AcpiExDumpBuffer, 312 AcpiExDumpPackage, 313 NULL, 314 AcpiExDumpDevice, 315 AcpiExDumpEvent, 316 AcpiExDumpMethod, 317 AcpiExDumpMutex, 318 AcpiExDumpRegion, 319 AcpiExDumpPower, 320 AcpiExDumpProcessor, 321 AcpiExDumpThermal, 322 AcpiExDumpBufferField, 323 NULL, 324 NULL, 325 AcpiExDumpRegionField, 326 AcpiExDumpBankField, 327 AcpiExDumpIndexField, 328 AcpiExDumpReference, 329 NULL, 330 NULL, 331 AcpiExDumpNotify, 332 AcpiExDumpAddressHandler, 333 NULL, 334 NULL, 335 NULL 336 }; 337 338 339 /******************************************************************************* 340 * 341 * FUNCTION: AcpiExDumpObject 342 * 343 * PARAMETERS: ObjDesc - Descriptor to dump 344 * Info - Info table corresponding to this object 345 * type 346 * 347 * RETURN: None 348 * 349 * DESCRIPTION: Walk the info table for this object 350 * 351 ******************************************************************************/ 352 353 static void 354 AcpiExDumpObject ( 355 ACPI_OPERAND_OBJECT *ObjDesc, 356 ACPI_EXDUMP_INFO *Info) 357 { 358 UINT8 *Target; 359 char *Name; 360 UINT8 Count; 361 362 363 if (!Info) 364 { 365 AcpiOsPrintf ( 366 "ExDumpObject: Display not implemented for object type %s\n", 367 AcpiUtGetObjectTypeName (ObjDesc)); 368 return; 369 } 370 371 /* First table entry must contain the table length (# of table entries) */ 372 373 Count = Info->Offset; 374 375 while (Count) 376 { 377 Target = ACPI_ADD_PTR (UINT8, ObjDesc, Info->Offset); 378 Name = Info->Name; 379 380 switch (Info->Opcode) 381 { 382 case ACPI_EXD_INIT: 383 break; 384 385 case ACPI_EXD_TYPE: 386 387 AcpiExOutString ("Type", AcpiUtGetObjectTypeName (ObjDesc)); 388 break; 389 390 case ACPI_EXD_UINT8: 391 392 AcpiOsPrintf ("%20s : %2.2X\n", Name, *Target); 393 break; 394 395 case ACPI_EXD_UINT16: 396 397 AcpiOsPrintf ("%20s : %4.4X\n", Name, ACPI_GET16 (Target)); 398 break; 399 400 case ACPI_EXD_UINT32: 401 402 AcpiOsPrintf ("%20s : %8.8X\n", Name, ACPI_GET32 (Target)); 403 break; 404 405 case ACPI_EXD_UINT64: 406 407 AcpiOsPrintf ("%20s : %8.8X%8.8X\n", "Value", 408 ACPI_FORMAT_UINT64 (ACPI_GET64 (Target))); 409 break; 410 411 case ACPI_EXD_POINTER: 412 case ACPI_EXD_ADDRESS: 413 414 AcpiExOutPointer (Name, *ACPI_CAST_PTR (void *, Target)); 415 break; 416 417 case ACPI_EXD_STRING: 418 419 AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX); 420 AcpiOsPrintf ("\n"); 421 break; 422 423 case ACPI_EXD_BUFFER: 424 425 ACPI_DUMP_BUFFER (ObjDesc->Buffer.Pointer, ObjDesc->Buffer.Length); 426 break; 427 428 case ACPI_EXD_PACKAGE: 429 430 /* Dump the package contents */ 431 432 AcpiOsPrintf ("\nPackage Contents:\n"); 433 AcpiExDumpPackageObj (ObjDesc, 0, 0); 434 break; 435 436 case ACPI_EXD_FIELD: 437 438 AcpiExDumpObject (ObjDesc, AcpiExDumpFieldCommon); 439 break; 440 441 case ACPI_EXD_REFERENCE: 442 443 AcpiExOutString ("Class Name", 444 ACPI_CAST_PTR (char, AcpiUtGetReferenceName (ObjDesc))); 445 AcpiExDumpReferenceObj (ObjDesc); 446 break; 447 448 default: 449 450 AcpiOsPrintf ("**** Invalid table opcode [%X] ****\n", 451 Info->Opcode); 452 return; 453 } 454 455 Info++; 456 Count--; 457 } 458 } 459 460 461 /******************************************************************************* 462 * 463 * FUNCTION: AcpiExDumpOperand 464 * 465 * PARAMETERS: *ObjDesc - Pointer to entry to be dumped 466 * Depth - Current nesting depth 467 * 468 * RETURN: None 469 * 470 * DESCRIPTION: Dump an operand object 471 * 472 ******************************************************************************/ 473 474 void 475 AcpiExDumpOperand ( 476 ACPI_OPERAND_OBJECT *ObjDesc, 477 UINT32 Depth) 478 { 479 UINT32 Length; 480 UINT32 Index; 481 482 483 ACPI_FUNCTION_NAME (ExDumpOperand) 484 485 486 /* Check if debug output enabled */ 487 488 if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_EXEC, _COMPONENT)) 489 { 490 return; 491 } 492 493 if (!ObjDesc) 494 { 495 /* This could be a null element of a package */ 496 497 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Null Object Descriptor\n")); 498 return; 499 } 500 501 if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED) 502 { 503 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p Namespace Node: ", ObjDesc)); 504 ACPI_DUMP_ENTRY (ObjDesc, ACPI_LV_EXEC); 505 return; 506 } 507 508 if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND) 509 { 510 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, 511 "%p is not a node or operand object: [%s]\n", 512 ObjDesc, AcpiUtGetDescriptorName (ObjDesc))); 513 ACPI_DUMP_BUFFER (ObjDesc, sizeof (ACPI_OPERAND_OBJECT)); 514 return; 515 } 516 517 /* ObjDesc is a valid object */ 518 519 if (Depth > 0) 520 { 521 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%*s[%u] %p ", 522 Depth, " ", Depth, ObjDesc)); 523 } 524 else 525 { 526 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p ", ObjDesc)); 527 } 528 529 /* Decode object type */ 530 531 switch (ObjDesc->Common.Type) 532 { 533 case ACPI_TYPE_LOCAL_REFERENCE: 534 535 AcpiOsPrintf ("Reference: [%s] ", AcpiUtGetReferenceName (ObjDesc)); 536 537 switch (ObjDesc->Reference.Class) 538 { 539 case ACPI_REFCLASS_DEBUG: 540 541 AcpiOsPrintf ("\n"); 542 break; 543 544 545 case ACPI_REFCLASS_INDEX: 546 547 AcpiOsPrintf ("%p\n", ObjDesc->Reference.Object); 548 break; 549 550 551 case ACPI_REFCLASS_TABLE: 552 553 AcpiOsPrintf ("Table Index %X\n", ObjDesc->Reference.Value); 554 break; 555 556 557 case ACPI_REFCLASS_REFOF: 558 559 AcpiOsPrintf ("%p [%s]\n", ObjDesc->Reference.Object, 560 AcpiUtGetTypeName (((ACPI_OPERAND_OBJECT *) 561 ObjDesc->Reference.Object)->Common.Type)); 562 break; 563 564 565 case ACPI_REFCLASS_NAME: 566 567 AcpiOsPrintf ("- [%4.4s]\n", ObjDesc->Reference.Node->Name.Ascii); 568 break; 569 570 571 case ACPI_REFCLASS_ARG: 572 case ACPI_REFCLASS_LOCAL: 573 574 AcpiOsPrintf ("%X\n", ObjDesc->Reference.Value); 575 break; 576 577 578 default: /* Unknown reference class */ 579 580 AcpiOsPrintf ("%2.2X\n", ObjDesc->Reference.Class); 581 break; 582 } 583 break; 584 585 586 case ACPI_TYPE_BUFFER: 587 588 AcpiOsPrintf ("Buffer length %.2X @ %p\n", 589 ObjDesc->Buffer.Length, ObjDesc->Buffer.Pointer); 590 591 /* Debug only -- dump the buffer contents */ 592 593 if (ObjDesc->Buffer.Pointer) 594 { 595 Length = ObjDesc->Buffer.Length; 596 if (Length > 128) 597 { 598 Length = 128; 599 } 600 601 AcpiOsPrintf ("Buffer Contents: (displaying length 0x%.2X)\n", 602 Length); 603 ACPI_DUMP_BUFFER (ObjDesc->Buffer.Pointer, Length); 604 } 605 break; 606 607 608 case ACPI_TYPE_INTEGER: 609 610 AcpiOsPrintf ("Integer %8.8X%8.8X\n", 611 ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value)); 612 break; 613 614 615 case ACPI_TYPE_PACKAGE: 616 617 AcpiOsPrintf ("Package [Len %X] ElementArray %p\n", 618 ObjDesc->Package.Count, ObjDesc->Package.Elements); 619 620 /* 621 * If elements exist, package element pointer is valid, 622 * and debug_level exceeds 1, dump package's elements. 623 */ 624 if (ObjDesc->Package.Count && 625 ObjDesc->Package.Elements && 626 AcpiDbgLevel > 1) 627 { 628 for (Index = 0; Index < ObjDesc->Package.Count; Index++) 629 { 630 AcpiExDumpOperand (ObjDesc->Package.Elements[Index], Depth+1); 631 } 632 } 633 break; 634 635 636 case ACPI_TYPE_REGION: 637 638 AcpiOsPrintf ("Region %s (%X)", 639 AcpiUtGetRegionName (ObjDesc->Region.SpaceId), 640 ObjDesc->Region.SpaceId); 641 642 /* 643 * If the address and length have not been evaluated, 644 * don't print them. 645 */ 646 if (!(ObjDesc->Region.Flags & AOPOBJ_DATA_VALID)) 647 { 648 AcpiOsPrintf ("\n"); 649 } 650 else 651 { 652 AcpiOsPrintf (" base %8.8X%8.8X Length %X\n", 653 ACPI_FORMAT_NATIVE_UINT (ObjDesc->Region.Address), 654 ObjDesc->Region.Length); 655 } 656 break; 657 658 659 case ACPI_TYPE_STRING: 660 661 AcpiOsPrintf ("String length %X @ %p ", 662 ObjDesc->String.Length, 663 ObjDesc->String.Pointer); 664 665 AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX); 666 AcpiOsPrintf ("\n"); 667 break; 668 669 670 case ACPI_TYPE_LOCAL_BANK_FIELD: 671 672 AcpiOsPrintf ("BankField\n"); 673 break; 674 675 676 case ACPI_TYPE_LOCAL_REGION_FIELD: 677 678 AcpiOsPrintf ("RegionField: Bits=%X AccWidth=%X Lock=%X Update=%X at " 679 "byte=%X bit=%X of below:\n", 680 ObjDesc->Field.BitLength, 681 ObjDesc->Field.AccessByteWidth, 682 ObjDesc->Field.FieldFlags & AML_FIELD_LOCK_RULE_MASK, 683 ObjDesc->Field.FieldFlags & AML_FIELD_UPDATE_RULE_MASK, 684 ObjDesc->Field.BaseByteOffset, 685 ObjDesc->Field.StartFieldBitOffset); 686 687 AcpiExDumpOperand (ObjDesc->Field.RegionObj, Depth+1); 688 break; 689 690 691 case ACPI_TYPE_LOCAL_INDEX_FIELD: 692 693 AcpiOsPrintf ("IndexField\n"); 694 break; 695 696 697 case ACPI_TYPE_BUFFER_FIELD: 698 699 AcpiOsPrintf ("BufferField: %X bits at byte %X bit %X of\n", 700 ObjDesc->BufferField.BitLength, 701 ObjDesc->BufferField.BaseByteOffset, 702 ObjDesc->BufferField.StartFieldBitOffset); 703 704 if (!ObjDesc->BufferField.BufferObj) 705 { 706 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "*NULL*\n")); 707 } 708 else if ((ObjDesc->BufferField.BufferObj)->Common.Type != 709 ACPI_TYPE_BUFFER) 710 { 711 AcpiOsPrintf ("*not a Buffer*\n"); 712 } 713 else 714 { 715 AcpiExDumpOperand (ObjDesc->BufferField.BufferObj, Depth+1); 716 } 717 break; 718 719 720 case ACPI_TYPE_EVENT: 721 722 AcpiOsPrintf ("Event\n"); 723 break; 724 725 726 case ACPI_TYPE_METHOD: 727 728 AcpiOsPrintf ("Method(%X) @ %p:%X\n", 729 ObjDesc->Method.ParamCount, 730 ObjDesc->Method.AmlStart, 731 ObjDesc->Method.AmlLength); 732 break; 733 734 735 case ACPI_TYPE_MUTEX: 736 737 AcpiOsPrintf ("Mutex\n"); 738 break; 739 740 741 case ACPI_TYPE_DEVICE: 742 743 AcpiOsPrintf ("Device\n"); 744 break; 745 746 747 case ACPI_TYPE_POWER: 748 749 AcpiOsPrintf ("Power\n"); 750 break; 751 752 753 case ACPI_TYPE_PROCESSOR: 754 755 AcpiOsPrintf ("Processor\n"); 756 break; 757 758 759 case ACPI_TYPE_THERMAL: 760 761 AcpiOsPrintf ("Thermal\n"); 762 break; 763 764 765 default: 766 /* Unknown Type */ 767 768 AcpiOsPrintf ("Unknown Type %X\n", ObjDesc->Common.Type); 769 break; 770 } 771 772 return; 773 } 774 775 776 /******************************************************************************* 777 * 778 * FUNCTION: AcpiExDumpOperands 779 * 780 * PARAMETERS: Operands - A list of Operand objects 781 * OpcodeName - AML opcode name 782 * NumOperands - Operand count for this opcode 783 * 784 * DESCRIPTION: Dump the operands associated with the opcode 785 * 786 ******************************************************************************/ 787 788 void 789 AcpiExDumpOperands ( 790 ACPI_OPERAND_OBJECT **Operands, 791 const char *OpcodeName, 792 UINT32 NumOperands) 793 { 794 ACPI_FUNCTION_NAME (ExDumpOperands); 795 796 797 if (!OpcodeName) 798 { 799 OpcodeName = "UNKNOWN"; 800 } 801 802 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, 803 "**** Start operand dump for opcode [%s], %u operands\n", 804 OpcodeName, NumOperands)); 805 806 if (NumOperands == 0) 807 { 808 NumOperands = 1; 809 } 810 811 /* Dump the individual operands */ 812 813 while (NumOperands) 814 { 815 AcpiExDumpOperand (*Operands, 0); 816 Operands++; 817 NumOperands--; 818 } 819 820 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, 821 "**** End operand dump for [%s]\n", OpcodeName)); 822 return; 823 } 824 825 826 /******************************************************************************* 827 * 828 * FUNCTION: AcpiExOut* functions 829 * 830 * PARAMETERS: Title - Descriptive text 831 * Value - Value to be displayed 832 * 833 * DESCRIPTION: Object dump output formatting functions. These functions 834 * reduce the number of format strings required and keeps them 835 * all in one place for easy modification. 836 * 837 ******************************************************************************/ 838 839 static void 840 AcpiExOutString ( 841 char *Title, 842 char *Value) 843 { 844 AcpiOsPrintf ("%20s : %s\n", Title, Value); 845 } 846 847 static void 848 AcpiExOutPointer ( 849 char *Title, 850 void *Value) 851 { 852 AcpiOsPrintf ("%20s : %p\n", Title, Value); 853 } 854 855 856 /******************************************************************************* 857 * 858 * FUNCTION: AcpiExDumpNamespaceNode 859 * 860 * PARAMETERS: Node - Descriptor to dump 861 * Flags - Force display if TRUE 862 * 863 * DESCRIPTION: Dumps the members of the given.Node 864 * 865 ******************************************************************************/ 866 867 void 868 AcpiExDumpNamespaceNode ( 869 ACPI_NAMESPACE_NODE *Node, 870 UINT32 Flags) 871 { 872 873 ACPI_FUNCTION_ENTRY (); 874 875 876 if (!Flags) 877 { 878 /* Check if debug output enabled */ 879 880 if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_OBJECTS, _COMPONENT)) 881 { 882 return; 883 } 884 } 885 886 AcpiOsPrintf ("%20s : %4.4s\n", "Name", AcpiUtGetNodeName (Node)); 887 AcpiExOutString ("Type", AcpiUtGetTypeName (Node->Type)); 888 AcpiExOutPointer ("Attached Object", AcpiNsGetAttachedObject (Node)); 889 AcpiExOutPointer ("Parent", Node->Parent); 890 891 AcpiExDumpObject (ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Node), 892 AcpiExDumpNode); 893 } 894 895 896 /******************************************************************************* 897 * 898 * FUNCTION: AcpiExDumpReferenceObj 899 * 900 * PARAMETERS: Object - Descriptor to dump 901 * 902 * DESCRIPTION: Dumps a reference object 903 * 904 ******************************************************************************/ 905 906 static void 907 AcpiExDumpReferenceObj ( 908 ACPI_OPERAND_OBJECT *ObjDesc) 909 { 910 ACPI_BUFFER RetBuf; 911 ACPI_STATUS Status; 912 913 914 RetBuf.Length = ACPI_ALLOCATE_LOCAL_BUFFER; 915 916 if (ObjDesc->Reference.Class == ACPI_REFCLASS_NAME) 917 { 918 AcpiOsPrintf (" %p ", ObjDesc->Reference.Node); 919 920 Status = AcpiNsHandleToPathname (ObjDesc->Reference.Node, &RetBuf); 921 if (ACPI_FAILURE (Status)) 922 { 923 AcpiOsPrintf (" Could not convert name to pathname\n"); 924 } 925 else 926 { 927 AcpiOsPrintf ("%s\n", (char *) RetBuf.Pointer); 928 ACPI_FREE (RetBuf.Pointer); 929 } 930 } 931 else if (ObjDesc->Reference.Object) 932 { 933 if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_OPERAND) 934 { 935 AcpiOsPrintf (" Target: %p", ObjDesc->Reference.Object); 936 if (ObjDesc->Reference.Class == ACPI_REFCLASS_TABLE) 937 { 938 AcpiOsPrintf (" Table Index: %X\n", ObjDesc->Reference.Value); 939 } 940 else 941 { 942 AcpiOsPrintf (" Target: %p [%s]\n", ObjDesc->Reference.Object, 943 AcpiUtGetTypeName (((ACPI_OPERAND_OBJECT *) 944 ObjDesc->Reference.Object)->Common.Type)); 945 } 946 } 947 else 948 { 949 AcpiOsPrintf (" Target: %p\n", ObjDesc->Reference.Object); 950 } 951 } 952 } 953 954 955 /******************************************************************************* 956 * 957 * FUNCTION: AcpiExDumpPackageObj 958 * 959 * PARAMETERS: ObjDesc - Descriptor to dump 960 * Level - Indentation Level 961 * Index - Package index for this object 962 * 963 * DESCRIPTION: Dumps the elements of the package 964 * 965 ******************************************************************************/ 966 967 static void 968 AcpiExDumpPackageObj ( 969 ACPI_OPERAND_OBJECT *ObjDesc, 970 UINT32 Level, 971 UINT32 Index) 972 { 973 UINT32 i; 974 975 976 /* Indentation and index output */ 977 978 if (Level > 0) 979 { 980 for (i = 0; i < Level; i++) 981 { 982 AcpiOsPrintf (" "); 983 } 984 985 AcpiOsPrintf ("[%.2d] ", Index); 986 } 987 988 AcpiOsPrintf ("%p ", ObjDesc); 989 990 /* Null package elements are allowed */ 991 992 if (!ObjDesc) 993 { 994 AcpiOsPrintf ("[Null Object]\n"); 995 return; 996 } 997 998 /* Packages may only contain a few object types */ 999 1000 switch (ObjDesc->Common.Type) 1001 { 1002 case ACPI_TYPE_INTEGER: 1003 1004 AcpiOsPrintf ("[Integer] = %8.8X%8.8X\n", 1005 ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value)); 1006 break; 1007 1008 1009 case ACPI_TYPE_STRING: 1010 1011 AcpiOsPrintf ("[String] Value: "); 1012 AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX); 1013 AcpiOsPrintf ("\n"); 1014 break; 1015 1016 1017 case ACPI_TYPE_BUFFER: 1018 1019 AcpiOsPrintf ("[Buffer] Length %.2X = ", ObjDesc->Buffer.Length); 1020 if (ObjDesc->Buffer.Length) 1021 { 1022 AcpiUtDebugDumpBuffer (ACPI_CAST_PTR (UINT8, ObjDesc->Buffer.Pointer), 1023 ObjDesc->Buffer.Length, DB_DWORD_DISPLAY, _COMPONENT); 1024 } 1025 else 1026 { 1027 AcpiOsPrintf ("\n"); 1028 } 1029 break; 1030 1031 1032 case ACPI_TYPE_PACKAGE: 1033 1034 AcpiOsPrintf ("[Package] Contains %u Elements:\n", 1035 ObjDesc->Package.Count); 1036 1037 for (i = 0; i < ObjDesc->Package.Count; i++) 1038 { 1039 AcpiExDumpPackageObj (ObjDesc->Package.Elements[i], Level+1, i); 1040 } 1041 break; 1042 1043 1044 case ACPI_TYPE_LOCAL_REFERENCE: 1045 1046 AcpiOsPrintf ("[Object Reference] Type [%s] %2.2X", 1047 AcpiUtGetReferenceName (ObjDesc), 1048 ObjDesc->Reference.Class); 1049 AcpiExDumpReferenceObj (ObjDesc); 1050 break; 1051 1052 1053 default: 1054 1055 AcpiOsPrintf ("[Unknown Type] %X\n", ObjDesc->Common.Type); 1056 break; 1057 } 1058 } 1059 1060 1061 /******************************************************************************* 1062 * 1063 * FUNCTION: AcpiExDumpObjectDescriptor 1064 * 1065 * PARAMETERS: ObjDesc - Descriptor to dump 1066 * Flags - Force display if TRUE 1067 * 1068 * DESCRIPTION: Dumps the members of the object descriptor given. 1069 * 1070 ******************************************************************************/ 1071 1072 void 1073 AcpiExDumpObjectDescriptor ( 1074 ACPI_OPERAND_OBJECT *ObjDesc, 1075 UINT32 Flags) 1076 { 1077 ACPI_FUNCTION_TRACE (ExDumpObjectDescriptor); 1078 1079 1080 if (!ObjDesc) 1081 { 1082 return_VOID; 1083 } 1084 1085 if (!Flags) 1086 { 1087 /* Check if debug output enabled */ 1088 1089 if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_OBJECTS, _COMPONENT)) 1090 { 1091 return_VOID; 1092 } 1093 } 1094 1095 if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED) 1096 { 1097 AcpiExDumpNamespaceNode ((ACPI_NAMESPACE_NODE *) ObjDesc, Flags); 1098 1099 AcpiOsPrintf ("\nAttached Object (%p):\n", 1100 ((ACPI_NAMESPACE_NODE *) ObjDesc)->Object); 1101 1102 AcpiExDumpObjectDescriptor ( 1103 ((ACPI_NAMESPACE_NODE *) ObjDesc)->Object, Flags); 1104 return_VOID; 1105 } 1106 1107 if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND) 1108 { 1109 AcpiOsPrintf ( 1110 "ExDumpObjectDescriptor: %p is not an ACPI operand object: [%s]\n", 1111 ObjDesc, AcpiUtGetDescriptorName (ObjDesc)); 1112 return_VOID; 1113 } 1114 1115 if (ObjDesc->Common.Type > ACPI_TYPE_NS_NODE_MAX) 1116 { 1117 return_VOID; 1118 } 1119 1120 /* Common Fields */ 1121 1122 AcpiExDumpObject (ObjDesc, AcpiExDumpCommon); 1123 1124 /* Object-specific fields */ 1125 1126 AcpiExDumpObject (ObjDesc, AcpiExDumpInfo[ObjDesc->Common.Type]); 1127 return_VOID; 1128 } 1129 1130 #endif 1131