xref: /titanic_41/usr/src/uts/intel/io/acpica/executer/exdump.c (revision 2a62b4a97f3b5b0ef5f3288ebbfc8509fb793b60)
1 /******************************************************************************
2  *
3  * Module Name: exdump - Interpreter debug output routines
4  *
5  *****************************************************************************/
6 
7 /*
8  * Copyright (C) 2000 - 2011, 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.SystemNotify),          "System Notify"},
135     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Device.DeviceNotify),          "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.SystemNotify),   "System Notify"},
183     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (PowerResource.DeviceNotify),   "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.SystemNotify),       "System Notify"},
193     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Processor.DeviceNotify),       "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.SystemNotify),     "System Notify"},
201     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (ThermalZone.DeviceNotify),     "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[3] =
213 {
214     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpRegionField),    NULL},
215     {ACPI_EXD_FIELD,    0,                                              NULL},
216     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Field.RegionObj),              "Region Object"}
217 };
218 
219 static ACPI_EXDUMP_INFO     AcpiExDumpBankField[5] =
220 {
221     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpBankField),      NULL},
222     {ACPI_EXD_FIELD,    0,                                              NULL},
223     {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (BankField.Value),              "Value"},
224     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (BankField.RegionObj),          "Region Object"},
225     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (BankField.BankObj),            "Bank Object"}
226 };
227 
228 static ACPI_EXDUMP_INFO     AcpiExDumpIndexField[5] =
229 {
230     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpBankField),      NULL},
231     {ACPI_EXD_FIELD,    0,                                              NULL},
232     {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (IndexField.Value),             "Value"},
233     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (IndexField.IndexObj),          "Index Object"},
234     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (IndexField.DataObj),           "Data Object"}
235 };
236 
237 static ACPI_EXDUMP_INFO     AcpiExDumpReference[8] =
238 {
239     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpReference),       NULL},
240     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Reference.Class),              "Class"},
241     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Reference.TargetType),         "Target Type"},
242     {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (Reference.Value),              "Value"},
243     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Reference.Object),             "Object Desc"},
244     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Reference.Node),               "Node"},
245     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Reference.Where),              "Where"},
246     {ACPI_EXD_REFERENCE,0,                                              NULL}
247 };
248 
249 static ACPI_EXDUMP_INFO     AcpiExDumpAddressHandler[6] =
250 {
251     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpAddressHandler), NULL},
252     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (AddressSpace.SpaceId),         "Space Id"},
253     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (AddressSpace.Next),            "Next"},
254     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (AddressSpace.RegionList),      "Region List"},
255     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (AddressSpace.Node),            "Node"},
256     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (AddressSpace.Context),         "Context"}
257 };
258 
259 static ACPI_EXDUMP_INFO     AcpiExDumpNotify[3] =
260 {
261     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpNotify),         NULL},
262     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Notify.Node),                  "Node"},
263     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Notify.Context),               "Context"}
264 };
265 
266 
267 /* Miscellaneous tables */
268 
269 static ACPI_EXDUMP_INFO     AcpiExDumpCommon[4] =
270 {
271     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpCommon),         NULL},
272     {ACPI_EXD_TYPE ,    0,                                              NULL},
273     {ACPI_EXD_UINT16,   ACPI_EXD_OFFSET (Common.ReferenceCount),        "Reference Count"},
274     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Common.Flags),                 "Flags"}
275 };
276 
277 static ACPI_EXDUMP_INFO     AcpiExDumpFieldCommon[7] =
278 {
279     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpFieldCommon),    NULL},
280     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (CommonField.FieldFlags),       "Field Flags"},
281     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (CommonField.AccessByteWidth),  "Access Byte Width"},
282     {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (CommonField.BitLength),        "Bit Length"},
283     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (CommonField.StartFieldBitOffset),"Field Bit Offset"},
284     {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (CommonField.BaseByteOffset),   "Base Byte Offset"},
285     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (CommonField.Node),             "Parent Node"}
286 };
287 
288 static ACPI_EXDUMP_INFO     AcpiExDumpNode[5] =
289 {
290     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpNode),           NULL},
291     {ACPI_EXD_UINT8,    ACPI_EXD_NSOFFSET (Flags),                      "Flags"},
292     {ACPI_EXD_UINT8,    ACPI_EXD_NSOFFSET (OwnerId),                    "Owner Id"},
293     {ACPI_EXD_POINTER,  ACPI_EXD_NSOFFSET (Child),                      "Child List"},
294     {ACPI_EXD_POINTER,  ACPI_EXD_NSOFFSET (Peer),                       "Next Peer"}
295 };
296 
297 
298 /* Dispatch table, indexed by object type */
299 
300 static ACPI_EXDUMP_INFO     *AcpiExDumpInfo[] =
301 {
302     NULL,
303     AcpiExDumpInteger,
304     AcpiExDumpString,
305     AcpiExDumpBuffer,
306     AcpiExDumpPackage,
307     NULL,
308     AcpiExDumpDevice,
309     AcpiExDumpEvent,
310     AcpiExDumpMethod,
311     AcpiExDumpMutex,
312     AcpiExDumpRegion,
313     AcpiExDumpPower,
314     AcpiExDumpProcessor,
315     AcpiExDumpThermal,
316     AcpiExDumpBufferField,
317     NULL,
318     NULL,
319     AcpiExDumpRegionField,
320     AcpiExDumpBankField,
321     AcpiExDumpIndexField,
322     AcpiExDumpReference,
323     NULL,
324     NULL,
325     AcpiExDumpNotify,
326     AcpiExDumpAddressHandler,
327     NULL,
328     NULL,
329     NULL
330 };
331 
332 
333 /*******************************************************************************
334  *
335  * FUNCTION:    AcpiExDumpObject
336  *
337  * PARAMETERS:  ObjDesc             - Descriptor to dump
338  *              Info                - Info table corresponding to this object
339  *                                    type
340  *
341  * RETURN:      None
342  *
343  * DESCRIPTION: Walk the info table for this object
344  *
345  ******************************************************************************/
346 
347 static void
348 AcpiExDumpObject (
349     ACPI_OPERAND_OBJECT     *ObjDesc,
350     ACPI_EXDUMP_INFO        *Info)
351 {
352     UINT8                   *Target;
353     char                    *Name;
354     UINT8                   Count;
355 
356 
357     if (!Info)
358     {
359         AcpiOsPrintf (
360             "ExDumpObject: Display not implemented for object type %s\n",
361             AcpiUtGetObjectTypeName (ObjDesc));
362         return;
363     }
364 
365     /* First table entry must contain the table length (# of table entries) */
366 
367     Count = Info->Offset;
368 
369     while (Count)
370     {
371         Target = ACPI_ADD_PTR (UINT8, ObjDesc, Info->Offset);
372         Name = Info->Name;
373 
374         switch (Info->Opcode)
375         {
376         case ACPI_EXD_INIT:
377             break;
378 
379         case ACPI_EXD_TYPE:
380 
381             AcpiExOutString  ("Type", AcpiUtGetObjectTypeName (ObjDesc));
382             break;
383 
384         case ACPI_EXD_UINT8:
385 
386             AcpiOsPrintf ("%20s : %2.2X\n", Name, *Target);
387             break;
388 
389         case ACPI_EXD_UINT16:
390 
391             AcpiOsPrintf ("%20s : %4.4X\n", Name, ACPI_GET16 (Target));
392             break;
393 
394         case ACPI_EXD_UINT32:
395 
396             AcpiOsPrintf ("%20s : %8.8X\n", Name, ACPI_GET32 (Target));
397             break;
398 
399         case ACPI_EXD_UINT64:
400 
401             AcpiOsPrintf ("%20s : %8.8X%8.8X\n", "Value",
402                 ACPI_FORMAT_UINT64 (ACPI_GET64 (Target)));
403             break;
404 
405         case ACPI_EXD_POINTER:
406         case ACPI_EXD_ADDRESS:
407 
408             AcpiExOutPointer (Name, *ACPI_CAST_PTR (void *, Target));
409             break;
410 
411         case ACPI_EXD_STRING:
412 
413             AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX);
414             AcpiOsPrintf ("\n");
415             break;
416 
417         case ACPI_EXD_BUFFER:
418 
419             ACPI_DUMP_BUFFER (ObjDesc->Buffer.Pointer, ObjDesc->Buffer.Length);
420             break;
421 
422         case ACPI_EXD_PACKAGE:
423 
424             /* Dump the package contents */
425 
426             AcpiOsPrintf ("\nPackage Contents:\n");
427             AcpiExDumpPackageObj (ObjDesc, 0, 0);
428             break;
429 
430         case ACPI_EXD_FIELD:
431 
432             AcpiExDumpObject (ObjDesc, AcpiExDumpFieldCommon);
433             break;
434 
435         case ACPI_EXD_REFERENCE:
436 
437             AcpiExOutString ("Class Name",
438                 ACPI_CAST_PTR (char, AcpiUtGetReferenceName (ObjDesc)));
439             AcpiExDumpReferenceObj (ObjDesc);
440             break;
441 
442         default:
443 
444             AcpiOsPrintf ("**** Invalid table opcode [%X] ****\n",
445                 Info->Opcode);
446             return;
447         }
448 
449         Info++;
450         Count--;
451     }
452 }
453 
454 
455 /*******************************************************************************
456  *
457  * FUNCTION:    AcpiExDumpOperand
458  *
459  * PARAMETERS:  *ObjDesc        - Pointer to entry to be dumped
460  *              Depth           - Current nesting depth
461  *
462  * RETURN:      None
463  *
464  * DESCRIPTION: Dump an operand object
465  *
466  ******************************************************************************/
467 
468 void
469 AcpiExDumpOperand (
470     ACPI_OPERAND_OBJECT     *ObjDesc,
471     UINT32                  Depth)
472 {
473     UINT32                  Length;
474     UINT32                  Index;
475 
476 
477     ACPI_FUNCTION_NAME (ExDumpOperand)
478 
479 
480     if (!((ACPI_LV_EXEC & AcpiDbgLevel) && (_COMPONENT & AcpiDbgLayer)))
481     {
482         return;
483     }
484 
485     if (!ObjDesc)
486     {
487         /* This could be a null element of a package */
488 
489         ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Null Object Descriptor\n"));
490         return;
491     }
492 
493     if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED)
494     {
495         ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p Namespace Node: ", ObjDesc));
496         ACPI_DUMP_ENTRY (ObjDesc, ACPI_LV_EXEC);
497         return;
498     }
499 
500     if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND)
501     {
502         ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
503             "%p is not a node or operand object: [%s]\n",
504             ObjDesc, AcpiUtGetDescriptorName (ObjDesc)));
505         ACPI_DUMP_BUFFER (ObjDesc, sizeof (ACPI_OPERAND_OBJECT));
506         return;
507     }
508 
509     /* ObjDesc is a valid object */
510 
511     if (Depth > 0)
512     {
513         ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%*s[%u] %p ",
514             Depth, " ", Depth, ObjDesc));
515     }
516     else
517     {
518         ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p ", ObjDesc));
519     }
520 
521     /* Decode object type */
522 
523     switch (ObjDesc->Common.Type)
524     {
525     case ACPI_TYPE_LOCAL_REFERENCE:
526 
527         AcpiOsPrintf ("Reference: [%s] ", AcpiUtGetReferenceName (ObjDesc));
528 
529         switch (ObjDesc->Reference.Class)
530         {
531         case ACPI_REFCLASS_DEBUG:
532 
533             AcpiOsPrintf ("\n");
534             break;
535 
536 
537         case ACPI_REFCLASS_INDEX:
538 
539             AcpiOsPrintf ("%p\n", ObjDesc->Reference.Object);
540             break;
541 
542 
543         case ACPI_REFCLASS_TABLE:
544 
545             AcpiOsPrintf ("Table Index %X\n", ObjDesc->Reference.Value);
546             break;
547 
548 
549         case ACPI_REFCLASS_REFOF:
550 
551             AcpiOsPrintf ("%p [%s]\n", ObjDesc->Reference.Object,
552                 AcpiUtGetTypeName (((ACPI_OPERAND_OBJECT *)
553                     ObjDesc->Reference.Object)->Common.Type));
554             break;
555 
556 
557         case ACPI_REFCLASS_NAME:
558 
559             AcpiOsPrintf ("- [%4.4s]\n", ObjDesc->Reference.Node->Name.Ascii);
560             break;
561 
562 
563         case ACPI_REFCLASS_ARG:
564         case ACPI_REFCLASS_LOCAL:
565 
566             AcpiOsPrintf ("%X\n", ObjDesc->Reference.Value);
567             break;
568 
569 
570         default:    /* Unknown reference class */
571 
572             AcpiOsPrintf ("%2.2X\n", ObjDesc->Reference.Class);
573             break;
574         }
575         break;
576 
577 
578     case ACPI_TYPE_BUFFER:
579 
580         AcpiOsPrintf ("Buffer length %.2X @ %p\n",
581             ObjDesc->Buffer.Length, ObjDesc->Buffer.Pointer);
582 
583         /* Debug only -- dump the buffer contents */
584 
585         if (ObjDesc->Buffer.Pointer)
586         {
587             Length = ObjDesc->Buffer.Length;
588             if (Length > 128)
589             {
590                 Length = 128;
591             }
592 
593             AcpiOsPrintf ("Buffer Contents: (displaying length 0x%.2X)\n",
594                 Length);
595             ACPI_DUMP_BUFFER (ObjDesc->Buffer.Pointer, Length);
596         }
597         break;
598 
599 
600     case ACPI_TYPE_INTEGER:
601 
602         AcpiOsPrintf ("Integer %8.8X%8.8X\n",
603             ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
604         break;
605 
606 
607     case ACPI_TYPE_PACKAGE:
608 
609         AcpiOsPrintf ("Package [Len %X] ElementArray %p\n",
610             ObjDesc->Package.Count, ObjDesc->Package.Elements);
611 
612         /*
613          * If elements exist, package element pointer is valid,
614          * and debug_level exceeds 1, dump package's elements.
615          */
616         if (ObjDesc->Package.Count &&
617             ObjDesc->Package.Elements &&
618             AcpiDbgLevel > 1)
619         {
620             for (Index = 0; Index < ObjDesc->Package.Count; Index++)
621             {
622                 AcpiExDumpOperand (ObjDesc->Package.Elements[Index], Depth+1);
623             }
624         }
625         break;
626 
627 
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 
651     case ACPI_TYPE_STRING:
652 
653         AcpiOsPrintf ("String length %X @ %p ",
654             ObjDesc->String.Length,
655             ObjDesc->String.Pointer);
656 
657         AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX);
658         AcpiOsPrintf ("\n");
659         break;
660 
661 
662     case ACPI_TYPE_LOCAL_BANK_FIELD:
663 
664         AcpiOsPrintf ("BankField\n");
665         break;
666 
667 
668     case ACPI_TYPE_LOCAL_REGION_FIELD:
669 
670         AcpiOsPrintf ("RegionField: Bits=%X AccWidth=%X Lock=%X Update=%X at "
671             "byte=%X bit=%X of below:\n",
672             ObjDesc->Field.BitLength,
673             ObjDesc->Field.AccessByteWidth,
674             ObjDesc->Field.FieldFlags & AML_FIELD_LOCK_RULE_MASK,
675             ObjDesc->Field.FieldFlags & AML_FIELD_UPDATE_RULE_MASK,
676             ObjDesc->Field.BaseByteOffset,
677             ObjDesc->Field.StartFieldBitOffset);
678 
679         AcpiExDumpOperand (ObjDesc->Field.RegionObj, Depth+1);
680         break;
681 
682 
683     case ACPI_TYPE_LOCAL_INDEX_FIELD:
684 
685         AcpiOsPrintf ("IndexField\n");
686         break;
687 
688 
689     case ACPI_TYPE_BUFFER_FIELD:
690 
691         AcpiOsPrintf ("BufferField: %X bits at byte %X bit %X of\n",
692             ObjDesc->BufferField.BitLength,
693             ObjDesc->BufferField.BaseByteOffset,
694             ObjDesc->BufferField.StartFieldBitOffset);
695 
696         if (!ObjDesc->BufferField.BufferObj)
697         {
698             ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "*NULL*\n"));
699         }
700         else if ((ObjDesc->BufferField.BufferObj)->Common.Type !=
701                     ACPI_TYPE_BUFFER)
702         {
703             AcpiOsPrintf ("*not a Buffer*\n");
704         }
705         else
706         {
707             AcpiExDumpOperand (ObjDesc->BufferField.BufferObj, Depth+1);
708         }
709         break;
710 
711 
712     case ACPI_TYPE_EVENT:
713 
714         AcpiOsPrintf ("Event\n");
715         break;
716 
717 
718     case ACPI_TYPE_METHOD:
719 
720         AcpiOsPrintf ("Method(%X) @ %p:%X\n",
721             ObjDesc->Method.ParamCount,
722             ObjDesc->Method.AmlStart,
723             ObjDesc->Method.AmlLength);
724         break;
725 
726 
727     case ACPI_TYPE_MUTEX:
728 
729         AcpiOsPrintf ("Mutex\n");
730         break;
731 
732 
733     case ACPI_TYPE_DEVICE:
734 
735         AcpiOsPrintf ("Device\n");
736         break;
737 
738 
739     case ACPI_TYPE_POWER:
740 
741         AcpiOsPrintf ("Power\n");
742         break;
743 
744 
745     case ACPI_TYPE_PROCESSOR:
746 
747         AcpiOsPrintf ("Processor\n");
748         break;
749 
750 
751     case ACPI_TYPE_THERMAL:
752 
753         AcpiOsPrintf ("Thermal\n");
754         break;
755 
756 
757     default:
758         /* Unknown Type */
759 
760         AcpiOsPrintf ("Unknown Type %X\n", ObjDesc->Common.Type);
761         break;
762     }
763 
764     return;
765 }
766 
767 
768 /*******************************************************************************
769  *
770  * FUNCTION:    AcpiExDumpOperands
771  *
772  * PARAMETERS:  Operands            - A list of Operand objects
773  *              OpcodeName          - AML opcode name
774  *              NumOperands         - Operand count for this opcode
775  *
776  * DESCRIPTION: Dump the operands associated with the opcode
777  *
778  ******************************************************************************/
779 
780 void
781 AcpiExDumpOperands (
782     ACPI_OPERAND_OBJECT     **Operands,
783     const char              *OpcodeName,
784     UINT32                  NumOperands)
785 {
786     ACPI_FUNCTION_NAME (ExDumpOperands);
787 
788 
789     if (!OpcodeName)
790     {
791         OpcodeName = "UNKNOWN";
792     }
793 
794     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
795         "**** Start operand dump for opcode [%s], %u operands\n",
796         OpcodeName, NumOperands));
797 
798     if (NumOperands == 0)
799     {
800         NumOperands = 1;
801     }
802 
803     /* Dump the individual operands */
804 
805     while (NumOperands)
806     {
807         AcpiExDumpOperand (*Operands, 0);
808         Operands++;
809         NumOperands--;
810     }
811 
812     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
813         "**** End operand dump for [%s]\n", OpcodeName));
814     return;
815 }
816 
817 
818 /*******************************************************************************
819  *
820  * FUNCTION:    AcpiExOut* functions
821  *
822  * PARAMETERS:  Title               - Descriptive text
823  *              Value               - Value to be displayed
824  *
825  * DESCRIPTION: Object dump output formatting functions.  These functions
826  *              reduce the number of format strings required and keeps them
827  *              all in one place for easy modification.
828  *
829  ******************************************************************************/
830 
831 static void
832 AcpiExOutString (
833     char                    *Title,
834     char                    *Value)
835 {
836     AcpiOsPrintf ("%20s : %s\n", Title, Value);
837 }
838 
839 static void
840 AcpiExOutPointer (
841     char                    *Title,
842     void                    *Value)
843 {
844     AcpiOsPrintf ("%20s : %p\n", Title, Value);
845 }
846 
847 
848 /*******************************************************************************
849  *
850  * FUNCTION:    AcpiExDumpNamespaceNode
851  *
852  * PARAMETERS:  Node                - Descriptor to dump
853  *              Flags               - Force display if TRUE
854  *
855  * DESCRIPTION: Dumps the members of the given.Node
856  *
857  ******************************************************************************/
858 
859 void
860 AcpiExDumpNamespaceNode (
861     ACPI_NAMESPACE_NODE     *Node,
862     UINT32                  Flags)
863 {
864 
865     ACPI_FUNCTION_ENTRY ();
866 
867 
868     if (!Flags)
869     {
870         if (!((ACPI_LV_OBJECTS & AcpiDbgLevel) && (_COMPONENT & AcpiDbgLayer)))
871         {
872             return;
873         }
874     }
875 
876     AcpiOsPrintf ("%20s : %4.4s\n", "Name", AcpiUtGetNodeName (Node));
877     AcpiExOutString  ("Type", AcpiUtGetTypeName (Node->Type));
878     AcpiExOutPointer ("Attached Object", AcpiNsGetAttachedObject (Node));
879     AcpiExOutPointer ("Parent", Node->Parent);
880 
881     AcpiExDumpObject (ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Node),
882         AcpiExDumpNode);
883 }
884 
885 
886 /*******************************************************************************
887  *
888  * FUNCTION:    AcpiExDumpReferenceObj
889  *
890  * PARAMETERS:  Object              - Descriptor to dump
891  *
892  * DESCRIPTION: Dumps a reference object
893  *
894  ******************************************************************************/
895 
896 static void
897 AcpiExDumpReferenceObj (
898     ACPI_OPERAND_OBJECT     *ObjDesc)
899 {
900     ACPI_BUFFER             RetBuf;
901     ACPI_STATUS             Status;
902 
903 
904     RetBuf.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
905 
906     if (ObjDesc->Reference.Class == ACPI_REFCLASS_NAME)
907     {
908         AcpiOsPrintf (" %p ", ObjDesc->Reference.Node);
909 
910         Status = AcpiNsHandleToPathname (ObjDesc->Reference.Node, &RetBuf);
911         if (ACPI_FAILURE (Status))
912         {
913             AcpiOsPrintf (" Could not convert name to pathname\n");
914         }
915         else
916         {
917            AcpiOsPrintf ("%s\n", (char *) RetBuf.Pointer);
918            ACPI_FREE (RetBuf.Pointer);
919         }
920     }
921     else if (ObjDesc->Reference.Object)
922     {
923         if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_OPERAND)
924         {
925             AcpiOsPrintf (" Target: %p", ObjDesc->Reference.Object);
926             if (ObjDesc->Reference.Class == ACPI_REFCLASS_TABLE)
927             {
928                 AcpiOsPrintf (" Table Index: %X\n", ObjDesc->Reference.Value);
929             }
930             else
931             {
932                 AcpiOsPrintf (" Target: %p [%s]\n", ObjDesc->Reference.Object,
933                     AcpiUtGetTypeName (((ACPI_OPERAND_OBJECT *)
934                         ObjDesc->Reference.Object)->Common.Type));
935             }
936         }
937         else
938         {
939             AcpiOsPrintf (" Target: %p\n", ObjDesc->Reference.Object);
940         }
941     }
942 }
943 
944 
945 /*******************************************************************************
946  *
947  * FUNCTION:    AcpiExDumpPackageObj
948  *
949  * PARAMETERS:  ObjDesc             - Descriptor to dump
950  *              Level               - Indentation Level
951  *              Index               - Package index for this object
952  *
953  * DESCRIPTION: Dumps the elements of the package
954  *
955  ******************************************************************************/
956 
957 static void
958 AcpiExDumpPackageObj (
959     ACPI_OPERAND_OBJECT     *ObjDesc,
960     UINT32                  Level,
961     UINT32                  Index)
962 {
963     UINT32                  i;
964 
965 
966     /* Indentation and index output */
967 
968     if (Level > 0)
969     {
970         for (i = 0; i < Level; i++)
971         {
972             AcpiOsPrintf ("  ");
973         }
974 
975         AcpiOsPrintf ("[%.2d] ", Index);
976     }
977 
978     AcpiOsPrintf ("%p ", ObjDesc);
979 
980     /* Null package elements are allowed */
981 
982     if (!ObjDesc)
983     {
984         AcpiOsPrintf ("[Null Object]\n");
985         return;
986     }
987 
988     /* Packages may only contain a few object types */
989 
990     switch (ObjDesc->Common.Type)
991     {
992     case ACPI_TYPE_INTEGER:
993 
994         AcpiOsPrintf ("[Integer] = %8.8X%8.8X\n",
995             ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
996         break;
997 
998 
999     case ACPI_TYPE_STRING:
1000 
1001         AcpiOsPrintf ("[String]  Value: ");
1002         for (i = 0; i < ObjDesc->String.Length; i++)
1003         {
1004             AcpiOsPrintf ("%c", ObjDesc->String.Pointer[i]);
1005         }
1006         AcpiOsPrintf ("\n");
1007         break;
1008 
1009 
1010     case ACPI_TYPE_BUFFER:
1011 
1012         AcpiOsPrintf ("[Buffer] Length %.2X = ", ObjDesc->Buffer.Length);
1013         if (ObjDesc->Buffer.Length)
1014         {
1015             AcpiUtDumpBuffer (ACPI_CAST_PTR (UINT8, ObjDesc->Buffer.Pointer),
1016                 ObjDesc->Buffer.Length, DB_DWORD_DISPLAY, _COMPONENT);
1017         }
1018         else
1019         {
1020             AcpiOsPrintf ("\n");
1021         }
1022         break;
1023 
1024 
1025     case ACPI_TYPE_PACKAGE:
1026 
1027         AcpiOsPrintf ("[Package] Contains %u Elements:\n",
1028             ObjDesc->Package.Count);
1029 
1030         for (i = 0; i < ObjDesc->Package.Count; i++)
1031         {
1032             AcpiExDumpPackageObj (ObjDesc->Package.Elements[i], Level+1, i);
1033         }
1034         break;
1035 
1036 
1037     case ACPI_TYPE_LOCAL_REFERENCE:
1038 
1039         AcpiOsPrintf ("[Object Reference] Type [%s] %2.2X",
1040             AcpiUtGetReferenceName (ObjDesc),
1041             ObjDesc->Reference.Class);
1042         AcpiExDumpReferenceObj (ObjDesc);
1043         break;
1044 
1045 
1046     default:
1047 
1048         AcpiOsPrintf ("[Unknown Type] %X\n", ObjDesc->Common.Type);
1049         break;
1050     }
1051 }
1052 
1053 
1054 /*******************************************************************************
1055  *
1056  * FUNCTION:    AcpiExDumpObjectDescriptor
1057  *
1058  * PARAMETERS:  ObjDesc             - Descriptor to dump
1059  *              Flags               - Force display if TRUE
1060  *
1061  * DESCRIPTION: Dumps the members of the object descriptor given.
1062  *
1063  ******************************************************************************/
1064 
1065 void
1066 AcpiExDumpObjectDescriptor (
1067     ACPI_OPERAND_OBJECT     *ObjDesc,
1068     UINT32                  Flags)
1069 {
1070     ACPI_FUNCTION_TRACE (ExDumpObjectDescriptor);
1071 
1072 
1073     if (!ObjDesc)
1074     {
1075         return_VOID;
1076     }
1077 
1078     if (!Flags)
1079     {
1080         if (!((ACPI_LV_OBJECTS & AcpiDbgLevel) && (_COMPONENT & AcpiDbgLayer)))
1081         {
1082             return_VOID;
1083         }
1084     }
1085 
1086     if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED)
1087     {
1088         AcpiExDumpNamespaceNode ((ACPI_NAMESPACE_NODE *) ObjDesc, Flags);
1089 
1090         AcpiOsPrintf ("\nAttached Object (%p):\n",
1091             ((ACPI_NAMESPACE_NODE *) ObjDesc)->Object);
1092 
1093         AcpiExDumpObjectDescriptor (
1094             ((ACPI_NAMESPACE_NODE *) ObjDesc)->Object, Flags);
1095         return_VOID;
1096     }
1097 
1098     if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND)
1099     {
1100         AcpiOsPrintf (
1101             "ExDumpObjectDescriptor: %p is not an ACPI operand object: [%s]\n",
1102             ObjDesc, AcpiUtGetDescriptorName (ObjDesc));
1103         return_VOID;
1104     }
1105 
1106     if (ObjDesc->Common.Type > ACPI_TYPE_NS_NODE_MAX)
1107     {
1108         return_VOID;
1109     }
1110 
1111     /* Common Fields */
1112 
1113     AcpiExDumpObject (ObjDesc, AcpiExDumpCommon);
1114 
1115     /* Object-specific fields */
1116 
1117     AcpiExDumpObject (ObjDesc, AcpiExDumpInfo[ObjDesc->Common.Type]);
1118     return_VOID;
1119 }
1120 
1121 #endif
1122 
1123