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
169static void
170AcpiExOutString (
171    const char              *Title,
172    const char              *Value);
173
174static void
175AcpiExOutPointer (
176    const char              *Title,
177    const void              *Value);
178
179static void
180AcpiExDumpObject (
181    ACPI_OPERAND_OBJECT     *ObjDesc,
182    ACPI_EXDUMP_INFO        *Info);
183
184static void
185AcpiExDumpReferenceObj (
186    ACPI_OPERAND_OBJECT     *ObjDesc);
187
188static void
189AcpiExDumpPackageObj (
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
204static 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
210static 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
218static 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
227static 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
237static 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
245static 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
251static 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
264static 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
274static 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
286static 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
296static 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
307static 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
315static 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
322static 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
331static 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
340static 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
349static 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
362static 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
372static 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
383static 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
393static 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
402static 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
411static 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
422static 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
436static 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
485static void
486AcpiExDumpObject (
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
741void
742AcpiExDumpOperand (
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
1039void
1040AcpiExDumpOperands (
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
1090static void
1091AcpiExOutString (
1092    const char              *Title,
1093    const char              *Value)
1094{
1095    AcpiOsPrintf ("%20s : %s\n", Title, Value);
1096}
1097
1098static void
1099AcpiExOutPointer (
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
1118void
1119AcpiExDumpNamespaceNode (
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
1156static void
1157AcpiExDumpReferenceObj (
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
1223static void
1224AcpiExDumpPackageObj (
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
1325void
1326AcpiExDumpObjectDescriptor (
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
1386DumpObject:
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