]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - sys/contrib/dev/acpica/executer/exdump.c
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / sys / contrib / dev / acpica / executer / exdump.c
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 <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[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