]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - executer/exdump.c
Import ACPICA 20120111.
[FreeBSD/FreeBSD.git] / executer / exdump.c
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 "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[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