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