1 /****************************************************************************** 2 * 3 * Module Name: exdump - Interpreter debug output routines 4 * 5 *****************************************************************************/ 6 7 /* 8 * Copyright (C) 2000 - 2015, 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 #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 char *Title, 64 char *Value); 65 66 static void 67 AcpiExOutPointer ( 68 char *Title, 69 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), "Elements"}, 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_UINT8, 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_UINT8, ACPI_EXD_NSOFFSET (Flags), "Flags"}, 318 {ACPI_EXD_UINT8, 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 char *Name; 384 const char *ReferenceName; 385 UINT8 Count; 386 ACPI_OPERAND_OBJECT *Start; 387 ACPI_OPERAND_OBJECT *Data = NULL; 388 ACPI_OPERAND_OBJECT *Next; 389 ACPI_NAMESPACE_NODE *Node; 390 391 392 if (!Info) 393 { 394 AcpiOsPrintf ( 395 "ExDumpObject: Display not implemented for object type %s\n", 396 AcpiUtGetObjectTypeName (ObjDesc)); 397 return; 398 } 399 400 /* First table entry must contain the table length (# of table entries) */ 401 402 Count = Info->Offset; 403 404 while (Count) 405 { 406 Target = ACPI_ADD_PTR (UINT8, ObjDesc, Info->Offset); 407 Name = Info->Name; 408 409 switch (Info->Opcode) 410 { 411 case ACPI_EXD_INIT: 412 413 break; 414 415 case ACPI_EXD_TYPE: 416 417 AcpiOsPrintf ("%20s : %2.2X [%s]\n", "Type", 418 ObjDesc->Common.Type, AcpiUtGetObjectTypeName (ObjDesc)); 419 break; 420 421 case ACPI_EXD_UINT8: 422 423 AcpiOsPrintf ("%20s : %2.2X\n", Name, *Target); 424 break; 425 426 case ACPI_EXD_UINT16: 427 428 AcpiOsPrintf ("%20s : %4.4X\n", Name, ACPI_GET16 (Target)); 429 break; 430 431 case ACPI_EXD_UINT32: 432 433 AcpiOsPrintf ("%20s : %8.8X\n", Name, ACPI_GET32 (Target)); 434 break; 435 436 case ACPI_EXD_UINT64: 437 438 AcpiOsPrintf ("%20s : %8.8X%8.8X\n", "Value", 439 ACPI_FORMAT_UINT64 (ACPI_GET64 (Target))); 440 break; 441 442 case ACPI_EXD_POINTER: 443 case ACPI_EXD_ADDRESS: 444 445 AcpiExOutPointer (Name, *ACPI_CAST_PTR (void *, Target)); 446 break; 447 448 case ACPI_EXD_STRING: 449 450 AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX); 451 AcpiOsPrintf ("\n"); 452 break; 453 454 case ACPI_EXD_BUFFER: 455 456 ACPI_DUMP_BUFFER ( 457 ObjDesc->Buffer.Pointer, ObjDesc->Buffer.Length); 458 break; 459 460 case ACPI_EXD_PACKAGE: 461 462 /* Dump the package contents */ 463 464 AcpiOsPrintf ("\nPackage Contents:\n"); 465 AcpiExDumpPackageObj (ObjDesc, 0, 0); 466 break; 467 468 case ACPI_EXD_FIELD: 469 470 AcpiExDumpObject (ObjDesc, AcpiExDumpFieldCommon); 471 break; 472 473 case ACPI_EXD_REFERENCE: 474 475 ReferenceName = AcpiUtGetReferenceName (ObjDesc); 476 AcpiExOutString ( 477 "Class Name", ACPI_CAST_PTR (char, ReferenceName)); 478 AcpiExDumpReferenceObj (ObjDesc); 479 break; 480 481 case ACPI_EXD_LIST: 482 483 Start = *ACPI_CAST_PTR (void *, Target); 484 Next = Start; 485 486 AcpiOsPrintf ("%20s : %p", Name, Next); 487 if (Next) 488 { 489 AcpiOsPrintf ("(%s %2.2X)", 490 AcpiUtGetObjectTypeName (Next), Next->Common.Type); 491 492 while (Next->Common.NextObject) 493 { 494 if ((Next->Common.Type == ACPI_TYPE_LOCAL_DATA) && 495 !Data) 496 { 497 Data = Next; 498 } 499 500 Next = Next->Common.NextObject; 501 AcpiOsPrintf ("->%p(%s %2.2X)", Next, 502 AcpiUtGetObjectTypeName (Next), Next->Common.Type); 503 504 if ((Next == Start) || (Next == Data)) 505 { 506 AcpiOsPrintf ( 507 "\n**** Error: Object list appears to be circular linked"); 508 break; 509 } 510 } 511 } 512 513 AcpiOsPrintf ("\n"); 514 break; 515 516 case ACPI_EXD_HDLR_LIST: 517 518 Start = *ACPI_CAST_PTR (void *, Target); 519 Next = Start; 520 521 AcpiOsPrintf ("%20s : %p", Name, Next); 522 if (Next) 523 { 524 AcpiOsPrintf ("(%s %2.2X)", 525 AcpiUtGetObjectTypeName (Next), Next->Common.Type); 526 527 while (Next->AddressSpace.Next) 528 { 529 if ((Next->Common.Type == ACPI_TYPE_LOCAL_DATA) && 530 !Data) 531 { 532 Data = Next; 533 } 534 535 Next = Next->AddressSpace.Next; 536 AcpiOsPrintf ("->%p(%s %2.2X)", Next, 537 AcpiUtGetObjectTypeName (Next), Next->Common.Type); 538 539 if ((Next == Start) || (Next == Data)) 540 { 541 AcpiOsPrintf ( 542 "\n**** Error: Handler list appears to be circular linked"); 543 break; 544 } 545 } 546 } 547 548 AcpiOsPrintf ("\n"); 549 break; 550 551 case ACPI_EXD_RGN_LIST: 552 553 Start = *ACPI_CAST_PTR (void *, Target); 554 Next = Start; 555 556 AcpiOsPrintf ("%20s : %p", Name, Next); 557 if (Next) 558 { 559 AcpiOsPrintf ("(%s %2.2X)", 560 AcpiUtGetObjectTypeName (Next), Next->Common.Type); 561 562 while (Next->Region.Next) 563 { 564 if ((Next->Common.Type == ACPI_TYPE_LOCAL_DATA) && 565 !Data) 566 { 567 Data = Next; 568 } 569 570 Next = Next->Region.Next; 571 AcpiOsPrintf ("->%p(%s %2.2X)", Next, 572 AcpiUtGetObjectTypeName (Next), Next->Common.Type); 573 574 if ((Next == Start) || (Next == Data)) 575 { 576 AcpiOsPrintf ( 577 "\n**** Error: Region list appears to be circular linked"); 578 break; 579 } 580 } 581 } 582 583 AcpiOsPrintf ("\n"); 584 break; 585 586 case ACPI_EXD_NODE: 587 588 Node = *ACPI_CAST_PTR (ACPI_NAMESPACE_NODE *, Target); 589 590 AcpiOsPrintf ("%20s : %p", Name, Node); 591 if (Node) 592 { 593 AcpiOsPrintf (" [%4.4s]", Node->Name.Ascii); 594 } 595 AcpiOsPrintf ("\n"); 596 break; 597 598 default: 599 600 AcpiOsPrintf ("**** Invalid table opcode [%X] ****\n", 601 Info->Opcode); 602 return; 603 } 604 605 Info++; 606 Count--; 607 } 608 } 609 610 611 /******************************************************************************* 612 * 613 * FUNCTION: AcpiExDumpOperand 614 * 615 * PARAMETERS: *ObjDesc - Pointer to entry to be dumped 616 * Depth - Current nesting depth 617 * 618 * RETURN: None 619 * 620 * DESCRIPTION: Dump an operand object 621 * 622 ******************************************************************************/ 623 624 void 625 AcpiExDumpOperand ( 626 ACPI_OPERAND_OBJECT *ObjDesc, 627 UINT32 Depth) 628 { 629 UINT32 Length; 630 UINT32 Index; 631 632 633 ACPI_FUNCTION_NAME (ExDumpOperand) 634 635 636 /* Check if debug output enabled */ 637 638 if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_EXEC, _COMPONENT)) 639 { 640 return; 641 } 642 643 if (!ObjDesc) 644 { 645 /* This could be a null element of a package */ 646 647 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Null Object Descriptor\n")); 648 return; 649 } 650 651 if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED) 652 { 653 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p Namespace Node: ", ObjDesc)); 654 ACPI_DUMP_ENTRY (ObjDesc, ACPI_LV_EXEC); 655 return; 656 } 657 658 if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND) 659 { 660 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, 661 "%p is not a node or operand object: [%s]\n", 662 ObjDesc, AcpiUtGetDescriptorName (ObjDesc))); 663 ACPI_DUMP_BUFFER (ObjDesc, sizeof (ACPI_OPERAND_OBJECT)); 664 return; 665 } 666 667 /* ObjDesc is a valid object */ 668 669 if (Depth > 0) 670 { 671 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%*s[%u] %p ", 672 Depth, " ", Depth, ObjDesc)); 673 } 674 else 675 { 676 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p ", ObjDesc)); 677 } 678 679 /* Decode object type */ 680 681 switch (ObjDesc->Common.Type) 682 { 683 case ACPI_TYPE_LOCAL_REFERENCE: 684 685 AcpiOsPrintf ("Reference: [%s] ", 686 AcpiUtGetReferenceName (ObjDesc)); 687 688 switch (ObjDesc->Reference.Class) 689 { 690 case ACPI_REFCLASS_DEBUG: 691 692 AcpiOsPrintf ("\n"); 693 break; 694 695 case ACPI_REFCLASS_INDEX: 696 697 AcpiOsPrintf ("%p\n", ObjDesc->Reference.Object); 698 break; 699 700 case ACPI_REFCLASS_TABLE: 701 702 AcpiOsPrintf ("Table Index %X\n", ObjDesc->Reference.Value); 703 break; 704 705 case ACPI_REFCLASS_REFOF: 706 707 AcpiOsPrintf ("%p [%s]\n", ObjDesc->Reference.Object, 708 AcpiUtGetTypeName (((ACPI_OPERAND_OBJECT *) 709 ObjDesc->Reference.Object)->Common.Type)); 710 break; 711 712 case ACPI_REFCLASS_NAME: 713 714 AcpiOsPrintf ("- [%4.4s]\n", 715 ObjDesc->Reference.Node->Name.Ascii); 716 break; 717 718 case ACPI_REFCLASS_ARG: 719 case ACPI_REFCLASS_LOCAL: 720 721 AcpiOsPrintf ("%X\n", ObjDesc->Reference.Value); 722 break; 723 724 default: /* Unknown reference class */ 725 726 AcpiOsPrintf ("%2.2X\n", ObjDesc->Reference.Class); 727 break; 728 } 729 break; 730 731 case ACPI_TYPE_BUFFER: 732 733 AcpiOsPrintf ("Buffer length %.2X @ %p\n", 734 ObjDesc->Buffer.Length, ObjDesc->Buffer.Pointer); 735 736 /* Debug only -- dump the buffer contents */ 737 738 if (ObjDesc->Buffer.Pointer) 739 { 740 Length = ObjDesc->Buffer.Length; 741 if (Length > 128) 742 { 743 Length = 128; 744 } 745 746 AcpiOsPrintf ( 747 "Buffer Contents: (displaying length 0x%.2X)\n", Length); 748 ACPI_DUMP_BUFFER (ObjDesc->Buffer.Pointer, Length); 749 } 750 break; 751 752 case ACPI_TYPE_INTEGER: 753 754 AcpiOsPrintf ("Integer %8.8X%8.8X\n", 755 ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value)); 756 break; 757 758 case ACPI_TYPE_PACKAGE: 759 760 AcpiOsPrintf ("Package [Len %X] ElementArray %p\n", 761 ObjDesc->Package.Count, ObjDesc->Package.Elements); 762 763 /* 764 * If elements exist, package element pointer is valid, 765 * and debug_level exceeds 1, dump package's elements. 766 */ 767 if (ObjDesc->Package.Count && 768 ObjDesc->Package.Elements && 769 AcpiDbgLevel > 1) 770 { 771 for (Index = 0; Index < ObjDesc->Package.Count; Index++) 772 { 773 AcpiExDumpOperand ( 774 ObjDesc->Package.Elements[Index], Depth + 1); 775 } 776 } 777 break; 778 779 case ACPI_TYPE_REGION: 780 781 AcpiOsPrintf ("Region %s (%X)", 782 AcpiUtGetRegionName (ObjDesc->Region.SpaceId), 783 ObjDesc->Region.SpaceId); 784 785 /* 786 * If the address and length have not been evaluated, 787 * don't print them. 788 */ 789 if (!(ObjDesc->Region.Flags & AOPOBJ_DATA_VALID)) 790 { 791 AcpiOsPrintf ("\n"); 792 } 793 else 794 { 795 AcpiOsPrintf (" base %8.8X%8.8X Length %X\n", 796 ACPI_FORMAT_UINT64 (ObjDesc->Region.Address), 797 ObjDesc->Region.Length); 798 } 799 break; 800 801 case ACPI_TYPE_STRING: 802 803 AcpiOsPrintf ("String length %X @ %p ", 804 ObjDesc->String.Length, 805 ObjDesc->String.Pointer); 806 807 AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX); 808 AcpiOsPrintf ("\n"); 809 break; 810 811 case ACPI_TYPE_LOCAL_BANK_FIELD: 812 813 AcpiOsPrintf ("BankField\n"); 814 break; 815 816 case ACPI_TYPE_LOCAL_REGION_FIELD: 817 818 AcpiOsPrintf ("RegionField: Bits=%X AccWidth=%X Lock=%X Update=%X at " 819 "byte=%X bit=%X of below:\n", 820 ObjDesc->Field.BitLength, 821 ObjDesc->Field.AccessByteWidth, 822 ObjDesc->Field.FieldFlags & AML_FIELD_LOCK_RULE_MASK, 823 ObjDesc->Field.FieldFlags & AML_FIELD_UPDATE_RULE_MASK, 824 ObjDesc->Field.BaseByteOffset, 825 ObjDesc->Field.StartFieldBitOffset); 826 827 AcpiExDumpOperand (ObjDesc->Field.RegionObj, Depth + 1); 828 break; 829 830 case ACPI_TYPE_LOCAL_INDEX_FIELD: 831 832 AcpiOsPrintf ("IndexField\n"); 833 break; 834 835 case ACPI_TYPE_BUFFER_FIELD: 836 837 AcpiOsPrintf ("BufferField: %X bits at byte %X bit %X of\n", 838 ObjDesc->BufferField.BitLength, 839 ObjDesc->BufferField.BaseByteOffset, 840 ObjDesc->BufferField.StartFieldBitOffset); 841 842 if (!ObjDesc->BufferField.BufferObj) 843 { 844 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "*NULL*\n")); 845 } 846 else if ((ObjDesc->BufferField.BufferObj)->Common.Type != 847 ACPI_TYPE_BUFFER) 848 { 849 AcpiOsPrintf ("*not a Buffer*\n"); 850 } 851 else 852 { 853 AcpiExDumpOperand (ObjDesc->BufferField.BufferObj, Depth + 1); 854 } 855 break; 856 857 case ACPI_TYPE_EVENT: 858 859 AcpiOsPrintf ("Event\n"); 860 break; 861 862 case ACPI_TYPE_METHOD: 863 864 AcpiOsPrintf ("Method(%X) @ %p:%X\n", 865 ObjDesc->Method.ParamCount, 866 ObjDesc->Method.AmlStart, 867 ObjDesc->Method.AmlLength); 868 break; 869 870 case ACPI_TYPE_MUTEX: 871 872 AcpiOsPrintf ("Mutex\n"); 873 break; 874 875 case ACPI_TYPE_DEVICE: 876 877 AcpiOsPrintf ("Device\n"); 878 break; 879 880 case ACPI_TYPE_POWER: 881 882 AcpiOsPrintf ("Power\n"); 883 break; 884 885 case ACPI_TYPE_PROCESSOR: 886 887 AcpiOsPrintf ("Processor\n"); 888 break; 889 890 case ACPI_TYPE_THERMAL: 891 892 AcpiOsPrintf ("Thermal\n"); 893 break; 894 895 default: 896 897 /* Unknown Type */ 898 899 AcpiOsPrintf ("Unknown Type %X\n", ObjDesc->Common.Type); 900 break; 901 } 902 903 return; 904 } 905 906 907 /******************************************************************************* 908 * 909 * FUNCTION: AcpiExDumpOperands 910 * 911 * PARAMETERS: Operands - A list of Operand objects 912 * OpcodeName - AML opcode name 913 * NumOperands - Operand count for this opcode 914 * 915 * DESCRIPTION: Dump the operands associated with the opcode 916 * 917 ******************************************************************************/ 918 919 void 920 AcpiExDumpOperands ( 921 ACPI_OPERAND_OBJECT **Operands, 922 const char *OpcodeName, 923 UINT32 NumOperands) 924 { 925 ACPI_FUNCTION_NAME (ExDumpOperands); 926 927 928 if (!OpcodeName) 929 { 930 OpcodeName = "UNKNOWN"; 931 } 932 933 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, 934 "**** Start operand dump for opcode [%s], %u operands\n", 935 OpcodeName, NumOperands)); 936 937 if (NumOperands == 0) 938 { 939 NumOperands = 1; 940 } 941 942 /* Dump the individual operands */ 943 944 while (NumOperands) 945 { 946 AcpiExDumpOperand (*Operands, 0); 947 Operands++; 948 NumOperands--; 949 } 950 951 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, 952 "**** End operand dump for [%s]\n", OpcodeName)); 953 return; 954 } 955 956 957 /******************************************************************************* 958 * 959 * FUNCTION: AcpiExOut* functions 960 * 961 * PARAMETERS: Title - Descriptive text 962 * Value - Value to be displayed 963 * 964 * DESCRIPTION: Object dump output formatting functions. These functions 965 * reduce the number of format strings required and keeps them 966 * all in one place for easy modification. 967 * 968 ******************************************************************************/ 969 970 static void 971 AcpiExOutString ( 972 char *Title, 973 char *Value) 974 { 975 AcpiOsPrintf ("%20s : %s\n", Title, Value); 976 } 977 978 static void 979 AcpiExOutPointer ( 980 char *Title, 981 void *Value) 982 { 983 AcpiOsPrintf ("%20s : %p\n", Title, Value); 984 } 985 986 987 /******************************************************************************* 988 * 989 * FUNCTION: AcpiExDumpNamespaceNode 990 * 991 * PARAMETERS: Node - Descriptor to dump 992 * Flags - Force display if TRUE 993 * 994 * DESCRIPTION: Dumps the members of the given.Node 995 * 996 ******************************************************************************/ 997 998 void 999 AcpiExDumpNamespaceNode ( 1000 ACPI_NAMESPACE_NODE *Node, 1001 UINT32 Flags) 1002 { 1003 1004 ACPI_FUNCTION_ENTRY (); 1005 1006 1007 if (!Flags) 1008 { 1009 /* Check if debug output enabled */ 1010 1011 if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_OBJECTS, _COMPONENT)) 1012 { 1013 return; 1014 } 1015 } 1016 1017 AcpiOsPrintf ("%20s : %4.4s\n", "Name", AcpiUtGetNodeName (Node)); 1018 AcpiOsPrintf ("%20s : %2.2X [%s]\n", "Type", 1019 Node->Type, AcpiUtGetTypeName (Node->Type)); 1020 1021 AcpiExDumpObject (ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Node), 1022 AcpiExDumpNode); 1023 } 1024 1025 1026 /******************************************************************************* 1027 * 1028 * FUNCTION: AcpiExDumpReferenceObj 1029 * 1030 * PARAMETERS: Object - Descriptor to dump 1031 * 1032 * DESCRIPTION: Dumps a reference object 1033 * 1034 ******************************************************************************/ 1035 1036 static void 1037 AcpiExDumpReferenceObj ( 1038 ACPI_OPERAND_OBJECT *ObjDesc) 1039 { 1040 ACPI_BUFFER RetBuf; 1041 ACPI_STATUS Status; 1042 1043 1044 RetBuf.Length = ACPI_ALLOCATE_LOCAL_BUFFER; 1045 1046 if (ObjDesc->Reference.Class == ACPI_REFCLASS_NAME) 1047 { 1048 AcpiOsPrintf (" %p ", ObjDesc->Reference.Node); 1049 1050 Status = AcpiNsHandleToPathname (ObjDesc->Reference.Node, 1051 &RetBuf, TRUE); 1052 if (ACPI_FAILURE (Status)) 1053 { 1054 AcpiOsPrintf (" Could not convert name to pathname\n"); 1055 } 1056 else 1057 { 1058 AcpiOsPrintf ("%s\n", (char *) RetBuf.Pointer); 1059 ACPI_FREE (RetBuf.Pointer); 1060 } 1061 } 1062 else if (ObjDesc->Reference.Object) 1063 { 1064 if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_OPERAND) 1065 { 1066 AcpiOsPrintf ("%22s %p", "Target :", 1067 ObjDesc->Reference.Object); 1068 if (ObjDesc->Reference.Class == ACPI_REFCLASS_TABLE) 1069 { 1070 AcpiOsPrintf (" Table Index: %X\n", 1071 ObjDesc->Reference.Value); 1072 } 1073 else 1074 { 1075 AcpiOsPrintf (" [%s]\n", 1076 AcpiUtGetTypeName (((ACPI_OPERAND_OBJECT *) 1077 ObjDesc->Reference.Object)->Common.Type)); 1078 } 1079 } 1080 else 1081 { 1082 AcpiOsPrintf (" Target: %p\n", ObjDesc->Reference.Object); 1083 } 1084 } 1085 } 1086 1087 1088 /******************************************************************************* 1089 * 1090 * FUNCTION: AcpiExDumpPackageObj 1091 * 1092 * PARAMETERS: ObjDesc - Descriptor to dump 1093 * Level - Indentation Level 1094 * Index - Package index for this object 1095 * 1096 * DESCRIPTION: Dumps the elements of the package 1097 * 1098 ******************************************************************************/ 1099 1100 static void 1101 AcpiExDumpPackageObj ( 1102 ACPI_OPERAND_OBJECT *ObjDesc, 1103 UINT32 Level, 1104 UINT32 Index) 1105 { 1106 UINT32 i; 1107 1108 1109 /* Indentation and index output */ 1110 1111 if (Level > 0) 1112 { 1113 for (i = 0; i < Level; i++) 1114 { 1115 AcpiOsPrintf (" "); 1116 } 1117 1118 AcpiOsPrintf ("[%.2d] ", Index); 1119 } 1120 1121 AcpiOsPrintf ("%p ", ObjDesc); 1122 1123 /* Null package elements are allowed */ 1124 1125 if (!ObjDesc) 1126 { 1127 AcpiOsPrintf ("[Null Object]\n"); 1128 return; 1129 } 1130 1131 /* Packages may only contain a few object types */ 1132 1133 switch (ObjDesc->Common.Type) 1134 { 1135 case ACPI_TYPE_INTEGER: 1136 1137 AcpiOsPrintf ("[Integer] = %8.8X%8.8X\n", 1138 ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value)); 1139 break; 1140 1141 case ACPI_TYPE_STRING: 1142 1143 AcpiOsPrintf ("[String] Value: "); 1144 AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX); 1145 AcpiOsPrintf ("\n"); 1146 break; 1147 1148 case ACPI_TYPE_BUFFER: 1149 1150 AcpiOsPrintf ("[Buffer] Length %.2X = ", ObjDesc->Buffer.Length); 1151 if (ObjDesc->Buffer.Length) 1152 { 1153 AcpiUtDebugDumpBuffer ( 1154 ACPI_CAST_PTR (UINT8, ObjDesc->Buffer.Pointer), 1155 ObjDesc->Buffer.Length, DB_DWORD_DISPLAY, _COMPONENT); 1156 } 1157 else 1158 { 1159 AcpiOsPrintf ("\n"); 1160 } 1161 break; 1162 1163 case ACPI_TYPE_PACKAGE: 1164 1165 AcpiOsPrintf ("[Package] Contains %u Elements:\n", 1166 ObjDesc->Package.Count); 1167 1168 for (i = 0; i < ObjDesc->Package.Count; i++) 1169 { 1170 AcpiExDumpPackageObj ( 1171 ObjDesc->Package.Elements[i], Level + 1, i); 1172 } 1173 break; 1174 1175 case ACPI_TYPE_LOCAL_REFERENCE: 1176 1177 AcpiOsPrintf ("[Object Reference] Type [%s] %2.2X", 1178 AcpiUtGetReferenceName (ObjDesc), 1179 ObjDesc->Reference.Class); 1180 AcpiExDumpReferenceObj (ObjDesc); 1181 break; 1182 1183 default: 1184 1185 AcpiOsPrintf ("[Unknown Type] %X\n", ObjDesc->Common.Type); 1186 break; 1187 } 1188 } 1189 1190 1191 /******************************************************************************* 1192 * 1193 * FUNCTION: AcpiExDumpObjectDescriptor 1194 * 1195 * PARAMETERS: ObjDesc - Descriptor to dump 1196 * Flags - Force display if TRUE 1197 * 1198 * DESCRIPTION: Dumps the members of the object descriptor given. 1199 * 1200 ******************************************************************************/ 1201 1202 void 1203 AcpiExDumpObjectDescriptor ( 1204 ACPI_OPERAND_OBJECT *ObjDesc, 1205 UINT32 Flags) 1206 { 1207 ACPI_FUNCTION_TRACE (ExDumpObjectDescriptor); 1208 1209 1210 if (!ObjDesc) 1211 { 1212 return_VOID; 1213 } 1214 1215 if (!Flags) 1216 { 1217 /* Check if debug output enabled */ 1218 1219 if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_OBJECTS, _COMPONENT)) 1220 { 1221 return_VOID; 1222 } 1223 } 1224 1225 if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED) 1226 { 1227 AcpiExDumpNamespaceNode ((ACPI_NAMESPACE_NODE *) ObjDesc, Flags); 1228 1229 AcpiOsPrintf ("\nAttached Object (%p):\n", 1230 ((ACPI_NAMESPACE_NODE *) ObjDesc)->Object); 1231 1232 ObjDesc = ((ACPI_NAMESPACE_NODE *) ObjDesc)->Object; 1233 goto DumpObject; 1234 } 1235 1236 if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND) 1237 { 1238 AcpiOsPrintf ( 1239 "%p is not an ACPI operand object: [%s]\n", 1240 ObjDesc, AcpiUtGetDescriptorName (ObjDesc)); 1241 return_VOID; 1242 } 1243 1244 /* Validate the object type */ 1245 1246 if (ObjDesc->Common.Type > ACPI_TYPE_LOCAL_MAX) 1247 { 1248 AcpiOsPrintf ("Not a known object type: %2.2X\n", 1249 ObjDesc->Common.Type); 1250 return_VOID; 1251 } 1252 1253 1254 DumpObject: 1255 1256 /* Common Fields */ 1257 1258 AcpiExDumpObject (ObjDesc, AcpiExDumpCommon); 1259 1260 /* Object-specific fields */ 1261 1262 AcpiExDumpObject (ObjDesc, AcpiExDumpInfo[ObjDesc->Common.Type]); 1263 1264 if (ObjDesc->Common.Type == ACPI_TYPE_REGION) 1265 { 1266 ObjDesc = ObjDesc->Common.NextObject; 1267 if (ObjDesc->Common.Type > ACPI_TYPE_LOCAL_MAX) 1268 { 1269 AcpiOsPrintf ( 1270 "Secondary object is not a known object type: %2.2X\n", 1271 ObjDesc->Common.Type); 1272 1273 return_VOID; 1274 } 1275 1276 AcpiOsPrintf ("\nExtra attached Object (%p):\n", ObjDesc); 1277 AcpiExDumpObject (ObjDesc, AcpiExDumpInfo[ObjDesc->Common.Type]); 1278 } 1279 1280 return_VOID; 1281 } 1282 1283 #endif 1284