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