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