1 /****************************************************************************** 2 * 3 * Module Name: exdump - Interpreter debug output routines 4 * 5 *****************************************************************************/ 6 7 /* 8 * Copyright (C) 2000 - 2022, 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 MERCHANTABILITY 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 #include "acpi.h" 45 #include "accommon.h" 46 #include "acinterp.h" 47 #include "amlcode.h" 48 #include "acnamesp.h" 49 50 51 #define _COMPONENT ACPI_EXECUTER 52 ACPI_MODULE_NAME ("exdump") 53 54 /* 55 * The following routines are used for debug output only 56 */ 57 #if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER) 58 59 /* Local prototypes */ 60 61 static void 62 AcpiExOutString ( 63 const char *Title, 64 const char *Value); 65 66 static void 67 AcpiExOutPointer ( 68 const char *Title, 69 const void *Value); 70 71 static void 72 AcpiExDumpObject ( 73 ACPI_OPERAND_OBJECT *ObjDesc, 74 ACPI_EXDUMP_INFO *Info); 75 76 static void 77 AcpiExDumpReferenceObj ( 78 ACPI_OPERAND_OBJECT *ObjDesc); 79 80 static void 81 AcpiExDumpPackageObj ( 82 ACPI_OPERAND_OBJECT *ObjDesc, 83 UINT32 Level, 84 UINT32 Index); 85 86 87 /******************************************************************************* 88 * 89 * Object Descriptor info tables 90 * 91 * Note: The first table entry must be an INIT opcode and must contain 92 * the table length (number of table entries) 93 * 94 ******************************************************************************/ 95 96 static ACPI_EXDUMP_INFO AcpiExDumpInteger[2] = 97 { 98 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpInteger), NULL}, 99 {ACPI_EXD_UINT64, ACPI_EXD_OFFSET (Integer.Value), "Value"} 100 }; 101 102 static ACPI_EXDUMP_INFO AcpiExDumpString[4] = 103 { 104 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpString), NULL}, 105 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (String.Length), "Length"}, 106 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (String.Pointer), "Pointer"}, 107 {ACPI_EXD_STRING, 0, NULL} 108 }; 109 110 static ACPI_EXDUMP_INFO AcpiExDumpBuffer[5] = 111 { 112 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpBuffer), NULL}, 113 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (Buffer.Length), "Length"}, 114 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Buffer.Pointer), "Pointer"}, 115 {ACPI_EXD_NODE, ACPI_EXD_OFFSET (Buffer.Node), "Parent Node"}, 116 {ACPI_EXD_BUFFER, 0, NULL} 117 }; 118 119 static ACPI_EXDUMP_INFO AcpiExDumpPackage[6] = 120 { 121 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpPackage), NULL}, 122 {ACPI_EXD_NODE, ACPI_EXD_OFFSET (Package.Node), "Parent Node"}, 123 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Package.Flags), "Flags"}, 124 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (Package.Count), "Element Count"}, 125 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Package.Elements), "Element List"}, 126 {ACPI_EXD_PACKAGE, 0, NULL} 127 }; 128 129 static ACPI_EXDUMP_INFO AcpiExDumpDevice[4] = 130 { 131 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpDevice), NULL}, 132 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Device.NotifyList[0]), "System Notify"}, 133 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Device.NotifyList[1]), "Device Notify"}, 134 {ACPI_EXD_HDLR_LIST,ACPI_EXD_OFFSET (Device.Handler), "Handler"} 135 }; 136 137 static ACPI_EXDUMP_INFO AcpiExDumpEvent[2] = 138 { 139 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpEvent), NULL}, 140 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Event.OsSemaphore), "OsSemaphore"} 141 }; 142 143 static ACPI_EXDUMP_INFO AcpiExDumpMethod[9] = 144 { 145 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpMethod), NULL}, 146 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Method.InfoFlags), "Info Flags"}, 147 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Method.ParamCount), "Parameter Count"}, 148 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Method.SyncLevel), "Sync Level"}, 149 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Method.Mutex), "Mutex"}, 150 {ACPI_EXD_UINT16, ACPI_EXD_OFFSET (Method.OwnerId), "Owner Id"}, 151 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Method.ThreadCount), "Thread Count"}, 152 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (Method.AmlLength), "Aml Length"}, 153 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Method.AmlStart), "Aml Start"} 154 }; 155 156 static ACPI_EXDUMP_INFO AcpiExDumpMutex[6] = 157 { 158 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpMutex), NULL}, 159 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Mutex.SyncLevel), "Sync Level"}, 160 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Mutex.OriginalSyncLevel), "Original 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[8] = 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_NODE, ACPI_EXD_OFFSET (Region.Node), "Parent Node"}, 172 {ACPI_EXD_ADDRESS, ACPI_EXD_OFFSET (Region.Address), "Address"}, 173 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (Region.Length), "Length"}, 174 {ACPI_EXD_HDLR_LIST,ACPI_EXD_OFFSET (Region.Handler), "Handler"}, 175 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Region.Next), "Next"} 176 }; 177 178 static ACPI_EXDUMP_INFO AcpiExDumpPower[6] = 179 { 180 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpPower), NULL}, 181 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (PowerResource.SystemLevel), "System Level"}, 182 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (PowerResource.ResourceOrder), "Resource Order"}, 183 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (PowerResource.NotifyList[0]), "System Notify"}, 184 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (PowerResource.NotifyList[1]), "Device Notify"}, 185 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (PowerResource.Handler), "Handler"} 186 }; 187 188 static ACPI_EXDUMP_INFO AcpiExDumpProcessor[7] = 189 { 190 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpProcessor), NULL}, 191 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Processor.ProcId), "Processor ID"}, 192 {ACPI_EXD_UINT8 , ACPI_EXD_OFFSET (Processor.Length), "Length"}, 193 {ACPI_EXD_ADDRESS, ACPI_EXD_OFFSET (Processor.Address), "Address"}, 194 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Processor.NotifyList[0]), "System Notify"}, 195 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Processor.NotifyList[1]), "Device Notify"}, 196 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Processor.Handler), "Handler"} 197 }; 198 199 static ACPI_EXDUMP_INFO AcpiExDumpThermal[4] = 200 { 201 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpThermal), NULL}, 202 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (ThermalZone.NotifyList[0]), "System Notify"}, 203 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (ThermalZone.NotifyList[1]), "Device Notify"}, 204 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (ThermalZone.Handler), "Handler"} 205 }; 206 207 static ACPI_EXDUMP_INFO AcpiExDumpBufferField[3] = 208 { 209 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpBufferField), NULL}, 210 {ACPI_EXD_FIELD, 0, NULL}, 211 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (BufferField.BufferObj), "Buffer Object"} 212 }; 213 214 static ACPI_EXDUMP_INFO AcpiExDumpRegionField[5] = 215 { 216 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpRegionField), NULL}, 217 {ACPI_EXD_FIELD, 0, NULL}, 218 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Field.AccessLength), "AccessLength"}, 219 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Field.RegionObj), "Region Object"}, 220 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Field.ResourceBuffer), "ResourceBuffer"} 221 }; 222 223 static ACPI_EXDUMP_INFO AcpiExDumpBankField[5] = 224 { 225 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpBankField), NULL}, 226 {ACPI_EXD_FIELD, 0, NULL}, 227 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (BankField.Value), "Value"}, 228 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (BankField.RegionObj), "Region Object"}, 229 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (BankField.BankObj), "Bank Object"} 230 }; 231 232 static ACPI_EXDUMP_INFO AcpiExDumpIndexField[5] = 233 { 234 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpBankField), NULL}, 235 {ACPI_EXD_FIELD, 0, NULL}, 236 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (IndexField.Value), "Value"}, 237 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (IndexField.IndexObj), "Index Object"}, 238 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (IndexField.DataObj), "Data Object"} 239 }; 240 241 static ACPI_EXDUMP_INFO AcpiExDumpReference[9] = 242 { 243 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpReference), NULL}, 244 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Reference.Class), "Class"}, 245 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Reference.TargetType), "Target Type"}, 246 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (Reference.Value), "Value"}, 247 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Reference.Object), "Object Desc"}, 248 {ACPI_EXD_NODE, ACPI_EXD_OFFSET (Reference.Node), "Node"}, 249 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Reference.Where), "Where"}, 250 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Reference.IndexPointer), "Index Pointer"}, 251 {ACPI_EXD_REFERENCE,0, NULL} 252 }; 253 254 static ACPI_EXDUMP_INFO AcpiExDumpAddressHandler[6] = 255 { 256 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpAddressHandler), NULL}, 257 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (AddressSpace.SpaceId), "Space Id"}, 258 {ACPI_EXD_HDLR_LIST,ACPI_EXD_OFFSET (AddressSpace.Next), "Next"}, 259 {ACPI_EXD_RGN_LIST, ACPI_EXD_OFFSET (AddressSpace.RegionList), "Region List"}, 260 {ACPI_EXD_NODE, ACPI_EXD_OFFSET (AddressSpace.Node), "Node"}, 261 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (AddressSpace.Context), "Context"} 262 }; 263 264 static ACPI_EXDUMP_INFO AcpiExDumpNotify[7] = 265 { 266 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpNotify), NULL}, 267 {ACPI_EXD_NODE, ACPI_EXD_OFFSET (Notify.Node), "Node"}, 268 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (Notify.HandlerType), "Handler Type"}, 269 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Notify.Handler), "Handler"}, 270 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Notify.Context), "Context"}, 271 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Notify.Next[0]), "Next System Notify"}, 272 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Notify.Next[1]), "Next Device Notify"} 273 }; 274 275 static ACPI_EXDUMP_INFO AcpiExDumpExtra[6] = 276 { 277 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpExtra), NULL}, 278 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Extra.Method_REG), "_REG Method"}, 279 {ACPI_EXD_NODE, ACPI_EXD_OFFSET (Extra.ScopeNode), "Scope Node"}, 280 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Extra.RegionContext), "Region Context"}, 281 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Extra.AmlStart), "Aml Start"}, 282 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (Extra.AmlLength), "Aml Length"} 283 }; 284 285 static ACPI_EXDUMP_INFO AcpiExDumpData[3] = 286 { 287 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpData), NULL}, 288 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Data.Handler), "Handler"}, 289 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Data.Pointer), "Raw Data"} 290 }; 291 292 /* Miscellaneous tables */ 293 294 static ACPI_EXDUMP_INFO AcpiExDumpCommon[5] = 295 { 296 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpCommon), NULL}, 297 {ACPI_EXD_TYPE , 0, NULL}, 298 {ACPI_EXD_UINT16, ACPI_EXD_OFFSET (Common.ReferenceCount), "Reference Count"}, 299 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Common.Flags), "Flags"}, 300 {ACPI_EXD_LIST, ACPI_EXD_OFFSET (Common.NextObject), "Object List"} 301 }; 302 303 static ACPI_EXDUMP_INFO AcpiExDumpFieldCommon[7] = 304 { 305 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpFieldCommon), NULL}, 306 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (CommonField.FieldFlags), "Field Flags"}, 307 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (CommonField.AccessByteWidth), "Access Byte Width"}, 308 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (CommonField.BitLength), "Bit Length"}, 309 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (CommonField.StartFieldBitOffset),"Field Bit Offset"}, 310 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (CommonField.BaseByteOffset), "Base Byte Offset"}, 311 {ACPI_EXD_NODE, ACPI_EXD_OFFSET (CommonField.Node), "Parent Node"} 312 }; 313 314 static ACPI_EXDUMP_INFO AcpiExDumpNode[7] = 315 { 316 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpNode), NULL}, 317 {ACPI_EXD_UINT16, ACPI_EXD_NSOFFSET (Flags), "Flags"}, 318 {ACPI_EXD_UINT16, ACPI_EXD_NSOFFSET (OwnerId), "Owner Id"}, 319 {ACPI_EXD_LIST, ACPI_EXD_NSOFFSET (Object), "Object List"}, 320 {ACPI_EXD_NODE, ACPI_EXD_NSOFFSET (Parent), "Parent"}, 321 {ACPI_EXD_NODE, ACPI_EXD_NSOFFSET (Child), "Child"}, 322 {ACPI_EXD_NODE, ACPI_EXD_NSOFFSET (Peer), "Peer"} 323 }; 324 325 326 /* Dispatch table, indexed by object type */ 327 328 static ACPI_EXDUMP_INFO *AcpiExDumpInfo[] = 329 { 330 NULL, 331 AcpiExDumpInteger, 332 AcpiExDumpString, 333 AcpiExDumpBuffer, 334 AcpiExDumpPackage, 335 NULL, 336 AcpiExDumpDevice, 337 AcpiExDumpEvent, 338 AcpiExDumpMethod, 339 AcpiExDumpMutex, 340 AcpiExDumpRegion, 341 AcpiExDumpPower, 342 AcpiExDumpProcessor, 343 AcpiExDumpThermal, 344 AcpiExDumpBufferField, 345 NULL, 346 NULL, 347 AcpiExDumpRegionField, 348 AcpiExDumpBankField, 349 AcpiExDumpIndexField, 350 AcpiExDumpReference, 351 NULL, 352 NULL, 353 AcpiExDumpNotify, 354 AcpiExDumpAddressHandler, 355 NULL, 356 NULL, 357 NULL, 358 AcpiExDumpExtra, 359 AcpiExDumpData 360 }; 361 362 363 /******************************************************************************* 364 * 365 * FUNCTION: AcpiExDumpObject 366 * 367 * PARAMETERS: ObjDesc - Descriptor to dump 368 * Info - Info table corresponding to this object 369 * type 370 * 371 * RETURN: None 372 * 373 * DESCRIPTION: Walk the info table for this object 374 * 375 ******************************************************************************/ 376 377 static void 378 AcpiExDumpObject ( 379 ACPI_OPERAND_OBJECT *ObjDesc, 380 ACPI_EXDUMP_INFO *Info) 381 { 382 UINT8 *Target; 383 const char *Name; 384 UINT8 Count; 385 ACPI_OPERAND_OBJECT *Start; 386 ACPI_OPERAND_OBJECT *Data = NULL; 387 ACPI_OPERAND_OBJECT *Next; 388 ACPI_NAMESPACE_NODE *Node; 389 390 391 if (!Info) 392 { 393 AcpiOsPrintf ( 394 "ExDumpObject: Display not implemented for object type %s\n", 395 AcpiUtGetObjectTypeName (ObjDesc)); 396 return; 397 } 398 399 /* First table entry must contain the table length (# of table entries) */ 400 401 Count = Info->Offset; 402 403 while (Count) 404 { 405 if (!ObjDesc) 406 { 407 return; 408 } 409 410 Target = ACPI_ADD_PTR (UINT8, ObjDesc, Info->Offset); 411 Name = Info->Name; 412 413 switch (Info->Opcode) 414 { 415 case ACPI_EXD_INIT: 416 417 break; 418 419 case ACPI_EXD_TYPE: 420 421 AcpiOsPrintf ("%20s : %2.2X [%s]\n", "Type", 422 ObjDesc->Common.Type, 423 AcpiUtGetObjectTypeName (ObjDesc)); 424 break; 425 426 case ACPI_EXD_UINT8: 427 428 AcpiOsPrintf ("%20s : %2.2X\n", Name, *Target); 429 break; 430 431 case ACPI_EXD_UINT16: 432 433 AcpiOsPrintf ("%20s : %4.4X\n", Name, ACPI_GET16 (Target)); 434 break; 435 436 case ACPI_EXD_UINT32: 437 438 AcpiOsPrintf ("%20s : %8.8X\n", Name, ACPI_GET32 (Target)); 439 break; 440 441 case ACPI_EXD_UINT64: 442 443 AcpiOsPrintf ("%20s : %8.8X%8.8X\n", "Value", 444 ACPI_FORMAT_UINT64 (ACPI_GET64 (Target))); 445 break; 446 447 case ACPI_EXD_POINTER: 448 case ACPI_EXD_ADDRESS: 449 450 AcpiExOutPointer (Name, *ACPI_CAST_PTR (void *, Target)); 451 break; 452 453 case ACPI_EXD_STRING: 454 455 AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX); 456 AcpiOsPrintf ("\n"); 457 break; 458 459 case ACPI_EXD_BUFFER: 460 461 ACPI_DUMP_BUFFER ( 462 ObjDesc->Buffer.Pointer, ObjDesc->Buffer.Length); 463 break; 464 465 case ACPI_EXD_PACKAGE: 466 467 /* Dump the package contents */ 468 469 AcpiOsPrintf ("\nPackage Contents:\n"); 470 AcpiExDumpPackageObj (ObjDesc, 0, 0); 471 break; 472 473 case ACPI_EXD_FIELD: 474 475 AcpiExDumpObject (ObjDesc, AcpiExDumpFieldCommon); 476 break; 477 478 case ACPI_EXD_REFERENCE: 479 480 AcpiExOutString ("Class Name", AcpiUtGetReferenceName (ObjDesc)); 481 AcpiExDumpReferenceObj (ObjDesc); 482 break; 483 484 case ACPI_EXD_LIST: 485 486 Start = *ACPI_CAST_PTR (void *, Target); 487 Next = Start; 488 489 AcpiOsPrintf ("%20s : %p ", Name, Next); 490 if (Next) 491 { 492 AcpiOsPrintf ("%s (Type %2.2X)", 493 AcpiUtGetObjectTypeName (Next), Next->Common.Type); 494 495 while (Next->Common.NextObject) 496 { 497 if ((Next->Common.Type == ACPI_TYPE_LOCAL_DATA) && 498 !Data) 499 { 500 Data = Next; 501 } 502 503 Next = Next->Common.NextObject; 504 AcpiOsPrintf ("->%p(%s %2.2X)", Next, 505 AcpiUtGetObjectTypeName (Next), Next->Common.Type); 506 507 if ((Next == Start) || (Next == Data)) 508 { 509 AcpiOsPrintf ( 510 "\n**** Error: Object list appears to be circular linked"); 511 break; 512 } 513 } 514 } 515 else 516 { 517 AcpiOsPrintf ("- No attached objects"); 518 } 519 520 AcpiOsPrintf ("\n"); 521 break; 522 523 case ACPI_EXD_HDLR_LIST: 524 525 Start = *ACPI_CAST_PTR (void *, Target); 526 Next = Start; 527 528 AcpiOsPrintf ("%20s : %p", Name, Next); 529 if (Next) 530 { 531 AcpiOsPrintf ("(%s %2.2X)", 532 AcpiUtGetObjectTypeName (Next), 533 Next->AddressSpace.SpaceId); 534 535 while (Next->AddressSpace.Next) 536 { 537 if ((Next->Common.Type == ACPI_TYPE_LOCAL_DATA) && 538 !Data) 539 { 540 Data = Next; 541 } 542 543 Next = Next->AddressSpace.Next; 544 AcpiOsPrintf ("->%p(%s %2.2X)", Next, 545 AcpiUtGetObjectTypeName (Next), 546 Next->AddressSpace.SpaceId); 547 548 if ((Next == Start) || (Next == Data)) 549 { 550 AcpiOsPrintf ( 551 "\n**** Error: Handler list appears to be circular linked"); 552 break; 553 } 554 } 555 } 556 557 AcpiOsPrintf ("\n"); 558 break; 559 560 case ACPI_EXD_RGN_LIST: 561 562 Start = *ACPI_CAST_PTR (void *, Target); 563 Next = Start; 564 565 AcpiOsPrintf ("%20s : %p", Name, Next); 566 if (Next) 567 { 568 AcpiOsPrintf ("(%s %2.2X)", 569 AcpiUtGetObjectTypeName (Next), Next->Common.Type); 570 571 while (Next->Region.Next) 572 { 573 if ((Next->Common.Type == ACPI_TYPE_LOCAL_DATA) && 574 !Data) 575 { 576 Data = Next; 577 } 578 579 Next = Next->Region.Next; 580 AcpiOsPrintf ("->%p(%s %2.2X)", Next, 581 AcpiUtGetObjectTypeName (Next), Next->Common.Type); 582 583 if ((Next == Start) || (Next == Data)) 584 { 585 AcpiOsPrintf ( 586 "\n**** Error: Region list appears to be circular linked"); 587 break; 588 } 589 } 590 } 591 592 AcpiOsPrintf ("\n"); 593 break; 594 595 case ACPI_EXD_NODE: 596 597 Node = *ACPI_CAST_PTR (ACPI_NAMESPACE_NODE *, Target); 598 599 AcpiOsPrintf ("%20s : %p", Name, Node); 600 if (Node) 601 { 602 AcpiOsPrintf (" [%4.4s]", Node->Name.Ascii); 603 } 604 AcpiOsPrintf ("\n"); 605 break; 606 607 default: 608 609 AcpiOsPrintf ("**** Invalid table opcode [%X] ****\n", 610 Info->Opcode); 611 return; 612 } 613 614 Info++; 615 Count--; 616 } 617 } 618 619 620 /******************************************************************************* 621 * 622 * FUNCTION: AcpiExDumpOperand 623 * 624 * PARAMETERS: *ObjDesc - Pointer to entry to be dumped 625 * Depth - Current nesting depth 626 * 627 * RETURN: None 628 * 629 * DESCRIPTION: Dump an operand object 630 * 631 ******************************************************************************/ 632 633 void 634 AcpiExDumpOperand ( 635 ACPI_OPERAND_OBJECT *ObjDesc, 636 UINT32 Depth) 637 { 638 UINT32 Length; 639 UINT32 Index; 640 641 642 ACPI_FUNCTION_NAME (ExDumpOperand); 643 644 645 /* Check if debug output enabled */ 646 647 if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_EXEC, _COMPONENT)) 648 { 649 return; 650 } 651 652 if (!ObjDesc) 653 { 654 /* This could be a null element of a package */ 655 656 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Null Object Descriptor\n")); 657 return; 658 } 659 660 if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED) 661 { 662 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p Namespace Node: ", ObjDesc)); 663 ACPI_DUMP_ENTRY (ObjDesc, ACPI_LV_EXEC); 664 return; 665 } 666 667 if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND) 668 { 669 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, 670 "%p is not a node or operand object: [%s]\n", 671 ObjDesc, AcpiUtGetDescriptorName (ObjDesc))); 672 ACPI_DUMP_BUFFER (ObjDesc, sizeof (ACPI_OPERAND_OBJECT)); 673 return; 674 } 675 676 /* ObjDesc is a valid object */ 677 678 if (Depth > 0) 679 { 680 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%*s[%u] %p Refs=%u ", 681 Depth, " ", Depth, ObjDesc, ObjDesc->Common.ReferenceCount)); 682 } 683 else 684 { 685 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p Refs=%u ", 686 ObjDesc, ObjDesc->Common.ReferenceCount)); 687 } 688 689 /* Decode object type */ 690 691 switch (ObjDesc->Common.Type) 692 { 693 case ACPI_TYPE_LOCAL_REFERENCE: 694 695 AcpiOsPrintf ("Reference: [%s] ", 696 AcpiUtGetReferenceName (ObjDesc)); 697 698 switch (ObjDesc->Reference.Class) 699 { 700 case ACPI_REFCLASS_DEBUG: 701 702 AcpiOsPrintf ("\n"); 703 break; 704 705 case ACPI_REFCLASS_INDEX: 706 707 AcpiOsPrintf ("%p\n", ObjDesc->Reference.Object); 708 break; 709 710 case ACPI_REFCLASS_TABLE: 711 712 AcpiOsPrintf ("Table Index %X\n", ObjDesc->Reference.Value); 713 break; 714 715 case ACPI_REFCLASS_REFOF: 716 717 AcpiOsPrintf ("%p [%s]\n", ObjDesc->Reference.Object, 718 AcpiUtGetTypeName (((ACPI_OPERAND_OBJECT *) 719 ObjDesc->Reference.Object)->Common.Type)); 720 break; 721 722 case ACPI_REFCLASS_NAME: 723 724 AcpiUtRepairName (ObjDesc->Reference.Node->Name.Ascii); 725 AcpiOsPrintf ("- [%4.4s] (Node %p)\n", 726 ObjDesc->Reference.Node->Name.Ascii, 727 ObjDesc->Reference.Node); 728 break; 729 730 case ACPI_REFCLASS_ARG: 731 case ACPI_REFCLASS_LOCAL: 732 733 AcpiOsPrintf ("%X\n", ObjDesc->Reference.Value); 734 break; 735 736 default: /* Unknown reference class */ 737 738 AcpiOsPrintf ("%2.2X\n", ObjDesc->Reference.Class); 739 break; 740 } 741 break; 742 743 case ACPI_TYPE_BUFFER: 744 745 AcpiOsPrintf ("Buffer length %.2X @ %p\n", 746 ObjDesc->Buffer.Length, ObjDesc->Buffer.Pointer); 747 748 /* Debug only -- dump the buffer contents */ 749 750 if (ObjDesc->Buffer.Pointer) 751 { 752 Length = ObjDesc->Buffer.Length; 753 if (Length > 128) 754 { 755 Length = 128; 756 } 757 758 AcpiOsPrintf ( 759 "Buffer Contents: (displaying length 0x%.2X)\n", Length); 760 ACPI_DUMP_BUFFER (ObjDesc->Buffer.Pointer, Length); 761 } 762 break; 763 764 case ACPI_TYPE_INTEGER: 765 766 AcpiOsPrintf ("Integer %8.8X%8.8X\n", 767 ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value)); 768 break; 769 770 case ACPI_TYPE_PACKAGE: 771 772 AcpiOsPrintf ("Package [Len %X] ElementArray %p\n", 773 ObjDesc->Package.Count, ObjDesc->Package.Elements); 774 775 /* 776 * If elements exist, package element pointer is valid, 777 * and debug_level exceeds 1, dump package's elements. 778 */ 779 if (ObjDesc->Package.Count && 780 ObjDesc->Package.Elements && 781 AcpiDbgLevel > 1) 782 { 783 for (Index = 0; Index < ObjDesc->Package.Count; Index++) 784 { 785 AcpiExDumpOperand ( 786 ObjDesc->Package.Elements[Index], Depth + 1); 787 } 788 } 789 break; 790 791 case ACPI_TYPE_REGION: 792 793 AcpiOsPrintf ("Region %s (%X)", 794 AcpiUtGetRegionName (ObjDesc->Region.SpaceId), 795 ObjDesc->Region.SpaceId); 796 797 /* 798 * If the address and length have not been evaluated, 799 * don't print them. 800 */ 801 if (!(ObjDesc->Region.Flags & AOPOBJ_DATA_VALID)) 802 { 803 AcpiOsPrintf ("\n"); 804 } 805 else 806 { 807 AcpiOsPrintf (" base %8.8X%8.8X Length %X\n", 808 ACPI_FORMAT_UINT64 (ObjDesc->Region.Address), 809 ObjDesc->Region.Length); 810 } 811 break; 812 813 case ACPI_TYPE_STRING: 814 815 AcpiOsPrintf ("String length %X @ %p ", 816 ObjDesc->String.Length, 817 ObjDesc->String.Pointer); 818 819 AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX); 820 AcpiOsPrintf ("\n"); 821 break; 822 823 case ACPI_TYPE_LOCAL_BANK_FIELD: 824 825 AcpiOsPrintf ("BankField\n"); 826 break; 827 828 case ACPI_TYPE_LOCAL_REGION_FIELD: 829 830 AcpiOsPrintf ("RegionField: Bits=%X AccWidth=%X Lock=%X Update=%X at " 831 "byte=%X bit=%X of below:\n", 832 ObjDesc->Field.BitLength, 833 ObjDesc->Field.AccessByteWidth, 834 ObjDesc->Field.FieldFlags & AML_FIELD_LOCK_RULE_MASK, 835 ObjDesc->Field.FieldFlags & AML_FIELD_UPDATE_RULE_MASK, 836 ObjDesc->Field.BaseByteOffset, 837 ObjDesc->Field.StartFieldBitOffset); 838 839 AcpiExDumpOperand (ObjDesc->Field.RegionObj, Depth + 1); 840 break; 841 842 case ACPI_TYPE_LOCAL_INDEX_FIELD: 843 844 AcpiOsPrintf ("IndexField\n"); 845 break; 846 847 case ACPI_TYPE_BUFFER_FIELD: 848 849 AcpiOsPrintf ("BufferField: %X bits at byte %X bit %X of\n", 850 ObjDesc->BufferField.BitLength, 851 ObjDesc->BufferField.BaseByteOffset, 852 ObjDesc->BufferField.StartFieldBitOffset); 853 854 if (!ObjDesc->BufferField.BufferObj) 855 { 856 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "*NULL*\n")); 857 } 858 else if ((ObjDesc->BufferField.BufferObj)->Common.Type != 859 ACPI_TYPE_BUFFER) 860 { 861 AcpiOsPrintf ("*not a Buffer*\n"); 862 } 863 else 864 { 865 AcpiExDumpOperand (ObjDesc->BufferField.BufferObj, Depth + 1); 866 } 867 break; 868 869 case ACPI_TYPE_EVENT: 870 871 AcpiOsPrintf ("Event\n"); 872 break; 873 874 case ACPI_TYPE_METHOD: 875 876 AcpiOsPrintf ("Method(%X) @ %p:%X\n", 877 ObjDesc->Method.ParamCount, 878 ObjDesc->Method.AmlStart, 879 ObjDesc->Method.AmlLength); 880 break; 881 882 case ACPI_TYPE_MUTEX: 883 884 AcpiOsPrintf ("Mutex\n"); 885 break; 886 887 case ACPI_TYPE_DEVICE: 888 889 AcpiOsPrintf ("Device\n"); 890 break; 891 892 case ACPI_TYPE_POWER: 893 894 AcpiOsPrintf ("Power\n"); 895 break; 896 897 case ACPI_TYPE_PROCESSOR: 898 899 AcpiOsPrintf ("Processor\n"); 900 break; 901 902 case ACPI_TYPE_THERMAL: 903 904 AcpiOsPrintf ("Thermal\n"); 905 break; 906 907 default: 908 909 /* Unknown Type */ 910 911 AcpiOsPrintf ("Unknown Type %X\n", ObjDesc->Common.Type); 912 break; 913 } 914 915 return; 916 } 917 918 919 /******************************************************************************* 920 * 921 * FUNCTION: AcpiExDumpOperands 922 * 923 * PARAMETERS: Operands - A list of Operand objects 924 * OpcodeName - AML opcode name 925 * NumOperands - Operand count for this opcode 926 * 927 * DESCRIPTION: Dump the operands associated with the opcode 928 * 929 ******************************************************************************/ 930 931 void 932 AcpiExDumpOperands ( 933 ACPI_OPERAND_OBJECT **Operands, 934 const char *OpcodeName, 935 UINT32 NumOperands) 936 { 937 ACPI_FUNCTION_TRACE (ExDumpOperands); 938 939 940 if (!OpcodeName) 941 { 942 OpcodeName = "UNKNOWN"; 943 } 944 945 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, 946 "**** Start operand dump for opcode [%s], %u operands\n", 947 OpcodeName, NumOperands)); 948 949 if (NumOperands == 0) 950 { 951 NumOperands = 1; 952 } 953 954 /* Dump the individual operands */ 955 956 while (NumOperands) 957 { 958 AcpiExDumpOperand (*Operands, 0); 959 Operands++; 960 NumOperands--; 961 } 962 963 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, 964 "**** End operand dump for [%s]\n", OpcodeName)); 965 return_VOID; 966 } 967 968 969 /******************************************************************************* 970 * 971 * FUNCTION: AcpiExOut* functions 972 * 973 * PARAMETERS: Title - Descriptive text 974 * Value - Value to be displayed 975 * 976 * DESCRIPTION: Object dump output formatting functions. These functions 977 * reduce the number of format strings required and keeps them 978 * all in one place for easy modification. 979 * 980 ******************************************************************************/ 981 982 static void 983 AcpiExOutString ( 984 const char *Title, 985 const char *Value) 986 { 987 AcpiOsPrintf ("%20s : %s\n", Title, Value); 988 } 989 990 static void 991 AcpiExOutPointer ( 992 const char *Title, 993 const void *Value) 994 { 995 AcpiOsPrintf ("%20s : %p\n", Title, Value); 996 } 997 998 999 /******************************************************************************* 1000 * 1001 * FUNCTION: AcpiExDumpNamespaceNode 1002 * 1003 * PARAMETERS: Node - Descriptor to dump 1004 * Flags - Force display if TRUE 1005 * 1006 * DESCRIPTION: Dumps the members of the given.Node 1007 * 1008 ******************************************************************************/ 1009 1010 void 1011 AcpiExDumpNamespaceNode ( 1012 ACPI_NAMESPACE_NODE *Node, 1013 UINT32 Flags) 1014 { 1015 1016 ACPI_FUNCTION_ENTRY (); 1017 1018 1019 if (!Flags) 1020 { 1021 /* Check if debug output enabled */ 1022 1023 if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_OBJECTS, _COMPONENT)) 1024 { 1025 return; 1026 } 1027 } 1028 1029 AcpiOsPrintf ("%20s : %4.4s\n", "Name", AcpiUtGetNodeName (Node)); 1030 AcpiOsPrintf ("%20s : %2.2X [%s]\n", "Type", 1031 Node->Type, AcpiUtGetTypeName (Node->Type)); 1032 1033 AcpiExDumpObject (ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Node), 1034 AcpiExDumpNode); 1035 } 1036 1037 1038 /******************************************************************************* 1039 * 1040 * FUNCTION: AcpiExDumpReferenceObj 1041 * 1042 * PARAMETERS: Object - Descriptor to dump 1043 * 1044 * DESCRIPTION: Dumps a reference object 1045 * 1046 ******************************************************************************/ 1047 1048 static void 1049 AcpiExDumpReferenceObj ( 1050 ACPI_OPERAND_OBJECT *ObjDesc) 1051 { 1052 ACPI_BUFFER RetBuf; 1053 ACPI_STATUS Status; 1054 1055 1056 RetBuf.Length = ACPI_ALLOCATE_LOCAL_BUFFER; 1057 1058 if (ObjDesc->Reference.Class == ACPI_REFCLASS_NAME) 1059 { 1060 AcpiOsPrintf (" %p ", ObjDesc->Reference.Node); 1061 1062 Status = AcpiNsHandleToPathname (ObjDesc->Reference.Node, 1063 &RetBuf, TRUE); 1064 if (ACPI_FAILURE (Status)) 1065 { 1066 AcpiOsPrintf (" Could not convert name to pathname: %s\n", 1067 AcpiFormatException (Status)); 1068 } 1069 else 1070 { 1071 AcpiOsPrintf ("%s: %s\n", 1072 AcpiUtGetTypeName (ObjDesc->Reference.Node->Type), 1073 (char *) RetBuf.Pointer); 1074 ACPI_FREE (RetBuf.Pointer); 1075 } 1076 } 1077 else if (ObjDesc->Reference.Object) 1078 { 1079 if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_OPERAND) 1080 { 1081 AcpiOsPrintf ("%22s %p", "Target :", 1082 ObjDesc->Reference.Object); 1083 if (ObjDesc->Reference.Class == ACPI_REFCLASS_TABLE) 1084 { 1085 AcpiOsPrintf (" Table Index: %X\n", 1086 ObjDesc->Reference.Value); 1087 } 1088 else 1089 { 1090 AcpiOsPrintf (" [%s]\n", 1091 AcpiUtGetTypeName (((ACPI_OPERAND_OBJECT *) 1092 ObjDesc->Reference.Object)->Common.Type)); 1093 } 1094 } 1095 else 1096 { 1097 AcpiOsPrintf (" Target: %p\n", ObjDesc->Reference.Object); 1098 } 1099 } 1100 } 1101 1102 1103 /******************************************************************************* 1104 * 1105 * FUNCTION: AcpiExDumpPackageObj 1106 * 1107 * PARAMETERS: ObjDesc - Descriptor to dump 1108 * Level - Indentation Level 1109 * Index - Package index for this object 1110 * 1111 * DESCRIPTION: Dumps the elements of the package 1112 * 1113 ******************************************************************************/ 1114 1115 static void 1116 AcpiExDumpPackageObj ( 1117 ACPI_OPERAND_OBJECT *ObjDesc, 1118 UINT32 Level, 1119 UINT32 Index) 1120 { 1121 UINT32 i; 1122 1123 1124 /* Indentation and index output */ 1125 1126 if (Level > 0) 1127 { 1128 for (i = 0; i < Level; i++) 1129 { 1130 AcpiOsPrintf (" "); 1131 } 1132 1133 AcpiOsPrintf ("[%.2d] ", Index); 1134 } 1135 1136 AcpiOsPrintf ("%p ", ObjDesc); 1137 1138 /* Null package elements are allowed */ 1139 1140 if (!ObjDesc) 1141 { 1142 AcpiOsPrintf ("[Null Object]\n"); 1143 return; 1144 } 1145 1146 /* Packages may only contain a few object types */ 1147 1148 switch (ObjDesc->Common.Type) 1149 { 1150 case ACPI_TYPE_INTEGER: 1151 1152 AcpiOsPrintf ("[Integer] = %8.8X%8.8X\n", 1153 ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value)); 1154 break; 1155 1156 case ACPI_TYPE_STRING: 1157 1158 AcpiOsPrintf ("[String] Value: "); 1159 AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX); 1160 AcpiOsPrintf ("\n"); 1161 break; 1162 1163 case ACPI_TYPE_BUFFER: 1164 1165 AcpiOsPrintf ("[Buffer] Length %.2X = ", ObjDesc->Buffer.Length); 1166 if (ObjDesc->Buffer.Length) 1167 { 1168 AcpiUtDebugDumpBuffer ( 1169 ACPI_CAST_PTR (UINT8, ObjDesc->Buffer.Pointer), 1170 ObjDesc->Buffer.Length, DB_DWORD_DISPLAY, _COMPONENT); 1171 } 1172 else 1173 { 1174 AcpiOsPrintf ("\n"); 1175 } 1176 break; 1177 1178 case ACPI_TYPE_PACKAGE: 1179 1180 AcpiOsPrintf ("[Package] Contains %u Elements:\n", 1181 ObjDesc->Package.Count); 1182 1183 for (i = 0; i < ObjDesc->Package.Count; i++) 1184 { 1185 AcpiExDumpPackageObj ( 1186 ObjDesc->Package.Elements[i], Level + 1, i); 1187 } 1188 break; 1189 1190 case ACPI_TYPE_LOCAL_REFERENCE: 1191 1192 AcpiOsPrintf ("[Object Reference] Class [%s]", 1193 AcpiUtGetReferenceName (ObjDesc)); 1194 AcpiExDumpReferenceObj (ObjDesc); 1195 break; 1196 1197 default: 1198 1199 AcpiOsPrintf ("[%s] Type: %2.2X\n", 1200 AcpiUtGetTypeName (ObjDesc->Common.Type), ObjDesc->Common.Type); 1201 break; 1202 } 1203 } 1204 1205 1206 /******************************************************************************* 1207 * 1208 * FUNCTION: AcpiExDumpObjectDescriptor 1209 * 1210 * PARAMETERS: ObjDesc - Descriptor to dump 1211 * Flags - Force display if TRUE 1212 * 1213 * DESCRIPTION: Dumps the members of the object descriptor given. 1214 * 1215 ******************************************************************************/ 1216 1217 void 1218 AcpiExDumpObjectDescriptor ( 1219 ACPI_OPERAND_OBJECT *ObjDesc, 1220 UINT32 Flags) 1221 { 1222 ACPI_FUNCTION_TRACE (ExDumpObjectDescriptor); 1223 1224 1225 if (!ObjDesc) 1226 { 1227 return_VOID; 1228 } 1229 1230 if (!Flags) 1231 { 1232 /* Check if debug output enabled */ 1233 1234 if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_OBJECTS, _COMPONENT)) 1235 { 1236 return_VOID; 1237 } 1238 } 1239 1240 if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED) 1241 { 1242 AcpiExDumpNamespaceNode ((ACPI_NAMESPACE_NODE *) ObjDesc, Flags); 1243 1244 ObjDesc = ((ACPI_NAMESPACE_NODE *) ObjDesc)->Object; 1245 if (!ObjDesc) 1246 { 1247 return_VOID; 1248 } 1249 1250 AcpiOsPrintf ("\nAttached Object %p", ObjDesc); 1251 if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED) 1252 { 1253 AcpiOsPrintf (" - Namespace Node"); 1254 } 1255 1256 AcpiOsPrintf (":\n"); 1257 goto DumpObject; 1258 } 1259 1260 if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND) 1261 { 1262 AcpiOsPrintf ( 1263 "%p is not an ACPI operand object: [%s]\n", 1264 ObjDesc, AcpiUtGetDescriptorName (ObjDesc)); 1265 return_VOID; 1266 } 1267 1268 /* Validate the object type */ 1269 1270 if (ObjDesc->Common.Type > ACPI_TYPE_LOCAL_MAX) 1271 { 1272 AcpiOsPrintf ("Not a known object type: %2.2X\n", 1273 ObjDesc->Common.Type); 1274 return_VOID; 1275 } 1276 1277 1278 DumpObject: 1279 1280 if (!ObjDesc) 1281 { 1282 return_VOID; 1283 } 1284 1285 /* Common Fields */ 1286 1287 AcpiExDumpObject (ObjDesc, AcpiExDumpCommon); 1288 1289 /* Object-specific fields */ 1290 1291 AcpiExDumpObject (ObjDesc, AcpiExDumpInfo[ObjDesc->Common.Type]); 1292 1293 if (ObjDesc->Common.Type == ACPI_TYPE_REGION) 1294 { 1295 ObjDesc = ObjDesc->Common.NextObject; 1296 if (ObjDesc->Common.Type > ACPI_TYPE_LOCAL_MAX) 1297 { 1298 AcpiOsPrintf ( 1299 "Secondary object is not a known object type: %2.2X\n", 1300 ObjDesc->Common.Type); 1301 1302 return_VOID; 1303 } 1304 1305 AcpiOsPrintf ("\nExtra attached Object (%p):\n", ObjDesc); 1306 AcpiExDumpObject (ObjDesc, AcpiExDumpInfo[ObjDesc->Common.Type]); 1307 } 1308 1309 return_VOID; 1310 } 1311 1312 #endif 1313