exdump.c revision 252279
1/******************************************************************************
2 *
3 * Module Name: exdump - Interpreter debug output routines
4 *
5 *****************************************************************************/
6
7/*
8 * Copyright (C) 2000 - 2013, Intel Corp.
9 * All rights reserved.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 *    notice, this list of conditions, and the following disclaimer,
16 *    without modification.
17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18 *    substantially similar to the "NO WARRANTY" disclaimer below
19 *    ("Disclaimer") and any redistribution must be conditioned upon
20 *    including a substantially similar Disclaimer requirement for further
21 *    binary redistribution.
22 * 3. Neither the names of the above-listed copyright holders nor the names
23 *    of any contributors may be used to endorse or promote products derived
24 *    from this software without specific prior written permission.
25 *
26 * Alternatively, this software may be distributed under the terms of the
27 * GNU General Public License ("GPL") version 2 as published by the Free
28 * Software Foundation.
29 *
30 * NO WARRANTY
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 * POSSIBILITY OF SUCH DAMAGES.
42 */
43
44#define __EXDUMP_C__
45
46#include <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.NotifyList[0]),         "System Notify"},
135    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Device.NotifyList[1]),         "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.NotifyList[0]),  "System Notify"},
183    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (PowerResource.NotifyList[1]),  "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.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
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.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
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[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
221static 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
230static 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
239static 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
251static 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
261static 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
275static 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
283static 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
294static 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
306static 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
353static void
354AcpiExDumpObject (
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
476void
477AcpiExDumpOperand (
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
768void
769AcpiExDumpOperands (
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
819static void
820AcpiExOutString (
821    char                    *Title,
822    char                    *Value)
823{
824    AcpiOsPrintf ("%20s : %s\n", Title, Value);
825}
826
827static void
828AcpiExOutPointer (
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
847void
848AcpiExDumpNamespaceNode (
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
886static void
887AcpiExDumpReferenceObj (
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
947static void
948AcpiExDumpPackageObj (
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
1047void
1048AcpiExDumpObjectDescriptor (
1049    ACPI_OPERAND_OBJECT     *ObjDesc,
1050    UINT32                  Flags)
1051{
1052    ACPI_FUNCTION_TRACE (ExDumpObjectDescriptor);
1053
1054
1055    if (!ObjDesc)
1056    {
1057        return_VOID;
1058    }
1059
1060    if (!Flags)
1061    {
1062        /* Check if debug output enabled */
1063
1064        if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_OBJECTS, _COMPONENT))
1065        {
1066            return_VOID;
1067        }
1068    }
1069
1070    if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED)
1071    {
1072        AcpiExDumpNamespaceNode ((ACPI_NAMESPACE_NODE *) ObjDesc, Flags);
1073
1074        AcpiOsPrintf ("\nAttached Object (%p):\n",
1075            ((ACPI_NAMESPACE_NODE *) ObjDesc)->Object);
1076
1077        AcpiExDumpObjectDescriptor (
1078            ((ACPI_NAMESPACE_NODE *) ObjDesc)->Object, Flags);
1079        return_VOID;
1080    }
1081
1082    if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND)
1083    {
1084        AcpiOsPrintf (
1085            "ExDumpObjectDescriptor: %p is not an ACPI operand object: [%s]\n",
1086            ObjDesc, AcpiUtGetDescriptorName (ObjDesc));
1087        return_VOID;
1088    }
1089
1090    if (ObjDesc->Common.Type > ACPI_TYPE_NS_NODE_MAX)
1091    {
1092        return_VOID;
1093    }
1094
1095    /* Common Fields */
1096
1097    AcpiExDumpObject (ObjDesc, AcpiExDumpCommon);
1098
1099    /* Object-specific fields */
1100
1101    AcpiExDumpObject (ObjDesc, AcpiExDumpInfo[ObjDesc->Common.Type]);
1102    return_VOID;
1103}
1104
1105#endif
1106