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