xref: /openbmc/linux/drivers/acpi/acpica/dbobject.c (revision 25d866c4)
195857638SErik Schmauss // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
299575102SLv Zheng /*******************************************************************************
399575102SLv Zheng  *
499575102SLv Zheng  * Module Name: dbobject - ACPI object decode and display
599575102SLv Zheng  *
699575102SLv Zheng  ******************************************************************************/
799575102SLv Zheng 
899575102SLv Zheng #include <acpi/acpi.h>
999575102SLv Zheng #include "accommon.h"
1099575102SLv Zheng #include "acnamesp.h"
1199575102SLv Zheng #include "acdebug.h"
1299575102SLv Zheng 
1399575102SLv Zheng #define _COMPONENT          ACPI_CA_DEBUGGER
1499575102SLv Zheng ACPI_MODULE_NAME("dbobject")
1599575102SLv Zheng 
1699575102SLv Zheng /* Local prototypes */
1799575102SLv Zheng static void acpi_db_decode_node(struct acpi_namespace_node *node);
1899575102SLv Zheng 
1999575102SLv Zheng /*******************************************************************************
2099575102SLv Zheng  *
2199575102SLv Zheng  * FUNCTION:    acpi_db_dump_method_info
2299575102SLv Zheng  *
2399575102SLv Zheng  * PARAMETERS:  status          - Method execution status
2499575102SLv Zheng  *              walk_state      - Current state of the parse tree walk
2599575102SLv Zheng  *
2699575102SLv Zheng  * RETURN:      None
2799575102SLv Zheng  *
2899575102SLv Zheng  * DESCRIPTION: Called when a method has been aborted because of an error.
2999575102SLv Zheng  *              Dumps the method execution stack, and the method locals/args,
3099575102SLv Zheng  *              and disassembles the AML opcode that failed.
3199575102SLv Zheng  *
3299575102SLv Zheng  ******************************************************************************/
3399575102SLv Zheng 
3499575102SLv Zheng void
acpi_db_dump_method_info(acpi_status status,struct acpi_walk_state * walk_state)3599575102SLv Zheng acpi_db_dump_method_info(acpi_status status, struct acpi_walk_state *walk_state)
3699575102SLv Zheng {
3799575102SLv Zheng 	struct acpi_thread_state *thread;
383877b2ccSBob Moore 	struct acpi_namespace_node *node;
393877b2ccSBob Moore 
403877b2ccSBob Moore 	node = walk_state->method_node;
413877b2ccSBob Moore 
423877b2ccSBob Moore 	/* There are no locals or arguments for the module-level code case */
433877b2ccSBob Moore 
443877b2ccSBob Moore 	if (node == acpi_gbl_root_node) {
453877b2ccSBob Moore 		return;
463877b2ccSBob Moore 	}
4799575102SLv Zheng 
4899575102SLv Zheng 	/* Ignore control codes, they are not errors */
4999575102SLv Zheng 
50*25d866c4SMaximilian Luz 	if (ACPI_CNTL_EXCEPTION(status)) {
5199575102SLv Zheng 		return;
5299575102SLv Zheng 	}
5399575102SLv Zheng 
5499575102SLv Zheng 	/* We may be executing a deferred opcode */
5599575102SLv Zheng 
5699575102SLv Zheng 	if (walk_state->deferred_node) {
5799575102SLv Zheng 		acpi_os_printf("Executing subtree for Buffer/Package/Region\n");
5899575102SLv Zheng 		return;
5999575102SLv Zheng 	}
6099575102SLv Zheng 
6199575102SLv Zheng 	/*
6299575102SLv Zheng 	 * If there is no Thread, we are not actually executing a method.
6399575102SLv Zheng 	 * This can happen when the iASL compiler calls the interpreter
6499575102SLv Zheng 	 * to perform constant folding.
6599575102SLv Zheng 	 */
6699575102SLv Zheng 	thread = walk_state->thread;
6799575102SLv Zheng 	if (!thread) {
6899575102SLv Zheng 		return;
6999575102SLv Zheng 	}
7099575102SLv Zheng 
7199575102SLv Zheng 	/* Display the method locals and arguments */
7299575102SLv Zheng 
7399575102SLv Zheng 	acpi_os_printf("\n");
7499575102SLv Zheng 	acpi_db_decode_locals(walk_state);
7599575102SLv Zheng 	acpi_os_printf("\n");
7699575102SLv Zheng 	acpi_db_decode_arguments(walk_state);
7799575102SLv Zheng 	acpi_os_printf("\n");
7899575102SLv Zheng }
7999575102SLv Zheng 
8099575102SLv Zheng /*******************************************************************************
8199575102SLv Zheng  *
8299575102SLv Zheng  * FUNCTION:    acpi_db_decode_internal_object
8399575102SLv Zheng  *
8499575102SLv Zheng  * PARAMETERS:  obj_desc        - Object to be displayed
8599575102SLv Zheng  *
8699575102SLv Zheng  * RETURN:      None
8799575102SLv Zheng  *
8899575102SLv Zheng  * DESCRIPTION: Short display of an internal object. Numbers/Strings/Buffers.
8999575102SLv Zheng  *
9099575102SLv Zheng  ******************************************************************************/
9199575102SLv Zheng 
acpi_db_decode_internal_object(union acpi_operand_object * obj_desc)9299575102SLv Zheng void acpi_db_decode_internal_object(union acpi_operand_object *obj_desc)
9399575102SLv Zheng {
9499575102SLv Zheng 	u32 i;
9599575102SLv Zheng 
9699575102SLv Zheng 	if (!obj_desc) {
9799575102SLv Zheng 		acpi_os_printf(" Uninitialized");
9899575102SLv Zheng 		return;
9999575102SLv Zheng 	}
10099575102SLv Zheng 
10199575102SLv Zheng 	if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) != ACPI_DESC_TYPE_OPERAND) {
10299575102SLv Zheng 		acpi_os_printf(" %p [%s]", obj_desc,
10399575102SLv Zheng 			       acpi_ut_get_descriptor_name(obj_desc));
10499575102SLv Zheng 		return;
10599575102SLv Zheng 	}
10699575102SLv Zheng 
10799575102SLv Zheng 	acpi_os_printf(" %s", acpi_ut_get_object_type_name(obj_desc));
10899575102SLv Zheng 
10999575102SLv Zheng 	switch (obj_desc->common.type) {
11099575102SLv Zheng 	case ACPI_TYPE_INTEGER:
11199575102SLv Zheng 
11299575102SLv Zheng 		acpi_os_printf(" %8.8X%8.8X",
11399575102SLv Zheng 			       ACPI_FORMAT_UINT64(obj_desc->integer.value));
11499575102SLv Zheng 		break;
11599575102SLv Zheng 
11699575102SLv Zheng 	case ACPI_TYPE_STRING:
11799575102SLv Zheng 
11860d836fcSBob Moore 		acpi_os_printf("(%u) \"%.60s",
11999575102SLv Zheng 			       obj_desc->string.length,
12099575102SLv Zheng 			       obj_desc->string.pointer);
12199575102SLv Zheng 
12260d836fcSBob Moore 		if (obj_desc->string.length > 60) {
12399575102SLv Zheng 			acpi_os_printf("...");
12499575102SLv Zheng 		} else {
12599575102SLv Zheng 			acpi_os_printf("\"");
12699575102SLv Zheng 		}
12799575102SLv Zheng 		break;
12899575102SLv Zheng 
12999575102SLv Zheng 	case ACPI_TYPE_BUFFER:
13099575102SLv Zheng 
13199575102SLv Zheng 		acpi_os_printf("(%u)", obj_desc->buffer.length);
13299575102SLv Zheng 		for (i = 0; (i < 8) && (i < obj_desc->buffer.length); i++) {
13399575102SLv Zheng 			acpi_os_printf(" %2.2X", obj_desc->buffer.pointer[i]);
13499575102SLv Zheng 		}
13599575102SLv Zheng 		break;
13699575102SLv Zheng 
13799575102SLv Zheng 	default:
13899575102SLv Zheng 
13999575102SLv Zheng 		acpi_os_printf(" %p", obj_desc);
14099575102SLv Zheng 		break;
14199575102SLv Zheng 	}
14299575102SLv Zheng }
14399575102SLv Zheng 
14499575102SLv Zheng /*******************************************************************************
14599575102SLv Zheng  *
14699575102SLv Zheng  * FUNCTION:    acpi_db_decode_node
14799575102SLv Zheng  *
14899575102SLv Zheng  * PARAMETERS:  node        - Object to be displayed
14999575102SLv Zheng  *
15099575102SLv Zheng  * RETURN:      None
15199575102SLv Zheng  *
15299575102SLv Zheng  * DESCRIPTION: Short display of a namespace node
15399575102SLv Zheng  *
15499575102SLv Zheng  ******************************************************************************/
15599575102SLv Zheng 
acpi_db_decode_node(struct acpi_namespace_node * node)15699575102SLv Zheng static void acpi_db_decode_node(struct acpi_namespace_node *node)
15799575102SLv Zheng {
15899575102SLv Zheng 
15999575102SLv Zheng 	acpi_os_printf("<Node>          Name %4.4s",
16099575102SLv Zheng 		       acpi_ut_get_node_name(node));
16199575102SLv Zheng 
16299575102SLv Zheng 	if (node->flags & ANOBJ_METHOD_ARG) {
16399575102SLv Zheng 		acpi_os_printf(" [Method Arg]");
16499575102SLv Zheng 	}
16599575102SLv Zheng 	if (node->flags & ANOBJ_METHOD_LOCAL) {
16699575102SLv Zheng 		acpi_os_printf(" [Method Local]");
16799575102SLv Zheng 	}
16899575102SLv Zheng 
16999575102SLv Zheng 	switch (node->type) {
17099575102SLv Zheng 
17199575102SLv Zheng 		/* These types have no attached object */
17299575102SLv Zheng 
17399575102SLv Zheng 	case ACPI_TYPE_DEVICE:
17499575102SLv Zheng 
17599575102SLv Zheng 		acpi_os_printf(" Device");
17699575102SLv Zheng 		break;
17799575102SLv Zheng 
17899575102SLv Zheng 	case ACPI_TYPE_THERMAL:
17999575102SLv Zheng 
18099575102SLv Zheng 		acpi_os_printf(" Thermal Zone");
18199575102SLv Zheng 		break;
18299575102SLv Zheng 
18399575102SLv Zheng 	default:
18499575102SLv Zheng 
18599575102SLv Zheng 		acpi_db_decode_internal_object(acpi_ns_get_attached_object
18699575102SLv Zheng 					       (node));
18799575102SLv Zheng 		break;
18899575102SLv Zheng 	}
18999575102SLv Zheng }
19099575102SLv Zheng 
19199575102SLv Zheng /*******************************************************************************
19299575102SLv Zheng  *
19399575102SLv Zheng  * FUNCTION:    acpi_db_display_internal_object
19499575102SLv Zheng  *
19599575102SLv Zheng  * PARAMETERS:  obj_desc        - Object to be displayed
19699575102SLv Zheng  *              walk_state      - Current walk state
19799575102SLv Zheng  *
19899575102SLv Zheng  * RETURN:      None
19999575102SLv Zheng  *
20099575102SLv Zheng  * DESCRIPTION: Short display of an internal object
20199575102SLv Zheng  *
20299575102SLv Zheng  ******************************************************************************/
20399575102SLv Zheng 
20499575102SLv Zheng void
acpi_db_display_internal_object(union acpi_operand_object * obj_desc,struct acpi_walk_state * walk_state)20599575102SLv Zheng acpi_db_display_internal_object(union acpi_operand_object *obj_desc,
20699575102SLv Zheng 				struct acpi_walk_state *walk_state)
20799575102SLv Zheng {
20899575102SLv Zheng 	u8 type;
20999575102SLv Zheng 
21099575102SLv Zheng 	acpi_os_printf("%p ", obj_desc);
21199575102SLv Zheng 
21299575102SLv Zheng 	if (!obj_desc) {
21399575102SLv Zheng 		acpi_os_printf("<Null Object>\n");
21499575102SLv Zheng 		return;
21599575102SLv Zheng 	}
21699575102SLv Zheng 
21799575102SLv Zheng 	/* Decode the object type */
21899575102SLv Zheng 
21999575102SLv Zheng 	switch (ACPI_GET_DESCRIPTOR_TYPE(obj_desc)) {
22099575102SLv Zheng 	case ACPI_DESC_TYPE_PARSER:
22199575102SLv Zheng 
22299575102SLv Zheng 		acpi_os_printf("<Parser> ");
22399575102SLv Zheng 		break;
22499575102SLv Zheng 
22599575102SLv Zheng 	case ACPI_DESC_TYPE_NAMED:
22699575102SLv Zheng 
22799575102SLv Zheng 		acpi_db_decode_node((struct acpi_namespace_node *)obj_desc);
22899575102SLv Zheng 		break;
22999575102SLv Zheng 
23099575102SLv Zheng 	case ACPI_DESC_TYPE_OPERAND:
23199575102SLv Zheng 
23299575102SLv Zheng 		type = obj_desc->common.type;
23399575102SLv Zheng 		if (type > ACPI_TYPE_LOCAL_MAX) {
23499575102SLv Zheng 			acpi_os_printf(" Type %X [Invalid Type]", (u32)type);
23599575102SLv Zheng 			return;
23699575102SLv Zheng 		}
23799575102SLv Zheng 
23899575102SLv Zheng 		/* Decode the ACPI object type */
23999575102SLv Zheng 
24099575102SLv Zheng 		switch (obj_desc->common.type) {
24199575102SLv Zheng 		case ACPI_TYPE_LOCAL_REFERENCE:
24299575102SLv Zheng 
24399575102SLv Zheng 			acpi_os_printf("[%s] ",
24499575102SLv Zheng 				       acpi_ut_get_reference_name(obj_desc));
24599575102SLv Zheng 
246c163f90cSErik Schmauss 			/* Decode the reference */
24799575102SLv Zheng 
24899575102SLv Zheng 			switch (obj_desc->reference.class) {
24999575102SLv Zheng 			case ACPI_REFCLASS_LOCAL:
25099575102SLv Zheng 
25199575102SLv Zheng 				acpi_os_printf("%X ",
25299575102SLv Zheng 					       obj_desc->reference.value);
25399575102SLv Zheng 				if (walk_state) {
25499575102SLv Zheng 					obj_desc = walk_state->local_variables
25599575102SLv Zheng 					    [obj_desc->reference.value].object;
25699575102SLv Zheng 					acpi_os_printf("%p", obj_desc);
25799575102SLv Zheng 					acpi_db_decode_internal_object
25899575102SLv Zheng 					    (obj_desc);
25999575102SLv Zheng 				}
26099575102SLv Zheng 				break;
26199575102SLv Zheng 
26299575102SLv Zheng 			case ACPI_REFCLASS_ARG:
26399575102SLv Zheng 
26499575102SLv Zheng 				acpi_os_printf("%X ",
26599575102SLv Zheng 					       obj_desc->reference.value);
26699575102SLv Zheng 				if (walk_state) {
26799575102SLv Zheng 					obj_desc = walk_state->arguments
26899575102SLv Zheng 					    [obj_desc->reference.value].object;
26999575102SLv Zheng 					acpi_os_printf("%p", obj_desc);
27099575102SLv Zheng 					acpi_db_decode_internal_object
27199575102SLv Zheng 					    (obj_desc);
27299575102SLv Zheng 				}
27399575102SLv Zheng 				break;
27499575102SLv Zheng 
27599575102SLv Zheng 			case ACPI_REFCLASS_INDEX:
27699575102SLv Zheng 
27799575102SLv Zheng 				switch (obj_desc->reference.target_type) {
27899575102SLv Zheng 				case ACPI_TYPE_BUFFER_FIELD:
27999575102SLv Zheng 
28099575102SLv Zheng 					acpi_os_printf("%p",
28199575102SLv Zheng 						       obj_desc->reference.
28299575102SLv Zheng 						       object);
28399575102SLv Zheng 					acpi_db_decode_internal_object
28499575102SLv Zheng 					    (obj_desc->reference.object);
28599575102SLv Zheng 					break;
28699575102SLv Zheng 
28799575102SLv Zheng 				case ACPI_TYPE_PACKAGE:
28899575102SLv Zheng 
28999575102SLv Zheng 					acpi_os_printf("%p",
29099575102SLv Zheng 						       obj_desc->reference.
29199575102SLv Zheng 						       where);
29299575102SLv Zheng 					if (!obj_desc->reference.where) {
29399575102SLv Zheng 						acpi_os_printf
29499575102SLv Zheng 						    (" Uninitialized WHERE pointer");
29599575102SLv Zheng 					} else {
29699575102SLv Zheng 						acpi_db_decode_internal_object(*
29799575102SLv Zheng 									       (obj_desc->
29899575102SLv Zheng 										reference.
29999575102SLv Zheng 										where));
30099575102SLv Zheng 					}
30199575102SLv Zheng 					break;
30299575102SLv Zheng 
30399575102SLv Zheng 				default:
30499575102SLv Zheng 
30599575102SLv Zheng 					acpi_os_printf
30699575102SLv Zheng 					    ("Unknown index target type");
30799575102SLv Zheng 					break;
30899575102SLv Zheng 				}
30999575102SLv Zheng 				break;
31099575102SLv Zheng 
31199575102SLv Zheng 			case ACPI_REFCLASS_REFOF:
31299575102SLv Zheng 
31399575102SLv Zheng 				if (!obj_desc->reference.object) {
31499575102SLv Zheng 					acpi_os_printf
31599575102SLv Zheng 					    ("Uninitialized reference subobject pointer");
31699575102SLv Zheng 					break;
31799575102SLv Zheng 				}
31899575102SLv Zheng 
31999575102SLv Zheng 				/* Reference can be to a Node or an Operand object */
32099575102SLv Zheng 
32199575102SLv Zheng 				switch (ACPI_GET_DESCRIPTOR_TYPE
32299575102SLv Zheng 					(obj_desc->reference.object)) {
32399575102SLv Zheng 				case ACPI_DESC_TYPE_NAMED:
32499575102SLv Zheng 
32599575102SLv Zheng 					acpi_db_decode_node(obj_desc->reference.
32699575102SLv Zheng 							    object);
32799575102SLv Zheng 					break;
32899575102SLv Zheng 
32999575102SLv Zheng 				case ACPI_DESC_TYPE_OPERAND:
33099575102SLv Zheng 
33199575102SLv Zheng 					acpi_db_decode_internal_object
33299575102SLv Zheng 					    (obj_desc->reference.object);
33399575102SLv Zheng 					break;
33499575102SLv Zheng 
33599575102SLv Zheng 				default:
33699575102SLv Zheng 					break;
33799575102SLv Zheng 				}
33899575102SLv Zheng 				break;
33999575102SLv Zheng 
34099575102SLv Zheng 			case ACPI_REFCLASS_NAME:
34199575102SLv Zheng 
34299575102SLv Zheng 				acpi_db_decode_node(obj_desc->reference.node);
34399575102SLv Zheng 				break;
34499575102SLv Zheng 
34599575102SLv Zheng 			case ACPI_REFCLASS_DEBUG:
34699575102SLv Zheng 			case ACPI_REFCLASS_TABLE:
34799575102SLv Zheng 
34899575102SLv Zheng 				acpi_os_printf("\n");
34999575102SLv Zheng 				break;
35099575102SLv Zheng 
35199575102SLv Zheng 			default:	/* Unknown reference class */
35299575102SLv Zheng 
35399575102SLv Zheng 				acpi_os_printf("%2.2X\n",
35499575102SLv Zheng 					       obj_desc->reference.class);
35599575102SLv Zheng 				break;
35699575102SLv Zheng 			}
35799575102SLv Zheng 			break;
35899575102SLv Zheng 
35999575102SLv Zheng 		default:
36099575102SLv Zheng 
36199575102SLv Zheng 			acpi_os_printf("<Obj>          ");
36299575102SLv Zheng 			acpi_db_decode_internal_object(obj_desc);
36399575102SLv Zheng 			break;
36499575102SLv Zheng 		}
36599575102SLv Zheng 		break;
36699575102SLv Zheng 
36799575102SLv Zheng 	default:
36899575102SLv Zheng 
36999575102SLv Zheng 		acpi_os_printf("<Not a valid ACPI Object Descriptor> [%s]",
37099575102SLv Zheng 			       acpi_ut_get_descriptor_name(obj_desc));
37199575102SLv Zheng 		break;
37299575102SLv Zheng 	}
37399575102SLv Zheng 
37499575102SLv Zheng 	acpi_os_printf("\n");
37599575102SLv Zheng }
37699575102SLv Zheng 
37799575102SLv Zheng /*******************************************************************************
37899575102SLv Zheng  *
37999575102SLv Zheng  * FUNCTION:    acpi_db_decode_locals
38099575102SLv Zheng  *
38199575102SLv Zheng  * PARAMETERS:  walk_state      - State for current method
38299575102SLv Zheng  *
38399575102SLv Zheng  * RETURN:      None
38499575102SLv Zheng  *
38599575102SLv Zheng  * DESCRIPTION: Display all locals for the currently running control method
38699575102SLv Zheng  *
38799575102SLv Zheng  ******************************************************************************/
38899575102SLv Zheng 
acpi_db_decode_locals(struct acpi_walk_state * walk_state)38999575102SLv Zheng void acpi_db_decode_locals(struct acpi_walk_state *walk_state)
39099575102SLv Zheng {
39199575102SLv Zheng 	u32 i;
39299575102SLv Zheng 	union acpi_operand_object *obj_desc;
39399575102SLv Zheng 	struct acpi_namespace_node *node;
39499575102SLv Zheng 	u8 display_locals = FALSE;
39599575102SLv Zheng 
39699575102SLv Zheng 	node = walk_state->method_node;
3973877b2ccSBob Moore 
3983877b2ccSBob Moore 	/* There are no locals for the module-level code case */
3993877b2ccSBob Moore 
4003877b2ccSBob Moore 	if (node == acpi_gbl_root_node) {
4013877b2ccSBob Moore 		return;
4023877b2ccSBob Moore 	}
40399575102SLv Zheng 
40499575102SLv Zheng 	if (!node) {
40599575102SLv Zheng 		acpi_os_printf
40699575102SLv Zheng 		    ("No method node (Executing subtree for buffer or opregion)\n");
40799575102SLv Zheng 		return;
40899575102SLv Zheng 	}
40999575102SLv Zheng 
41099575102SLv Zheng 	if (node->type != ACPI_TYPE_METHOD) {
41199575102SLv Zheng 		acpi_os_printf("Executing subtree for Buffer/Package/Region\n");
41299575102SLv Zheng 		return;
41399575102SLv Zheng 	}
41499575102SLv Zheng 
41599575102SLv Zheng 	/* Are any locals actually set? */
41699575102SLv Zheng 
41799575102SLv Zheng 	for (i = 0; i < ACPI_METHOD_NUM_LOCALS; i++) {
41899575102SLv Zheng 		obj_desc = walk_state->local_variables[i].object;
41999575102SLv Zheng 		if (obj_desc) {
42099575102SLv Zheng 			display_locals = TRUE;
42199575102SLv Zheng 			break;
42299575102SLv Zheng 		}
42399575102SLv Zheng 	}
42499575102SLv Zheng 
42599575102SLv Zheng 	/* If any are set, only display the ones that are set */
42699575102SLv Zheng 
42799575102SLv Zheng 	if (display_locals) {
42899575102SLv Zheng 		acpi_os_printf
4292cb8c3bbSBob Moore 		    ("\nInitialized Local Variables for Method [%4.4s]:\n",
43099575102SLv Zheng 		     acpi_ut_get_node_name(node));
43199575102SLv Zheng 
43299575102SLv Zheng 		for (i = 0; i < ACPI_METHOD_NUM_LOCALS; i++) {
43399575102SLv Zheng 			obj_desc = walk_state->local_variables[i].object;
43499575102SLv Zheng 			if (obj_desc) {
43599575102SLv Zheng 				acpi_os_printf("  Local%X: ", i);
43699575102SLv Zheng 				acpi_db_display_internal_object(obj_desc,
43799575102SLv Zheng 								walk_state);
43899575102SLv Zheng 			}
43999575102SLv Zheng 		}
44099575102SLv Zheng 	} else {
44199575102SLv Zheng 		acpi_os_printf
4422cb8c3bbSBob Moore 		    ("No Local Variables are initialized for Method [%4.4s]\n",
44399575102SLv Zheng 		     acpi_ut_get_node_name(node));
44499575102SLv Zheng 	}
44599575102SLv Zheng }
44699575102SLv Zheng 
44799575102SLv Zheng /*******************************************************************************
44899575102SLv Zheng  *
44999575102SLv Zheng  * FUNCTION:    acpi_db_decode_arguments
45099575102SLv Zheng  *
45199575102SLv Zheng  * PARAMETERS:  walk_state      - State for current method
45299575102SLv Zheng  *
45399575102SLv Zheng  * RETURN:      None
45499575102SLv Zheng  *
45599575102SLv Zheng  * DESCRIPTION: Display all arguments for the currently running control method
45699575102SLv Zheng  *
45799575102SLv Zheng  ******************************************************************************/
45899575102SLv Zheng 
acpi_db_decode_arguments(struct acpi_walk_state * walk_state)45999575102SLv Zheng void acpi_db_decode_arguments(struct acpi_walk_state *walk_state)
46099575102SLv Zheng {
46199575102SLv Zheng 	u32 i;
46299575102SLv Zheng 	union acpi_operand_object *obj_desc;
46399575102SLv Zheng 	struct acpi_namespace_node *node;
46499575102SLv Zheng 	u8 display_args = FALSE;
46599575102SLv Zheng 
46699575102SLv Zheng 	node = walk_state->method_node;
46799575102SLv Zheng 
4683877b2ccSBob Moore 	/* There are no arguments for the module-level code case */
4693877b2ccSBob Moore 
4703877b2ccSBob Moore 	if (node == acpi_gbl_root_node) {
4713877b2ccSBob Moore 		return;
4723877b2ccSBob Moore 	}
4733877b2ccSBob Moore 
47499575102SLv Zheng 	if (!node) {
47599575102SLv Zheng 		acpi_os_printf
47699575102SLv Zheng 		    ("No method node (Executing subtree for buffer or opregion)\n");
47799575102SLv Zheng 		return;
47899575102SLv Zheng 	}
47999575102SLv Zheng 
48099575102SLv Zheng 	if (node->type != ACPI_TYPE_METHOD) {
48199575102SLv Zheng 		acpi_os_printf("Executing subtree for Buffer/Package/Region\n");
48299575102SLv Zheng 		return;
48399575102SLv Zheng 	}
48499575102SLv Zheng 
48599575102SLv Zheng 	/* Are any arguments actually set? */
48699575102SLv Zheng 
48799575102SLv Zheng 	for (i = 0; i < ACPI_METHOD_NUM_ARGS; i++) {
48899575102SLv Zheng 		obj_desc = walk_state->arguments[i].object;
48999575102SLv Zheng 		if (obj_desc) {
49099575102SLv Zheng 			display_args = TRUE;
49199575102SLv Zheng 			break;
49299575102SLv Zheng 		}
49399575102SLv Zheng 	}
49499575102SLv Zheng 
49599575102SLv Zheng 	/* If any are set, only display the ones that are set */
49699575102SLv Zheng 
49799575102SLv Zheng 	if (display_args) {
49899575102SLv Zheng 		acpi_os_printf("Initialized Arguments for Method [%4.4s]:  "
49999575102SLv Zheng 			       "(%X arguments defined for method invocation)\n",
50099575102SLv Zheng 			       acpi_ut_get_node_name(node),
5012cb8c3bbSBob Moore 			       node->object->method.param_count);
50299575102SLv Zheng 
50399575102SLv Zheng 		for (i = 0; i < ACPI_METHOD_NUM_ARGS; i++) {
50499575102SLv Zheng 			obj_desc = walk_state->arguments[i].object;
50599575102SLv Zheng 			if (obj_desc) {
50699575102SLv Zheng 				acpi_os_printf("  Arg%u:   ", i);
50799575102SLv Zheng 				acpi_db_display_internal_object(obj_desc,
50899575102SLv Zheng 								walk_state);
50999575102SLv Zheng 			}
51099575102SLv Zheng 		}
51199575102SLv Zheng 	} else {
51299575102SLv Zheng 		acpi_os_printf
51399575102SLv Zheng 		    ("No Arguments are initialized for method [%4.4s]\n",
51499575102SLv Zheng 		     acpi_ut_get_node_name(node));
51599575102SLv Zheng 	}
51699575102SLv Zheng }
517