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 "acpi.h"
47 #include "accommon.h"
48 #include "acinterp.h"
49 #include "amlcode.h"
50 #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
1106