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