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