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