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