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