[go: nahoru, domu]

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