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