1 | // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 |
2 | /****************************************************************************** |
3 | * |
4 | * Module Name: exdump - Interpreter debug output routines |
5 | * |
6 | * Copyright (C) 2000 - 2023, Intel Corp. |
7 | * |
8 | *****************************************************************************/ |
9 | |
10 | #include <acpi/acpi.h> |
11 | #include "accommon.h" |
12 | #include "acinterp.h" |
13 | #include "amlcode.h" |
14 | #include "acnamesp.h" |
15 | |
16 | #define _COMPONENT ACPI_EXECUTER |
17 | ACPI_MODULE_NAME("exdump" ) |
18 | |
19 | /* |
20 | * The following routines are used for debug output only |
21 | */ |
22 | #if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER) |
23 | /* Local prototypes */ |
24 | static void acpi_ex_out_string(const char *title, const char *value); |
25 | |
26 | static void acpi_ex_out_pointer(const char *title, const void *value); |
27 | |
28 | static void |
29 | acpi_ex_dump_object(union acpi_operand_object *obj_desc, |
30 | struct acpi_exdump_info *info); |
31 | |
32 | static void acpi_ex_dump_reference_obj(union acpi_operand_object *obj_desc); |
33 | |
34 | static void |
35 | acpi_ex_dump_package_obj(union acpi_operand_object *obj_desc, |
36 | u32 level, u32 index); |
37 | |
38 | /******************************************************************************* |
39 | * |
40 | * Object Descriptor info tables |
41 | * |
42 | * Note: The first table entry must be an INIT opcode and must contain |
43 | * the table length (number of table entries) |
44 | * |
45 | ******************************************************************************/ |
46 | |
47 | static struct acpi_exdump_info acpi_ex_dump_integer[2] = { |
48 | {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_integer), NULL}, |
49 | {ACPI_EXD_UINT64, ACPI_EXD_OFFSET(integer.value), "Value" } |
50 | }; |
51 | |
52 | static struct acpi_exdump_info acpi_ex_dump_string[4] = { |
53 | {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_string), NULL}, |
54 | {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(string.length), "Length" }, |
55 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(string.pointer), "Pointer" }, |
56 | {ACPI_EXD_STRING, 0, NULL} |
57 | }; |
58 | |
59 | static struct acpi_exdump_info acpi_ex_dump_buffer[5] = { |
60 | {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_buffer), NULL}, |
61 | {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(buffer.length), "Length" }, |
62 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(buffer.pointer), "Pointer" }, |
63 | {ACPI_EXD_NODE, ACPI_EXD_OFFSET(buffer.node), "Parent Node" }, |
64 | {ACPI_EXD_BUFFER, 0, NULL} |
65 | }; |
66 | |
67 | static struct acpi_exdump_info acpi_ex_dump_package[6] = { |
68 | {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_package), NULL}, |
69 | {ACPI_EXD_NODE, ACPI_EXD_OFFSET(package.node), "Parent Node" }, |
70 | {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(package.flags), "Flags" }, |
71 | {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(package.count), "Element Count" }, |
72 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(package.elements), "Element List" }, |
73 | {ACPI_EXD_PACKAGE, 0, NULL} |
74 | }; |
75 | |
76 | static struct acpi_exdump_info acpi_ex_dump_device[4] = { |
77 | {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_device), NULL}, |
78 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(device.notify_list[0]), |
79 | "System Notify" }, |
80 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(device.notify_list[1]), |
81 | "Device Notify" }, |
82 | {ACPI_EXD_HDLR_LIST, ACPI_EXD_OFFSET(device.handler), "Handler" } |
83 | }; |
84 | |
85 | static struct acpi_exdump_info acpi_ex_dump_event[2] = { |
86 | {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_event), NULL}, |
87 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(event.os_semaphore), "OsSemaphore" } |
88 | }; |
89 | |
90 | static struct acpi_exdump_info acpi_ex_dump_method[9] = { |
91 | {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_method), NULL}, |
92 | {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(method.info_flags), "Info Flags" }, |
93 | {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(method.param_count), |
94 | "Parameter Count" }, |
95 | {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(method.sync_level), "Sync Level" }, |
96 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(method.mutex), "Mutex" }, |
97 | {ACPI_EXD_UINT16, ACPI_EXD_OFFSET(method.owner_id), "Owner Id" }, |
98 | {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(method.thread_count), "Thread Count" }, |
99 | {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(method.aml_length), "Aml Length" }, |
100 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(method.aml_start), "Aml Start" } |
101 | }; |
102 | |
103 | static struct acpi_exdump_info acpi_ex_dump_mutex[6] = { |
104 | {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_mutex), NULL}, |
105 | {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(mutex.sync_level), "Sync Level" }, |
106 | {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(mutex.original_sync_level), |
107 | "Original Sync Level" }, |
108 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(mutex.owner_thread), "Owner Thread" }, |
109 | {ACPI_EXD_UINT16, ACPI_EXD_OFFSET(mutex.acquisition_depth), |
110 | "Acquire Depth" }, |
111 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(mutex.os_mutex), "OsMutex" } |
112 | }; |
113 | |
114 | static struct acpi_exdump_info acpi_ex_dump_region[8] = { |
115 | {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_region), NULL}, |
116 | {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(region.space_id), "Space Id" }, |
117 | {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(region.flags), "Flags" }, |
118 | {ACPI_EXD_NODE, ACPI_EXD_OFFSET(region.node), "Parent Node" }, |
119 | {ACPI_EXD_ADDRESS, ACPI_EXD_OFFSET(region.address), "Address" }, |
120 | {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(region.length), "Length" }, |
121 | {ACPI_EXD_HDLR_LIST, ACPI_EXD_OFFSET(region.handler), "Handler" }, |
122 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(region.next), "Next" } |
123 | }; |
124 | |
125 | static struct acpi_exdump_info acpi_ex_dump_power[6] = { |
126 | {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_power), NULL}, |
127 | {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(power_resource.system_level), |
128 | "System Level" }, |
129 | {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(power_resource.resource_order), |
130 | "Resource Order" }, |
131 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(power_resource.notify_list[0]), |
132 | "System Notify" }, |
133 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(power_resource.notify_list[1]), |
134 | "Device Notify" }, |
135 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(power_resource.handler), "Handler" } |
136 | }; |
137 | |
138 | static struct acpi_exdump_info acpi_ex_dump_processor[7] = { |
139 | {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_processor), NULL}, |
140 | {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(processor.proc_id), "Processor ID" }, |
141 | {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(processor.length), "Length" }, |
142 | {ACPI_EXD_ADDRESS, ACPI_EXD_OFFSET(processor.address), "Address" }, |
143 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(processor.notify_list[0]), |
144 | "System Notify" }, |
145 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(processor.notify_list[1]), |
146 | "Device Notify" }, |
147 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(processor.handler), "Handler" } |
148 | }; |
149 | |
150 | static struct acpi_exdump_info acpi_ex_dump_thermal[4] = { |
151 | {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_thermal), NULL}, |
152 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(thermal_zone.notify_list[0]), |
153 | "System Notify" }, |
154 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(thermal_zone.notify_list[1]), |
155 | "Device Notify" }, |
156 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(thermal_zone.handler), "Handler" } |
157 | }; |
158 | |
159 | static struct acpi_exdump_info acpi_ex_dump_buffer_field[3] = { |
160 | {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_buffer_field), NULL}, |
161 | {ACPI_EXD_FIELD, 0, NULL}, |
162 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(buffer_field.buffer_obj), |
163 | "Buffer Object" } |
164 | }; |
165 | |
166 | static struct acpi_exdump_info acpi_ex_dump_region_field[5] = { |
167 | {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_region_field), NULL}, |
168 | {ACPI_EXD_FIELD, 0, NULL}, |
169 | {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(field.access_length), "AccessLength" }, |
170 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(field.region_obj), "Region Object" }, |
171 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(field.resource_buffer), |
172 | "ResourceBuffer" } |
173 | }; |
174 | |
175 | static struct acpi_exdump_info acpi_ex_dump_bank_field[5] = { |
176 | {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_bank_field), NULL}, |
177 | {ACPI_EXD_FIELD, 0, NULL}, |
178 | {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(bank_field.value), "Value" }, |
179 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(bank_field.region_obj), |
180 | "Region Object" }, |
181 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(bank_field.bank_obj), "Bank Object" } |
182 | }; |
183 | |
184 | static struct acpi_exdump_info acpi_ex_dump_index_field[5] = { |
185 | {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_bank_field), NULL}, |
186 | {ACPI_EXD_FIELD, 0, NULL}, |
187 | {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(index_field.value), "Value" }, |
188 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(index_field.index_obj), |
189 | "Index Object" }, |
190 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(index_field.data_obj), "Data Object" } |
191 | }; |
192 | |
193 | static struct acpi_exdump_info acpi_ex_dump_reference[9] = { |
194 | {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_reference), NULL}, |
195 | {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(reference.class), "Class" }, |
196 | {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(reference.target_type), "Target Type" }, |
197 | {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(reference.value), "Value" }, |
198 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(reference.object), "Object Desc" }, |
199 | {ACPI_EXD_NODE, ACPI_EXD_OFFSET(reference.node), "Node" }, |
200 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(reference.where), "Where" }, |
201 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(reference.index_pointer), |
202 | "Index Pointer" }, |
203 | {ACPI_EXD_REFERENCE, 0, NULL} |
204 | }; |
205 | |
206 | static struct acpi_exdump_info acpi_ex_dump_address_handler[6] = { |
207 | {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_address_handler), |
208 | NULL}, |
209 | {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(address_space.space_id), "Space Id" }, |
210 | {ACPI_EXD_HDLR_LIST, ACPI_EXD_OFFSET(address_space.next), "Next" }, |
211 | {ACPI_EXD_RGN_LIST, ACPI_EXD_OFFSET(address_space.region_list), |
212 | "Region List" }, |
213 | {ACPI_EXD_NODE, ACPI_EXD_OFFSET(address_space.node), "Node" }, |
214 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(address_space.context), "Context" } |
215 | }; |
216 | |
217 | static struct acpi_exdump_info acpi_ex_dump_notify[7] = { |
218 | {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_notify), NULL}, |
219 | {ACPI_EXD_NODE, ACPI_EXD_OFFSET(notify.node), "Node" }, |
220 | {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(notify.handler_type), "Handler Type" }, |
221 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(notify.handler), "Handler" }, |
222 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(notify.context), "Context" }, |
223 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(notify.next[0]), |
224 | "Next System Notify" }, |
225 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(notify.next[1]), "Next Device Notify" } |
226 | }; |
227 | |
228 | static struct acpi_exdump_info [6] = { |
229 | {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_extra), NULL}, |
230 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(extra.method_REG), "_REG Method" }, |
231 | {ACPI_EXD_NODE, ACPI_EXD_OFFSET(extra.scope_node), "Scope Node" }, |
232 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(extra.region_context), |
233 | "Region Context" }, |
234 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(extra.aml_start), "Aml Start" }, |
235 | {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(extra.aml_length), "Aml Length" } |
236 | }; |
237 | |
238 | static struct acpi_exdump_info acpi_ex_dump_data[3] = { |
239 | {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_data), NULL}, |
240 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(data.handler), "Handler" }, |
241 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(data.pointer), "Raw Data" } |
242 | }; |
243 | |
244 | /* Miscellaneous tables */ |
245 | |
246 | static struct acpi_exdump_info acpi_ex_dump_common[5] = { |
247 | {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_common), NULL}, |
248 | {ACPI_EXD_TYPE, 0, NULL}, |
249 | {ACPI_EXD_UINT16, ACPI_EXD_OFFSET(common.reference_count), |
250 | "Reference Count" }, |
251 | {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(common.flags), "Flags" }, |
252 | {ACPI_EXD_LIST, ACPI_EXD_OFFSET(common.next_object), "Object List" } |
253 | }; |
254 | |
255 | static struct acpi_exdump_info acpi_ex_dump_field_common[7] = { |
256 | {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_field_common), NULL}, |
257 | {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(common_field.field_flags), |
258 | "Field Flags" }, |
259 | {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(common_field.access_byte_width), |
260 | "Access Byte Width" }, |
261 | {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(common_field.bit_length), |
262 | "Bit Length" }, |
263 | {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(common_field.start_field_bit_offset), |
264 | "Field Bit Offset" }, |
265 | {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(common_field.base_byte_offset), |
266 | "Base Byte Offset" }, |
267 | {ACPI_EXD_NODE, ACPI_EXD_OFFSET(common_field.node), "Parent Node" } |
268 | }; |
269 | |
270 | static struct acpi_exdump_info acpi_ex_dump_node[7] = { |
271 | {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_node), NULL}, |
272 | {ACPI_EXD_UINT16, ACPI_EXD_NSOFFSET(flags), "Flags" }, |
273 | {ACPI_EXD_UINT16, ACPI_EXD_NSOFFSET(owner_id), "Owner Id" }, |
274 | {ACPI_EXD_LIST, ACPI_EXD_NSOFFSET(object), "Object List" }, |
275 | {ACPI_EXD_NODE, ACPI_EXD_NSOFFSET(parent), "Parent" }, |
276 | {ACPI_EXD_NODE, ACPI_EXD_NSOFFSET(child), "Child" }, |
277 | {ACPI_EXD_NODE, ACPI_EXD_NSOFFSET(peer), "Peer" } |
278 | }; |
279 | |
280 | /* Dispatch table, indexed by object type */ |
281 | |
282 | static struct acpi_exdump_info *acpi_ex_dump_info[] = { |
283 | NULL, |
284 | acpi_ex_dump_integer, |
285 | acpi_ex_dump_string, |
286 | acpi_ex_dump_buffer, |
287 | acpi_ex_dump_package, |
288 | NULL, |
289 | acpi_ex_dump_device, |
290 | acpi_ex_dump_event, |
291 | acpi_ex_dump_method, |
292 | acpi_ex_dump_mutex, |
293 | acpi_ex_dump_region, |
294 | acpi_ex_dump_power, |
295 | acpi_ex_dump_processor, |
296 | acpi_ex_dump_thermal, |
297 | acpi_ex_dump_buffer_field, |
298 | NULL, |
299 | NULL, |
300 | acpi_ex_dump_region_field, |
301 | acpi_ex_dump_bank_field, |
302 | acpi_ex_dump_index_field, |
303 | acpi_ex_dump_reference, |
304 | NULL, |
305 | NULL, |
306 | acpi_ex_dump_notify, |
307 | acpi_ex_dump_address_handler, |
308 | NULL, |
309 | NULL, |
310 | NULL, |
311 | acpi_ex_dump_extra, |
312 | acpi_ex_dump_data |
313 | }; |
314 | |
315 | /******************************************************************************* |
316 | * |
317 | * FUNCTION: acpi_ex_dump_object |
318 | * |
319 | * PARAMETERS: obj_desc - Descriptor to dump |
320 | * info - Info table corresponding to this object |
321 | * type |
322 | * |
323 | * RETURN: None |
324 | * |
325 | * DESCRIPTION: Walk the info table for this object |
326 | * |
327 | ******************************************************************************/ |
328 | |
329 | static void |
330 | acpi_ex_dump_object(union acpi_operand_object *obj_desc, |
331 | struct acpi_exdump_info *info) |
332 | { |
333 | u8 *target; |
334 | const char *name; |
335 | u8 count; |
336 | union acpi_operand_object *start; |
337 | union acpi_operand_object *data = NULL; |
338 | union acpi_operand_object *next; |
339 | struct acpi_namespace_node *node; |
340 | |
341 | if (!info) { |
342 | acpi_os_printf |
343 | (format: "ExDumpObject: Display not implemented for object type %s\n" , |
344 | acpi_ut_get_object_type_name(obj_desc)); |
345 | return; |
346 | } |
347 | |
348 | /* First table entry must contain the table length (# of table entries) */ |
349 | |
350 | count = info->offset; |
351 | |
352 | while (count) { |
353 | if (!obj_desc) { |
354 | return; |
355 | } |
356 | |
357 | target = ACPI_ADD_PTR(u8, obj_desc, info->offset); |
358 | name = info->name; |
359 | |
360 | switch (info->opcode) { |
361 | case ACPI_EXD_INIT: |
362 | |
363 | break; |
364 | |
365 | case ACPI_EXD_TYPE: |
366 | |
367 | acpi_os_printf(format: "%20s : %2.2X [%s]\n" , "Type" , |
368 | obj_desc->common.type, |
369 | acpi_ut_get_object_type_name(obj_desc)); |
370 | break; |
371 | |
372 | case ACPI_EXD_UINT8: |
373 | |
374 | acpi_os_printf(format: "%20s : %2.2X\n" , name, *target); |
375 | break; |
376 | |
377 | case ACPI_EXD_UINT16: |
378 | |
379 | acpi_os_printf(format: "%20s : %4.4X\n" , name, |
380 | ACPI_GET16(target)); |
381 | break; |
382 | |
383 | case ACPI_EXD_UINT32: |
384 | |
385 | acpi_os_printf(format: "%20s : %8.8X\n" , name, |
386 | ACPI_GET32(target)); |
387 | break; |
388 | |
389 | case ACPI_EXD_UINT64: |
390 | |
391 | acpi_os_printf(format: "%20s : %8.8X%8.8X\n" , "Value" , |
392 | ACPI_FORMAT_UINT64(ACPI_GET64(target))); |
393 | break; |
394 | |
395 | case ACPI_EXD_POINTER: |
396 | case ACPI_EXD_ADDRESS: |
397 | |
398 | acpi_ex_out_pointer(title: name, |
399 | value: *ACPI_CAST_PTR(void *, target)); |
400 | break; |
401 | |
402 | case ACPI_EXD_STRING: |
403 | |
404 | acpi_ut_print_string(string: obj_desc->string.pointer, |
405 | ACPI_UINT8_MAX); |
406 | acpi_os_printf(format: "\n" ); |
407 | break; |
408 | |
409 | case ACPI_EXD_BUFFER: |
410 | |
411 | ACPI_DUMP_BUFFER(obj_desc->buffer.pointer, |
412 | obj_desc->buffer.length); |
413 | break; |
414 | |
415 | case ACPI_EXD_PACKAGE: |
416 | |
417 | /* Dump the package contents */ |
418 | |
419 | acpi_os_printf(format: "\nPackage Contents:\n" ); |
420 | acpi_ex_dump_package_obj(obj_desc, level: 0, index: 0); |
421 | break; |
422 | |
423 | case ACPI_EXD_FIELD: |
424 | |
425 | acpi_ex_dump_object(obj_desc, |
426 | info: acpi_ex_dump_field_common); |
427 | break; |
428 | |
429 | case ACPI_EXD_REFERENCE: |
430 | |
431 | acpi_ex_out_string(title: "Class Name" , |
432 | value: acpi_ut_get_reference_name |
433 | (object: obj_desc)); |
434 | acpi_ex_dump_reference_obj(obj_desc); |
435 | break; |
436 | |
437 | case ACPI_EXD_LIST: |
438 | |
439 | start = *ACPI_CAST_PTR(void *, target); |
440 | next = start; |
441 | |
442 | acpi_os_printf(format: "%20s : %p " , name, next); |
443 | if (next) { |
444 | acpi_os_printf(format: "%s (Type %2.2X)" , |
445 | acpi_ut_get_object_type_name |
446 | (obj_desc: next), next->common.type); |
447 | |
448 | while (next->common.next_object) { |
449 | if ((next->common.type == |
450 | ACPI_TYPE_LOCAL_DATA) && !data) { |
451 | data = next; |
452 | } |
453 | |
454 | next = next->common.next_object; |
455 | acpi_os_printf(format: "->%p(%s %2.2X)" , next, |
456 | acpi_ut_get_object_type_name |
457 | (obj_desc: next), |
458 | next->common.type); |
459 | |
460 | if ((next == start) || (next == data)) { |
461 | acpi_os_printf |
462 | (format: "\n**** Error: Object list appears to be circular linked" ); |
463 | break; |
464 | } |
465 | } |
466 | } else { |
467 | acpi_os_printf(format: "- No attached objects" ); |
468 | } |
469 | |
470 | acpi_os_printf(format: "\n" ); |
471 | break; |
472 | |
473 | case ACPI_EXD_HDLR_LIST: |
474 | |
475 | start = *ACPI_CAST_PTR(void *, target); |
476 | next = start; |
477 | |
478 | acpi_os_printf(format: "%20s : %p" , name, next); |
479 | if (next) { |
480 | acpi_os_printf(format: "(%s %2.2X)" , |
481 | acpi_ut_get_object_type_name |
482 | (obj_desc: next), |
483 | next->address_space.space_id); |
484 | |
485 | while (next->address_space.next) { |
486 | if ((next->common.type == |
487 | ACPI_TYPE_LOCAL_DATA) && !data) { |
488 | data = next; |
489 | } |
490 | |
491 | next = next->address_space.next; |
492 | acpi_os_printf(format: "->%p(%s %2.2X)" , next, |
493 | acpi_ut_get_object_type_name |
494 | (obj_desc: next), |
495 | next->address_space. |
496 | space_id); |
497 | |
498 | if ((next == start) || (next == data)) { |
499 | acpi_os_printf |
500 | (format: "\n**** Error: Handler list appears to be circular linked" ); |
501 | break; |
502 | } |
503 | } |
504 | } |
505 | |
506 | acpi_os_printf(format: "\n" ); |
507 | break; |
508 | |
509 | case ACPI_EXD_RGN_LIST: |
510 | |
511 | start = *ACPI_CAST_PTR(void *, target); |
512 | next = start; |
513 | |
514 | acpi_os_printf(format: "%20s : %p" , name, next); |
515 | if (next) { |
516 | acpi_os_printf(format: "(%s %2.2X)" , |
517 | acpi_ut_get_object_type_name |
518 | (obj_desc: next), next->common.type); |
519 | |
520 | while (next->region.next) { |
521 | if ((next->common.type == |
522 | ACPI_TYPE_LOCAL_DATA) && !data) { |
523 | data = next; |
524 | } |
525 | |
526 | next = next->region.next; |
527 | acpi_os_printf(format: "->%p(%s %2.2X)" , next, |
528 | acpi_ut_get_object_type_name |
529 | (obj_desc: next), |
530 | next->common.type); |
531 | |
532 | if ((next == start) || (next == data)) { |
533 | acpi_os_printf |
534 | (format: "\n**** Error: Region list appears to be circular linked" ); |
535 | break; |
536 | } |
537 | } |
538 | } |
539 | |
540 | acpi_os_printf(format: "\n" ); |
541 | break; |
542 | |
543 | case ACPI_EXD_NODE: |
544 | |
545 | node = |
546 | *ACPI_CAST_PTR(struct acpi_namespace_node *, |
547 | target); |
548 | |
549 | acpi_os_printf(format: "%20s : %p" , name, node); |
550 | if (node) { |
551 | acpi_os_printf(format: " [%4.4s]" , node->name.ascii); |
552 | } |
553 | acpi_os_printf(format: "\n" ); |
554 | break; |
555 | |
556 | default: |
557 | |
558 | acpi_os_printf(format: "**** Invalid table opcode [%X] ****\n" , |
559 | info->opcode); |
560 | return; |
561 | } |
562 | |
563 | info++; |
564 | count--; |
565 | } |
566 | } |
567 | |
568 | /******************************************************************************* |
569 | * |
570 | * FUNCTION: acpi_ex_dump_operand |
571 | * |
572 | * PARAMETERS: *obj_desc - Pointer to entry to be dumped |
573 | * depth - Current nesting depth |
574 | * |
575 | * RETURN: None |
576 | * |
577 | * DESCRIPTION: Dump an operand object |
578 | * |
579 | ******************************************************************************/ |
580 | |
581 | void acpi_ex_dump_operand(union acpi_operand_object *obj_desc, u32 depth) |
582 | { |
583 | u32 length; |
584 | u32 index; |
585 | |
586 | ACPI_FUNCTION_NAME(ex_dump_operand); |
587 | |
588 | /* Check if debug output enabled */ |
589 | |
590 | if (!ACPI_IS_DEBUG_ENABLED(ACPI_LV_EXEC, _COMPONENT)) { |
591 | return; |
592 | } |
593 | |
594 | if (!obj_desc) { |
595 | |
596 | /* This could be a null element of a package */ |
597 | |
598 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Null Object Descriptor\n" )); |
599 | return; |
600 | } |
601 | |
602 | if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) == ACPI_DESC_TYPE_NAMED) { |
603 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%p Namespace Node: " , |
604 | obj_desc)); |
605 | ACPI_DUMP_ENTRY(obj_desc, ACPI_LV_EXEC); |
606 | return; |
607 | } |
608 | |
609 | if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) != ACPI_DESC_TYPE_OPERAND) { |
610 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, |
611 | "%p is not a node or operand object: [%s]\n" , |
612 | obj_desc, |
613 | acpi_ut_get_descriptor_name(obj_desc))); |
614 | ACPI_DUMP_BUFFER(obj_desc, sizeof(union acpi_operand_object)); |
615 | return; |
616 | } |
617 | |
618 | /* obj_desc is a valid object */ |
619 | |
620 | if (depth > 0) { |
621 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%*s[%u] %p Refs=%u " , |
622 | depth, " " , depth, obj_desc, |
623 | obj_desc->common.reference_count)); |
624 | } else { |
625 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%p Refs=%u " , |
626 | obj_desc, obj_desc->common.reference_count)); |
627 | } |
628 | |
629 | /* Decode object type */ |
630 | |
631 | switch (obj_desc->common.type) { |
632 | case ACPI_TYPE_LOCAL_REFERENCE: |
633 | |
634 | acpi_os_printf(format: "Reference: [%s] " , |
635 | acpi_ut_get_reference_name(object: obj_desc)); |
636 | |
637 | switch (obj_desc->reference.class) { |
638 | case ACPI_REFCLASS_DEBUG: |
639 | |
640 | acpi_os_printf(format: "\n" ); |
641 | break; |
642 | |
643 | case ACPI_REFCLASS_INDEX: |
644 | |
645 | acpi_os_printf(format: "%p\n" , obj_desc->reference.object); |
646 | break; |
647 | |
648 | case ACPI_REFCLASS_TABLE: |
649 | |
650 | acpi_os_printf(format: "Table Index %X\n" , |
651 | obj_desc->reference.value); |
652 | break; |
653 | |
654 | case ACPI_REFCLASS_REFOF: |
655 | |
656 | acpi_os_printf(format: "%p [%s]\n" , obj_desc->reference.object, |
657 | acpi_ut_get_type_name(type: ((union |
658 | acpi_operand_object |
659 | *) |
660 | obj_desc-> |
661 | reference. |
662 | object)->common. |
663 | type)); |
664 | break; |
665 | |
666 | case ACPI_REFCLASS_NAME: |
667 | |
668 | acpi_ut_repair_name(name: obj_desc->reference.node->name. |
669 | ascii); |
670 | acpi_os_printf(format: "- [%4.4s] (Node %p)\n" , |
671 | obj_desc->reference.node->name.ascii, |
672 | obj_desc->reference.node); |
673 | break; |
674 | |
675 | case ACPI_REFCLASS_ARG: |
676 | case ACPI_REFCLASS_LOCAL: |
677 | |
678 | acpi_os_printf(format: "%X\n" , obj_desc->reference.value); |
679 | break; |
680 | |
681 | default: /* Unknown reference class */ |
682 | |
683 | acpi_os_printf(format: "%2.2X\n" , obj_desc->reference.class); |
684 | break; |
685 | } |
686 | break; |
687 | |
688 | case ACPI_TYPE_BUFFER: |
689 | |
690 | acpi_os_printf(format: "Buffer length %.2X @ %p\n" , |
691 | obj_desc->buffer.length, |
692 | obj_desc->buffer.pointer); |
693 | |
694 | /* Debug only -- dump the buffer contents */ |
695 | |
696 | if (obj_desc->buffer.pointer) { |
697 | length = obj_desc->buffer.length; |
698 | if (length > 128) { |
699 | length = 128; |
700 | } |
701 | |
702 | acpi_os_printf |
703 | (format: "Buffer Contents: (displaying length 0x%.2X)\n" , |
704 | length); |
705 | ACPI_DUMP_BUFFER(obj_desc->buffer.pointer, length); |
706 | } |
707 | break; |
708 | |
709 | case ACPI_TYPE_INTEGER: |
710 | |
711 | acpi_os_printf(format: "Integer %8.8X%8.8X\n" , |
712 | ACPI_FORMAT_UINT64(obj_desc->integer.value)); |
713 | break; |
714 | |
715 | case ACPI_TYPE_PACKAGE: |
716 | |
717 | acpi_os_printf(format: "Package [Len %X] ElementArray %p\n" , |
718 | obj_desc->package.count, |
719 | obj_desc->package.elements); |
720 | |
721 | /* |
722 | * If elements exist, package element pointer is valid, |
723 | * and debug_level exceeds 1, dump package's elements. |
724 | */ |
725 | if (obj_desc->package.count && |
726 | obj_desc->package.elements && acpi_dbg_level > 1) { |
727 | for (index = 0; index < obj_desc->package.count; |
728 | index++) { |
729 | acpi_ex_dump_operand(obj_desc: obj_desc->package. |
730 | elements[index], |
731 | depth: depth + 1); |
732 | } |
733 | } |
734 | break; |
735 | |
736 | case ACPI_TYPE_REGION: |
737 | |
738 | acpi_os_printf(format: "Region %s (%X)" , |
739 | acpi_ut_get_region_name(space_id: obj_desc->region. |
740 | space_id), |
741 | obj_desc->region.space_id); |
742 | |
743 | /* |
744 | * If the address and length have not been evaluated, |
745 | * don't print them. |
746 | */ |
747 | if (!(obj_desc->region.flags & AOPOBJ_DATA_VALID)) { |
748 | acpi_os_printf(format: "\n" ); |
749 | } else { |
750 | acpi_os_printf(format: " base %8.8X%8.8X Length %X\n" , |
751 | ACPI_FORMAT_UINT64(obj_desc->region. |
752 | address), |
753 | obj_desc->region.length); |
754 | } |
755 | break; |
756 | |
757 | case ACPI_TYPE_STRING: |
758 | |
759 | acpi_os_printf(format: "String length %X @ %p " , |
760 | obj_desc->string.length, |
761 | obj_desc->string.pointer); |
762 | |
763 | acpi_ut_print_string(string: obj_desc->string.pointer, ACPI_UINT8_MAX); |
764 | acpi_os_printf(format: "\n" ); |
765 | break; |
766 | |
767 | case ACPI_TYPE_LOCAL_BANK_FIELD: |
768 | |
769 | acpi_os_printf(format: "BankField\n" ); |
770 | break; |
771 | |
772 | case ACPI_TYPE_LOCAL_REGION_FIELD: |
773 | |
774 | acpi_os_printf |
775 | (format: "RegionField: Bits=%X AccWidth=%X Lock=%X Update=%X at " |
776 | "byte=%X bit=%X of below:\n" , obj_desc->field.bit_length, |
777 | obj_desc->field.access_byte_width, |
778 | obj_desc->field.field_flags & AML_FIELD_LOCK_RULE_MASK, |
779 | obj_desc->field.field_flags & AML_FIELD_UPDATE_RULE_MASK, |
780 | obj_desc->field.base_byte_offset, |
781 | obj_desc->field.start_field_bit_offset); |
782 | |
783 | acpi_ex_dump_operand(obj_desc: obj_desc->field.region_obj, depth: depth + 1); |
784 | break; |
785 | |
786 | case ACPI_TYPE_LOCAL_INDEX_FIELD: |
787 | |
788 | acpi_os_printf(format: "IndexField\n" ); |
789 | break; |
790 | |
791 | case ACPI_TYPE_BUFFER_FIELD: |
792 | |
793 | acpi_os_printf(format: "BufferField: %X bits at byte %X bit %X of\n" , |
794 | obj_desc->buffer_field.bit_length, |
795 | obj_desc->buffer_field.base_byte_offset, |
796 | obj_desc->buffer_field.start_field_bit_offset); |
797 | |
798 | if (!obj_desc->buffer_field.buffer_obj) { |
799 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "*NULL*\n" )); |
800 | } else if ((obj_desc->buffer_field.buffer_obj)->common.type != |
801 | ACPI_TYPE_BUFFER) { |
802 | acpi_os_printf(format: "*not a Buffer*\n" ); |
803 | } else { |
804 | acpi_ex_dump_operand(obj_desc: obj_desc->buffer_field.buffer_obj, |
805 | depth: depth + 1); |
806 | } |
807 | break; |
808 | |
809 | case ACPI_TYPE_EVENT: |
810 | |
811 | acpi_os_printf(format: "Event\n" ); |
812 | break; |
813 | |
814 | case ACPI_TYPE_METHOD: |
815 | |
816 | acpi_os_printf(format: "Method(%X) @ %p:%X\n" , |
817 | obj_desc->method.param_count, |
818 | obj_desc->method.aml_start, |
819 | obj_desc->method.aml_length); |
820 | break; |
821 | |
822 | case ACPI_TYPE_MUTEX: |
823 | |
824 | acpi_os_printf(format: "Mutex\n" ); |
825 | break; |
826 | |
827 | case ACPI_TYPE_DEVICE: |
828 | |
829 | acpi_os_printf(format: "Device\n" ); |
830 | break; |
831 | |
832 | case ACPI_TYPE_POWER: |
833 | |
834 | acpi_os_printf(format: "Power\n" ); |
835 | break; |
836 | |
837 | case ACPI_TYPE_PROCESSOR: |
838 | |
839 | acpi_os_printf(format: "Processor\n" ); |
840 | break; |
841 | |
842 | case ACPI_TYPE_THERMAL: |
843 | |
844 | acpi_os_printf(format: "Thermal\n" ); |
845 | break; |
846 | |
847 | default: |
848 | |
849 | /* Unknown Type */ |
850 | |
851 | acpi_os_printf(format: "Unknown Type %X\n" , obj_desc->common.type); |
852 | break; |
853 | } |
854 | |
855 | return; |
856 | } |
857 | |
858 | /******************************************************************************* |
859 | * |
860 | * FUNCTION: acpi_ex_dump_operands |
861 | * |
862 | * PARAMETERS: operands - A list of Operand objects |
863 | * opcode_name - AML opcode name |
864 | * num_operands - Operand count for this opcode |
865 | * |
866 | * DESCRIPTION: Dump the operands associated with the opcode |
867 | * |
868 | ******************************************************************************/ |
869 | |
870 | void |
871 | acpi_ex_dump_operands(union acpi_operand_object **operands, |
872 | const char *opcode_name, u32 num_operands) |
873 | { |
874 | ACPI_FUNCTION_TRACE(ex_dump_operands); |
875 | |
876 | if (!opcode_name) { |
877 | opcode_name = "UNKNOWN" ; |
878 | } |
879 | |
880 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, |
881 | "**** Start operand dump for opcode [%s], %u operands\n" , |
882 | opcode_name, num_operands)); |
883 | |
884 | if (num_operands == 0) { |
885 | num_operands = 1; |
886 | } |
887 | |
888 | /* Dump the individual operands */ |
889 | |
890 | while (num_operands) { |
891 | acpi_ex_dump_operand(obj_desc: *operands, depth: 0); |
892 | operands++; |
893 | num_operands--; |
894 | } |
895 | |
896 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, |
897 | "**** End operand dump for [%s]\n" , opcode_name)); |
898 | return_VOID; |
899 | } |
900 | |
901 | /******************************************************************************* |
902 | * |
903 | * FUNCTION: acpi_ex_out* functions |
904 | * |
905 | * PARAMETERS: title - Descriptive text |
906 | * value - Value to be displayed |
907 | * |
908 | * DESCRIPTION: Object dump output formatting functions. These functions |
909 | * reduce the number of format strings required and keeps them |
910 | * all in one place for easy modification. |
911 | * |
912 | ******************************************************************************/ |
913 | |
914 | static void acpi_ex_out_string(const char *title, const char *value) |
915 | { |
916 | acpi_os_printf(format: "%20s : %s\n" , title, value); |
917 | } |
918 | |
919 | static void acpi_ex_out_pointer(const char *title, const void *value) |
920 | { |
921 | acpi_os_printf(format: "%20s : %p\n" , title, value); |
922 | } |
923 | |
924 | /******************************************************************************* |
925 | * |
926 | * FUNCTION: acpi_ex_dump_namespace_node |
927 | * |
928 | * PARAMETERS: node - Descriptor to dump |
929 | * flags - Force display if TRUE |
930 | * |
931 | * DESCRIPTION: Dumps the members of the given.Node |
932 | * |
933 | ******************************************************************************/ |
934 | |
935 | void acpi_ex_dump_namespace_node(struct acpi_namespace_node *node, u32 flags) |
936 | { |
937 | |
938 | ACPI_FUNCTION_ENTRY(); |
939 | |
940 | if (!flags) { |
941 | |
942 | /* Check if debug output enabled */ |
943 | |
944 | if (!ACPI_IS_DEBUG_ENABLED(ACPI_LV_OBJECTS, _COMPONENT)) { |
945 | return; |
946 | } |
947 | } |
948 | |
949 | acpi_os_printf(format: "%20s : %4.4s\n" , "Name" , acpi_ut_get_node_name(object: node)); |
950 | acpi_os_printf(format: "%20s : %2.2X [%s]\n" , "Type" , |
951 | node->type, acpi_ut_get_type_name(type: node->type)); |
952 | |
953 | acpi_ex_dump_object(ACPI_CAST_PTR(union acpi_operand_object, node), |
954 | info: acpi_ex_dump_node); |
955 | } |
956 | |
957 | /******************************************************************************* |
958 | * |
959 | * FUNCTION: acpi_ex_dump_reference_obj |
960 | * |
961 | * PARAMETERS: object - Descriptor to dump |
962 | * |
963 | * DESCRIPTION: Dumps a reference object |
964 | * |
965 | ******************************************************************************/ |
966 | |
967 | static void acpi_ex_dump_reference_obj(union acpi_operand_object *obj_desc) |
968 | { |
969 | struct acpi_buffer ret_buf; |
970 | acpi_status status; |
971 | |
972 | ret_buf.length = ACPI_ALLOCATE_LOCAL_BUFFER; |
973 | |
974 | if (obj_desc->reference.class == ACPI_REFCLASS_NAME) { |
975 | acpi_os_printf(format: " %p " , obj_desc->reference.node); |
976 | |
977 | status = acpi_ns_handle_to_pathname(target_handle: obj_desc->reference.node, |
978 | buffer: &ret_buf, TRUE); |
979 | if (ACPI_FAILURE(status)) { |
980 | acpi_os_printf |
981 | (format: " Could not convert name to pathname: %s\n" , |
982 | acpi_format_exception(exception: status)); |
983 | } else { |
984 | acpi_os_printf(format: "%s: %s\n" , |
985 | acpi_ut_get_type_name(type: obj_desc-> |
986 | reference.node-> |
987 | type), |
988 | (char *)ret_buf.pointer); |
989 | ACPI_FREE(ret_buf.pointer); |
990 | } |
991 | } else if (obj_desc->reference.object) { |
992 | if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) == |
993 | ACPI_DESC_TYPE_OPERAND) { |
994 | acpi_os_printf(format: "%22s %p" , "Target :" , |
995 | obj_desc->reference.object); |
996 | if (obj_desc->reference.class == ACPI_REFCLASS_TABLE) { |
997 | acpi_os_printf(format: " Table Index: %X\n" , |
998 | obj_desc->reference.value); |
999 | } else { |
1000 | acpi_os_printf(format: " [%s]\n" , |
1001 | acpi_ut_get_type_name(type: ((union |
1002 | acpi_operand_object |
1003 | *) |
1004 | obj_desc-> |
1005 | reference. |
1006 | object)-> |
1007 | common. |
1008 | type)); |
1009 | } |
1010 | } else { |
1011 | acpi_os_printf(format: " Target: %p\n" , |
1012 | obj_desc->reference.object); |
1013 | } |
1014 | } |
1015 | } |
1016 | |
1017 | /******************************************************************************* |
1018 | * |
1019 | * FUNCTION: acpi_ex_dump_package_obj |
1020 | * |
1021 | * PARAMETERS: obj_desc - Descriptor to dump |
1022 | * level - Indentation Level |
1023 | * index - Package index for this object |
1024 | * |
1025 | * DESCRIPTION: Dumps the elements of the package |
1026 | * |
1027 | ******************************************************************************/ |
1028 | |
1029 | static void |
1030 | acpi_ex_dump_package_obj(union acpi_operand_object *obj_desc, |
1031 | u32 level, u32 index) |
1032 | { |
1033 | u32 i; |
1034 | |
1035 | /* Indentation and index output */ |
1036 | |
1037 | if (level > 0) { |
1038 | for (i = 0; i < level; i++) { |
1039 | acpi_os_printf(format: " " ); |
1040 | } |
1041 | |
1042 | acpi_os_printf(format: "[%.2d] " , index); |
1043 | } |
1044 | |
1045 | acpi_os_printf(format: "%p " , obj_desc); |
1046 | |
1047 | /* Null package elements are allowed */ |
1048 | |
1049 | if (!obj_desc) { |
1050 | acpi_os_printf(format: "[Null Object]\n" ); |
1051 | return; |
1052 | } |
1053 | |
1054 | /* Packages may only contain a few object types */ |
1055 | |
1056 | switch (obj_desc->common.type) { |
1057 | case ACPI_TYPE_INTEGER: |
1058 | |
1059 | acpi_os_printf(format: "[Integer] = %8.8X%8.8X\n" , |
1060 | ACPI_FORMAT_UINT64(obj_desc->integer.value)); |
1061 | break; |
1062 | |
1063 | case ACPI_TYPE_STRING: |
1064 | |
1065 | acpi_os_printf(format: "[String] Value: " ); |
1066 | acpi_ut_print_string(string: obj_desc->string.pointer, ACPI_UINT8_MAX); |
1067 | acpi_os_printf(format: "\n" ); |
1068 | break; |
1069 | |
1070 | case ACPI_TYPE_BUFFER: |
1071 | |
1072 | acpi_os_printf(format: "[Buffer] Length %.2X = " , |
1073 | obj_desc->buffer.length); |
1074 | if (obj_desc->buffer.length) { |
1075 | acpi_ut_debug_dump_buffer(ACPI_CAST_PTR |
1076 | (u8, |
1077 | obj_desc->buffer.pointer), |
1078 | count: obj_desc->buffer.length, |
1079 | DB_DWORD_DISPLAY, _COMPONENT); |
1080 | } else { |
1081 | acpi_os_printf(format: "\n" ); |
1082 | } |
1083 | break; |
1084 | |
1085 | case ACPI_TYPE_PACKAGE: |
1086 | |
1087 | acpi_os_printf(format: "[Package] Contains %u Elements:\n" , |
1088 | obj_desc->package.count); |
1089 | |
1090 | for (i = 0; i < obj_desc->package.count; i++) { |
1091 | acpi_ex_dump_package_obj(obj_desc: obj_desc->package.elements[i], |
1092 | level: level + 1, index: i); |
1093 | } |
1094 | break; |
1095 | |
1096 | case ACPI_TYPE_LOCAL_REFERENCE: |
1097 | |
1098 | acpi_os_printf(format: "[Object Reference] Class [%s]" , |
1099 | acpi_ut_get_reference_name(object: obj_desc)); |
1100 | acpi_ex_dump_reference_obj(obj_desc); |
1101 | break; |
1102 | |
1103 | default: |
1104 | |
1105 | acpi_os_printf(format: "[%s] Type: %2.2X\n" , |
1106 | acpi_ut_get_type_name(type: obj_desc->common.type), |
1107 | obj_desc->common.type); |
1108 | break; |
1109 | } |
1110 | } |
1111 | |
1112 | /******************************************************************************* |
1113 | * |
1114 | * FUNCTION: acpi_ex_dump_object_descriptor |
1115 | * |
1116 | * PARAMETERS: obj_desc - Descriptor to dump |
1117 | * flags - Force display if TRUE |
1118 | * |
1119 | * DESCRIPTION: Dumps the members of the object descriptor given. |
1120 | * |
1121 | ******************************************************************************/ |
1122 | |
1123 | void |
1124 | acpi_ex_dump_object_descriptor(union acpi_operand_object *obj_desc, u32 flags) |
1125 | { |
1126 | ACPI_FUNCTION_TRACE(ex_dump_object_descriptor); |
1127 | |
1128 | if (!obj_desc) { |
1129 | return_VOID; |
1130 | } |
1131 | |
1132 | if (!flags) { |
1133 | |
1134 | /* Check if debug output enabled */ |
1135 | |
1136 | if (!ACPI_IS_DEBUG_ENABLED(ACPI_LV_OBJECTS, _COMPONENT)) { |
1137 | return_VOID; |
1138 | } |
1139 | } |
1140 | |
1141 | if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) == ACPI_DESC_TYPE_NAMED) { |
1142 | acpi_ex_dump_namespace_node(node: (struct acpi_namespace_node *) |
1143 | obj_desc, flags); |
1144 | |
1145 | obj_desc = ((struct acpi_namespace_node *)obj_desc)->object; |
1146 | if (!obj_desc) { |
1147 | return_VOID; |
1148 | } |
1149 | |
1150 | acpi_os_printf(format: "\nAttached Object %p" , obj_desc); |
1151 | if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) == ACPI_DESC_TYPE_NAMED) { |
1152 | acpi_os_printf(format: " - Namespace Node" ); |
1153 | } |
1154 | |
1155 | acpi_os_printf(format: ":\n" ); |
1156 | goto dump_object; |
1157 | } |
1158 | |
1159 | if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) != ACPI_DESC_TYPE_OPERAND) { |
1160 | acpi_os_printf(format: "%p is not an ACPI operand object: [%s]\n" , |
1161 | obj_desc, acpi_ut_get_descriptor_name(object: obj_desc)); |
1162 | return_VOID; |
1163 | } |
1164 | |
1165 | /* Validate the object type */ |
1166 | |
1167 | if (obj_desc->common.type > ACPI_TYPE_LOCAL_MAX) { |
1168 | acpi_os_printf(format: "Not a known object type: %2.2X\n" , |
1169 | obj_desc->common.type); |
1170 | return_VOID; |
1171 | } |
1172 | |
1173 | dump_object: |
1174 | |
1175 | if (!obj_desc) { |
1176 | return_VOID; |
1177 | } |
1178 | |
1179 | /* Common Fields */ |
1180 | |
1181 | acpi_ex_dump_object(obj_desc, info: acpi_ex_dump_common); |
1182 | |
1183 | /* Object-specific fields */ |
1184 | |
1185 | acpi_ex_dump_object(obj_desc, info: acpi_ex_dump_info[obj_desc->common.type]); |
1186 | |
1187 | if (obj_desc->common.type == ACPI_TYPE_REGION) { |
1188 | obj_desc = obj_desc->common.next_object; |
1189 | if (obj_desc->common.type > ACPI_TYPE_LOCAL_MAX) { |
1190 | acpi_os_printf |
1191 | (format: "Secondary object is not a known object type: %2.2X\n" , |
1192 | obj_desc->common.type); |
1193 | |
1194 | return_VOID; |
1195 | } |
1196 | |
1197 | acpi_os_printf(format: "\nExtra attached Object (%p):\n" , obj_desc); |
1198 | acpi_ex_dump_object(obj_desc, |
1199 | info: acpi_ex_dump_info[obj_desc->common.type]); |
1200 | } |
1201 | |
1202 | return_VOID; |
1203 | } |
1204 | |
1205 | #endif |
1206 | |