1 /******************************************************************************
   2  *
   3  * Module Name: exdump - Interpreter debug output routines
   4  *
   5  *****************************************************************************/
   6 
   7 /*
   8  * Copyright (C) 2000 - 2014, 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.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 = 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     char                    *Title,
 822     char                    *Value)
 823 {
 824     AcpiOsPrintf ("%20s : %s\n", Title, Value);
 825 }
 826 
 827 static void
 828 AcpiExOutPointer (
 829     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