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