exdump.c revision 245582
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    UINT8                   Count;
361
362
363    if (!Info)
364    {
365        AcpiOsPrintf (
366            "ExDumpObject: Display not implemented for object type %s\n",
367            AcpiUtGetObjectTypeName (ObjDesc));
368        return;
369    }
370
371    /* First table entry must contain the table length (# of table entries) */
372
373    Count = Info->Offset;
374
375    while (Count)
376    {
377        Target = ACPI_ADD_PTR (UINT8, ObjDesc, Info->Offset);
378        Name = Info->Name;
379
380        switch (Info->Opcode)
381        {
382        case ACPI_EXD_INIT:
383            break;
384
385        case ACPI_EXD_TYPE:
386
387            AcpiExOutString  ("Type", AcpiUtGetObjectTypeName (ObjDesc));
388            break;
389
390        case ACPI_EXD_UINT8:
391
392            AcpiOsPrintf ("%20s : %2.2X\n", Name, *Target);
393            break;
394
395        case ACPI_EXD_UINT16:
396
397            AcpiOsPrintf ("%20s : %4.4X\n", Name, ACPI_GET16 (Target));
398            break;
399
400        case ACPI_EXD_UINT32:
401
402            AcpiOsPrintf ("%20s : %8.8X\n", Name, ACPI_GET32 (Target));
403            break;
404
405        case ACPI_EXD_UINT64:
406
407            AcpiOsPrintf ("%20s : %8.8X%8.8X\n", "Value",
408                ACPI_FORMAT_UINT64 (ACPI_GET64 (Target)));
409            break;
410
411        case ACPI_EXD_POINTER:
412        case ACPI_EXD_ADDRESS:
413
414            AcpiExOutPointer (Name, *ACPI_CAST_PTR (void *, Target));
415            break;
416
417        case ACPI_EXD_STRING:
418
419            AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX);
420            AcpiOsPrintf ("\n");
421            break;
422
423        case ACPI_EXD_BUFFER:
424
425            ACPI_DUMP_BUFFER (ObjDesc->Buffer.Pointer, ObjDesc->Buffer.Length);
426            break;
427
428        case ACPI_EXD_PACKAGE:
429
430            /* Dump the package contents */
431
432            AcpiOsPrintf ("\nPackage Contents:\n");
433            AcpiExDumpPackageObj (ObjDesc, 0, 0);
434            break;
435
436        case ACPI_EXD_FIELD:
437
438            AcpiExDumpObject (ObjDesc, AcpiExDumpFieldCommon);
439            break;
440
441        case ACPI_EXD_REFERENCE:
442
443            AcpiExOutString ("Class Name",
444                ACPI_CAST_PTR (char, AcpiUtGetReferenceName (ObjDesc)));
445            AcpiExDumpReferenceObj (ObjDesc);
446            break;
447
448        default:
449
450            AcpiOsPrintf ("**** Invalid table opcode [%X] ****\n",
451                Info->Opcode);
452            return;
453        }
454
455        Info++;
456        Count--;
457    }
458}
459
460
461/*******************************************************************************
462 *
463 * FUNCTION:    AcpiExDumpOperand
464 *
465 * PARAMETERS:  *ObjDesc        - Pointer to entry to be dumped
466 *              Depth           - Current nesting depth
467 *
468 * RETURN:      None
469 *
470 * DESCRIPTION: Dump an operand object
471 *
472 ******************************************************************************/
473
474void
475AcpiExDumpOperand (
476    ACPI_OPERAND_OBJECT     *ObjDesc,
477    UINT32                  Depth)
478{
479    UINT32                  Length;
480    UINT32                  Index;
481
482
483    ACPI_FUNCTION_NAME (ExDumpOperand)
484
485
486    /* Check if debug output enabled */
487
488    if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_EXEC, _COMPONENT))
489    {
490        return;
491    }
492
493    if (!ObjDesc)
494    {
495        /* This could be a null element of a package */
496
497        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Null Object Descriptor\n"));
498        return;
499    }
500
501    if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED)
502    {
503        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p Namespace Node: ", ObjDesc));
504        ACPI_DUMP_ENTRY (ObjDesc, ACPI_LV_EXEC);
505        return;
506    }
507
508    if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND)
509    {
510        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
511            "%p is not a node or operand object: [%s]\n",
512            ObjDesc, AcpiUtGetDescriptorName (ObjDesc)));
513        ACPI_DUMP_BUFFER (ObjDesc, sizeof (ACPI_OPERAND_OBJECT));
514        return;
515    }
516
517    /* ObjDesc is a valid object */
518
519    if (Depth > 0)
520    {
521        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%*s[%u] %p ",
522            Depth, " ", Depth, ObjDesc));
523    }
524    else
525    {
526        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p ", ObjDesc));
527    }
528
529    /* Decode object type */
530
531    switch (ObjDesc->Common.Type)
532    {
533    case ACPI_TYPE_LOCAL_REFERENCE:
534
535        AcpiOsPrintf ("Reference: [%s] ", AcpiUtGetReferenceName (ObjDesc));
536
537        switch (ObjDesc->Reference.Class)
538        {
539        case ACPI_REFCLASS_DEBUG:
540
541            AcpiOsPrintf ("\n");
542            break;
543
544
545        case ACPI_REFCLASS_INDEX:
546
547            AcpiOsPrintf ("%p\n", ObjDesc->Reference.Object);
548            break;
549
550
551        case ACPI_REFCLASS_TABLE:
552
553            AcpiOsPrintf ("Table Index %X\n", ObjDesc->Reference.Value);
554            break;
555
556
557        case ACPI_REFCLASS_REFOF:
558
559            AcpiOsPrintf ("%p [%s]\n", ObjDesc->Reference.Object,
560                AcpiUtGetTypeName (((ACPI_OPERAND_OBJECT *)
561                    ObjDesc->Reference.Object)->Common.Type));
562            break;
563
564
565        case ACPI_REFCLASS_NAME:
566
567            AcpiOsPrintf ("- [%4.4s]\n", ObjDesc->Reference.Node->Name.Ascii);
568            break;
569
570
571        case ACPI_REFCLASS_ARG:
572        case ACPI_REFCLASS_LOCAL:
573
574            AcpiOsPrintf ("%X\n", ObjDesc->Reference.Value);
575            break;
576
577
578        default:    /* Unknown reference class */
579
580            AcpiOsPrintf ("%2.2X\n", ObjDesc->Reference.Class);
581            break;
582        }
583        break;
584
585
586    case ACPI_TYPE_BUFFER:
587
588        AcpiOsPrintf ("Buffer length %.2X @ %p\n",
589            ObjDesc->Buffer.Length, ObjDesc->Buffer.Pointer);
590
591        /* Debug only -- dump the buffer contents */
592
593        if (ObjDesc->Buffer.Pointer)
594        {
595            Length = ObjDesc->Buffer.Length;
596            if (Length > 128)
597            {
598                Length = 128;
599            }
600
601            AcpiOsPrintf ("Buffer Contents: (displaying length 0x%.2X)\n",
602                Length);
603            ACPI_DUMP_BUFFER (ObjDesc->Buffer.Pointer, Length);
604        }
605        break;
606
607
608    case ACPI_TYPE_INTEGER:
609
610        AcpiOsPrintf ("Integer %8.8X%8.8X\n",
611            ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
612        break;
613
614
615    case ACPI_TYPE_PACKAGE:
616
617        AcpiOsPrintf ("Package [Len %X] ElementArray %p\n",
618            ObjDesc->Package.Count, ObjDesc->Package.Elements);
619
620        /*
621         * If elements exist, package element pointer is valid,
622         * and debug_level exceeds 1, dump package's elements.
623         */
624        if (ObjDesc->Package.Count &&
625            ObjDesc->Package.Elements &&
626            AcpiDbgLevel > 1)
627        {
628            for (Index = 0; Index < ObjDesc->Package.Count; Index++)
629            {
630                AcpiExDumpOperand (ObjDesc->Package.Elements[Index], Depth+1);
631            }
632        }
633        break;
634
635
636    case ACPI_TYPE_REGION:
637
638        AcpiOsPrintf ("Region %s (%X)",
639            AcpiUtGetRegionName (ObjDesc->Region.SpaceId),
640            ObjDesc->Region.SpaceId);
641
642        /*
643         * If the address and length have not been evaluated,
644         * don't print them.
645         */
646        if (!(ObjDesc->Region.Flags & AOPOBJ_DATA_VALID))
647        {
648            AcpiOsPrintf ("\n");
649        }
650        else
651        {
652            AcpiOsPrintf (" base %8.8X%8.8X Length %X\n",
653                ACPI_FORMAT_NATIVE_UINT (ObjDesc->Region.Address),
654                ObjDesc->Region.Length);
655        }
656        break;
657
658
659    case ACPI_TYPE_STRING:
660
661        AcpiOsPrintf ("String length %X @ %p ",
662            ObjDesc->String.Length,
663            ObjDesc->String.Pointer);
664
665        AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX);
666        AcpiOsPrintf ("\n");
667        break;
668
669
670    case ACPI_TYPE_LOCAL_BANK_FIELD:
671
672        AcpiOsPrintf ("BankField\n");
673        break;
674
675
676    case ACPI_TYPE_LOCAL_REGION_FIELD:
677
678        AcpiOsPrintf ("RegionField: Bits=%X AccWidth=%X Lock=%X Update=%X at "
679            "byte=%X bit=%X of below:\n",
680            ObjDesc->Field.BitLength,
681            ObjDesc->Field.AccessByteWidth,
682            ObjDesc->Field.FieldFlags & AML_FIELD_LOCK_RULE_MASK,
683            ObjDesc->Field.FieldFlags & AML_FIELD_UPDATE_RULE_MASK,
684            ObjDesc->Field.BaseByteOffset,
685            ObjDesc->Field.StartFieldBitOffset);
686
687        AcpiExDumpOperand (ObjDesc->Field.RegionObj, Depth+1);
688        break;
689
690
691    case ACPI_TYPE_LOCAL_INDEX_FIELD:
692
693        AcpiOsPrintf ("IndexField\n");
694        break;
695
696
697    case ACPI_TYPE_BUFFER_FIELD:
698
699        AcpiOsPrintf ("BufferField: %X bits at byte %X bit %X of\n",
700            ObjDesc->BufferField.BitLength,
701            ObjDesc->BufferField.BaseByteOffset,
702            ObjDesc->BufferField.StartFieldBitOffset);
703
704        if (!ObjDesc->BufferField.BufferObj)
705        {
706            ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "*NULL*\n"));
707        }
708        else if ((ObjDesc->BufferField.BufferObj)->Common.Type !=
709                    ACPI_TYPE_BUFFER)
710        {
711            AcpiOsPrintf ("*not a Buffer*\n");
712        }
713        else
714        {
715            AcpiExDumpOperand (ObjDesc->BufferField.BufferObj, Depth+1);
716        }
717        break;
718
719
720    case ACPI_TYPE_EVENT:
721
722        AcpiOsPrintf ("Event\n");
723        break;
724
725
726    case ACPI_TYPE_METHOD:
727
728        AcpiOsPrintf ("Method(%X) @ %p:%X\n",
729            ObjDesc->Method.ParamCount,
730            ObjDesc->Method.AmlStart,
731            ObjDesc->Method.AmlLength);
732        break;
733
734
735    case ACPI_TYPE_MUTEX:
736
737        AcpiOsPrintf ("Mutex\n");
738        break;
739
740
741    case ACPI_TYPE_DEVICE:
742
743        AcpiOsPrintf ("Device\n");
744        break;
745
746
747    case ACPI_TYPE_POWER:
748
749        AcpiOsPrintf ("Power\n");
750        break;
751
752
753    case ACPI_TYPE_PROCESSOR:
754
755        AcpiOsPrintf ("Processor\n");
756        break;
757
758
759    case ACPI_TYPE_THERMAL:
760
761        AcpiOsPrintf ("Thermal\n");
762        break;
763
764
765    default:
766        /* Unknown Type */
767
768        AcpiOsPrintf ("Unknown Type %X\n", ObjDesc->Common.Type);
769        break;
770    }
771
772    return;
773}
774
775
776/*******************************************************************************
777 *
778 * FUNCTION:    AcpiExDumpOperands
779 *
780 * PARAMETERS:  Operands            - A list of Operand objects
781 *              OpcodeName          - AML opcode name
782 *              NumOperands         - Operand count for this opcode
783 *
784 * DESCRIPTION: Dump the operands associated with the opcode
785 *
786 ******************************************************************************/
787
788void
789AcpiExDumpOperands (
790    ACPI_OPERAND_OBJECT     **Operands,
791    const char              *OpcodeName,
792    UINT32                  NumOperands)
793{
794    ACPI_FUNCTION_NAME (ExDumpOperands);
795
796
797    if (!OpcodeName)
798    {
799        OpcodeName = "UNKNOWN";
800    }
801
802    ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
803        "**** Start operand dump for opcode [%s], %u operands\n",
804        OpcodeName, NumOperands));
805
806    if (NumOperands == 0)
807    {
808        NumOperands = 1;
809    }
810
811    /* Dump the individual operands */
812
813    while (NumOperands)
814    {
815        AcpiExDumpOperand (*Operands, 0);
816        Operands++;
817        NumOperands--;
818    }
819
820    ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
821        "**** End operand dump for [%s]\n", OpcodeName));
822    return;
823}
824
825
826/*******************************************************************************
827 *
828 * FUNCTION:    AcpiExOut* functions
829 *
830 * PARAMETERS:  Title               - Descriptive text
831 *              Value               - Value to be displayed
832 *
833 * DESCRIPTION: Object dump output formatting functions. These functions
834 *              reduce the number of format strings required and keeps them
835 *              all in one place for easy modification.
836 *
837 ******************************************************************************/
838
839static void
840AcpiExOutString (
841    char                    *Title,
842    char                    *Value)
843{
844    AcpiOsPrintf ("%20s : %s\n", Title, Value);
845}
846
847static void
848AcpiExOutPointer (
849    char                    *Title,
850    void                    *Value)
851{
852    AcpiOsPrintf ("%20s : %p\n", Title, Value);
853}
854
855
856/*******************************************************************************
857 *
858 * FUNCTION:    AcpiExDumpNamespaceNode
859 *
860 * PARAMETERS:  Node                - Descriptor to dump
861 *              Flags               - Force display if TRUE
862 *
863 * DESCRIPTION: Dumps the members of the given.Node
864 *
865 ******************************************************************************/
866
867void
868AcpiExDumpNamespaceNode (
869    ACPI_NAMESPACE_NODE     *Node,
870    UINT32                  Flags)
871{
872
873    ACPI_FUNCTION_ENTRY ();
874
875
876    if (!Flags)
877    {
878        /* Check if debug output enabled */
879
880        if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_OBJECTS, _COMPONENT))
881        {
882            return;
883        }
884    }
885
886    AcpiOsPrintf ("%20s : %4.4s\n", "Name", AcpiUtGetNodeName (Node));
887    AcpiExOutString  ("Type", AcpiUtGetTypeName (Node->Type));
888    AcpiExOutPointer ("Attached Object", AcpiNsGetAttachedObject (Node));
889    AcpiExOutPointer ("Parent", Node->Parent);
890
891    AcpiExDumpObject (ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Node),
892        AcpiExDumpNode);
893}
894
895
896/*******************************************************************************
897 *
898 * FUNCTION:    AcpiExDumpReferenceObj
899 *
900 * PARAMETERS:  Object              - Descriptor to dump
901 *
902 * DESCRIPTION: Dumps a reference object
903 *
904 ******************************************************************************/
905
906static void
907AcpiExDumpReferenceObj (
908    ACPI_OPERAND_OBJECT     *ObjDesc)
909{
910    ACPI_BUFFER             RetBuf;
911    ACPI_STATUS             Status;
912
913
914    RetBuf.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
915
916    if (ObjDesc->Reference.Class == ACPI_REFCLASS_NAME)
917    {
918        AcpiOsPrintf (" %p ", ObjDesc->Reference.Node);
919
920        Status = AcpiNsHandleToPathname (ObjDesc->Reference.Node, &RetBuf);
921        if (ACPI_FAILURE (Status))
922        {
923            AcpiOsPrintf (" Could not convert name to pathname\n");
924        }
925        else
926        {
927           AcpiOsPrintf ("%s\n", (char *) RetBuf.Pointer);
928           ACPI_FREE (RetBuf.Pointer);
929        }
930    }
931    else if (ObjDesc->Reference.Object)
932    {
933        if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_OPERAND)
934        {
935            AcpiOsPrintf (" Target: %p", ObjDesc->Reference.Object);
936            if (ObjDesc->Reference.Class == ACPI_REFCLASS_TABLE)
937            {
938                AcpiOsPrintf (" Table Index: %X\n", ObjDesc->Reference.Value);
939            }
940            else
941            {
942                AcpiOsPrintf (" Target: %p [%s]\n", ObjDesc->Reference.Object,
943                    AcpiUtGetTypeName (((ACPI_OPERAND_OBJECT *)
944                        ObjDesc->Reference.Object)->Common.Type));
945            }
946        }
947        else
948        {
949            AcpiOsPrintf (" Target: %p\n", ObjDesc->Reference.Object);
950        }
951    }
952}
953
954
955/*******************************************************************************
956 *
957 * FUNCTION:    AcpiExDumpPackageObj
958 *
959 * PARAMETERS:  ObjDesc             - Descriptor to dump
960 *              Level               - Indentation Level
961 *              Index               - Package index for this object
962 *
963 * DESCRIPTION: Dumps the elements of the package
964 *
965 ******************************************************************************/
966
967static void
968AcpiExDumpPackageObj (
969    ACPI_OPERAND_OBJECT     *ObjDesc,
970    UINT32                  Level,
971    UINT32                  Index)
972{
973    UINT32                  i;
974
975
976    /* Indentation and index output */
977
978    if (Level > 0)
979    {
980        for (i = 0; i < Level; i++)
981        {
982            AcpiOsPrintf ("  ");
983        }
984
985        AcpiOsPrintf ("[%.2d] ", Index);
986    }
987
988    AcpiOsPrintf ("%p ", ObjDesc);
989
990    /* Null package elements are allowed */
991
992    if (!ObjDesc)
993    {
994        AcpiOsPrintf ("[Null Object]\n");
995        return;
996    }
997
998    /* Packages may only contain a few object types */
999
1000    switch (ObjDesc->Common.Type)
1001    {
1002    case ACPI_TYPE_INTEGER:
1003
1004        AcpiOsPrintf ("[Integer] = %8.8X%8.8X\n",
1005            ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
1006        break;
1007
1008
1009    case ACPI_TYPE_STRING:
1010
1011        AcpiOsPrintf ("[String]  Value: ");
1012        AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX);
1013        AcpiOsPrintf ("\n");
1014        break;
1015
1016
1017    case ACPI_TYPE_BUFFER:
1018
1019        AcpiOsPrintf ("[Buffer] Length %.2X = ", ObjDesc->Buffer.Length);
1020        if (ObjDesc->Buffer.Length)
1021        {
1022            AcpiUtDebugDumpBuffer (ACPI_CAST_PTR (UINT8, ObjDesc->Buffer.Pointer),
1023                ObjDesc->Buffer.Length, DB_DWORD_DISPLAY, _COMPONENT);
1024        }
1025        else
1026        {
1027            AcpiOsPrintf ("\n");
1028        }
1029        break;
1030
1031
1032    case ACPI_TYPE_PACKAGE:
1033
1034        AcpiOsPrintf ("[Package] Contains %u Elements:\n",
1035            ObjDesc->Package.Count);
1036
1037        for (i = 0; i < ObjDesc->Package.Count; i++)
1038        {
1039            AcpiExDumpPackageObj (ObjDesc->Package.Elements[i], Level+1, i);
1040        }
1041        break;
1042
1043
1044    case ACPI_TYPE_LOCAL_REFERENCE:
1045
1046        AcpiOsPrintf ("[Object Reference] Type [%s] %2.2X",
1047            AcpiUtGetReferenceName (ObjDesc),
1048            ObjDesc->Reference.Class);
1049        AcpiExDumpReferenceObj (ObjDesc);
1050        break;
1051
1052
1053    default:
1054
1055        AcpiOsPrintf ("[Unknown Type] %X\n", ObjDesc->Common.Type);
1056        break;
1057    }
1058}
1059
1060
1061/*******************************************************************************
1062 *
1063 * FUNCTION:    AcpiExDumpObjectDescriptor
1064 *
1065 * PARAMETERS:  ObjDesc             - Descriptor to dump
1066 *              Flags               - Force display if TRUE
1067 *
1068 * DESCRIPTION: Dumps the members of the object descriptor given.
1069 *
1070 ******************************************************************************/
1071
1072void
1073AcpiExDumpObjectDescriptor (
1074    ACPI_OPERAND_OBJECT     *ObjDesc,
1075    UINT32                  Flags)
1076{
1077    ACPI_FUNCTION_TRACE (ExDumpObjectDescriptor);
1078
1079
1080    if (!ObjDesc)
1081    {
1082        return_VOID;
1083    }
1084
1085    if (!Flags)
1086    {
1087        /* Check if debug output enabled */
1088
1089        if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_OBJECTS, _COMPONENT))
1090        {
1091            return_VOID;
1092        }
1093    }
1094
1095    if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED)
1096    {
1097        AcpiExDumpNamespaceNode ((ACPI_NAMESPACE_NODE *) ObjDesc, Flags);
1098
1099        AcpiOsPrintf ("\nAttached Object (%p):\n",
1100            ((ACPI_NAMESPACE_NODE *) ObjDesc)->Object);
1101
1102        AcpiExDumpObjectDescriptor (
1103            ((ACPI_NAMESPACE_NODE *) ObjDesc)->Object, Flags);
1104        return_VOID;
1105    }
1106
1107    if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND)
1108    {
1109        AcpiOsPrintf (
1110            "ExDumpObjectDescriptor: %p is not an ACPI operand object: [%s]\n",
1111            ObjDesc, AcpiUtGetDescriptorName (ObjDesc));
1112        return_VOID;
1113    }
1114
1115    if (ObjDesc->Common.Type > ACPI_TYPE_NS_NODE_MAX)
1116    {
1117        return_VOID;
1118    }
1119
1120    /* Common Fields */
1121
1122    AcpiExDumpObject (ObjDesc, AcpiExDumpCommon);
1123
1124    /* Object-specific fields */
1125
1126    AcpiExDumpObject (ObjDesc, AcpiExDumpInfo[ObjDesc->Common.Type]);
1127    return_VOID;
1128}
1129
1130#endif
1131