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