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