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