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