Home | History | Annotate | Line # | Download | only in executer
exdump.c revision 1.3.10.1
      1 /******************************************************************************
      2  *
      3  * Module Name: exdump - Interpreter debug output routines
      4  *
      5  *****************************************************************************/
      6 
      7 /*
      8  * Copyright (C) 2000 - 2013, 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 #define __EXDUMP_C__
     45 
     46 #include "acpi.h"
     47 #include "accommon.h"
     48 #include "acinterp.h"
     49 #include "amlcode.h"
     50 #include "acnamesp.h"
     51 
     52 
     53 #define _COMPONENT          ACPI_EXECUTER
     54         ACPI_MODULE_NAME    ("exdump")
     55 
     56 /*
     57  * The following routines are used for debug output only
     58  */
     59 #if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
     60 
     61 /* Local prototypes */
     62 
     63 static void
     64 AcpiExOutString (
     65     const char              *Title,
     66     const char              *Value);
     67 
     68 static void
     69 AcpiExOutPointer (
     70     const char              *Title,
     71     void                    *Value);
     72 
     73 static void
     74 AcpiExDumpObject (
     75     ACPI_OPERAND_OBJECT     *ObjDesc,
     76     ACPI_EXDUMP_INFO        *Info);
     77 
     78 static void
     79 AcpiExDumpReferenceObj (
     80     ACPI_OPERAND_OBJECT     *ObjDesc);
     81 
     82 static void
     83 AcpiExDumpPackageObj (
     84     ACPI_OPERAND_OBJECT     *ObjDesc,
     85     UINT32                  Level,
     86     UINT32                  Index);
     87 
     88 
     89 /*******************************************************************************
     90  *
     91  * Object Descriptor info tables
     92  *
     93  * Note: The first table entry must be an INIT opcode and must contain
     94  * the table length (number of table entries)
     95  *
     96  ******************************************************************************/
     97 
     98 static ACPI_EXDUMP_INFO     AcpiExDumpInteger[2] =
     99 {
    100     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpInteger),        NULL},
    101     {ACPI_EXD_UINT64,   ACPI_EXD_OFFSET (Integer.Value),                "Value"}
    102 };
    103 
    104 static ACPI_EXDUMP_INFO     AcpiExDumpString[4] =
    105 {
    106     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpString),         NULL},
    107     {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (String.Length),                "Length"},
    108     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (String.Pointer),               "Pointer"},
    109     {ACPI_EXD_STRING,   0,                                              NULL}
    110 };
    111 
    112 static ACPI_EXDUMP_INFO     AcpiExDumpBuffer[5] =
    113 {
    114     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpBuffer),         NULL},
    115     {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (Buffer.Length),                "Length"},
    116     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Buffer.Pointer),               "Pointer"},
    117     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Buffer.Node),                  "Parent Node"},
    118     {ACPI_EXD_BUFFER,   0,                                              NULL}
    119 };
    120 
    121 static ACPI_EXDUMP_INFO     AcpiExDumpPackage[5] =
    122 {
    123     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpPackage),        NULL},
    124     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Package.Flags),                "Flags"},
    125     {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (Package.Count),                "Elements"},
    126     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Package.Elements),             "Element List"},
    127     {ACPI_EXD_PACKAGE,  0,                                              NULL}
    128 };
    129 
    130 static ACPI_EXDUMP_INFO     AcpiExDumpDevice[4] =
    131 {
    132     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpDevice),         NULL},
    133     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Device.Handler),               "Handler"},
    134     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Device.NotifyList[0]),         "System Notify"},
    135     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Device.NotifyList[1]),         "Device Notify"}
    136 };
    137 
    138 static ACPI_EXDUMP_INFO     AcpiExDumpEvent[2] =
    139 {
    140     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpEvent),          NULL},
    141     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Event.OsSemaphore),            "OsSemaphore"}
    142 };
    143 
    144 static ACPI_EXDUMP_INFO     AcpiExDumpMethod[9] =
    145 {
    146     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpMethod),         NULL},
    147     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Method.InfoFlags),             "Info Flags"},
    148     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Method.ParamCount),            "Parameter Count"},
    149     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Method.SyncLevel),             "Sync Level"},
    150     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Method.Mutex),                 "Mutex"},
    151     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Method.OwnerId),               "Owner Id"},
    152     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Method.ThreadCount),           "Thread Count"},
    153     {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (Method.AmlLength),             "Aml Length"},
    154     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Method.AmlStart),              "Aml Start"}
    155 };
    156 
    157 static ACPI_EXDUMP_INFO     AcpiExDumpMutex[5] =
    158 {
    159     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpMutex),          NULL},
    160     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Mutex.SyncLevel),              "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[7] =
    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_ADDRESS,  ACPI_EXD_OFFSET (Region.Address),               "Address"},
    172     {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (Region.Length),                "Length"},
    173     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Region.Handler),               "Handler"},
    174     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Region.Next),                  "Next"}
    175 };
    176 
    177 static ACPI_EXDUMP_INFO     AcpiExDumpPower[5] =
    178 {
    179     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpPower),          NULL},
    180     {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (PowerResource.SystemLevel),    "System Level"},
    181     {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (PowerResource.ResourceOrder),  "Resource Order"},
    182     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (PowerResource.NotifyList[0]),  "System Notify"},
    183     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (PowerResource.NotifyList[1]),  "Device Notify"}
    184 };
    185 
    186 static ACPI_EXDUMP_INFO     AcpiExDumpProcessor[7] =
    187 {
    188     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpProcessor),      NULL},
    189     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Processor.ProcId),             "Processor ID"},
    190     {ACPI_EXD_UINT8 ,   ACPI_EXD_OFFSET (Processor.Length),             "Length"},
    191     {ACPI_EXD_ADDRESS,  ACPI_EXD_OFFSET (Processor.Address),            "Address"},
    192     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Processor.NotifyList[0]),      "System Notify"},
    193     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Processor.NotifyList[1]),      "Device Notify"},
    194     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Processor.Handler),            "Handler"}
    195 };
    196 
    197 static ACPI_EXDUMP_INFO     AcpiExDumpThermal[4] =
    198 {
    199     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpThermal),        NULL},
    200     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (ThermalZone.NotifyList[0]),    "System Notify"},
    201     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (ThermalZone.NotifyList[1]),    "Device Notify"},
    202     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (ThermalZone.Handler),          "Handler"}
    203 };
    204 
    205 static ACPI_EXDUMP_INFO     AcpiExDumpBufferField[3] =
    206 {
    207     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpBufferField),    NULL},
    208     {ACPI_EXD_FIELD,    0,                                              NULL},
    209     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (BufferField.BufferObj),        "Buffer Object"}
    210 };
    211 
    212 static ACPI_EXDUMP_INFO     AcpiExDumpRegionField[5] =
    213 {
    214     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpRegionField),    NULL},
    215     {ACPI_EXD_FIELD,    0,                                              NULL},
    216     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Field.AccessLength),           "AccessLength"},
    217     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Field.RegionObj),              "Region Object"},
    218     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Field.ResourceBuffer),         "ResourceBuffer"}
    219 };
    220 
    221 static ACPI_EXDUMP_INFO     AcpiExDumpBankField[5] =
    222 {
    223     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpBankField),      NULL},
    224     {ACPI_EXD_FIELD,    0,                                              NULL},
    225     {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (BankField.Value),              "Value"},
    226     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (BankField.RegionObj),          "Region Object"},
    227     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (BankField.BankObj),            "Bank Object"}
    228 };
    229 
    230 static ACPI_EXDUMP_INFO     AcpiExDumpIndexField[5] =
    231 {
    232     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpBankField),      NULL},
    233     {ACPI_EXD_FIELD,    0,                                              NULL},
    234     {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (IndexField.Value),             "Value"},
    235     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (IndexField.IndexObj),          "Index Object"},
    236     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (IndexField.DataObj),           "Data Object"}
    237 };
    238 
    239 static ACPI_EXDUMP_INFO     AcpiExDumpReference[8] =
    240 {
    241     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpReference),       NULL},
    242     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Reference.Class),              "Class"},
    243     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Reference.TargetType),         "Target Type"},
    244     {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (Reference.Value),              "Value"},
    245     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Reference.Object),             "Object Desc"},
    246     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Reference.Node),               "Node"},
    247     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Reference.Where),              "Where"},
    248     {ACPI_EXD_REFERENCE,0,                                              NULL}
    249 };
    250 
    251 static ACPI_EXDUMP_INFO     AcpiExDumpAddressHandler[6] =
    252 {
    253     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpAddressHandler), NULL},
    254     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (AddressSpace.SpaceId),         "Space Id"},
    255     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (AddressSpace.Next),            "Next"},
    256     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (AddressSpace.RegionList),      "Region List"},
    257     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (AddressSpace.Node),            "Node"},
    258     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (AddressSpace.Context),         "Context"}
    259 };
    260 
    261 static ACPI_EXDUMP_INFO     AcpiExDumpNotify[7] =
    262 {
    263     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpNotify),         NULL},
    264     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Notify.Node),                  "Node"},
    265     {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (Notify.HandlerType),           "Handler Type"},
    266     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Notify.Handler),               "Handler"},
    267     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Notify.Context),               "Context"},
    268     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Notify.Next[0]),               "Next System Notify"},
    269     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Notify.Next[1]),               "Next Device Notify"}
    270 };
    271 
    272 
    273 /* Miscellaneous tables */
    274 
    275 static ACPI_EXDUMP_INFO     AcpiExDumpCommon[4] =
    276 {
    277     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpCommon),         NULL},
    278     {ACPI_EXD_TYPE ,    0,                                              NULL},
    279     {ACPI_EXD_UINT16,   ACPI_EXD_OFFSET (Common.ReferenceCount),        "Reference Count"},
    280     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Common.Flags),                 "Flags"}
    281 };
    282 
    283 static ACPI_EXDUMP_INFO     AcpiExDumpFieldCommon[7] =
    284 {
    285     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpFieldCommon),    NULL},
    286     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (CommonField.FieldFlags),       "Field Flags"},
    287     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (CommonField.AccessByteWidth),  "Access Byte Width"},
    288     {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (CommonField.BitLength),        "Bit Length"},
    289     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (CommonField.StartFieldBitOffset),"Field Bit Offset"},
    290     {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (CommonField.BaseByteOffset),   "Base Byte Offset"},
    291     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (CommonField.Node),             "Parent Node"}
    292 };
    293 
    294 static ACPI_EXDUMP_INFO     AcpiExDumpNode[5] =
    295 {
    296     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpNode),           NULL},
    297     {ACPI_EXD_UINT8,    ACPI_EXD_NSOFFSET (Flags),                      "Flags"},
    298     {ACPI_EXD_UINT8,    ACPI_EXD_NSOFFSET (OwnerId),                    "Owner Id"},
    299     {ACPI_EXD_POINTER,  ACPI_EXD_NSOFFSET (Child),                      "Child List"},
    300     {ACPI_EXD_POINTER,  ACPI_EXD_NSOFFSET (Peer),                       "Next Peer"}
    301 };
    302 
    303 
    304 /* Dispatch table, indexed by object type */
    305 
    306 static ACPI_EXDUMP_INFO     *AcpiExDumpInfo[] =
    307 {
    308     NULL,
    309     AcpiExDumpInteger,
    310     AcpiExDumpString,
    311     AcpiExDumpBuffer,
    312     AcpiExDumpPackage,
    313     NULL,
    314     AcpiExDumpDevice,
    315     AcpiExDumpEvent,
    316     AcpiExDumpMethod,
    317     AcpiExDumpMutex,
    318     AcpiExDumpRegion,
    319     AcpiExDumpPower,
    320     AcpiExDumpProcessor,
    321     AcpiExDumpThermal,
    322     AcpiExDumpBufferField,
    323     NULL,
    324     NULL,
    325     AcpiExDumpRegionField,
    326     AcpiExDumpBankField,
    327     AcpiExDumpIndexField,
    328     AcpiExDumpReference,
    329     NULL,
    330     NULL,
    331     AcpiExDumpNotify,
    332     AcpiExDumpAddressHandler,
    333     NULL,
    334     NULL,
    335     NULL
    336 };
    337 
    338 
    339 /*******************************************************************************
    340  *
    341  * FUNCTION:    AcpiExDumpObject
    342  *
    343  * PARAMETERS:  ObjDesc             - Descriptor to dump
    344  *              Info                - Info table corresponding to this object
    345  *                                    type
    346  *
    347  * RETURN:      None
    348  *
    349  * DESCRIPTION: Walk the info table for this object
    350  *
    351  ******************************************************************************/
    352 
    353 static void
    354 AcpiExDumpObject (
    355     ACPI_OPERAND_OBJECT     *ObjDesc,
    356     ACPI_EXDUMP_INFO        *Info)
    357 {
    358     UINT8                   *Target;
    359     char                    *Name;
    360     const char              *ReferenceName;
    361     UINT8                   Count;
    362 
    363 
    364     if (!Info)
    365     {
    366         AcpiOsPrintf (
    367             "ExDumpObject: Display not implemented for object type %s\n",
    368             AcpiUtGetObjectTypeName (ObjDesc));
    369         return;
    370     }
    371 
    372     /* First table entry must contain the table length (# of table entries) */
    373 
    374     Count = Info->Offset;
    375 
    376     while (Count)
    377     {
    378         Target = ACPI_ADD_PTR (UINT8, ObjDesc, Info->Offset);
    379         Name = __UNCONST(Info->Name);
    380 
    381         switch (Info->Opcode)
    382         {
    383         case ACPI_EXD_INIT:
    384 
    385             break;
    386 
    387         case ACPI_EXD_TYPE:
    388 
    389             AcpiExOutString  ("Type", AcpiUtGetObjectTypeName (ObjDesc));
    390             break;
    391 
    392         case ACPI_EXD_UINT8:
    393 
    394             AcpiOsPrintf ("%20s : %2.2X\n", Name, *Target);
    395             break;
    396 
    397         case ACPI_EXD_UINT16:
    398 
    399             AcpiOsPrintf ("%20s : %4.4X\n", Name, ACPI_GET16 (Target));
    400             break;
    401 
    402         case ACPI_EXD_UINT32:
    403 
    404             AcpiOsPrintf ("%20s : %8.8X\n", Name, ACPI_GET32 (Target));
    405             break;
    406 
    407         case ACPI_EXD_UINT64:
    408 
    409             AcpiOsPrintf ("%20s : %8.8X%8.8X\n", "Value",
    410                 ACPI_FORMAT_UINT64 (ACPI_GET64 (Target)));
    411             break;
    412 
    413         case ACPI_EXD_POINTER:
    414         case ACPI_EXD_ADDRESS:
    415 
    416             AcpiExOutPointer (Name, *ACPI_CAST_PTR (void *, Target));
    417             break;
    418 
    419         case ACPI_EXD_STRING:
    420 
    421             AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX);
    422             AcpiOsPrintf ("\n");
    423             break;
    424 
    425         case ACPI_EXD_BUFFER:
    426 
    427             ACPI_DUMP_BUFFER (ObjDesc->Buffer.Pointer, ObjDesc->Buffer.Length);
    428             break;
    429 
    430         case ACPI_EXD_PACKAGE:
    431 
    432             /* Dump the package contents */
    433 
    434             AcpiOsPrintf ("\nPackage Contents:\n");
    435             AcpiExDumpPackageObj (ObjDesc, 0, 0);
    436             break;
    437 
    438         case ACPI_EXD_FIELD:
    439 
    440             AcpiExDumpObject (ObjDesc, AcpiExDumpFieldCommon);
    441             break;
    442 
    443         case ACPI_EXD_REFERENCE:
    444 
    445             ReferenceName = AcpiUtGetReferenceName (ObjDesc);
    446             AcpiExOutString ("Class Name", ACPI_CAST_PTR (char, ReferenceName));
    447             AcpiExDumpReferenceObj (ObjDesc);
    448             break;
    449 
    450         default:
    451 
    452             AcpiOsPrintf ("**** Invalid table opcode [%X] ****\n",
    453                 Info->Opcode);
    454             return;
    455         }
    456 
    457         Info++;
    458         Count--;
    459     }
    460 }
    461 
    462 
    463 /*******************************************************************************
    464  *
    465  * FUNCTION:    AcpiExDumpOperand
    466  *
    467  * PARAMETERS:  *ObjDesc        - Pointer to entry to be dumped
    468  *              Depth           - Current nesting depth
    469  *
    470  * RETURN:      None
    471  *
    472  * DESCRIPTION: Dump an operand object
    473  *
    474  ******************************************************************************/
    475 
    476 void
    477 AcpiExDumpOperand (
    478     ACPI_OPERAND_OBJECT     *ObjDesc,
    479     UINT32                  Depth)
    480 {
    481     UINT32                  Length;
    482     UINT32                  Index;
    483 
    484 
    485     ACPI_FUNCTION_NAME (ExDumpOperand)
    486 
    487 
    488     /* Check if debug output enabled */
    489 
    490     if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_EXEC, _COMPONENT))
    491     {
    492         return;
    493     }
    494 
    495     if (!ObjDesc)
    496     {
    497         /* This could be a null element of a package */
    498 
    499         ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Null Object Descriptor\n"));
    500         return;
    501     }
    502 
    503     if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED)
    504     {
    505         ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p Namespace Node: ", ObjDesc));
    506         ACPI_DUMP_ENTRY (ObjDesc, ACPI_LV_EXEC);
    507         return;
    508     }
    509 
    510     if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND)
    511     {
    512         ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
    513             "%p is not a node or operand object: [%s]\n",
    514             ObjDesc, AcpiUtGetDescriptorName (ObjDesc)));
    515         ACPI_DUMP_BUFFER (ObjDesc, sizeof (ACPI_OPERAND_OBJECT));
    516         return;
    517     }
    518 
    519     /* ObjDesc is a valid object */
    520 
    521     if (Depth > 0)
    522     {
    523         ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%*s[%u] %p ",
    524             Depth, " ", Depth, ObjDesc));
    525     }
    526     else
    527     {
    528         ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p ", ObjDesc));
    529     }
    530 
    531     /* Decode object type */
    532 
    533     switch (ObjDesc->Common.Type)
    534     {
    535     case ACPI_TYPE_LOCAL_REFERENCE:
    536 
    537         AcpiOsPrintf ("Reference: [%s] ", AcpiUtGetReferenceName (ObjDesc));
    538 
    539         switch (ObjDesc->Reference.Class)
    540         {
    541         case ACPI_REFCLASS_DEBUG:
    542 
    543             AcpiOsPrintf ("\n");
    544             break;
    545 
    546         case ACPI_REFCLASS_INDEX:
    547 
    548             AcpiOsPrintf ("%p\n", ObjDesc->Reference.Object);
    549             break;
    550 
    551         case ACPI_REFCLASS_TABLE:
    552 
    553             AcpiOsPrintf ("Table Index %X\n", ObjDesc->Reference.Value);
    554             break;
    555 
    556         case ACPI_REFCLASS_REFOF:
    557 
    558             AcpiOsPrintf ("%p [%s]\n", ObjDesc->Reference.Object,
    559                 AcpiUtGetTypeName (((ACPI_OPERAND_OBJECT *)
    560                     ObjDesc->Reference.Object)->Common.Type));
    561             break;
    562 
    563         case ACPI_REFCLASS_NAME:
    564 
    565             AcpiOsPrintf ("- [%4.4s]\n", ObjDesc->Reference.Node->Name.Ascii);
    566             break;
    567 
    568         case ACPI_REFCLASS_ARG:
    569         case ACPI_REFCLASS_LOCAL:
    570 
    571             AcpiOsPrintf ("%X\n", ObjDesc->Reference.Value);
    572             break;
    573 
    574         default:    /* Unknown reference class */
    575 
    576             AcpiOsPrintf ("%2.2X\n", ObjDesc->Reference.Class);
    577             break;
    578         }
    579         break;
    580 
    581     case ACPI_TYPE_BUFFER:
    582 
    583         AcpiOsPrintf ("Buffer length %.2X @ %p\n",
    584             ObjDesc->Buffer.Length, ObjDesc->Buffer.Pointer);
    585 
    586         /* Debug only -- dump the buffer contents */
    587 
    588         if (ObjDesc->Buffer.Pointer)
    589         {
    590             Length = ObjDesc->Buffer.Length;
    591             if (Length > 128)
    592             {
    593                 Length = 128;
    594             }
    595 
    596             AcpiOsPrintf ("Buffer Contents: (displaying length 0x%.2X)\n",
    597                 Length);
    598             ACPI_DUMP_BUFFER (ObjDesc->Buffer.Pointer, Length);
    599         }
    600         break;
    601 
    602     case ACPI_TYPE_INTEGER:
    603 
    604         AcpiOsPrintf ("Integer %8.8X%8.8X\n",
    605             ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
    606         break;
    607 
    608     case ACPI_TYPE_PACKAGE:
    609 
    610         AcpiOsPrintf ("Package [Len %X] ElementArray %p\n",
    611             ObjDesc->Package.Count, ObjDesc->Package.Elements);
    612 
    613         /*
    614          * If elements exist, package element pointer is valid,
    615          * and debug_level exceeds 1, dump package's elements.
    616          */
    617         if (ObjDesc->Package.Count &&
    618             ObjDesc->Package.Elements &&
    619             AcpiDbgLevel > 1)
    620         {
    621             for (Index = 0; Index < ObjDesc->Package.Count; Index++)
    622             {
    623                 AcpiExDumpOperand (ObjDesc->Package.Elements[Index], Depth+1);
    624             }
    625         }
    626         break;
    627 
    628     case ACPI_TYPE_REGION:
    629 
    630         AcpiOsPrintf ("Region %s (%X)",
    631             AcpiUtGetRegionName (ObjDesc->Region.SpaceId),
    632             ObjDesc->Region.SpaceId);
    633 
    634         /*
    635          * If the address and length have not been evaluated,
    636          * don't print them.
    637          */
    638         if (!(ObjDesc->Region.Flags & AOPOBJ_DATA_VALID))
    639         {
    640             AcpiOsPrintf ("\n");
    641         }
    642         else
    643         {
    644             AcpiOsPrintf (" base %8.8X%8.8X Length %X\n",
    645                 ACPI_FORMAT_NATIVE_UINT (ObjDesc->Region.Address),
    646                 ObjDesc->Region.Length);
    647         }
    648         break;
    649 
    650     case ACPI_TYPE_STRING:
    651 
    652         AcpiOsPrintf ("String length %X @ %p ",
    653             ObjDesc->String.Length,
    654             ObjDesc->String.Pointer);
    655 
    656         AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX);
    657         AcpiOsPrintf ("\n");
    658         break;
    659 
    660     case ACPI_TYPE_LOCAL_BANK_FIELD:
    661 
    662         AcpiOsPrintf ("BankField\n");
    663         break;
    664 
    665     case ACPI_TYPE_LOCAL_REGION_FIELD:
    666 
    667         AcpiOsPrintf ("RegionField: Bits=%X AccWidth=%X Lock=%X Update=%X at "
    668             "byte=%X bit=%X of below:\n",
    669             ObjDesc->Field.BitLength,
    670             ObjDesc->Field.AccessByteWidth,
    671             ObjDesc->Field.FieldFlags & AML_FIELD_LOCK_RULE_MASK,
    672             ObjDesc->Field.FieldFlags & AML_FIELD_UPDATE_RULE_MASK,
    673             ObjDesc->Field.BaseByteOffset,
    674             ObjDesc->Field.StartFieldBitOffset);
    675 
    676         AcpiExDumpOperand (ObjDesc->Field.RegionObj, Depth+1);
    677         break;
    678 
    679     case ACPI_TYPE_LOCAL_INDEX_FIELD:
    680 
    681         AcpiOsPrintf ("IndexField\n");
    682         break;
    683 
    684     case ACPI_TYPE_BUFFER_FIELD:
    685 
    686         AcpiOsPrintf ("BufferField: %X bits at byte %X bit %X of\n",
    687             ObjDesc->BufferField.BitLength,
    688             ObjDesc->BufferField.BaseByteOffset,
    689             ObjDesc->BufferField.StartFieldBitOffset);
    690 
    691         if (!ObjDesc->BufferField.BufferObj)
    692         {
    693             ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "*NULL*\n"));
    694         }
    695         else if ((ObjDesc->BufferField.BufferObj)->Common.Type !=
    696                     ACPI_TYPE_BUFFER)
    697         {
    698             AcpiOsPrintf ("*not a Buffer*\n");
    699         }
    700         else
    701         {
    702             AcpiExDumpOperand (ObjDesc->BufferField.BufferObj, Depth+1);
    703         }
    704         break;
    705 
    706     case ACPI_TYPE_EVENT:
    707 
    708         AcpiOsPrintf ("Event\n");
    709         break;
    710 
    711     case ACPI_TYPE_METHOD:
    712 
    713         AcpiOsPrintf ("Method(%X) @ %p:%X\n",
    714             ObjDesc->Method.ParamCount,
    715             ObjDesc->Method.AmlStart,
    716             ObjDesc->Method.AmlLength);
    717         break;
    718 
    719     case ACPI_TYPE_MUTEX:
    720 
    721         AcpiOsPrintf ("Mutex\n");
    722         break;
    723 
    724     case ACPI_TYPE_DEVICE:
    725 
    726         AcpiOsPrintf ("Device\n");
    727         break;
    728 
    729     case ACPI_TYPE_POWER:
    730 
    731         AcpiOsPrintf ("Power\n");
    732         break;
    733 
    734     case ACPI_TYPE_PROCESSOR:
    735 
    736         AcpiOsPrintf ("Processor\n");
    737         break;
    738 
    739     case ACPI_TYPE_THERMAL:
    740 
    741         AcpiOsPrintf ("Thermal\n");
    742         break;
    743 
    744     default:
    745 
    746         /* Unknown Type */
    747 
    748         AcpiOsPrintf ("Unknown Type %X\n", ObjDesc->Common.Type);
    749         break;
    750     }
    751 
    752     return;
    753 }
    754 
    755 
    756 /*******************************************************************************
    757  *
    758  * FUNCTION:    AcpiExDumpOperands
    759  *
    760  * PARAMETERS:  Operands            - A list of Operand objects
    761  *              OpcodeName          - AML opcode name
    762  *              NumOperands         - Operand count for this opcode
    763  *
    764  * DESCRIPTION: Dump the operands associated with the opcode
    765  *
    766  ******************************************************************************/
    767 
    768 void
    769 AcpiExDumpOperands (
    770     ACPI_OPERAND_OBJECT     **Operands,
    771     const char              *OpcodeName,
    772     UINT32                  NumOperands)
    773 {
    774     ACPI_FUNCTION_NAME (ExDumpOperands);
    775 
    776 
    777     if (!OpcodeName)
    778     {
    779         OpcodeName = "UNKNOWN";
    780     }
    781 
    782     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
    783         "**** Start operand dump for opcode [%s], %u operands\n",
    784         OpcodeName, NumOperands));
    785 
    786     if (NumOperands == 0)
    787     {
    788         NumOperands = 1;
    789     }
    790 
    791     /* Dump the individual operands */
    792 
    793     while (NumOperands)
    794     {
    795         AcpiExDumpOperand (*Operands, 0);
    796         Operands++;
    797         NumOperands--;
    798     }
    799 
    800     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
    801         "**** End operand dump for [%s]\n", OpcodeName));
    802     return;
    803 }
    804 
    805 
    806 /*******************************************************************************
    807  *
    808  * FUNCTION:    AcpiExOut* functions
    809  *
    810  * PARAMETERS:  Title               - Descriptive text
    811  *              Value               - Value to be displayed
    812  *
    813  * DESCRIPTION: Object dump output formatting functions. These functions
    814  *              reduce the number of format strings required and keeps them
    815  *              all in one place for easy modification.
    816  *
    817  ******************************************************************************/
    818 
    819 static void
    820 AcpiExOutString (
    821     const char              *Title,
    822     const char              *Value)
    823 {
    824     AcpiOsPrintf ("%20s : %s\n", Title, Value);
    825 }
    826 
    827 static void
    828 AcpiExOutPointer (
    829     const char              *Title,
    830     void                    *Value)
    831 {
    832     AcpiOsPrintf ("%20s : %p\n", Title, Value);
    833 }
    834 
    835 
    836 /*******************************************************************************
    837  *
    838  * FUNCTION:    AcpiExDumpNamespaceNode
    839  *
    840  * PARAMETERS:  Node                - Descriptor to dump
    841  *              Flags               - Force display if TRUE
    842  *
    843  * DESCRIPTION: Dumps the members of the given.Node
    844  *
    845  ******************************************************************************/
    846 
    847 void
    848 AcpiExDumpNamespaceNode (
    849     ACPI_NAMESPACE_NODE     *Node,
    850     UINT32                  Flags)
    851 {
    852 
    853     ACPI_FUNCTION_ENTRY ();
    854 
    855 
    856     if (!Flags)
    857     {
    858         /* Check if debug output enabled */
    859 
    860         if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_OBJECTS, _COMPONENT))
    861         {
    862             return;
    863         }
    864     }
    865 
    866     AcpiOsPrintf ("%20s : %4.4s\n", "Name", AcpiUtGetNodeName (Node));
    867     AcpiExOutString  ("Type", AcpiUtGetTypeName (Node->Type));
    868     AcpiExOutPointer ("Attached Object", AcpiNsGetAttachedObject (Node));
    869     AcpiExOutPointer ("Parent", Node->Parent);
    870 
    871     AcpiExDumpObject (ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Node),
    872         AcpiExDumpNode);
    873 }
    874 
    875 
    876 /*******************************************************************************
    877  *
    878  * FUNCTION:    AcpiExDumpReferenceObj
    879  *
    880  * PARAMETERS:  Object              - Descriptor to dump
    881  *
    882  * DESCRIPTION: Dumps a reference object
    883  *
    884  ******************************************************************************/
    885 
    886 static void
    887 AcpiExDumpReferenceObj (
    888     ACPI_OPERAND_OBJECT     *ObjDesc)
    889 {
    890     ACPI_BUFFER             RetBuf;
    891     ACPI_STATUS             Status;
    892 
    893 
    894     RetBuf.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
    895 
    896     if (ObjDesc->Reference.Class == ACPI_REFCLASS_NAME)
    897     {
    898         AcpiOsPrintf (" %p ", ObjDesc->Reference.Node);
    899 
    900         Status = AcpiNsHandleToPathname (ObjDesc->Reference.Node, &RetBuf);
    901         if (ACPI_FAILURE (Status))
    902         {
    903             AcpiOsPrintf (" Could not convert name to pathname\n");
    904         }
    905         else
    906         {
    907            AcpiOsPrintf ("%s\n", (char *) RetBuf.Pointer);
    908            ACPI_FREE (RetBuf.Pointer);
    909         }
    910     }
    911     else if (ObjDesc->Reference.Object)
    912     {
    913         if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_OPERAND)
    914         {
    915             AcpiOsPrintf (" Target: %p", ObjDesc->Reference.Object);
    916             if (ObjDesc->Reference.Class == ACPI_REFCLASS_TABLE)
    917             {
    918                 AcpiOsPrintf (" Table Index: %X\n", ObjDesc->Reference.Value);
    919             }
    920             else
    921             {
    922                 AcpiOsPrintf (" Target: %p [%s]\n", ObjDesc->Reference.Object,
    923                     AcpiUtGetTypeName (((ACPI_OPERAND_OBJECT *)
    924                         ObjDesc->Reference.Object)->Common.Type));
    925             }
    926         }
    927         else
    928         {
    929             AcpiOsPrintf (" Target: %p\n", ObjDesc->Reference.Object);
    930         }
    931     }
    932 }
    933 
    934 
    935 /*******************************************************************************
    936  *
    937  * FUNCTION:    AcpiExDumpPackageObj
    938  *
    939  * PARAMETERS:  ObjDesc             - Descriptor to dump
    940  *              Level               - Indentation Level
    941  *              Index               - Package index for this object
    942  *
    943  * DESCRIPTION: Dumps the elements of the package
    944  *
    945  ******************************************************************************/
    946 
    947 static void
    948 AcpiExDumpPackageObj (
    949     ACPI_OPERAND_OBJECT     *ObjDesc,
    950     UINT32                  Level,
    951     UINT32                  Index)
    952 {
    953     UINT32                  i;
    954 
    955 
    956     /* Indentation and index output */
    957 
    958     if (Level > 0)
    959     {
    960         for (i = 0; i < Level; i++)
    961         {
    962             AcpiOsPrintf ("  ");
    963         }
    964 
    965         AcpiOsPrintf ("[%.2d] ", Index);
    966     }
    967 
    968     AcpiOsPrintf ("%p ", ObjDesc);
    969 
    970     /* Null package elements are allowed */
    971 
    972     if (!ObjDesc)
    973     {
    974         AcpiOsPrintf ("[Null Object]\n");
    975         return;
    976     }
    977 
    978     /* Packages may only contain a few object types */
    979 
    980     switch (ObjDesc->Common.Type)
    981     {
    982     case ACPI_TYPE_INTEGER:
    983 
    984         AcpiOsPrintf ("[Integer] = %8.8X%8.8X\n",
    985             ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
    986         break;
    987 
    988     case ACPI_TYPE_STRING:
    989 
    990         AcpiOsPrintf ("[String]  Value: ");
    991         AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX);
    992         AcpiOsPrintf ("\n");
    993         break;
    994 
    995     case ACPI_TYPE_BUFFER:
    996 
    997         AcpiOsPrintf ("[Buffer] Length %.2X = ", ObjDesc->Buffer.Length);
    998         if (ObjDesc->Buffer.Length)
    999         {
   1000             AcpiUtDebugDumpBuffer (ACPI_CAST_PTR (UINT8, ObjDesc->Buffer.Pointer),
   1001                 ObjDesc->Buffer.Length, DB_DWORD_DISPLAY, _COMPONENT);
   1002         }
   1003         else
   1004         {
   1005             AcpiOsPrintf ("\n");
   1006         }
   1007         break;
   1008 
   1009     case ACPI_TYPE_PACKAGE:
   1010 
   1011         AcpiOsPrintf ("[Package] Contains %u Elements:\n",
   1012             ObjDesc->Package.Count);
   1013 
   1014         for (i = 0; i < ObjDesc->Package.Count; i++)
   1015         {
   1016             AcpiExDumpPackageObj (ObjDesc->Package.Elements[i], Level+1, i);
   1017         }
   1018         break;
   1019 
   1020     case ACPI_TYPE_LOCAL_REFERENCE:
   1021 
   1022         AcpiOsPrintf ("[Object Reference] Type [%s] %2.2X",
   1023             AcpiUtGetReferenceName (ObjDesc),
   1024             ObjDesc->Reference.Class);
   1025         AcpiExDumpReferenceObj (ObjDesc);
   1026         break;
   1027 
   1028     default:
   1029 
   1030         AcpiOsPrintf ("[Unknown Type] %X\n", ObjDesc->Common.Type);
   1031         break;
   1032     }
   1033 }
   1034 
   1035 
   1036 /*******************************************************************************
   1037  *
   1038  * FUNCTION:    AcpiExDumpObjectDescriptor
   1039  *
   1040  * PARAMETERS:  ObjDesc             - Descriptor to dump
   1041  *              Flags               - Force display if TRUE
   1042  *
   1043  * DESCRIPTION: Dumps the members of the object descriptor given.
   1044  *
   1045  ******************************************************************************/
   1046 
   1047 void
   1048 AcpiExDumpObjectDescriptor (
   1049     ACPI_OPERAND_OBJECT     *ObjDesc,
   1050     UINT32                  Flags)
   1051 {
   1052     ACPI_FUNCTION_TRACE (ExDumpObjectDescriptor);
   1053 
   1054 
   1055     if (!ObjDesc)
   1056     {
   1057         return_VOID;
   1058     }
   1059 
   1060     if (!Flags)
   1061     {
   1062         /* Check if debug output enabled */
   1063 
   1064         if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_OBJECTS, _COMPONENT))
   1065         {
   1066             return_VOID;
   1067         }
   1068     }
   1069 
   1070     if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED)
   1071     {
   1072         AcpiExDumpNamespaceNode ((ACPI_NAMESPACE_NODE *) ObjDesc, Flags);
   1073 
   1074         AcpiOsPrintf ("\nAttached Object (%p):\n",
   1075             ((ACPI_NAMESPACE_NODE *) ObjDesc)->Object);
   1076 
   1077         AcpiExDumpObjectDescriptor (
   1078             ((ACPI_NAMESPACE_NODE *) ObjDesc)->Object, Flags);
   1079         return_VOID;
   1080     }
   1081 
   1082     if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND)
   1083     {
   1084         AcpiOsPrintf (
   1085             "ExDumpObjectDescriptor: %p is not an ACPI operand object: [%s]\n",
   1086             ObjDesc, AcpiUtGetDescriptorName (ObjDesc));
   1087         return_VOID;
   1088     }
   1089 
   1090     if (ObjDesc->Common.Type > ACPI_TYPE_NS_NODE_MAX)
   1091     {
   1092         return_VOID;
   1093     }
   1094 
   1095     /* Common Fields */
   1096 
   1097     AcpiExDumpObject (ObjDesc, AcpiExDumpCommon);
   1098 
   1099     /* Object-specific fields */
   1100 
   1101     AcpiExDumpObject (ObjDesc, AcpiExDumpInfo[ObjDesc->Common.Type]);
   1102     return_VOID;
   1103 }
   1104 
   1105 #endif
   1106