Home | History | Annotate | Line # | Download | only in executer
      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 - 2025, 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),                "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 = __UNCONST(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