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