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