exdump.c revision 250838
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 63static void 64AcpiExOutString ( 65 char *Title, 66 char *Value); 67 68static void 69AcpiExOutPointer ( 70 char *Title, 71 void *Value); 72 73static void 74AcpiExDumpObject ( 75 ACPI_OPERAND_OBJECT *ObjDesc, 76 ACPI_EXDUMP_INFO *Info); 77 78static void 79AcpiExDumpReferenceObj ( 80 ACPI_OPERAND_OBJECT *ObjDesc); 81 82static void 83AcpiExDumpPackageObj ( 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 98static 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 104static 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 112static 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 121static 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 130static 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 138static 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 144static 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 157static 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 166static 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 177static 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 186static 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 197static 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 205static 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 212static 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 221static 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 230static 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 239static 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 251static 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 261static 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 275static 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 283static 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 294static 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 306static 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 353static void 354AcpiExDumpObject ( 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 384 break; 385 386 case ACPI_EXD_TYPE: 387 388 AcpiExOutString ("Type", AcpiUtGetObjectTypeName (ObjDesc)); 389 break; 390 391 case ACPI_EXD_UINT8: 392 393 AcpiOsPrintf ("%20s : %2.2X\n", Name, *Target); 394 break; 395 396 case ACPI_EXD_UINT16: 397 398 AcpiOsPrintf ("%20s : %4.4X\n", Name, ACPI_GET16 (Target)); 399 break; 400 401 case ACPI_EXD_UINT32: 402 403 AcpiOsPrintf ("%20s : %8.8X\n", Name, ACPI_GET32 (Target)); 404 break; 405 406 case ACPI_EXD_UINT64: 407 408 AcpiOsPrintf ("%20s : %8.8X%8.8X\n", "Value", 409 ACPI_FORMAT_UINT64 (ACPI_GET64 (Target))); 410 break; 411 412 case ACPI_EXD_POINTER: 413 case ACPI_EXD_ADDRESS: 414 415 AcpiExOutPointer (Name, *ACPI_CAST_PTR (void *, Target)); 416 break; 417 418 case ACPI_EXD_STRING: 419 420 AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX); 421 AcpiOsPrintf ("\n"); 422 break; 423 424 case ACPI_EXD_BUFFER: 425 426 ACPI_DUMP_BUFFER (ObjDesc->Buffer.Pointer, ObjDesc->Buffer.Length); 427 break; 428 429 case ACPI_EXD_PACKAGE: 430 431 /* Dump the package contents */ 432 433 AcpiOsPrintf ("\nPackage Contents:\n"); 434 AcpiExDumpPackageObj (ObjDesc, 0, 0); 435 break; 436 437 case ACPI_EXD_FIELD: 438 439 AcpiExDumpObject (ObjDesc, AcpiExDumpFieldCommon); 440 break; 441 442 case ACPI_EXD_REFERENCE: 443 444 AcpiExOutString ("Class Name", 445 ACPI_CAST_PTR (char, AcpiUtGetReferenceName (ObjDesc))); 446 AcpiExDumpReferenceObj (ObjDesc); 447 break; 448 449 default: 450 451 AcpiOsPrintf ("**** Invalid table opcode [%X] ****\n", 452 Info->Opcode); 453 return; 454 } 455 456 Info++; 457 Count--; 458 } 459} 460 461 462/******************************************************************************* 463 * 464 * FUNCTION: AcpiExDumpOperand 465 * 466 * PARAMETERS: *ObjDesc - Pointer to entry to be dumped 467 * Depth - Current nesting depth 468 * 469 * RETURN: None 470 * 471 * DESCRIPTION: Dump an operand object 472 * 473 ******************************************************************************/ 474 475void 476AcpiExDumpOperand ( 477 ACPI_OPERAND_OBJECT *ObjDesc, 478 UINT32 Depth) 479{ 480 UINT32 Length; 481 UINT32 Index; 482 483 484 ACPI_FUNCTION_NAME (ExDumpOperand) 485 486 487 /* Check if debug output enabled */ 488 489 if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_EXEC, _COMPONENT)) 490 { 491 return; 492 } 493 494 if (!ObjDesc) 495 { 496 /* This could be a null element of a package */ 497 498 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Null Object Descriptor\n")); 499 return; 500 } 501 502 if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED) 503 { 504 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p Namespace Node: ", ObjDesc)); 505 ACPI_DUMP_ENTRY (ObjDesc, ACPI_LV_EXEC); 506 return; 507 } 508 509 if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND) 510 { 511 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, 512 "%p is not a node or operand object: [%s]\n", 513 ObjDesc, AcpiUtGetDescriptorName (ObjDesc))); 514 ACPI_DUMP_BUFFER (ObjDesc, sizeof (ACPI_OPERAND_OBJECT)); 515 return; 516 } 517 518 /* ObjDesc is a valid object */ 519 520 if (Depth > 0) 521 { 522 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%*s[%u] %p ", 523 Depth, " ", Depth, ObjDesc)); 524 } 525 else 526 { 527 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p ", ObjDesc)); 528 } 529 530 /* Decode object type */ 531 532 switch (ObjDesc->Common.Type) 533 { 534 case ACPI_TYPE_LOCAL_REFERENCE: 535 536 AcpiOsPrintf ("Reference: [%s] ", AcpiUtGetReferenceName (ObjDesc)); 537 538 switch (ObjDesc->Reference.Class) 539 { 540 case ACPI_REFCLASS_DEBUG: 541 542 AcpiOsPrintf ("\n"); 543 break; 544 545 case ACPI_REFCLASS_INDEX: 546 547 AcpiOsPrintf ("%p\n", ObjDesc->Reference.Object); 548 break; 549 550 case ACPI_REFCLASS_TABLE: 551 552 AcpiOsPrintf ("Table Index %X\n", ObjDesc->Reference.Value); 553 break; 554 555 case ACPI_REFCLASS_REFOF: 556 557 AcpiOsPrintf ("%p [%s]\n", ObjDesc->Reference.Object, 558 AcpiUtGetTypeName (((ACPI_OPERAND_OBJECT *) 559 ObjDesc->Reference.Object)->Common.Type)); 560 break; 561 562 case ACPI_REFCLASS_NAME: 563 564 AcpiOsPrintf ("- [%4.4s]\n", ObjDesc->Reference.Node->Name.Ascii); 565 break; 566 567 case ACPI_REFCLASS_ARG: 568 case ACPI_REFCLASS_LOCAL: 569 570 AcpiOsPrintf ("%X\n", ObjDesc->Reference.Value); 571 break; 572 573 default: /* Unknown reference class */ 574 575 AcpiOsPrintf ("%2.2X\n", ObjDesc->Reference.Class); 576 break; 577 } 578 break; 579 580 case ACPI_TYPE_BUFFER: 581 582 AcpiOsPrintf ("Buffer length %.2X @ %p\n", 583 ObjDesc->Buffer.Length, ObjDesc->Buffer.Pointer); 584 585 /* Debug only -- dump the buffer contents */ 586 587 if (ObjDesc->Buffer.Pointer) 588 { 589 Length = ObjDesc->Buffer.Length; 590 if (Length > 128) 591 { 592 Length = 128; 593 } 594 595 AcpiOsPrintf ("Buffer Contents: (displaying length 0x%.2X)\n", 596 Length); 597 ACPI_DUMP_BUFFER (ObjDesc->Buffer.Pointer, Length); 598 } 599 break; 600 601 case ACPI_TYPE_INTEGER: 602 603 AcpiOsPrintf ("Integer %8.8X%8.8X\n", 604 ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value)); 605 break; 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 case ACPI_TYPE_REGION: 628 629 AcpiOsPrintf ("Region %s (%X)", 630 AcpiUtGetRegionName (ObjDesc->Region.SpaceId), 631 ObjDesc->Region.SpaceId); 632 633 /* 634 * If the address and length have not been evaluated, 635 * don't print them. 636 */ 637 if (!(ObjDesc->Region.Flags & AOPOBJ_DATA_VALID)) 638 { 639 AcpiOsPrintf ("\n"); 640 } 641 else 642 { 643 AcpiOsPrintf (" base %8.8X%8.8X Length %X\n", 644 ACPI_FORMAT_NATIVE_UINT (ObjDesc->Region.Address), 645 ObjDesc->Region.Length); 646 } 647 break; 648 649 case ACPI_TYPE_STRING: 650 651 AcpiOsPrintf ("String length %X @ %p ", 652 ObjDesc->String.Length, 653 ObjDesc->String.Pointer); 654 655 AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX); 656 AcpiOsPrintf ("\n"); 657 break; 658 659 case ACPI_TYPE_LOCAL_BANK_FIELD: 660 661 AcpiOsPrintf ("BankField\n"); 662 break; 663 664 case ACPI_TYPE_LOCAL_REGION_FIELD: 665 666 AcpiOsPrintf ("RegionField: Bits=%X AccWidth=%X Lock=%X Update=%X at " 667 "byte=%X bit=%X of below:\n", 668 ObjDesc->Field.BitLength, 669 ObjDesc->Field.AccessByteWidth, 670 ObjDesc->Field.FieldFlags & AML_FIELD_LOCK_RULE_MASK, 671 ObjDesc->Field.FieldFlags & AML_FIELD_UPDATE_RULE_MASK, 672 ObjDesc->Field.BaseByteOffset, 673 ObjDesc->Field.StartFieldBitOffset); 674 675 AcpiExDumpOperand (ObjDesc->Field.RegionObj, Depth+1); 676 break; 677 678 case ACPI_TYPE_LOCAL_INDEX_FIELD: 679 680 AcpiOsPrintf ("IndexField\n"); 681 break; 682 683 case ACPI_TYPE_BUFFER_FIELD: 684 685 AcpiOsPrintf ("BufferField: %X bits at byte %X bit %X of\n", 686 ObjDesc->BufferField.BitLength, 687 ObjDesc->BufferField.BaseByteOffset, 688 ObjDesc->BufferField.StartFieldBitOffset); 689 690 if (!ObjDesc->BufferField.BufferObj) 691 { 692 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "*NULL*\n")); 693 } 694 else if ((ObjDesc->BufferField.BufferObj)->Common.Type != 695 ACPI_TYPE_BUFFER) 696 { 697 AcpiOsPrintf ("*not a Buffer*\n"); 698 } 699 else 700 { 701 AcpiExDumpOperand (ObjDesc->BufferField.BufferObj, Depth+1); 702 } 703 break; 704 705 case ACPI_TYPE_EVENT: 706 707 AcpiOsPrintf ("Event\n"); 708 break; 709 710 case ACPI_TYPE_METHOD: 711 712 AcpiOsPrintf ("Method(%X) @ %p:%X\n", 713 ObjDesc->Method.ParamCount, 714 ObjDesc->Method.AmlStart, 715 ObjDesc->Method.AmlLength); 716 break; 717 718 case ACPI_TYPE_MUTEX: 719 720 AcpiOsPrintf ("Mutex\n"); 721 break; 722 723 case ACPI_TYPE_DEVICE: 724 725 AcpiOsPrintf ("Device\n"); 726 break; 727 728 case ACPI_TYPE_POWER: 729 730 AcpiOsPrintf ("Power\n"); 731 break; 732 733 case ACPI_TYPE_PROCESSOR: 734 735 AcpiOsPrintf ("Processor\n"); 736 break; 737 738 case ACPI_TYPE_THERMAL: 739 740 AcpiOsPrintf ("Thermal\n"); 741 break; 742 743 default: 744 745 /* Unknown Type */ 746 747 AcpiOsPrintf ("Unknown Type %X\n", ObjDesc->Common.Type); 748 break; 749 } 750 751 return; 752} 753 754 755/******************************************************************************* 756 * 757 * FUNCTION: AcpiExDumpOperands 758 * 759 * PARAMETERS: Operands - A list of Operand objects 760 * OpcodeName - AML opcode name 761 * NumOperands - Operand count for this opcode 762 * 763 * DESCRIPTION: Dump the operands associated with the opcode 764 * 765 ******************************************************************************/ 766 767void 768AcpiExDumpOperands ( 769 ACPI_OPERAND_OBJECT **Operands, 770 const char *OpcodeName, 771 UINT32 NumOperands) 772{ 773 ACPI_FUNCTION_NAME (ExDumpOperands); 774 775 776 if (!OpcodeName) 777 { 778 OpcodeName = "UNKNOWN"; 779 } 780 781 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, 782 "**** Start operand dump for opcode [%s], %u operands\n", 783 OpcodeName, NumOperands)); 784 785 if (NumOperands == 0) 786 { 787 NumOperands = 1; 788 } 789 790 /* Dump the individual operands */ 791 792 while (NumOperands) 793 { 794 AcpiExDumpOperand (*Operands, 0); 795 Operands++; 796 NumOperands--; 797 } 798 799 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, 800 "**** End operand dump for [%s]\n", OpcodeName)); 801 return; 802} 803 804 805/******************************************************************************* 806 * 807 * FUNCTION: AcpiExOut* functions 808 * 809 * PARAMETERS: Title - Descriptive text 810 * Value - Value to be displayed 811 * 812 * DESCRIPTION: Object dump output formatting functions. These functions 813 * reduce the number of format strings required and keeps them 814 * all in one place for easy modification. 815 * 816 ******************************************************************************/ 817 818static void 819AcpiExOutString ( 820 char *Title, 821 char *Value) 822{ 823 AcpiOsPrintf ("%20s : %s\n", Title, Value); 824} 825 826static void 827AcpiExOutPointer ( 828 char *Title, 829 void *Value) 830{ 831 AcpiOsPrintf ("%20s : %p\n", Title, Value); 832} 833 834 835/******************************************************************************* 836 * 837 * FUNCTION: AcpiExDumpNamespaceNode 838 * 839 * PARAMETERS: Node - Descriptor to dump 840 * Flags - Force display if TRUE 841 * 842 * DESCRIPTION: Dumps the members of the given.Node 843 * 844 ******************************************************************************/ 845 846void 847AcpiExDumpNamespaceNode ( 848 ACPI_NAMESPACE_NODE *Node, 849 UINT32 Flags) 850{ 851 852 ACPI_FUNCTION_ENTRY (); 853 854 855 if (!Flags) 856 { 857 /* Check if debug output enabled */ 858 859 if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_OBJECTS, _COMPONENT)) 860 { 861 return; 862 } 863 } 864 865 AcpiOsPrintf ("%20s : %4.4s\n", "Name", AcpiUtGetNodeName (Node)); 866 AcpiExOutString ("Type", AcpiUtGetTypeName (Node->Type)); 867 AcpiExOutPointer ("Attached Object", AcpiNsGetAttachedObject (Node)); 868 AcpiExOutPointer ("Parent", Node->Parent); 869 870 AcpiExDumpObject (ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Node), 871 AcpiExDumpNode); 872} 873 874 875/******************************************************************************* 876 * 877 * FUNCTION: AcpiExDumpReferenceObj 878 * 879 * PARAMETERS: Object - Descriptor to dump 880 * 881 * DESCRIPTION: Dumps a reference object 882 * 883 ******************************************************************************/ 884 885static void 886AcpiExDumpReferenceObj ( 887 ACPI_OPERAND_OBJECT *ObjDesc) 888{ 889 ACPI_BUFFER RetBuf; 890 ACPI_STATUS Status; 891 892 893 RetBuf.Length = ACPI_ALLOCATE_LOCAL_BUFFER; 894 895 if (ObjDesc->Reference.Class == ACPI_REFCLASS_NAME) 896 { 897 AcpiOsPrintf (" %p ", ObjDesc->Reference.Node); 898 899 Status = AcpiNsHandleToPathname (ObjDesc->Reference.Node, &RetBuf); 900 if (ACPI_FAILURE (Status)) 901 { 902 AcpiOsPrintf (" Could not convert name to pathname\n"); 903 } 904 else 905 { 906 AcpiOsPrintf ("%s\n", (char *) RetBuf.Pointer); 907 ACPI_FREE (RetBuf.Pointer); 908 } 909 } 910 else if (ObjDesc->Reference.Object) 911 { 912 if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_OPERAND) 913 { 914 AcpiOsPrintf (" Target: %p", ObjDesc->Reference.Object); 915 if (ObjDesc->Reference.Class == ACPI_REFCLASS_TABLE) 916 { 917 AcpiOsPrintf (" Table Index: %X\n", ObjDesc->Reference.Value); 918 } 919 else 920 { 921 AcpiOsPrintf (" Target: %p [%s]\n", ObjDesc->Reference.Object, 922 AcpiUtGetTypeName (((ACPI_OPERAND_OBJECT *) 923 ObjDesc->Reference.Object)->Common.Type)); 924 } 925 } 926 else 927 { 928 AcpiOsPrintf (" Target: %p\n", ObjDesc->Reference.Object); 929 } 930 } 931} 932 933 934/******************************************************************************* 935 * 936 * FUNCTION: AcpiExDumpPackageObj 937 * 938 * PARAMETERS: ObjDesc - Descriptor to dump 939 * Level - Indentation Level 940 * Index - Package index for this object 941 * 942 * DESCRIPTION: Dumps the elements of the package 943 * 944 ******************************************************************************/ 945 946static void 947AcpiExDumpPackageObj ( 948 ACPI_OPERAND_OBJECT *ObjDesc, 949 UINT32 Level, 950 UINT32 Index) 951{ 952 UINT32 i; 953 954 955 /* Indentation and index output */ 956 957 if (Level > 0) 958 { 959 for (i = 0; i < Level; i++) 960 { 961 AcpiOsPrintf (" "); 962 } 963 964 AcpiOsPrintf ("[%.2d] ", Index); 965 } 966 967 AcpiOsPrintf ("%p ", ObjDesc); 968 969 /* Null package elements are allowed */ 970 971 if (!ObjDesc) 972 { 973 AcpiOsPrintf ("[Null Object]\n"); 974 return; 975 } 976 977 /* Packages may only contain a few object types */ 978 979 switch (ObjDesc->Common.Type) 980 { 981 case ACPI_TYPE_INTEGER: 982 983 AcpiOsPrintf ("[Integer] = %8.8X%8.8X\n", 984 ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value)); 985 break; 986 987 case ACPI_TYPE_STRING: 988 989 AcpiOsPrintf ("[String] Value: "); 990 AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX); 991 AcpiOsPrintf ("\n"); 992 break; 993 994 case ACPI_TYPE_BUFFER: 995 996 AcpiOsPrintf ("[Buffer] Length %.2X = ", ObjDesc->Buffer.Length); 997 if (ObjDesc->Buffer.Length) 998 { 999 AcpiUtDebugDumpBuffer (ACPI_CAST_PTR (UINT8, ObjDesc->Buffer.Pointer), 1000 ObjDesc->Buffer.Length, DB_DWORD_DISPLAY, _COMPONENT); 1001 } 1002 else 1003 { 1004 AcpiOsPrintf ("\n"); 1005 } 1006 break; 1007 1008 case ACPI_TYPE_PACKAGE: 1009 1010 AcpiOsPrintf ("[Package] Contains %u Elements:\n", 1011 ObjDesc->Package.Count); 1012 1013 for (i = 0; i < ObjDesc->Package.Count; i++) 1014 { 1015 AcpiExDumpPackageObj (ObjDesc->Package.Elements[i], Level+1, i); 1016 } 1017 break; 1018 1019 case ACPI_TYPE_LOCAL_REFERENCE: 1020 1021 AcpiOsPrintf ("[Object Reference] Type [%s] %2.2X", 1022 AcpiUtGetReferenceName (ObjDesc), 1023 ObjDesc->Reference.Class); 1024 AcpiExDumpReferenceObj (ObjDesc); 1025 break; 1026 1027 default: 1028 1029 AcpiOsPrintf ("[Unknown Type] %X\n", ObjDesc->Common.Type); 1030 break; 1031 } 1032} 1033 1034 1035/******************************************************************************* 1036 * 1037 * FUNCTION: AcpiExDumpObjectDescriptor 1038 * 1039 * PARAMETERS: ObjDesc - Descriptor to dump 1040 * Flags - Force display if TRUE 1041 * 1042 * DESCRIPTION: Dumps the members of the object descriptor given. 1043 * 1044 ******************************************************************************/ 1045 1046void 1047AcpiExDumpObjectDescriptor ( 1048 ACPI_OPERAND_OBJECT *ObjDesc, 1049 UINT32 Flags) 1050{ 1051 ACPI_FUNCTION_TRACE (ExDumpObjectDescriptor); 1052 1053 1054 if (!ObjDesc) 1055 { 1056 return_VOID; 1057 } 1058 1059 if (!Flags) 1060 { 1061 /* Check if debug output enabled */ 1062 1063 if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_OBJECTS, _COMPONENT)) 1064 { 1065 return_VOID; 1066 } 1067 } 1068 1069 if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED) 1070 { 1071 AcpiExDumpNamespaceNode ((ACPI_NAMESPACE_NODE *) ObjDesc, Flags); 1072 1073 AcpiOsPrintf ("\nAttached Object (%p):\n", 1074 ((ACPI_NAMESPACE_NODE *) ObjDesc)->Object); 1075 1076 AcpiExDumpObjectDescriptor ( 1077 ((ACPI_NAMESPACE_NODE *) ObjDesc)->Object, Flags); 1078 return_VOID; 1079 } 1080 1081 if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND) 1082 { 1083 AcpiOsPrintf ( 1084 "ExDumpObjectDescriptor: %p is not an ACPI operand object: [%s]\n", 1085 ObjDesc, AcpiUtGetDescriptorName (ObjDesc)); 1086 return_VOID; 1087 } 1088 1089 if (ObjDesc->Common.Type > ACPI_TYPE_NS_NODE_MAX) 1090 { 1091 return_VOID; 1092 } 1093 1094 /* Common Fields */ 1095 1096 AcpiExDumpObject (ObjDesc, AcpiExDumpCommon); 1097 1098 /* Object-specific fields */ 1099 1100 AcpiExDumpObject (ObjDesc, AcpiExDumpInfo[ObjDesc->Common.Type]); 1101 return_VOID; 1102} 1103 1104#endif 1105