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 <contrib/dev/acpica/include/acpi.h>
47#include <contrib/dev/acpica/include/accommon.h>
48#include <contrib/dev/acpica/include/acinterp.h>
49#include <contrib/dev/acpica/include/amlcode.h>
50#include <contrib/dev/acpica/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
63static void
64AcpiExOutString (
65    char                    *Title,
66    char                    *Value);
67
68static void
69AcpiExOutPointer (
70    char                    *Title,
71    void                    *Value);
72
73static void
74AcpiExDumpObject (
75    ACPI_OPERAND_OBJECT     *ObjDesc,
76    ACPI_EXDUMP_INFO        *Info);
77
78static void
79AcpiExDumpReferenceObj (
80    ACPI_OPERAND_OBJECT     *ObjDesc);
81
82static void
83AcpiExDumpPackageObj (
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
98static 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
104static 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
112static 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
121static 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
130static 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
138static 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
144static 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
157static 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
166static 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
177static 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
186static 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
197static 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
205static 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
212static 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
219static 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
228static 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
237static 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
249static 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
259static 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
269static 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
277static 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
288static 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
300static 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
347static void
348AcpiExDumpObject (
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
468void
469AcpiExDumpOperand (
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
780void
781AcpiExDumpOperands (
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
831static void
832AcpiExOutString (
833    char                    *Title,
834    char                    *Value)
835{
836    AcpiOsPrintf ("%20s : %s\n", Title, Value);
837}
838
839static void
840AcpiExOutPointer (
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
859void
860AcpiExDumpNamespaceNode (
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
896static void
897AcpiExDumpReferenceObj (
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
957static void
958AcpiExDumpPackageObj (
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
1065void
1066AcpiExDumpObjectDescriptor (
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