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 - 2023, 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),                "Element Count"},
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_UINT16,   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_UINT16,   ACPI_EXD_NSOFFSET (Flags),                      "Flags"},
426     {ACPI_EXD_UINT16,   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
AcpiExDumpObject(ACPI_OPERAND_OBJECT * ObjDesc,ACPI_EXDUMP_INFO * Info)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         if (!ObjDesc)
514         {
515             return;
516         }
517 
518         Target = ACPI_ADD_PTR (UINT8, ObjDesc, Info->Offset);
519         Name = Info->Name;
520 
521         switch (Info->Opcode)
522         {
523         case ACPI_EXD_INIT:
524 
525             break;
526 
527         case ACPI_EXD_TYPE:
528 
529             AcpiOsPrintf ("%20s : %2.2X [%s]\n", "Type",
530                 ObjDesc->Common.Type,
531                 AcpiUtGetObjectTypeName (ObjDesc));
532             break;
533 
534         case ACPI_EXD_UINT8:
535 
536             AcpiOsPrintf ("%20s : %2.2X\n", Name, *Target);
537             break;
538 
539         case ACPI_EXD_UINT16:
540 
541             AcpiOsPrintf ("%20s : %4.4X\n", Name, ACPI_GET16 (Target));
542             break;
543 
544         case ACPI_EXD_UINT32:
545 
546             AcpiOsPrintf ("%20s : %8.8X\n", Name, ACPI_GET32 (Target));
547             break;
548 
549         case ACPI_EXD_UINT64:
550 
551             AcpiOsPrintf ("%20s : %8.8X%8.8X\n", "Value",
552                 ACPI_FORMAT_UINT64 (ACPI_GET64 (Target)));
553             break;
554 
555         case ACPI_EXD_POINTER:
556         case ACPI_EXD_ADDRESS:
557 
558             AcpiExOutPointer (Name, *ACPI_CAST_PTR (void *, Target));
559             break;
560 
561         case ACPI_EXD_STRING:
562 
563             AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX);
564             AcpiOsPrintf ("\n");
565             break;
566 
567         case ACPI_EXD_BUFFER:
568 
569             ACPI_DUMP_BUFFER (
570                 ObjDesc->Buffer.Pointer, ObjDesc->Buffer.Length);
571             break;
572 
573         case ACPI_EXD_PACKAGE:
574 
575             /* Dump the package contents */
576 
577             AcpiOsPrintf ("\nPackage Contents:\n");
578             AcpiExDumpPackageObj (ObjDesc, 0, 0);
579             break;
580 
581         case ACPI_EXD_FIELD:
582 
583             AcpiExDumpObject (ObjDesc, AcpiExDumpFieldCommon);
584             break;
585 
586         case ACPI_EXD_REFERENCE:
587 
588             AcpiExOutString ("Class Name", AcpiUtGetReferenceName (ObjDesc));
589             AcpiExDumpReferenceObj (ObjDesc);
590             break;
591 
592         case ACPI_EXD_LIST:
593 
594             Start = *ACPI_CAST_PTR (void *, Target);
595             Next = Start;
596 
597             AcpiOsPrintf ("%20s : %p ", Name, Next);
598             if (Next)
599             {
600                 AcpiOsPrintf ("%s (Type %2.2X)",
601                     AcpiUtGetObjectTypeName (Next), Next->Common.Type);
602 
603                 while (Next->Common.NextObject)
604                 {
605                     if ((Next->Common.Type == ACPI_TYPE_LOCAL_DATA) &&
606                         !Data)
607                     {
608                         Data = Next;
609                     }
610 
611                     Next = Next->Common.NextObject;
612                     AcpiOsPrintf ("->%p(%s %2.2X)", Next,
613                         AcpiUtGetObjectTypeName (Next), Next->Common.Type);
614 
615                     if ((Next == Start) || (Next == Data))
616                     {
617                         AcpiOsPrintf (
618                             "\n**** Error: Object list appears to be circular linked");
619                         break;
620                     }
621                 }
622             }
623             else
624             {
625                 AcpiOsPrintf ("- No attached objects");
626             }
627 
628             AcpiOsPrintf ("\n");
629             break;
630 
631         case ACPI_EXD_HDLR_LIST:
632 
633             Start = *ACPI_CAST_PTR (void *, Target);
634             Next = Start;
635 
636             AcpiOsPrintf ("%20s : %p", Name, Next);
637             if (Next)
638             {
639                 AcpiOsPrintf ("(%s %2.2X)",
640                     AcpiUtGetObjectTypeName (Next),
641                     Next->AddressSpace.SpaceId);
642 
643                 while (Next->AddressSpace.Next)
644                 {
645                     if ((Next->Common.Type == ACPI_TYPE_LOCAL_DATA) &&
646                         !Data)
647                     {
648                         Data = Next;
649                     }
650 
651                     Next = Next->AddressSpace.Next;
652                     AcpiOsPrintf ("->%p(%s %2.2X)", Next,
653                         AcpiUtGetObjectTypeName (Next),
654                         Next->AddressSpace.SpaceId);
655 
656                     if ((Next == Start) || (Next == Data))
657                     {
658                         AcpiOsPrintf (
659                             "\n**** Error: Handler list appears to be circular linked");
660                         break;
661                     }
662                 }
663             }
664 
665             AcpiOsPrintf ("\n");
666             break;
667 
668         case ACPI_EXD_RGN_LIST:
669 
670             Start = *ACPI_CAST_PTR (void *, Target);
671             Next = Start;
672 
673             AcpiOsPrintf ("%20s : %p", Name, Next);
674             if (Next)
675             {
676                 AcpiOsPrintf ("(%s %2.2X)",
677                     AcpiUtGetObjectTypeName (Next), Next->Common.Type);
678 
679                 while (Next->Region.Next)
680                 {
681                     if ((Next->Common.Type == ACPI_TYPE_LOCAL_DATA) &&
682                         !Data)
683                     {
684                         Data = Next;
685                     }
686 
687                     Next = Next->Region.Next;
688                     AcpiOsPrintf ("->%p(%s %2.2X)", Next,
689                         AcpiUtGetObjectTypeName (Next), Next->Common.Type);
690 
691                     if ((Next == Start) || (Next == Data))
692                     {
693                         AcpiOsPrintf (
694                             "\n**** Error: Region list appears to be circular linked");
695                         break;
696                     }
697                 }
698             }
699 
700             AcpiOsPrintf ("\n");
701             break;
702 
703         case ACPI_EXD_NODE:
704 
705             Node = *ACPI_CAST_PTR (ACPI_NAMESPACE_NODE *, Target);
706 
707             AcpiOsPrintf ("%20s : %p", Name, Node);
708             if (Node)
709             {
710                 AcpiOsPrintf (" [%4.4s]", Node->Name.Ascii);
711             }
712             AcpiOsPrintf ("\n");
713             break;
714 
715         default:
716 
717             AcpiOsPrintf ("**** Invalid table opcode [%X] ****\n",
718                 Info->Opcode);
719             return;
720         }
721 
722         Info++;
723         Count--;
724     }
725 }
726 
727 
728 /*******************************************************************************
729  *
730  * FUNCTION:    AcpiExDumpOperand
731  *
732  * PARAMETERS:  *ObjDesc        - Pointer to entry to be dumped
733  *              Depth           - Current nesting depth
734  *
735  * RETURN:      None
736  *
737  * DESCRIPTION: Dump an operand object
738  *
739  ******************************************************************************/
740 
741 void
AcpiExDumpOperand(ACPI_OPERAND_OBJECT * ObjDesc,UINT32 Depth)742 AcpiExDumpOperand (
743     ACPI_OPERAND_OBJECT     *ObjDesc,
744     UINT32                  Depth)
745 {
746     UINT32                  Length;
747     UINT32                  Index;
748 
749 
750     ACPI_FUNCTION_NAME (ExDumpOperand);
751 
752 
753     /* Check if debug output enabled */
754 
755     if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_EXEC, _COMPONENT))
756     {
757         return;
758     }
759 
760     if (!ObjDesc)
761     {
762         /* This could be a null element of a package */
763 
764         ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Null Object Descriptor\n"));
765         return;
766     }
767 
768     if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED)
769     {
770         ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p Namespace Node: ", ObjDesc));
771         ACPI_DUMP_ENTRY (ObjDesc, ACPI_LV_EXEC);
772         return;
773     }
774 
775     if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND)
776     {
777         ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
778             "%p is not a node or operand object: [%s]\n",
779             ObjDesc, AcpiUtGetDescriptorName (ObjDesc)));
780         ACPI_DUMP_BUFFER (ObjDesc, sizeof (ACPI_OPERAND_OBJECT));
781         return;
782     }
783 
784     /* ObjDesc is a valid object */
785 
786     if (Depth > 0)
787     {
788         ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%*s[%u] %p Refs=%u ",
789             Depth, " ", Depth, ObjDesc, ObjDesc->Common.ReferenceCount));
790     }
791     else
792     {
793         ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p Refs=%u ",
794             ObjDesc, ObjDesc->Common.ReferenceCount));
795     }
796 
797     /* Decode object type */
798 
799     switch (ObjDesc->Common.Type)
800     {
801     case ACPI_TYPE_LOCAL_REFERENCE:
802 
803         AcpiOsPrintf ("Reference: [%s] ",
804             AcpiUtGetReferenceName (ObjDesc));
805 
806         switch (ObjDesc->Reference.Class)
807         {
808         case ACPI_REFCLASS_DEBUG:
809 
810             AcpiOsPrintf ("\n");
811             break;
812 
813         case ACPI_REFCLASS_INDEX:
814 
815             AcpiOsPrintf ("%p\n", ObjDesc->Reference.Object);
816             break;
817 
818         case ACPI_REFCLASS_TABLE:
819 
820             AcpiOsPrintf ("Table Index %X\n", ObjDesc->Reference.Value);
821             break;
822 
823         case ACPI_REFCLASS_REFOF:
824 
825             AcpiOsPrintf ("%p [%s]\n", ObjDesc->Reference.Object,
826                 AcpiUtGetTypeName (((ACPI_OPERAND_OBJECT *)
827                     ObjDesc->Reference.Object)->Common.Type));
828             break;
829 
830         case ACPI_REFCLASS_NAME:
831 
832             AcpiUtRepairName (ObjDesc->Reference.Node->Name.Ascii);
833             AcpiOsPrintf ("- [%4.4s] (Node %p)\n",
834                 ObjDesc->Reference.Node->Name.Ascii,
835                 ObjDesc->Reference.Node);
836             break;
837 
838         case ACPI_REFCLASS_ARG:
839         case ACPI_REFCLASS_LOCAL:
840 
841             AcpiOsPrintf ("%X\n", ObjDesc->Reference.Value);
842             break;
843 
844         default:    /* Unknown reference class */
845 
846             AcpiOsPrintf ("%2.2X\n", ObjDesc->Reference.Class);
847             break;
848         }
849         break;
850 
851     case ACPI_TYPE_BUFFER:
852 
853         AcpiOsPrintf ("Buffer length %.2X @ %p\n",
854             ObjDesc->Buffer.Length, ObjDesc->Buffer.Pointer);
855 
856         /* Debug only -- dump the buffer contents */
857 
858         if (ObjDesc->Buffer.Pointer)
859         {
860             Length = ObjDesc->Buffer.Length;
861             if (Length > 128)
862             {
863                 Length = 128;
864             }
865 
866             AcpiOsPrintf (
867                 "Buffer Contents: (displaying length 0x%.2X)\n", Length);
868             ACPI_DUMP_BUFFER (ObjDesc->Buffer.Pointer, Length);
869         }
870         break;
871 
872     case ACPI_TYPE_INTEGER:
873 
874         AcpiOsPrintf ("Integer %8.8X%8.8X\n",
875             ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
876         break;
877 
878     case ACPI_TYPE_PACKAGE:
879 
880         AcpiOsPrintf ("Package [Len %X] ElementArray %p\n",
881             ObjDesc->Package.Count, ObjDesc->Package.Elements);
882 
883         /*
884          * If elements exist, package element pointer is valid,
885          * and debug_level exceeds 1, dump package's elements.
886          */
887         if (ObjDesc->Package.Count &&
888             ObjDesc->Package.Elements &&
889             AcpiDbgLevel > 1)
890         {
891             for (Index = 0; Index < ObjDesc->Package.Count; Index++)
892             {
893                 AcpiExDumpOperand (
894                     ObjDesc->Package.Elements[Index], Depth + 1);
895             }
896         }
897         break;
898 
899     case ACPI_TYPE_REGION:
900 
901         AcpiOsPrintf ("Region %s (%X)",
902             AcpiUtGetRegionName (ObjDesc->Region.SpaceId),
903             ObjDesc->Region.SpaceId);
904 
905         /*
906          * If the address and length have not been evaluated,
907          * don't print them.
908          */
909         if (!(ObjDesc->Region.Flags & AOPOBJ_DATA_VALID))
910         {
911             AcpiOsPrintf ("\n");
912         }
913         else
914         {
915             AcpiOsPrintf (" base %8.8X%8.8X Length %X\n",
916                 ACPI_FORMAT_UINT64 (ObjDesc->Region.Address),
917                 ObjDesc->Region.Length);
918         }
919         break;
920 
921     case ACPI_TYPE_STRING:
922 
923         AcpiOsPrintf ("String length %X @ %p ",
924             ObjDesc->String.Length,
925             ObjDesc->String.Pointer);
926 
927         AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX);
928         AcpiOsPrintf ("\n");
929         break;
930 
931     case ACPI_TYPE_LOCAL_BANK_FIELD:
932 
933         AcpiOsPrintf ("BankField\n");
934         break;
935 
936     case ACPI_TYPE_LOCAL_REGION_FIELD:
937 
938         AcpiOsPrintf ("RegionField: Bits=%X AccWidth=%X Lock=%X Update=%X at "
939             "byte=%X bit=%X of below:\n",
940             ObjDesc->Field.BitLength,
941             ObjDesc->Field.AccessByteWidth,
942             ObjDesc->Field.FieldFlags & AML_FIELD_LOCK_RULE_MASK,
943             ObjDesc->Field.FieldFlags & AML_FIELD_UPDATE_RULE_MASK,
944             ObjDesc->Field.BaseByteOffset,
945             ObjDesc->Field.StartFieldBitOffset);
946 
947         AcpiExDumpOperand (ObjDesc->Field.RegionObj, Depth + 1);
948         break;
949 
950     case ACPI_TYPE_LOCAL_INDEX_FIELD:
951 
952         AcpiOsPrintf ("IndexField\n");
953         break;
954 
955     case ACPI_TYPE_BUFFER_FIELD:
956 
957         AcpiOsPrintf ("BufferField: %X bits at byte %X bit %X of\n",
958             ObjDesc->BufferField.BitLength,
959             ObjDesc->BufferField.BaseByteOffset,
960             ObjDesc->BufferField.StartFieldBitOffset);
961 
962         if (!ObjDesc->BufferField.BufferObj)
963         {
964             ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "*NULL*\n"));
965         }
966         else if ((ObjDesc->BufferField.BufferObj)->Common.Type !=
967             ACPI_TYPE_BUFFER)
968         {
969             AcpiOsPrintf ("*not a Buffer*\n");
970         }
971         else
972         {
973             AcpiExDumpOperand (ObjDesc->BufferField.BufferObj, Depth + 1);
974         }
975         break;
976 
977     case ACPI_TYPE_EVENT:
978 
979         AcpiOsPrintf ("Event\n");
980         break;
981 
982     case ACPI_TYPE_METHOD:
983 
984         AcpiOsPrintf ("Method(%X) @ %p:%X\n",
985             ObjDesc->Method.ParamCount,
986             ObjDesc->Method.AmlStart,
987             ObjDesc->Method.AmlLength);
988         break;
989 
990     case ACPI_TYPE_MUTEX:
991 
992         AcpiOsPrintf ("Mutex\n");
993         break;
994 
995     case ACPI_TYPE_DEVICE:
996 
997         AcpiOsPrintf ("Device\n");
998         break;
999 
1000     case ACPI_TYPE_POWER:
1001 
1002         AcpiOsPrintf ("Power\n");
1003         break;
1004 
1005     case ACPI_TYPE_PROCESSOR:
1006 
1007         AcpiOsPrintf ("Processor\n");
1008         break;
1009 
1010     case ACPI_TYPE_THERMAL:
1011 
1012         AcpiOsPrintf ("Thermal\n");
1013         break;
1014 
1015     default:
1016 
1017         /* Unknown Type */
1018 
1019         AcpiOsPrintf ("Unknown Type %X\n", ObjDesc->Common.Type);
1020         break;
1021     }
1022 
1023     return;
1024 }
1025 
1026 
1027 /*******************************************************************************
1028  *
1029  * FUNCTION:    AcpiExDumpOperands
1030  *
1031  * PARAMETERS:  Operands            - A list of Operand objects
1032  *              OpcodeName          - AML opcode name
1033  *              NumOperands         - Operand count for this opcode
1034  *
1035  * DESCRIPTION: Dump the operands associated with the opcode
1036  *
1037  ******************************************************************************/
1038 
1039 void
AcpiExDumpOperands(ACPI_OPERAND_OBJECT ** Operands,const char * OpcodeName,UINT32 NumOperands)1040 AcpiExDumpOperands (
1041     ACPI_OPERAND_OBJECT     **Operands,
1042     const char              *OpcodeName,
1043     UINT32                  NumOperands)
1044 {
1045     ACPI_FUNCTION_TRACE (ExDumpOperands);
1046 
1047 
1048     if (!OpcodeName)
1049     {
1050         OpcodeName = "UNKNOWN";
1051     }
1052 
1053     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
1054         "**** Start operand dump for opcode [%s], %u operands\n",
1055         OpcodeName, NumOperands));
1056 
1057     if (NumOperands == 0)
1058     {
1059         NumOperands = 1;
1060     }
1061 
1062     /* Dump the individual operands */
1063 
1064     while (NumOperands)
1065     {
1066         AcpiExDumpOperand (*Operands, 0);
1067         Operands++;
1068         NumOperands--;
1069     }
1070 
1071     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
1072         "**** End operand dump for [%s]\n", OpcodeName));
1073     return_VOID;
1074 }
1075 
1076 
1077 /*******************************************************************************
1078  *
1079  * FUNCTION:    AcpiExOut* functions
1080  *
1081  * PARAMETERS:  Title               - Descriptive text
1082  *              Value               - Value to be displayed
1083  *
1084  * DESCRIPTION: Object dump output formatting functions. These functions
1085  *              reduce the number of format strings required and keeps them
1086  *              all in one place for easy modification.
1087  *
1088  ******************************************************************************/
1089 
1090 static void
AcpiExOutString(const char * Title,const char * Value)1091 AcpiExOutString (
1092     const char              *Title,
1093     const char              *Value)
1094 {
1095     AcpiOsPrintf ("%20s : %s\n", Title, Value);
1096 }
1097 
1098 static void
AcpiExOutPointer(const char * Title,const void * Value)1099 AcpiExOutPointer (
1100     const char              *Title,
1101     const void              *Value)
1102 {
1103     AcpiOsPrintf ("%20s : %p\n", Title, Value);
1104 }
1105 
1106 
1107 /*******************************************************************************
1108  *
1109  * FUNCTION:    AcpiExDumpNamespaceNode
1110  *
1111  * PARAMETERS:  Node                - Descriptor to dump
1112  *              Flags               - Force display if TRUE
1113  *
1114  * DESCRIPTION: Dumps the members of the given.Node
1115  *
1116  ******************************************************************************/
1117 
1118 void
AcpiExDumpNamespaceNode(ACPI_NAMESPACE_NODE * Node,UINT32 Flags)1119 AcpiExDumpNamespaceNode (
1120     ACPI_NAMESPACE_NODE     *Node,
1121     UINT32                  Flags)
1122 {
1123 
1124     ACPI_FUNCTION_ENTRY ();
1125 
1126 
1127     if (!Flags)
1128     {
1129         /* Check if debug output enabled */
1130 
1131         if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_OBJECTS, _COMPONENT))
1132         {
1133             return;
1134         }
1135     }
1136 
1137     AcpiOsPrintf ("%20s : %4.4s\n", "Name", AcpiUtGetNodeName (Node));
1138     AcpiOsPrintf ("%20s : %2.2X [%s]\n", "Type",
1139         Node->Type, AcpiUtGetTypeName (Node->Type));
1140 
1141     AcpiExDumpObject (ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Node),
1142         AcpiExDumpNode);
1143 }
1144 
1145 
1146 /*******************************************************************************
1147  *
1148  * FUNCTION:    AcpiExDumpReferenceObj
1149  *
1150  * PARAMETERS:  Object              - Descriptor to dump
1151  *
1152  * DESCRIPTION: Dumps a reference object
1153  *
1154  ******************************************************************************/
1155 
1156 static void
AcpiExDumpReferenceObj(ACPI_OPERAND_OBJECT * ObjDesc)1157 AcpiExDumpReferenceObj (
1158     ACPI_OPERAND_OBJECT     *ObjDesc)
1159 {
1160     ACPI_BUFFER             RetBuf;
1161     ACPI_STATUS             Status;
1162 
1163 
1164     RetBuf.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
1165 
1166     if (ObjDesc->Reference.Class == ACPI_REFCLASS_NAME)
1167     {
1168         AcpiOsPrintf (" %p ", ObjDesc->Reference.Node);
1169 
1170         Status = AcpiNsHandleToPathname (ObjDesc->Reference.Node,
1171             &RetBuf, TRUE);
1172         if (ACPI_FAILURE (Status))
1173         {
1174             AcpiOsPrintf (" Could not convert name to pathname: %s\n",
1175                 AcpiFormatException (Status));
1176         }
1177         else
1178         {
1179             AcpiOsPrintf ("%s: %s\n",
1180                 AcpiUtGetTypeName (ObjDesc->Reference.Node->Type),
1181                 (char *) RetBuf.Pointer);
1182             ACPI_FREE (RetBuf.Pointer);
1183         }
1184     }
1185     else if (ObjDesc->Reference.Object)
1186     {
1187         if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_OPERAND)
1188         {
1189             AcpiOsPrintf ("%22s %p", "Target :",
1190                 ObjDesc->Reference.Object);
1191             if (ObjDesc->Reference.Class == ACPI_REFCLASS_TABLE)
1192             {
1193                 AcpiOsPrintf (" Table Index: %X\n",
1194                     ObjDesc->Reference.Value);
1195             }
1196             else
1197             {
1198                 AcpiOsPrintf (" [%s]\n",
1199                     AcpiUtGetTypeName (((ACPI_OPERAND_OBJECT *)
1200                     ObjDesc->Reference.Object)->Common.Type));
1201             }
1202         }
1203         else
1204         {
1205             AcpiOsPrintf (" Target: %p\n", ObjDesc->Reference.Object);
1206         }
1207     }
1208 }
1209 
1210 
1211 /*******************************************************************************
1212  *
1213  * FUNCTION:    AcpiExDumpPackageObj
1214  *
1215  * PARAMETERS:  ObjDesc             - Descriptor to dump
1216  *              Level               - Indentation Level
1217  *              Index               - Package index for this object
1218  *
1219  * DESCRIPTION: Dumps the elements of the package
1220  *
1221  ******************************************************************************/
1222 
1223 static void
AcpiExDumpPackageObj(ACPI_OPERAND_OBJECT * ObjDesc,UINT32 Level,UINT32 Index)1224 AcpiExDumpPackageObj (
1225     ACPI_OPERAND_OBJECT     *ObjDesc,
1226     UINT32                  Level,
1227     UINT32                  Index)
1228 {
1229     UINT32                  i;
1230 
1231 
1232     /* Indentation and index output */
1233 
1234     if (Level > 0)
1235     {
1236         for (i = 0; i < Level; i++)
1237         {
1238             AcpiOsPrintf ("  ");
1239         }
1240 
1241         AcpiOsPrintf ("[%.2d] ", Index);
1242     }
1243 
1244     AcpiOsPrintf ("%p ", ObjDesc);
1245 
1246     /* Null package elements are allowed */
1247 
1248     if (!ObjDesc)
1249     {
1250         AcpiOsPrintf ("[Null Object]\n");
1251         return;
1252     }
1253 
1254     /* Packages may only contain a few object types */
1255 
1256     switch (ObjDesc->Common.Type)
1257     {
1258     case ACPI_TYPE_INTEGER:
1259 
1260         AcpiOsPrintf ("[Integer] = %8.8X%8.8X\n",
1261             ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
1262         break;
1263 
1264     case ACPI_TYPE_STRING:
1265 
1266         AcpiOsPrintf ("[String]  Value: ");
1267         AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX);
1268         AcpiOsPrintf ("\n");
1269         break;
1270 
1271     case ACPI_TYPE_BUFFER:
1272 
1273         AcpiOsPrintf ("[Buffer] Length %.2X = ", ObjDesc->Buffer.Length);
1274         if (ObjDesc->Buffer.Length)
1275         {
1276             AcpiUtDebugDumpBuffer (
1277                 ACPI_CAST_PTR (UINT8, ObjDesc->Buffer.Pointer),
1278                 ObjDesc->Buffer.Length, DB_DWORD_DISPLAY, _COMPONENT);
1279         }
1280         else
1281         {
1282             AcpiOsPrintf ("\n");
1283         }
1284         break;
1285 
1286     case ACPI_TYPE_PACKAGE:
1287 
1288         AcpiOsPrintf ("[Package] Contains %u Elements:\n",
1289             ObjDesc->Package.Count);
1290 
1291         for (i = 0; i < ObjDesc->Package.Count; i++)
1292         {
1293             AcpiExDumpPackageObj (
1294                 ObjDesc->Package.Elements[i], Level + 1, i);
1295         }
1296         break;
1297 
1298     case ACPI_TYPE_LOCAL_REFERENCE:
1299 
1300         AcpiOsPrintf ("[Object Reference] Class [%s]",
1301             AcpiUtGetReferenceName (ObjDesc));
1302         AcpiExDumpReferenceObj (ObjDesc);
1303         break;
1304 
1305     default:
1306 
1307         AcpiOsPrintf ("[%s] Type: %2.2X\n",
1308             AcpiUtGetTypeName (ObjDesc->Common.Type), ObjDesc->Common.Type);
1309         break;
1310     }
1311 }
1312 
1313 
1314 /*******************************************************************************
1315  *
1316  * FUNCTION:    AcpiExDumpObjectDescriptor
1317  *
1318  * PARAMETERS:  ObjDesc             - Descriptor to dump
1319  *              Flags               - Force display if TRUE
1320  *
1321  * DESCRIPTION: Dumps the members of the object descriptor given.
1322  *
1323  ******************************************************************************/
1324 
1325 void
AcpiExDumpObjectDescriptor(ACPI_OPERAND_OBJECT * ObjDesc,UINT32 Flags)1326 AcpiExDumpObjectDescriptor (
1327     ACPI_OPERAND_OBJECT     *ObjDesc,
1328     UINT32                  Flags)
1329 {
1330     ACPI_FUNCTION_TRACE (ExDumpObjectDescriptor);
1331 
1332 
1333     if (!ObjDesc)
1334     {
1335         return_VOID;
1336     }
1337 
1338     if (!Flags)
1339     {
1340         /* Check if debug output enabled */
1341 
1342         if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_OBJECTS, _COMPONENT))
1343         {
1344             return_VOID;
1345         }
1346     }
1347 
1348     if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED)
1349     {
1350         AcpiExDumpNamespaceNode ((ACPI_NAMESPACE_NODE *) ObjDesc, Flags);
1351 
1352         ObjDesc = ((ACPI_NAMESPACE_NODE *) ObjDesc)->Object;
1353         if (!ObjDesc)
1354         {
1355             return_VOID;
1356         }
1357 
1358         AcpiOsPrintf ("\nAttached Object %p", ObjDesc);
1359         if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED)
1360         {
1361             AcpiOsPrintf (" - Namespace Node");
1362         }
1363 
1364         AcpiOsPrintf (":\n");
1365         goto DumpObject;
1366     }
1367 
1368     if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND)
1369     {
1370         AcpiOsPrintf (
1371             "%p is not an ACPI operand object: [%s]\n",
1372             ObjDesc, AcpiUtGetDescriptorName (ObjDesc));
1373         return_VOID;
1374     }
1375 
1376     /* Validate the object type */
1377 
1378     if (ObjDesc->Common.Type > ACPI_TYPE_LOCAL_MAX)
1379     {
1380         AcpiOsPrintf ("Not a known object type: %2.2X\n",
1381             ObjDesc->Common.Type);
1382         return_VOID;
1383     }
1384 
1385 
1386 DumpObject:
1387 
1388     if (!ObjDesc)
1389     {
1390         return_VOID;
1391     }
1392 
1393     /* Common Fields */
1394 
1395     AcpiExDumpObject (ObjDesc, AcpiExDumpCommon);
1396 
1397     /* Object-specific fields */
1398 
1399     AcpiExDumpObject (ObjDesc, AcpiExDumpInfo[ObjDesc->Common.Type]);
1400 
1401     if (ObjDesc->Common.Type == ACPI_TYPE_REGION)
1402     {
1403         ObjDesc = ObjDesc->Common.NextObject;
1404         if (ObjDesc->Common.Type > ACPI_TYPE_LOCAL_MAX)
1405         {
1406             AcpiOsPrintf (
1407                 "Secondary object is not a known object type: %2.2X\n",
1408                 ObjDesc->Common.Type);
1409 
1410             return_VOID;
1411         }
1412 
1413         AcpiOsPrintf ("\nExtra attached Object (%p):\n", ObjDesc);
1414         AcpiExDumpObject (ObjDesc, AcpiExDumpInfo[ObjDesc->Common.Type]);
1415     }
1416 
1417     return_VOID;
1418 }
1419 
1420 #endif
1421