xref: /dflybsd-src/sys/contrib/dev/acpica/source/components/executer/exdump.c (revision 05e9456a9a0270a5696b2f6a4e977598a709a7a3)
1 /******************************************************************************
2  *
3  * Module Name: exdump - Interpreter debug output routines
4  *
5  *****************************************************************************/
6 
7 /******************************************************************************
8  *
9  * 1. Copyright Notice
10  *
11  * Some or all of this work - Copyright (c) 1999 - 2017, Intel Corp.
12  * All rights reserved.
13  *
14  * 2. License
15  *
16  * 2.1. This is your license from Intel Corp. under its intellectual property
17  * rights. You may have additional license terms from the party that provided
18  * you this software, covering your right to use that party's intellectual
19  * property rights.
20  *
21  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22  * copy of the source code appearing in this file ("Covered Code") an
23  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24  * base code distributed originally by Intel ("Original Intel Code") to copy,
25  * make derivatives, distribute, use and display any portion of the Covered
26  * Code in any form, with the right to sublicense such rights; and
27  *
28  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29  * license (with the right to sublicense), under only those claims of Intel
30  * patents that are infringed by the Original Intel Code, to make, use, sell,
31  * offer to sell, and import the Covered Code and derivative works thereof
32  * solely to the minimum extent necessary to exercise the above copyright
33  * license, and in no event shall the patent license extend to any additions
34  * to or modifications of the Original Intel Code. No other license or right
35  * is granted directly or by implication, estoppel or otherwise;
36  *
37  * The above copyright and patent license is granted only if the following
38  * conditions are met:
39  *
40  * 3. Conditions
41  *
42  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43  * Redistribution of source code of any substantial portion of the Covered
44  * Code or modification with rights to further distribute source must include
45  * the above Copyright Notice, the above License, this list of Conditions,
46  * and the following Disclaimer and Export Compliance provision. In addition,
47  * Licensee must cause all Covered Code to which Licensee contributes to
48  * contain a file documenting the changes Licensee made to create that Covered
49  * Code and the date of any change. Licensee must include in that file the
50  * documentation of any changes made by any predecessor Licensee. Licensee
51  * must include a prominent statement that the modification is derived,
52  * directly or indirectly, from Original Intel Code.
53  *
54  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55  * Redistribution of source code of any substantial portion of the Covered
56  * Code or modification without rights to further distribute source must
57  * include the following Disclaimer and Export Compliance provision in the
58  * documentation and/or other materials provided with distribution. In
59  * addition, Licensee may not authorize further sublicense of source of any
60  * portion of the Covered Code, and must include terms to the effect that the
61  * license from Licensee to its licensee is limited to the intellectual
62  * property embodied in the software Licensee provides to its licensee, and
63  * not to intellectual property embodied in modifications its licensee may
64  * make.
65  *
66  * 3.3. Redistribution of Executable. Redistribution in executable form of any
67  * substantial portion of the Covered Code or modification must reproduce the
68  * above Copyright Notice, and the following Disclaimer and Export Compliance
69  * provision in the documentation and/or other materials provided with the
70  * distribution.
71  *
72  * 3.4. Intel retains all right, title, and interest in and to the Original
73  * Intel Code.
74  *
75  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76  * Intel shall be used in advertising or otherwise to promote the sale, use or
77  * other dealings in products derived from or relating to the Covered Code
78  * without prior written authorization from Intel.
79  *
80  * 4. Disclaimer and Export Compliance
81  *
82  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88  * PARTICULAR PURPOSE.
89  *
90  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97  * LIMITED REMEDY.
98  *
99  * 4.3. Licensee shall not export, either directly or indirectly, any of this
100  * software or system incorporating such software without first obtaining any
101  * required license or other approval from the U. S. Department of Commerce or
102  * any other agency or department of the United States Government. In the
103  * event Licensee exports any such software from the United States or
104  * re-exports any such software from a foreign destination, Licensee shall
105  * ensure that the distribution and export/re-export of the software is in
106  * compliance with all laws, regulations, orders, or other restrictions of the
107  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108  * any of its subsidiaries will export/re-export any technical data, process,
109  * software, or service, directly or indirectly, to any country for which the
110  * United States government or any agency thereof requires an export license,
111  * other governmental approval, or letter of assurance, without first obtaining
112  * such license, approval or letter.
113  *
114  *****************************************************************************
115  *
116  * Alternatively, you may choose to be licensed under the terms of the
117  * following license:
118  *
119  * Redistribution and use in source and binary forms, with or without
120  * modification, are permitted provided that the following conditions
121  * are met:
122  * 1. Redistributions of source code must retain the above copyright
123  *    notice, this list of conditions, and the following disclaimer,
124  *    without modification.
125  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
126  *    substantially similar to the "NO WARRANTY" disclaimer below
127  *    ("Disclaimer") and any redistribution must be conditioned upon
128  *    including a substantially similar Disclaimer requirement for further
129  *    binary redistribution.
130  * 3. Neither the names of the above-listed copyright holders nor the names
131  *    of any contributors may be used to endorse or promote products derived
132  *    from this software without specific prior written permission.
133  *
134  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
135  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
136  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
137  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
138  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
139  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
140  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
141  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
142  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
143  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
144  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
145  *
146  * Alternatively, you may choose to be licensed under the terms of the
147  * GNU General Public License ("GPL") version 2 as published by the Free
148  * Software Foundation.
149  *
150  *****************************************************************************/
151 
152 #include "acpi.h"
153 #include "accommon.h"
154 #include "acinterp.h"
155 #include "amlcode.h"
156 #include "acnamesp.h"
157 
158 
159 #define _COMPONENT          ACPI_EXECUTER
160         ACPI_MODULE_NAME    ("exdump")
161 
162 /*
163  * The following routines are used for debug output only
164  */
165 #if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
166 
167 /* Local prototypes */
168 
169 static void
170 AcpiExOutString (
171     const char              *Title,
172     const char              *Value);
173 
174 static void
175 AcpiExOutPointer (
176     const char              *Title,
177     const void              *Value);
178 
179 static void
180 AcpiExDumpObject (
181     ACPI_OPERAND_OBJECT     *ObjDesc,
182     ACPI_EXDUMP_INFO        *Info);
183 
184 static void
185 AcpiExDumpReferenceObj (
186     ACPI_OPERAND_OBJECT     *ObjDesc);
187 
188 static void
189 AcpiExDumpPackageObj (
190     ACPI_OPERAND_OBJECT     *ObjDesc,
191     UINT32                  Level,
192     UINT32                  Index);
193 
194 
195 /*******************************************************************************
196  *
197  * Object Descriptor info tables
198  *
199  * Note: The first table entry must be an INIT opcode and must contain
200  * the table length (number of table entries)
201  *
202  ******************************************************************************/
203 
204 static ACPI_EXDUMP_INFO     AcpiExDumpInteger[2] =
205 {
206     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpInteger),        NULL},
207     {ACPI_EXD_UINT64,   ACPI_EXD_OFFSET (Integer.Value),                "Value"}
208 };
209 
210 static ACPI_EXDUMP_INFO     AcpiExDumpString[4] =
211 {
212     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpString),         NULL},
213     {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (String.Length),                "Length"},
214     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (String.Pointer),               "Pointer"},
215     {ACPI_EXD_STRING,   0,                                              NULL}
216 };
217 
218 static ACPI_EXDUMP_INFO     AcpiExDumpBuffer[5] =
219 {
220     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpBuffer),         NULL},
221     {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (Buffer.Length),                "Length"},
222     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Buffer.Pointer),               "Pointer"},
223     {ACPI_EXD_NODE,     ACPI_EXD_OFFSET (Buffer.Node),                  "Parent Node"},
224     {ACPI_EXD_BUFFER,   0,                                              NULL}
225 };
226 
227 static ACPI_EXDUMP_INFO     AcpiExDumpPackage[6] =
228 {
229     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpPackage),        NULL},
230     {ACPI_EXD_NODE,     ACPI_EXD_OFFSET (Package.Node),                 "Parent Node"},
231     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Package.Flags),                "Flags"},
232     {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (Package.Count),                "Elements"},
233     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Package.Elements),             "Element List"},
234     {ACPI_EXD_PACKAGE,  0,                                              NULL}
235 };
236 
237 static ACPI_EXDUMP_INFO     AcpiExDumpDevice[4] =
238 {
239     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpDevice),         NULL},
240     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Device.NotifyList[0]),         "System Notify"},
241     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Device.NotifyList[1]),         "Device Notify"},
242     {ACPI_EXD_HDLR_LIST,ACPI_EXD_OFFSET (Device.Handler),               "Handler"}
243 };
244 
245 static ACPI_EXDUMP_INFO     AcpiExDumpEvent[2] =
246 {
247     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpEvent),          NULL},
248     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Event.OsSemaphore),            "OsSemaphore"}
249 };
250 
251 static ACPI_EXDUMP_INFO     AcpiExDumpMethod[9] =
252 {
253     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpMethod),         NULL},
254     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Method.InfoFlags),             "Info Flags"},
255     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Method.ParamCount),            "Parameter Count"},
256     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Method.SyncLevel),             "Sync Level"},
257     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Method.Mutex),                 "Mutex"},
258     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Method.OwnerId),               "Owner Id"},
259     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Method.ThreadCount),           "Thread Count"},
260     {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (Method.AmlLength),             "Aml Length"},
261     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Method.AmlStart),              "Aml Start"}
262 };
263 
264 static ACPI_EXDUMP_INFO     AcpiExDumpMutex[6] =
265 {
266     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpMutex),          NULL},
267     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Mutex.SyncLevel),              "Sync Level"},
268     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Mutex.OriginalSyncLevel),      "Original Sync Level"},
269     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Mutex.OwnerThread),            "Owner Thread"},
270     {ACPI_EXD_UINT16,   ACPI_EXD_OFFSET (Mutex.AcquisitionDepth),       "Acquire Depth"},
271     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Mutex.OsMutex),                "OsMutex"}
272 };
273 
274 static ACPI_EXDUMP_INFO     AcpiExDumpRegion[8] =
275 {
276     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpRegion),         NULL},
277     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Region.SpaceId),               "Space Id"},
278     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Region.Flags),                 "Flags"},
279     {ACPI_EXD_NODE,     ACPI_EXD_OFFSET (Region.Node),                  "Parent Node"},
280     {ACPI_EXD_ADDRESS,  ACPI_EXD_OFFSET (Region.Address),               "Address"},
281     {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (Region.Length),                "Length"},
282     {ACPI_EXD_HDLR_LIST,ACPI_EXD_OFFSET (Region.Handler),               "Handler"},
283     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Region.Next),                  "Next"}
284 };
285 
286 static ACPI_EXDUMP_INFO     AcpiExDumpPower[6] =
287 {
288     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpPower),          NULL},
289     {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (PowerResource.SystemLevel),    "System Level"},
290     {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (PowerResource.ResourceOrder),  "Resource Order"},
291     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (PowerResource.NotifyList[0]),  "System Notify"},
292     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (PowerResource.NotifyList[1]),  "Device Notify"},
293     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (PowerResource.Handler),        "Handler"}
294 };
295 
296 static ACPI_EXDUMP_INFO     AcpiExDumpProcessor[7] =
297 {
298     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpProcessor),      NULL},
299     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Processor.ProcId),             "Processor ID"},
300     {ACPI_EXD_UINT8 ,   ACPI_EXD_OFFSET (Processor.Length),             "Length"},
301     {ACPI_EXD_ADDRESS,  ACPI_EXD_OFFSET (Processor.Address),            "Address"},
302     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Processor.NotifyList[0]),      "System Notify"},
303     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Processor.NotifyList[1]),      "Device Notify"},
304     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Processor.Handler),            "Handler"}
305 };
306 
307 static ACPI_EXDUMP_INFO     AcpiExDumpThermal[4] =
308 {
309     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpThermal),        NULL},
310     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (ThermalZone.NotifyList[0]),    "System Notify"},
311     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (ThermalZone.NotifyList[1]),    "Device Notify"},
312     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (ThermalZone.Handler),          "Handler"}
313 };
314 
315 static ACPI_EXDUMP_INFO     AcpiExDumpBufferField[3] =
316 {
317     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpBufferField),    NULL},
318     {ACPI_EXD_FIELD,    0,                                              NULL},
319     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (BufferField.BufferObj),        "Buffer Object"}
320 };
321 
322 static ACPI_EXDUMP_INFO     AcpiExDumpRegionField[5] =
323 {
324     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpRegionField),    NULL},
325     {ACPI_EXD_FIELD,    0,                                              NULL},
326     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Field.AccessLength),           "AccessLength"},
327     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Field.RegionObj),              "Region Object"},
328     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Field.ResourceBuffer),         "ResourceBuffer"}
329 };
330 
331 static ACPI_EXDUMP_INFO     AcpiExDumpBankField[5] =
332 {
333     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpBankField),      NULL},
334     {ACPI_EXD_FIELD,    0,                                              NULL},
335     {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (BankField.Value),              "Value"},
336     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (BankField.RegionObj),          "Region Object"},
337     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (BankField.BankObj),            "Bank Object"}
338 };
339 
340 static ACPI_EXDUMP_INFO     AcpiExDumpIndexField[5] =
341 {
342     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpBankField),      NULL},
343     {ACPI_EXD_FIELD,    0,                                              NULL},
344     {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (IndexField.Value),             "Value"},
345     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (IndexField.IndexObj),          "Index Object"},
346     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (IndexField.DataObj),           "Data Object"}
347 };
348 
349 static ACPI_EXDUMP_INFO     AcpiExDumpReference[9] =
350 {
351     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpReference),       NULL},
352     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Reference.Class),              "Class"},
353     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Reference.TargetType),         "Target Type"},
354     {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (Reference.Value),              "Value"},
355     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Reference.Object),             "Object Desc"},
356     {ACPI_EXD_NODE,     ACPI_EXD_OFFSET (Reference.Node),               "Node"},
357     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Reference.Where),              "Where"},
358     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Reference.IndexPointer),       "Index Pointer"},
359     {ACPI_EXD_REFERENCE,0,                                              NULL}
360 };
361 
362 static ACPI_EXDUMP_INFO     AcpiExDumpAddressHandler[6] =
363 {
364     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpAddressHandler), NULL},
365     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (AddressSpace.SpaceId),         "Space Id"},
366     {ACPI_EXD_HDLR_LIST,ACPI_EXD_OFFSET (AddressSpace.Next),            "Next"},
367     {ACPI_EXD_RGN_LIST, ACPI_EXD_OFFSET (AddressSpace.RegionList),      "Region List"},
368     {ACPI_EXD_NODE,     ACPI_EXD_OFFSET (AddressSpace.Node),            "Node"},
369     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (AddressSpace.Context),         "Context"}
370 };
371 
372 static ACPI_EXDUMP_INFO     AcpiExDumpNotify[7] =
373 {
374     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpNotify),         NULL},
375     {ACPI_EXD_NODE,     ACPI_EXD_OFFSET (Notify.Node),                  "Node"},
376     {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (Notify.HandlerType),           "Handler Type"},
377     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Notify.Handler),               "Handler"},
378     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Notify.Context),               "Context"},
379     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Notify.Next[0]),               "Next System Notify"},
380     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Notify.Next[1]),               "Next Device Notify"}
381 };
382 
383 static ACPI_EXDUMP_INFO     AcpiExDumpExtra[6] =
384 {
385     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpExtra),          NULL},
386     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Extra.Method_REG),             "_REG Method"},
387     {ACPI_EXD_NODE,     ACPI_EXD_OFFSET (Extra.ScopeNode),              "Scope Node"},
388     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Extra.RegionContext),          "Region Context"},
389     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Extra.AmlStart),               "Aml Start"},
390     {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (Extra.AmlLength),              "Aml Length"}
391 };
392 
393 static ACPI_EXDUMP_INFO     AcpiExDumpData[3] =
394 {
395     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpData),           NULL},
396     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Data.Handler),                 "Handler"},
397     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Data.Pointer),                 "Raw Data"}
398 };
399 
400 /* Miscellaneous tables */
401 
402 static ACPI_EXDUMP_INFO     AcpiExDumpCommon[5] =
403 {
404     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpCommon),         NULL},
405     {ACPI_EXD_TYPE ,    0,                                              NULL},
406     {ACPI_EXD_UINT16,   ACPI_EXD_OFFSET (Common.ReferenceCount),        "Reference Count"},
407     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Common.Flags),                 "Flags"},
408     {ACPI_EXD_LIST,     ACPI_EXD_OFFSET (Common.NextObject),            "Object List"}
409 };
410 
411 static ACPI_EXDUMP_INFO     AcpiExDumpFieldCommon[7] =
412 {
413     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpFieldCommon),    NULL},
414     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (CommonField.FieldFlags),       "Field Flags"},
415     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (CommonField.AccessByteWidth),  "Access Byte Width"},
416     {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (CommonField.BitLength),        "Bit Length"},
417     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (CommonField.StartFieldBitOffset),"Field Bit Offset"},
418     {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (CommonField.BaseByteOffset),   "Base Byte Offset"},
419     {ACPI_EXD_NODE,     ACPI_EXD_OFFSET (CommonField.Node),             "Parent Node"}
420 };
421 
422 static ACPI_EXDUMP_INFO     AcpiExDumpNode[7] =
423 {
424     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpNode),           NULL},
425     {ACPI_EXD_UINT8,    ACPI_EXD_NSOFFSET (Flags),                      "Flags"},
426     {ACPI_EXD_UINT8,    ACPI_EXD_NSOFFSET (OwnerId),                    "Owner Id"},
427     {ACPI_EXD_LIST,     ACPI_EXD_NSOFFSET (Object),                     "Object List"},
428     {ACPI_EXD_NODE,     ACPI_EXD_NSOFFSET (Parent),                     "Parent"},
429     {ACPI_EXD_NODE,     ACPI_EXD_NSOFFSET (Child),                      "Child"},
430     {ACPI_EXD_NODE,     ACPI_EXD_NSOFFSET (Peer),                       "Peer"}
431 };
432 
433 
434 /* Dispatch table, indexed by object type */
435 
436 static ACPI_EXDUMP_INFO     *AcpiExDumpInfo[] =
437 {
438     NULL,
439     AcpiExDumpInteger,
440     AcpiExDumpString,
441     AcpiExDumpBuffer,
442     AcpiExDumpPackage,
443     NULL,
444     AcpiExDumpDevice,
445     AcpiExDumpEvent,
446     AcpiExDumpMethod,
447     AcpiExDumpMutex,
448     AcpiExDumpRegion,
449     AcpiExDumpPower,
450     AcpiExDumpProcessor,
451     AcpiExDumpThermal,
452     AcpiExDumpBufferField,
453     NULL,
454     NULL,
455     AcpiExDumpRegionField,
456     AcpiExDumpBankField,
457     AcpiExDumpIndexField,
458     AcpiExDumpReference,
459     NULL,
460     NULL,
461     AcpiExDumpNotify,
462     AcpiExDumpAddressHandler,
463     NULL,
464     NULL,
465     NULL,
466     AcpiExDumpExtra,
467     AcpiExDumpData
468 };
469 
470 
471 /*******************************************************************************
472  *
473  * FUNCTION:    AcpiExDumpObject
474  *
475  * PARAMETERS:  ObjDesc             - Descriptor to dump
476  *              Info                - Info table corresponding to this object
477  *                                    type
478  *
479  * RETURN:      None
480  *
481  * DESCRIPTION: Walk the info table for this object
482  *
483  ******************************************************************************/
484 
485 static void
486 AcpiExDumpObject (
487     ACPI_OPERAND_OBJECT     *ObjDesc,
488     ACPI_EXDUMP_INFO        *Info)
489 {
490     UINT8                   *Target;
491     const char              *Name;
492     UINT8                   Count;
493     ACPI_OPERAND_OBJECT     *Start;
494     ACPI_OPERAND_OBJECT     *Data = NULL;
495     ACPI_OPERAND_OBJECT     *Next;
496     ACPI_NAMESPACE_NODE     *Node;
497 
498 
499     if (!Info)
500     {
501         AcpiOsPrintf (
502             "ExDumpObject: Display not implemented for object type %s\n",
503             AcpiUtGetObjectTypeName (ObjDesc));
504         return;
505     }
506 
507     /* First table entry must contain the table length (# of table entries) */
508 
509     Count = Info->Offset;
510 
511     while (Count)
512     {
513         Target = ACPI_ADD_PTR (UINT8, ObjDesc, Info->Offset);
514         Name = Info->Name;
515 
516         switch (Info->Opcode)
517         {
518         case ACPI_EXD_INIT:
519 
520             break;
521 
522         case ACPI_EXD_TYPE:
523 
524             AcpiOsPrintf ("%20s : %2.2X [%s]\n", "Type",
525                 ObjDesc->Common.Type, AcpiUtGetObjectTypeName (ObjDesc));
526             break;
527 
528         case ACPI_EXD_UINT8:
529 
530             AcpiOsPrintf ("%20s : %2.2X\n", Name, *Target);
531             break;
532 
533         case ACPI_EXD_UINT16:
534 
535             AcpiOsPrintf ("%20s : %4.4X\n", Name, ACPI_GET16 (Target));
536             break;
537 
538         case ACPI_EXD_UINT32:
539 
540             AcpiOsPrintf ("%20s : %8.8X\n", Name, ACPI_GET32 (Target));
541             break;
542 
543         case ACPI_EXD_UINT64:
544 
545             AcpiOsPrintf ("%20s : %8.8X%8.8X\n", "Value",
546                 ACPI_FORMAT_UINT64 (ACPI_GET64 (Target)));
547             break;
548 
549         case ACPI_EXD_POINTER:
550         case ACPI_EXD_ADDRESS:
551 
552             AcpiExOutPointer (Name, *ACPI_CAST_PTR (void *, Target));
553             break;
554 
555         case ACPI_EXD_STRING:
556 
557             AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX);
558             AcpiOsPrintf ("\n");
559             break;
560 
561         case ACPI_EXD_BUFFER:
562 
563             ACPI_DUMP_BUFFER (
564                 ObjDesc->Buffer.Pointer, ObjDesc->Buffer.Length);
565             break;
566 
567         case ACPI_EXD_PACKAGE:
568 
569             /* Dump the package contents */
570 
571             AcpiOsPrintf ("\nPackage Contents:\n");
572             AcpiExDumpPackageObj (ObjDesc, 0, 0);
573             break;
574 
575         case ACPI_EXD_FIELD:
576 
577             AcpiExDumpObject (ObjDesc, AcpiExDumpFieldCommon);
578             break;
579 
580         case ACPI_EXD_REFERENCE:
581 
582             AcpiExOutString ("Class Name", AcpiUtGetReferenceName (ObjDesc));
583             AcpiExDumpReferenceObj (ObjDesc);
584             break;
585 
586         case ACPI_EXD_LIST:
587 
588             Start = *ACPI_CAST_PTR (void *, Target);
589             Next = Start;
590 
591             AcpiOsPrintf ("%20s : %p", Name, Next);
592             if (Next)
593             {
594                 AcpiOsPrintf ("(%s %2.2X)",
595                     AcpiUtGetObjectTypeName (Next), Next->Common.Type);
596 
597                 while (Next->Common.NextObject)
598                 {
599                     if ((Next->Common.Type == ACPI_TYPE_LOCAL_DATA) &&
600                         !Data)
601                     {
602                         Data = Next;
603                     }
604 
605                     Next = Next->Common.NextObject;
606                     AcpiOsPrintf ("->%p(%s %2.2X)", Next,
607                         AcpiUtGetObjectTypeName (Next), Next->Common.Type);
608 
609                     if ((Next == Start) || (Next == Data))
610                     {
611                         AcpiOsPrintf (
612                             "\n**** Error: Object list appears to be circular linked");
613                         break;
614                     }
615                 }
616             }
617 
618             AcpiOsPrintf ("\n");
619             break;
620 
621         case ACPI_EXD_HDLR_LIST:
622 
623             Start = *ACPI_CAST_PTR (void *, Target);
624             Next = Start;
625 
626             AcpiOsPrintf ("%20s : %p", Name, Next);
627             if (Next)
628             {
629                 AcpiOsPrintf ("(%s %2.2X)",
630                     AcpiUtGetObjectTypeName (Next),
631                     Next->AddressSpace.SpaceId);
632 
633                 while (Next->AddressSpace.Next)
634                 {
635                     if ((Next->Common.Type == ACPI_TYPE_LOCAL_DATA) &&
636                         !Data)
637                     {
638                         Data = Next;
639                     }
640 
641                     Next = Next->AddressSpace.Next;
642                     AcpiOsPrintf ("->%p(%s %2.2X)", Next,
643                         AcpiUtGetObjectTypeName (Next),
644                         Next->AddressSpace.SpaceId);
645 
646                     if ((Next == Start) || (Next == Data))
647                     {
648                         AcpiOsPrintf (
649                             "\n**** Error: Handler list appears to be circular linked");
650                         break;
651                     }
652                 }
653             }
654 
655             AcpiOsPrintf ("\n");
656             break;
657 
658         case ACPI_EXD_RGN_LIST:
659 
660             Start = *ACPI_CAST_PTR (void *, Target);
661             Next = Start;
662 
663             AcpiOsPrintf ("%20s : %p", Name, Next);
664             if (Next)
665             {
666                 AcpiOsPrintf ("(%s %2.2X)",
667                     AcpiUtGetObjectTypeName (Next), Next->Common.Type);
668 
669                 while (Next->Region.Next)
670                 {
671                     if ((Next->Common.Type == ACPI_TYPE_LOCAL_DATA) &&
672                         !Data)
673                     {
674                         Data = Next;
675                     }
676 
677                     Next = Next->Region.Next;
678                     AcpiOsPrintf ("->%p(%s %2.2X)", Next,
679                         AcpiUtGetObjectTypeName (Next), Next->Common.Type);
680 
681                     if ((Next == Start) || (Next == Data))
682                     {
683                         AcpiOsPrintf (
684                             "\n**** Error: Region list appears to be circular linked");
685                         break;
686                     }
687                 }
688             }
689 
690             AcpiOsPrintf ("\n");
691             break;
692 
693         case ACPI_EXD_NODE:
694 
695             Node = *ACPI_CAST_PTR (ACPI_NAMESPACE_NODE *, Target);
696 
697             AcpiOsPrintf ("%20s : %p", Name, Node);
698             if (Node)
699             {
700                 AcpiOsPrintf (" [%4.4s]", Node->Name.Ascii);
701             }
702             AcpiOsPrintf ("\n");
703             break;
704 
705         default:
706 
707             AcpiOsPrintf ("**** Invalid table opcode [%X] ****\n",
708                 Info->Opcode);
709             return;
710         }
711 
712         Info++;
713         Count--;
714     }
715 }
716 
717 
718 /*******************************************************************************
719  *
720  * FUNCTION:    AcpiExDumpOperand
721  *
722  * PARAMETERS:  *ObjDesc        - Pointer to entry to be dumped
723  *              Depth           - Current nesting depth
724  *
725  * RETURN:      None
726  *
727  * DESCRIPTION: Dump an operand object
728  *
729  ******************************************************************************/
730 
731 void
732 AcpiExDumpOperand (
733     ACPI_OPERAND_OBJECT     *ObjDesc,
734     UINT32                  Depth)
735 {
736     UINT32                  Length;
737     UINT32                  Index;
738 
739 
740     ACPI_FUNCTION_NAME (ExDumpOperand)
741 
742 
743     /* Check if debug output enabled */
744 
745     if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_EXEC, _COMPONENT))
746     {
747         return;
748     }
749 
750     if (!ObjDesc)
751     {
752         /* This could be a null element of a package */
753 
754         ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Null Object Descriptor\n"));
755         return;
756     }
757 
758     if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED)
759     {
760         ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p Namespace Node: ", ObjDesc));
761         ACPI_DUMP_ENTRY (ObjDesc, ACPI_LV_EXEC);
762         return;
763     }
764 
765     if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND)
766     {
767         ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
768             "%p is not a node or operand object: [%s]\n",
769             ObjDesc, AcpiUtGetDescriptorName (ObjDesc)));
770         ACPI_DUMP_BUFFER (ObjDesc, sizeof (ACPI_OPERAND_OBJECT));
771         return;
772     }
773 
774     /* ObjDesc is a valid object */
775 
776     if (Depth > 0)
777     {
778         ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%*s[%u] %p Refs=%u ",
779             Depth, " ", Depth, ObjDesc, ObjDesc->Common.ReferenceCount));
780     }
781     else
782     {
783         ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p Refs=%u ",
784             ObjDesc, ObjDesc->Common.ReferenceCount));
785     }
786 
787     /* Decode object type */
788 
789     switch (ObjDesc->Common.Type)
790     {
791     case ACPI_TYPE_LOCAL_REFERENCE:
792 
793         AcpiOsPrintf ("Reference: [%s] ",
794             AcpiUtGetReferenceName (ObjDesc));
795 
796         switch (ObjDesc->Reference.Class)
797         {
798         case ACPI_REFCLASS_DEBUG:
799 
800             AcpiOsPrintf ("\n");
801             break;
802 
803         case ACPI_REFCLASS_INDEX:
804 
805             AcpiOsPrintf ("%p\n", ObjDesc->Reference.Object);
806             break;
807 
808         case ACPI_REFCLASS_TABLE:
809 
810             AcpiOsPrintf ("Table Index %X\n", ObjDesc->Reference.Value);
811             break;
812 
813         case ACPI_REFCLASS_REFOF:
814 
815             AcpiOsPrintf ("%p [%s]\n", ObjDesc->Reference.Object,
816                 AcpiUtGetTypeName (((ACPI_OPERAND_OBJECT *)
817                     ObjDesc->Reference.Object)->Common.Type));
818             break;
819 
820         case ACPI_REFCLASS_NAME:
821 
822             AcpiUtRepairName (ObjDesc->Reference.Node->Name.Ascii);
823             AcpiOsPrintf ("- [%4.4s] (Node %p)\n",
824                 ObjDesc->Reference.Node->Name.Ascii,
825                 ObjDesc->Reference.Node);
826             break;
827 
828         case ACPI_REFCLASS_ARG:
829         case ACPI_REFCLASS_LOCAL:
830 
831             AcpiOsPrintf ("%X\n", ObjDesc->Reference.Value);
832             break;
833 
834         default:    /* Unknown reference class */
835 
836             AcpiOsPrintf ("%2.2X\n", ObjDesc->Reference.Class);
837             break;
838         }
839         break;
840 
841     case ACPI_TYPE_BUFFER:
842 
843         AcpiOsPrintf ("Buffer length %.2X @ %p\n",
844             ObjDesc->Buffer.Length, ObjDesc->Buffer.Pointer);
845 
846         /* Debug only -- dump the buffer contents */
847 
848         if (ObjDesc->Buffer.Pointer)
849         {
850             Length = ObjDesc->Buffer.Length;
851             if (Length > 128)
852             {
853                 Length = 128;
854             }
855 
856             AcpiOsPrintf (
857                 "Buffer Contents: (displaying length 0x%.2X)\n", Length);
858             ACPI_DUMP_BUFFER (ObjDesc->Buffer.Pointer, Length);
859         }
860         break;
861 
862     case ACPI_TYPE_INTEGER:
863 
864         AcpiOsPrintf ("Integer %8.8X%8.8X\n",
865             ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
866         break;
867 
868     case ACPI_TYPE_PACKAGE:
869 
870         AcpiOsPrintf ("Package [Len %X] ElementArray %p\n",
871             ObjDesc->Package.Count, ObjDesc->Package.Elements);
872 
873         /*
874          * If elements exist, package element pointer is valid,
875          * and debug_level exceeds 1, dump package's elements.
876          */
877         if (ObjDesc->Package.Count &&
878             ObjDesc->Package.Elements &&
879             AcpiDbgLevel > 1)
880         {
881             for (Index = 0; Index < ObjDesc->Package.Count; Index++)
882             {
883                 AcpiExDumpOperand (
884                     ObjDesc->Package.Elements[Index], Depth + 1);
885             }
886         }
887         break;
888 
889     case ACPI_TYPE_REGION:
890 
891         AcpiOsPrintf ("Region %s (%X)",
892             AcpiUtGetRegionName (ObjDesc->Region.SpaceId),
893             ObjDesc->Region.SpaceId);
894 
895         /*
896          * If the address and length have not been evaluated,
897          * don't print them.
898          */
899         if (!(ObjDesc->Region.Flags & AOPOBJ_DATA_VALID))
900         {
901             AcpiOsPrintf ("\n");
902         }
903         else
904         {
905             AcpiOsPrintf (" base %8.8X%8.8X Length %X\n",
906                 ACPI_FORMAT_UINT64 (ObjDesc->Region.Address),
907                 ObjDesc->Region.Length);
908         }
909         break;
910 
911     case ACPI_TYPE_STRING:
912 
913         AcpiOsPrintf ("String length %X @ %p ",
914             ObjDesc->String.Length,
915             ObjDesc->String.Pointer);
916 
917         AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX);
918         AcpiOsPrintf ("\n");
919         break;
920 
921     case ACPI_TYPE_LOCAL_BANK_FIELD:
922 
923         AcpiOsPrintf ("BankField\n");
924         break;
925 
926     case ACPI_TYPE_LOCAL_REGION_FIELD:
927 
928         AcpiOsPrintf ("RegionField: Bits=%X AccWidth=%X Lock=%X Update=%X at "
929             "byte=%X bit=%X of below:\n",
930             ObjDesc->Field.BitLength,
931             ObjDesc->Field.AccessByteWidth,
932             ObjDesc->Field.FieldFlags & AML_FIELD_LOCK_RULE_MASK,
933             ObjDesc->Field.FieldFlags & AML_FIELD_UPDATE_RULE_MASK,
934             ObjDesc->Field.BaseByteOffset,
935             ObjDesc->Field.StartFieldBitOffset);
936 
937         AcpiExDumpOperand (ObjDesc->Field.RegionObj, Depth + 1);
938         break;
939 
940     case ACPI_TYPE_LOCAL_INDEX_FIELD:
941 
942         AcpiOsPrintf ("IndexField\n");
943         break;
944 
945     case ACPI_TYPE_BUFFER_FIELD:
946 
947         AcpiOsPrintf ("BufferField: %X bits at byte %X bit %X of\n",
948             ObjDesc->BufferField.BitLength,
949             ObjDesc->BufferField.BaseByteOffset,
950             ObjDesc->BufferField.StartFieldBitOffset);
951 
952         if (!ObjDesc->BufferField.BufferObj)
953         {
954             ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "*NULL*\n"));
955         }
956         else if ((ObjDesc->BufferField.BufferObj)->Common.Type !=
957             ACPI_TYPE_BUFFER)
958         {
959             AcpiOsPrintf ("*not a Buffer*\n");
960         }
961         else
962         {
963             AcpiExDumpOperand (ObjDesc->BufferField.BufferObj, Depth + 1);
964         }
965         break;
966 
967     case ACPI_TYPE_EVENT:
968 
969         AcpiOsPrintf ("Event\n");
970         break;
971 
972     case ACPI_TYPE_METHOD:
973 
974         AcpiOsPrintf ("Method(%X) @ %p:%X\n",
975             ObjDesc->Method.ParamCount,
976             ObjDesc->Method.AmlStart,
977             ObjDesc->Method.AmlLength);
978         break;
979 
980     case ACPI_TYPE_MUTEX:
981 
982         AcpiOsPrintf ("Mutex\n");
983         break;
984 
985     case ACPI_TYPE_DEVICE:
986 
987         AcpiOsPrintf ("Device\n");
988         break;
989 
990     case ACPI_TYPE_POWER:
991 
992         AcpiOsPrintf ("Power\n");
993         break;
994 
995     case ACPI_TYPE_PROCESSOR:
996 
997         AcpiOsPrintf ("Processor\n");
998         break;
999 
1000     case ACPI_TYPE_THERMAL:
1001 
1002         AcpiOsPrintf ("Thermal\n");
1003         break;
1004 
1005     default:
1006 
1007         /* Unknown Type */
1008 
1009         AcpiOsPrintf ("Unknown Type %X\n", ObjDesc->Common.Type);
1010         break;
1011     }
1012 
1013     return;
1014 }
1015 
1016 
1017 /*******************************************************************************
1018  *
1019  * FUNCTION:    AcpiExDumpOperands
1020  *
1021  * PARAMETERS:  Operands            - A list of Operand objects
1022  *              OpcodeName          - AML opcode name
1023  *              NumOperands         - Operand count for this opcode
1024  *
1025  * DESCRIPTION: Dump the operands associated with the opcode
1026  *
1027  ******************************************************************************/
1028 
1029 void
1030 AcpiExDumpOperands (
1031     ACPI_OPERAND_OBJECT     **Operands,
1032     const char              *OpcodeName,
1033     UINT32                  NumOperands)
1034 {
1035     ACPI_FUNCTION_NAME (ExDumpOperands);
1036 
1037 
1038     if (!OpcodeName)
1039     {
1040         OpcodeName = "UNKNOWN";
1041     }
1042 
1043     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
1044         "**** Start operand dump for opcode [%s], %u operands\n",
1045         OpcodeName, NumOperands));
1046 
1047     if (NumOperands == 0)
1048     {
1049         NumOperands = 1;
1050     }
1051 
1052     /* Dump the individual operands */
1053 
1054     while (NumOperands)
1055     {
1056         AcpiExDumpOperand (*Operands, 0);
1057         Operands++;
1058         NumOperands--;
1059     }
1060 
1061     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
1062         "**** End operand dump for [%s]\n", OpcodeName));
1063     return;
1064 }
1065 
1066 
1067 /*******************************************************************************
1068  *
1069  * FUNCTION:    AcpiExOut* functions
1070  *
1071  * PARAMETERS:  Title               - Descriptive text
1072  *              Value               - Value to be displayed
1073  *
1074  * DESCRIPTION: Object dump output formatting functions. These functions
1075  *              reduce the number of format strings required and keeps them
1076  *              all in one place for easy modification.
1077  *
1078  ******************************************************************************/
1079 
1080 static void
1081 AcpiExOutString (
1082     const char              *Title,
1083     const char              *Value)
1084 {
1085     AcpiOsPrintf ("%20s : %s\n", Title, Value);
1086 }
1087 
1088 static void
1089 AcpiExOutPointer (
1090     const char              *Title,
1091     const void              *Value)
1092 {
1093     AcpiOsPrintf ("%20s : %p\n", Title, Value);
1094 }
1095 
1096 
1097 /*******************************************************************************
1098  *
1099  * FUNCTION:    AcpiExDumpNamespaceNode
1100  *
1101  * PARAMETERS:  Node                - Descriptor to dump
1102  *              Flags               - Force display if TRUE
1103  *
1104  * DESCRIPTION: Dumps the members of the given.Node
1105  *
1106  ******************************************************************************/
1107 
1108 void
1109 AcpiExDumpNamespaceNode (
1110     ACPI_NAMESPACE_NODE     *Node,
1111     UINT32                  Flags)
1112 {
1113 
1114     ACPI_FUNCTION_ENTRY ();
1115 
1116 
1117     if (!Flags)
1118     {
1119         /* Check if debug output enabled */
1120 
1121         if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_OBJECTS, _COMPONENT))
1122         {
1123             return;
1124         }
1125     }
1126 
1127     AcpiOsPrintf ("%20s : %4.4s\n", "Name", AcpiUtGetNodeName (Node));
1128     AcpiOsPrintf ("%20s : %2.2X [%s]\n", "Type",
1129         Node->Type, AcpiUtGetTypeName (Node->Type));
1130 
1131     AcpiExDumpObject (ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Node),
1132         AcpiExDumpNode);
1133 }
1134 
1135 
1136 /*******************************************************************************
1137  *
1138  * FUNCTION:    AcpiExDumpReferenceObj
1139  *
1140  * PARAMETERS:  Object              - Descriptor to dump
1141  *
1142  * DESCRIPTION: Dumps a reference object
1143  *
1144  ******************************************************************************/
1145 
1146 static void
1147 AcpiExDumpReferenceObj (
1148     ACPI_OPERAND_OBJECT     *ObjDesc)
1149 {
1150     ACPI_BUFFER             RetBuf;
1151     ACPI_STATUS             Status;
1152 
1153 
1154     RetBuf.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
1155 
1156     if (ObjDesc->Reference.Class == ACPI_REFCLASS_NAME)
1157     {
1158         AcpiOsPrintf (" %p ", ObjDesc->Reference.Node);
1159 
1160         Status = AcpiNsHandleToPathname (ObjDesc->Reference.Node,
1161             &RetBuf, TRUE);
1162         if (ACPI_FAILURE (Status))
1163         {
1164             AcpiOsPrintf (" Could not convert name to pathname: %s\n",
1165                 AcpiFormatException (Status));
1166         }
1167         else
1168         {
1169             AcpiOsPrintf ("%s: %s\n",
1170                 AcpiUtGetTypeName (ObjDesc->Reference.Node->Type),
1171                 (char *) RetBuf.Pointer);
1172             ACPI_FREE (RetBuf.Pointer);
1173         }
1174     }
1175     else if (ObjDesc->Reference.Object)
1176     {
1177         if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_OPERAND)
1178         {
1179             AcpiOsPrintf ("%22s %p", "Target :",
1180                 ObjDesc->Reference.Object);
1181             if (ObjDesc->Reference.Class == ACPI_REFCLASS_TABLE)
1182             {
1183                 AcpiOsPrintf (" Table Index: %X\n",
1184                     ObjDesc->Reference.Value);
1185             }
1186             else
1187             {
1188                 AcpiOsPrintf (" [%s]\n",
1189                     AcpiUtGetTypeName (((ACPI_OPERAND_OBJECT *)
1190                     ObjDesc->Reference.Object)->Common.Type));
1191             }
1192         }
1193         else
1194         {
1195             AcpiOsPrintf (" Target: %p\n", ObjDesc->Reference.Object);
1196         }
1197     }
1198 }
1199 
1200 
1201 /*******************************************************************************
1202  *
1203  * FUNCTION:    AcpiExDumpPackageObj
1204  *
1205  * PARAMETERS:  ObjDesc             - Descriptor to dump
1206  *              Level               - Indentation Level
1207  *              Index               - Package index for this object
1208  *
1209  * DESCRIPTION: Dumps the elements of the package
1210  *
1211  ******************************************************************************/
1212 
1213 static void
1214 AcpiExDumpPackageObj (
1215     ACPI_OPERAND_OBJECT     *ObjDesc,
1216     UINT32                  Level,
1217     UINT32                  Index)
1218 {
1219     UINT32                  i;
1220 
1221 
1222     /* Indentation and index output */
1223 
1224     if (Level > 0)
1225     {
1226         for (i = 0; i < Level; i++)
1227         {
1228             AcpiOsPrintf ("  ");
1229         }
1230 
1231         AcpiOsPrintf ("[%.2d] ", Index);
1232     }
1233 
1234     AcpiOsPrintf ("%p ", ObjDesc);
1235 
1236     /* Null package elements are allowed */
1237 
1238     if (!ObjDesc)
1239     {
1240         AcpiOsPrintf ("[Null Object]\n");
1241         return;
1242     }
1243 
1244     /* Packages may only contain a few object types */
1245 
1246     switch (ObjDesc->Common.Type)
1247     {
1248     case ACPI_TYPE_INTEGER:
1249 
1250         AcpiOsPrintf ("[Integer] = %8.8X%8.8X\n",
1251             ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
1252         break;
1253 
1254     case ACPI_TYPE_STRING:
1255 
1256         AcpiOsPrintf ("[String]  Value: ");
1257         AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX);
1258         AcpiOsPrintf ("\n");
1259         break;
1260 
1261     case ACPI_TYPE_BUFFER:
1262 
1263         AcpiOsPrintf ("[Buffer] Length %.2X = ", ObjDesc->Buffer.Length);
1264         if (ObjDesc->Buffer.Length)
1265         {
1266             AcpiUtDebugDumpBuffer (
1267                 ACPI_CAST_PTR (UINT8, ObjDesc->Buffer.Pointer),
1268                 ObjDesc->Buffer.Length, DB_DWORD_DISPLAY, _COMPONENT);
1269         }
1270         else
1271         {
1272             AcpiOsPrintf ("\n");
1273         }
1274         break;
1275 
1276     case ACPI_TYPE_PACKAGE:
1277 
1278         AcpiOsPrintf ("[Package] Contains %u Elements:\n",
1279             ObjDesc->Package.Count);
1280 
1281         for (i = 0; i < ObjDesc->Package.Count; i++)
1282         {
1283             AcpiExDumpPackageObj (
1284                 ObjDesc->Package.Elements[i], Level + 1, i);
1285         }
1286         break;
1287 
1288     case ACPI_TYPE_LOCAL_REFERENCE:
1289 
1290         AcpiOsPrintf ("[Object Reference] Class [%s]",
1291             AcpiUtGetReferenceName (ObjDesc));
1292         AcpiExDumpReferenceObj (ObjDesc);
1293         break;
1294 
1295     default:
1296 
1297         AcpiOsPrintf ("[Unknown Type] %X\n", ObjDesc->Common.Type);
1298         break;
1299     }
1300 }
1301 
1302 
1303 /*******************************************************************************
1304  *
1305  * FUNCTION:    AcpiExDumpObjectDescriptor
1306  *
1307  * PARAMETERS:  ObjDesc             - Descriptor to dump
1308  *              Flags               - Force display if TRUE
1309  *
1310  * DESCRIPTION: Dumps the members of the object descriptor given.
1311  *
1312  ******************************************************************************/
1313 
1314 void
1315 AcpiExDumpObjectDescriptor (
1316     ACPI_OPERAND_OBJECT     *ObjDesc,
1317     UINT32                  Flags)
1318 {
1319     ACPI_FUNCTION_TRACE (ExDumpObjectDescriptor);
1320 
1321 
1322     if (!ObjDesc)
1323     {
1324         return_VOID;
1325     }
1326 
1327     if (!Flags)
1328     {
1329         /* Check if debug output enabled */
1330 
1331         if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_OBJECTS, _COMPONENT))
1332         {
1333             return_VOID;
1334         }
1335     }
1336 
1337     if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED)
1338     {
1339         AcpiExDumpNamespaceNode ((ACPI_NAMESPACE_NODE *) ObjDesc, Flags);
1340 
1341         AcpiOsPrintf ("\nAttached Object (%p):\n",
1342             ((ACPI_NAMESPACE_NODE *) ObjDesc)->Object);
1343 
1344         ObjDesc = ((ACPI_NAMESPACE_NODE *) ObjDesc)->Object;
1345         goto DumpObject;
1346     }
1347 
1348     if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND)
1349     {
1350         AcpiOsPrintf (
1351             "%p is not an ACPI operand object: [%s]\n",
1352             ObjDesc, AcpiUtGetDescriptorName (ObjDesc));
1353         return_VOID;
1354     }
1355 
1356     /* Validate the object type */
1357 
1358     if (ObjDesc->Common.Type > ACPI_TYPE_LOCAL_MAX)
1359     {
1360         AcpiOsPrintf ("Not a known object type: %2.2X\n",
1361             ObjDesc->Common.Type);
1362         return_VOID;
1363     }
1364 
1365 
1366 DumpObject:
1367 
1368     /* Common Fields */
1369 
1370     AcpiExDumpObject (ObjDesc, AcpiExDumpCommon);
1371 
1372     /* Object-specific fields */
1373 
1374     AcpiExDumpObject (ObjDesc, AcpiExDumpInfo[ObjDesc->Common.Type]);
1375 
1376     if (ObjDesc->Common.Type == ACPI_TYPE_REGION)
1377     {
1378         ObjDesc = ObjDesc->Common.NextObject;
1379         if (ObjDesc->Common.Type > ACPI_TYPE_LOCAL_MAX)
1380         {
1381             AcpiOsPrintf (
1382                 "Secondary object is not a known object type: %2.2X\n",
1383                 ObjDesc->Common.Type);
1384 
1385             return_VOID;
1386         }
1387 
1388         AcpiOsPrintf ("\nExtra attached Object (%p):\n", ObjDesc);
1389         AcpiExDumpObject (ObjDesc, AcpiExDumpInfo[ObjDesc->Common.Type]);
1390     }
1391 
1392     return_VOID;
1393 }
1394 
1395 #endif
1396