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