xref: /OK3568_Linux_fs/kernel/drivers/acpi/acpica/dbobject.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
2*4882a593Smuzhiyun /*******************************************************************************
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Module Name: dbobject - ACPI object decode and display
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  ******************************************************************************/
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #include <acpi/acpi.h>
9*4882a593Smuzhiyun #include "accommon.h"
10*4882a593Smuzhiyun #include "acnamesp.h"
11*4882a593Smuzhiyun #include "acdebug.h"
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #define _COMPONENT          ACPI_CA_DEBUGGER
14*4882a593Smuzhiyun ACPI_MODULE_NAME("dbobject")
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun /* Local prototypes */
17*4882a593Smuzhiyun static void acpi_db_decode_node(struct acpi_namespace_node *node);
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun /*******************************************************************************
20*4882a593Smuzhiyun  *
21*4882a593Smuzhiyun  * FUNCTION:    acpi_db_dump_method_info
22*4882a593Smuzhiyun  *
23*4882a593Smuzhiyun  * PARAMETERS:  status          - Method execution status
24*4882a593Smuzhiyun  *              walk_state      - Current state of the parse tree walk
25*4882a593Smuzhiyun  *
26*4882a593Smuzhiyun  * RETURN:      None
27*4882a593Smuzhiyun  *
28*4882a593Smuzhiyun  * DESCRIPTION: Called when a method has been aborted because of an error.
29*4882a593Smuzhiyun  *              Dumps the method execution stack, and the method locals/args,
30*4882a593Smuzhiyun  *              and disassembles the AML opcode that failed.
31*4882a593Smuzhiyun  *
32*4882a593Smuzhiyun  ******************************************************************************/
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun void
acpi_db_dump_method_info(acpi_status status,struct acpi_walk_state * walk_state)35*4882a593Smuzhiyun acpi_db_dump_method_info(acpi_status status, struct acpi_walk_state *walk_state)
36*4882a593Smuzhiyun {
37*4882a593Smuzhiyun 	struct acpi_thread_state *thread;
38*4882a593Smuzhiyun 	struct acpi_namespace_node *node;
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun 	node = walk_state->method_node;
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun 	/* There are no locals or arguments for the module-level code case */
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun 	if (node == acpi_gbl_root_node) {
45*4882a593Smuzhiyun 		return;
46*4882a593Smuzhiyun 	}
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun 	/* Ignore control codes, they are not errors */
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun 	if ((status & AE_CODE_MASK) == AE_CODE_CONTROL) {
51*4882a593Smuzhiyun 		return;
52*4882a593Smuzhiyun 	}
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun 	/* We may be executing a deferred opcode */
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun 	if (walk_state->deferred_node) {
57*4882a593Smuzhiyun 		acpi_os_printf("Executing subtree for Buffer/Package/Region\n");
58*4882a593Smuzhiyun 		return;
59*4882a593Smuzhiyun 	}
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun 	/*
62*4882a593Smuzhiyun 	 * If there is no Thread, we are not actually executing a method.
63*4882a593Smuzhiyun 	 * This can happen when the iASL compiler calls the interpreter
64*4882a593Smuzhiyun 	 * to perform constant folding.
65*4882a593Smuzhiyun 	 */
66*4882a593Smuzhiyun 	thread = walk_state->thread;
67*4882a593Smuzhiyun 	if (!thread) {
68*4882a593Smuzhiyun 		return;
69*4882a593Smuzhiyun 	}
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun 	/* Display the method locals and arguments */
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun 	acpi_os_printf("\n");
74*4882a593Smuzhiyun 	acpi_db_decode_locals(walk_state);
75*4882a593Smuzhiyun 	acpi_os_printf("\n");
76*4882a593Smuzhiyun 	acpi_db_decode_arguments(walk_state);
77*4882a593Smuzhiyun 	acpi_os_printf("\n");
78*4882a593Smuzhiyun }
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun /*******************************************************************************
81*4882a593Smuzhiyun  *
82*4882a593Smuzhiyun  * FUNCTION:    acpi_db_decode_internal_object
83*4882a593Smuzhiyun  *
84*4882a593Smuzhiyun  * PARAMETERS:  obj_desc        - Object to be displayed
85*4882a593Smuzhiyun  *
86*4882a593Smuzhiyun  * RETURN:      None
87*4882a593Smuzhiyun  *
88*4882a593Smuzhiyun  * DESCRIPTION: Short display of an internal object. Numbers/Strings/Buffers.
89*4882a593Smuzhiyun  *
90*4882a593Smuzhiyun  ******************************************************************************/
91*4882a593Smuzhiyun 
acpi_db_decode_internal_object(union acpi_operand_object * obj_desc)92*4882a593Smuzhiyun void acpi_db_decode_internal_object(union acpi_operand_object *obj_desc)
93*4882a593Smuzhiyun {
94*4882a593Smuzhiyun 	u32 i;
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun 	if (!obj_desc) {
97*4882a593Smuzhiyun 		acpi_os_printf(" Uninitialized");
98*4882a593Smuzhiyun 		return;
99*4882a593Smuzhiyun 	}
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun 	if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) != ACPI_DESC_TYPE_OPERAND) {
102*4882a593Smuzhiyun 		acpi_os_printf(" %p [%s]", obj_desc,
103*4882a593Smuzhiyun 			       acpi_ut_get_descriptor_name(obj_desc));
104*4882a593Smuzhiyun 		return;
105*4882a593Smuzhiyun 	}
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun 	acpi_os_printf(" %s", acpi_ut_get_object_type_name(obj_desc));
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun 	switch (obj_desc->common.type) {
110*4882a593Smuzhiyun 	case ACPI_TYPE_INTEGER:
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun 		acpi_os_printf(" %8.8X%8.8X",
113*4882a593Smuzhiyun 			       ACPI_FORMAT_UINT64(obj_desc->integer.value));
114*4882a593Smuzhiyun 		break;
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun 	case ACPI_TYPE_STRING:
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun 		acpi_os_printf("(%u) \"%.60s",
119*4882a593Smuzhiyun 			       obj_desc->string.length,
120*4882a593Smuzhiyun 			       obj_desc->string.pointer);
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun 		if (obj_desc->string.length > 60) {
123*4882a593Smuzhiyun 			acpi_os_printf("...");
124*4882a593Smuzhiyun 		} else {
125*4882a593Smuzhiyun 			acpi_os_printf("\"");
126*4882a593Smuzhiyun 		}
127*4882a593Smuzhiyun 		break;
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun 	case ACPI_TYPE_BUFFER:
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun 		acpi_os_printf("(%u)", obj_desc->buffer.length);
132*4882a593Smuzhiyun 		for (i = 0; (i < 8) && (i < obj_desc->buffer.length); i++) {
133*4882a593Smuzhiyun 			acpi_os_printf(" %2.2X", obj_desc->buffer.pointer[i]);
134*4882a593Smuzhiyun 		}
135*4882a593Smuzhiyun 		break;
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun 	default:
138*4882a593Smuzhiyun 
139*4882a593Smuzhiyun 		acpi_os_printf(" %p", obj_desc);
140*4882a593Smuzhiyun 		break;
141*4882a593Smuzhiyun 	}
142*4882a593Smuzhiyun }
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun /*******************************************************************************
145*4882a593Smuzhiyun  *
146*4882a593Smuzhiyun  * FUNCTION:    acpi_db_decode_node
147*4882a593Smuzhiyun  *
148*4882a593Smuzhiyun  * PARAMETERS:  node        - Object to be displayed
149*4882a593Smuzhiyun  *
150*4882a593Smuzhiyun  * RETURN:      None
151*4882a593Smuzhiyun  *
152*4882a593Smuzhiyun  * DESCRIPTION: Short display of a namespace node
153*4882a593Smuzhiyun  *
154*4882a593Smuzhiyun  ******************************************************************************/
155*4882a593Smuzhiyun 
acpi_db_decode_node(struct acpi_namespace_node * node)156*4882a593Smuzhiyun static void acpi_db_decode_node(struct acpi_namespace_node *node)
157*4882a593Smuzhiyun {
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun 	acpi_os_printf("<Node>          Name %4.4s",
160*4882a593Smuzhiyun 		       acpi_ut_get_node_name(node));
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun 	if (node->flags & ANOBJ_METHOD_ARG) {
163*4882a593Smuzhiyun 		acpi_os_printf(" [Method Arg]");
164*4882a593Smuzhiyun 	}
165*4882a593Smuzhiyun 	if (node->flags & ANOBJ_METHOD_LOCAL) {
166*4882a593Smuzhiyun 		acpi_os_printf(" [Method Local]");
167*4882a593Smuzhiyun 	}
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun 	switch (node->type) {
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun 		/* These types have no attached object */
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun 	case ACPI_TYPE_DEVICE:
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun 		acpi_os_printf(" Device");
176*4882a593Smuzhiyun 		break;
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun 	case ACPI_TYPE_THERMAL:
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun 		acpi_os_printf(" Thermal Zone");
181*4882a593Smuzhiyun 		break;
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun 	default:
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun 		acpi_db_decode_internal_object(acpi_ns_get_attached_object
186*4882a593Smuzhiyun 					       (node));
187*4882a593Smuzhiyun 		break;
188*4882a593Smuzhiyun 	}
189*4882a593Smuzhiyun }
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun /*******************************************************************************
192*4882a593Smuzhiyun  *
193*4882a593Smuzhiyun  * FUNCTION:    acpi_db_display_internal_object
194*4882a593Smuzhiyun  *
195*4882a593Smuzhiyun  * PARAMETERS:  obj_desc        - Object to be displayed
196*4882a593Smuzhiyun  *              walk_state      - Current walk state
197*4882a593Smuzhiyun  *
198*4882a593Smuzhiyun  * RETURN:      None
199*4882a593Smuzhiyun  *
200*4882a593Smuzhiyun  * DESCRIPTION: Short display of an internal object
201*4882a593Smuzhiyun  *
202*4882a593Smuzhiyun  ******************************************************************************/
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun void
acpi_db_display_internal_object(union acpi_operand_object * obj_desc,struct acpi_walk_state * walk_state)205*4882a593Smuzhiyun acpi_db_display_internal_object(union acpi_operand_object *obj_desc,
206*4882a593Smuzhiyun 				struct acpi_walk_state *walk_state)
207*4882a593Smuzhiyun {
208*4882a593Smuzhiyun 	u8 type;
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun 	acpi_os_printf("%p ", obj_desc);
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun 	if (!obj_desc) {
213*4882a593Smuzhiyun 		acpi_os_printf("<Null Object>\n");
214*4882a593Smuzhiyun 		return;
215*4882a593Smuzhiyun 	}
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun 	/* Decode the object type */
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun 	switch (ACPI_GET_DESCRIPTOR_TYPE(obj_desc)) {
220*4882a593Smuzhiyun 	case ACPI_DESC_TYPE_PARSER:
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun 		acpi_os_printf("<Parser> ");
223*4882a593Smuzhiyun 		break;
224*4882a593Smuzhiyun 
225*4882a593Smuzhiyun 	case ACPI_DESC_TYPE_NAMED:
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun 		acpi_db_decode_node((struct acpi_namespace_node *)obj_desc);
228*4882a593Smuzhiyun 		break;
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun 	case ACPI_DESC_TYPE_OPERAND:
231*4882a593Smuzhiyun 
232*4882a593Smuzhiyun 		type = obj_desc->common.type;
233*4882a593Smuzhiyun 		if (type > ACPI_TYPE_LOCAL_MAX) {
234*4882a593Smuzhiyun 			acpi_os_printf(" Type %X [Invalid Type]", (u32)type);
235*4882a593Smuzhiyun 			return;
236*4882a593Smuzhiyun 		}
237*4882a593Smuzhiyun 
238*4882a593Smuzhiyun 		/* Decode the ACPI object type */
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun 		switch (obj_desc->common.type) {
241*4882a593Smuzhiyun 		case ACPI_TYPE_LOCAL_REFERENCE:
242*4882a593Smuzhiyun 
243*4882a593Smuzhiyun 			acpi_os_printf("[%s] ",
244*4882a593Smuzhiyun 				       acpi_ut_get_reference_name(obj_desc));
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun 			/* Decode the reference */
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun 			switch (obj_desc->reference.class) {
249*4882a593Smuzhiyun 			case ACPI_REFCLASS_LOCAL:
250*4882a593Smuzhiyun 
251*4882a593Smuzhiyun 				acpi_os_printf("%X ",
252*4882a593Smuzhiyun 					       obj_desc->reference.value);
253*4882a593Smuzhiyun 				if (walk_state) {
254*4882a593Smuzhiyun 					obj_desc = walk_state->local_variables
255*4882a593Smuzhiyun 					    [obj_desc->reference.value].object;
256*4882a593Smuzhiyun 					acpi_os_printf("%p", obj_desc);
257*4882a593Smuzhiyun 					acpi_db_decode_internal_object
258*4882a593Smuzhiyun 					    (obj_desc);
259*4882a593Smuzhiyun 				}
260*4882a593Smuzhiyun 				break;
261*4882a593Smuzhiyun 
262*4882a593Smuzhiyun 			case ACPI_REFCLASS_ARG:
263*4882a593Smuzhiyun 
264*4882a593Smuzhiyun 				acpi_os_printf("%X ",
265*4882a593Smuzhiyun 					       obj_desc->reference.value);
266*4882a593Smuzhiyun 				if (walk_state) {
267*4882a593Smuzhiyun 					obj_desc = walk_state->arguments
268*4882a593Smuzhiyun 					    [obj_desc->reference.value].object;
269*4882a593Smuzhiyun 					acpi_os_printf("%p", obj_desc);
270*4882a593Smuzhiyun 					acpi_db_decode_internal_object
271*4882a593Smuzhiyun 					    (obj_desc);
272*4882a593Smuzhiyun 				}
273*4882a593Smuzhiyun 				break;
274*4882a593Smuzhiyun 
275*4882a593Smuzhiyun 			case ACPI_REFCLASS_INDEX:
276*4882a593Smuzhiyun 
277*4882a593Smuzhiyun 				switch (obj_desc->reference.target_type) {
278*4882a593Smuzhiyun 				case ACPI_TYPE_BUFFER_FIELD:
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun 					acpi_os_printf("%p",
281*4882a593Smuzhiyun 						       obj_desc->reference.
282*4882a593Smuzhiyun 						       object);
283*4882a593Smuzhiyun 					acpi_db_decode_internal_object
284*4882a593Smuzhiyun 					    (obj_desc->reference.object);
285*4882a593Smuzhiyun 					break;
286*4882a593Smuzhiyun 
287*4882a593Smuzhiyun 				case ACPI_TYPE_PACKAGE:
288*4882a593Smuzhiyun 
289*4882a593Smuzhiyun 					acpi_os_printf("%p",
290*4882a593Smuzhiyun 						       obj_desc->reference.
291*4882a593Smuzhiyun 						       where);
292*4882a593Smuzhiyun 					if (!obj_desc->reference.where) {
293*4882a593Smuzhiyun 						acpi_os_printf
294*4882a593Smuzhiyun 						    (" Uninitialized WHERE pointer");
295*4882a593Smuzhiyun 					} else {
296*4882a593Smuzhiyun 						acpi_db_decode_internal_object(*
297*4882a593Smuzhiyun 									       (obj_desc->
298*4882a593Smuzhiyun 										reference.
299*4882a593Smuzhiyun 										where));
300*4882a593Smuzhiyun 					}
301*4882a593Smuzhiyun 					break;
302*4882a593Smuzhiyun 
303*4882a593Smuzhiyun 				default:
304*4882a593Smuzhiyun 
305*4882a593Smuzhiyun 					acpi_os_printf
306*4882a593Smuzhiyun 					    ("Unknown index target type");
307*4882a593Smuzhiyun 					break;
308*4882a593Smuzhiyun 				}
309*4882a593Smuzhiyun 				break;
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun 			case ACPI_REFCLASS_REFOF:
312*4882a593Smuzhiyun 
313*4882a593Smuzhiyun 				if (!obj_desc->reference.object) {
314*4882a593Smuzhiyun 					acpi_os_printf
315*4882a593Smuzhiyun 					    ("Uninitialized reference subobject pointer");
316*4882a593Smuzhiyun 					break;
317*4882a593Smuzhiyun 				}
318*4882a593Smuzhiyun 
319*4882a593Smuzhiyun 				/* Reference can be to a Node or an Operand object */
320*4882a593Smuzhiyun 
321*4882a593Smuzhiyun 				switch (ACPI_GET_DESCRIPTOR_TYPE
322*4882a593Smuzhiyun 					(obj_desc->reference.object)) {
323*4882a593Smuzhiyun 				case ACPI_DESC_TYPE_NAMED:
324*4882a593Smuzhiyun 
325*4882a593Smuzhiyun 					acpi_db_decode_node(obj_desc->reference.
326*4882a593Smuzhiyun 							    object);
327*4882a593Smuzhiyun 					break;
328*4882a593Smuzhiyun 
329*4882a593Smuzhiyun 				case ACPI_DESC_TYPE_OPERAND:
330*4882a593Smuzhiyun 
331*4882a593Smuzhiyun 					acpi_db_decode_internal_object
332*4882a593Smuzhiyun 					    (obj_desc->reference.object);
333*4882a593Smuzhiyun 					break;
334*4882a593Smuzhiyun 
335*4882a593Smuzhiyun 				default:
336*4882a593Smuzhiyun 					break;
337*4882a593Smuzhiyun 				}
338*4882a593Smuzhiyun 				break;
339*4882a593Smuzhiyun 
340*4882a593Smuzhiyun 			case ACPI_REFCLASS_NAME:
341*4882a593Smuzhiyun 
342*4882a593Smuzhiyun 				acpi_db_decode_node(obj_desc->reference.node);
343*4882a593Smuzhiyun 				break;
344*4882a593Smuzhiyun 
345*4882a593Smuzhiyun 			case ACPI_REFCLASS_DEBUG:
346*4882a593Smuzhiyun 			case ACPI_REFCLASS_TABLE:
347*4882a593Smuzhiyun 
348*4882a593Smuzhiyun 				acpi_os_printf("\n");
349*4882a593Smuzhiyun 				break;
350*4882a593Smuzhiyun 
351*4882a593Smuzhiyun 			default:	/* Unknown reference class */
352*4882a593Smuzhiyun 
353*4882a593Smuzhiyun 				acpi_os_printf("%2.2X\n",
354*4882a593Smuzhiyun 					       obj_desc->reference.class);
355*4882a593Smuzhiyun 				break;
356*4882a593Smuzhiyun 			}
357*4882a593Smuzhiyun 			break;
358*4882a593Smuzhiyun 
359*4882a593Smuzhiyun 		default:
360*4882a593Smuzhiyun 
361*4882a593Smuzhiyun 			acpi_os_printf("<Obj>          ");
362*4882a593Smuzhiyun 			acpi_db_decode_internal_object(obj_desc);
363*4882a593Smuzhiyun 			break;
364*4882a593Smuzhiyun 		}
365*4882a593Smuzhiyun 		break;
366*4882a593Smuzhiyun 
367*4882a593Smuzhiyun 	default:
368*4882a593Smuzhiyun 
369*4882a593Smuzhiyun 		acpi_os_printf("<Not a valid ACPI Object Descriptor> [%s]",
370*4882a593Smuzhiyun 			       acpi_ut_get_descriptor_name(obj_desc));
371*4882a593Smuzhiyun 		break;
372*4882a593Smuzhiyun 	}
373*4882a593Smuzhiyun 
374*4882a593Smuzhiyun 	acpi_os_printf("\n");
375*4882a593Smuzhiyun }
376*4882a593Smuzhiyun 
377*4882a593Smuzhiyun /*******************************************************************************
378*4882a593Smuzhiyun  *
379*4882a593Smuzhiyun  * FUNCTION:    acpi_db_decode_locals
380*4882a593Smuzhiyun  *
381*4882a593Smuzhiyun  * PARAMETERS:  walk_state      - State for current method
382*4882a593Smuzhiyun  *
383*4882a593Smuzhiyun  * RETURN:      None
384*4882a593Smuzhiyun  *
385*4882a593Smuzhiyun  * DESCRIPTION: Display all locals for the currently running control method
386*4882a593Smuzhiyun  *
387*4882a593Smuzhiyun  ******************************************************************************/
388*4882a593Smuzhiyun 
acpi_db_decode_locals(struct acpi_walk_state * walk_state)389*4882a593Smuzhiyun void acpi_db_decode_locals(struct acpi_walk_state *walk_state)
390*4882a593Smuzhiyun {
391*4882a593Smuzhiyun 	u32 i;
392*4882a593Smuzhiyun 	union acpi_operand_object *obj_desc;
393*4882a593Smuzhiyun 	struct acpi_namespace_node *node;
394*4882a593Smuzhiyun 	u8 display_locals = FALSE;
395*4882a593Smuzhiyun 
396*4882a593Smuzhiyun 	node = walk_state->method_node;
397*4882a593Smuzhiyun 
398*4882a593Smuzhiyun 	/* There are no locals for the module-level code case */
399*4882a593Smuzhiyun 
400*4882a593Smuzhiyun 	if (node == acpi_gbl_root_node) {
401*4882a593Smuzhiyun 		return;
402*4882a593Smuzhiyun 	}
403*4882a593Smuzhiyun 
404*4882a593Smuzhiyun 	if (!node) {
405*4882a593Smuzhiyun 		acpi_os_printf
406*4882a593Smuzhiyun 		    ("No method node (Executing subtree for buffer or opregion)\n");
407*4882a593Smuzhiyun 		return;
408*4882a593Smuzhiyun 	}
409*4882a593Smuzhiyun 
410*4882a593Smuzhiyun 	if (node->type != ACPI_TYPE_METHOD) {
411*4882a593Smuzhiyun 		acpi_os_printf("Executing subtree for Buffer/Package/Region\n");
412*4882a593Smuzhiyun 		return;
413*4882a593Smuzhiyun 	}
414*4882a593Smuzhiyun 
415*4882a593Smuzhiyun 	/* Are any locals actually set? */
416*4882a593Smuzhiyun 
417*4882a593Smuzhiyun 	for (i = 0; i < ACPI_METHOD_NUM_LOCALS; i++) {
418*4882a593Smuzhiyun 		obj_desc = walk_state->local_variables[i].object;
419*4882a593Smuzhiyun 		if (obj_desc) {
420*4882a593Smuzhiyun 			display_locals = TRUE;
421*4882a593Smuzhiyun 			break;
422*4882a593Smuzhiyun 		}
423*4882a593Smuzhiyun 	}
424*4882a593Smuzhiyun 
425*4882a593Smuzhiyun 	/* If any are set, only display the ones that are set */
426*4882a593Smuzhiyun 
427*4882a593Smuzhiyun 	if (display_locals) {
428*4882a593Smuzhiyun 		acpi_os_printf
429*4882a593Smuzhiyun 		    ("\nInitialized Local Variables for Method [%4.4s]:\n",
430*4882a593Smuzhiyun 		     acpi_ut_get_node_name(node));
431*4882a593Smuzhiyun 
432*4882a593Smuzhiyun 		for (i = 0; i < ACPI_METHOD_NUM_LOCALS; i++) {
433*4882a593Smuzhiyun 			obj_desc = walk_state->local_variables[i].object;
434*4882a593Smuzhiyun 			if (obj_desc) {
435*4882a593Smuzhiyun 				acpi_os_printf("  Local%X: ", i);
436*4882a593Smuzhiyun 				acpi_db_display_internal_object(obj_desc,
437*4882a593Smuzhiyun 								walk_state);
438*4882a593Smuzhiyun 			}
439*4882a593Smuzhiyun 		}
440*4882a593Smuzhiyun 	} else {
441*4882a593Smuzhiyun 		acpi_os_printf
442*4882a593Smuzhiyun 		    ("No Local Variables are initialized for Method [%4.4s]\n",
443*4882a593Smuzhiyun 		     acpi_ut_get_node_name(node));
444*4882a593Smuzhiyun 	}
445*4882a593Smuzhiyun }
446*4882a593Smuzhiyun 
447*4882a593Smuzhiyun /*******************************************************************************
448*4882a593Smuzhiyun  *
449*4882a593Smuzhiyun  * FUNCTION:    acpi_db_decode_arguments
450*4882a593Smuzhiyun  *
451*4882a593Smuzhiyun  * PARAMETERS:  walk_state      - State for current method
452*4882a593Smuzhiyun  *
453*4882a593Smuzhiyun  * RETURN:      None
454*4882a593Smuzhiyun  *
455*4882a593Smuzhiyun  * DESCRIPTION: Display all arguments for the currently running control method
456*4882a593Smuzhiyun  *
457*4882a593Smuzhiyun  ******************************************************************************/
458*4882a593Smuzhiyun 
acpi_db_decode_arguments(struct acpi_walk_state * walk_state)459*4882a593Smuzhiyun void acpi_db_decode_arguments(struct acpi_walk_state *walk_state)
460*4882a593Smuzhiyun {
461*4882a593Smuzhiyun 	u32 i;
462*4882a593Smuzhiyun 	union acpi_operand_object *obj_desc;
463*4882a593Smuzhiyun 	struct acpi_namespace_node *node;
464*4882a593Smuzhiyun 	u8 display_args = FALSE;
465*4882a593Smuzhiyun 
466*4882a593Smuzhiyun 	node = walk_state->method_node;
467*4882a593Smuzhiyun 
468*4882a593Smuzhiyun 	/* There are no arguments for the module-level code case */
469*4882a593Smuzhiyun 
470*4882a593Smuzhiyun 	if (node == acpi_gbl_root_node) {
471*4882a593Smuzhiyun 		return;
472*4882a593Smuzhiyun 	}
473*4882a593Smuzhiyun 
474*4882a593Smuzhiyun 	if (!node) {
475*4882a593Smuzhiyun 		acpi_os_printf
476*4882a593Smuzhiyun 		    ("No method node (Executing subtree for buffer or opregion)\n");
477*4882a593Smuzhiyun 		return;
478*4882a593Smuzhiyun 	}
479*4882a593Smuzhiyun 
480*4882a593Smuzhiyun 	if (node->type != ACPI_TYPE_METHOD) {
481*4882a593Smuzhiyun 		acpi_os_printf("Executing subtree for Buffer/Package/Region\n");
482*4882a593Smuzhiyun 		return;
483*4882a593Smuzhiyun 	}
484*4882a593Smuzhiyun 
485*4882a593Smuzhiyun 	/* Are any arguments actually set? */
486*4882a593Smuzhiyun 
487*4882a593Smuzhiyun 	for (i = 0; i < ACPI_METHOD_NUM_ARGS; i++) {
488*4882a593Smuzhiyun 		obj_desc = walk_state->arguments[i].object;
489*4882a593Smuzhiyun 		if (obj_desc) {
490*4882a593Smuzhiyun 			display_args = TRUE;
491*4882a593Smuzhiyun 			break;
492*4882a593Smuzhiyun 		}
493*4882a593Smuzhiyun 	}
494*4882a593Smuzhiyun 
495*4882a593Smuzhiyun 	/* If any are set, only display the ones that are set */
496*4882a593Smuzhiyun 
497*4882a593Smuzhiyun 	if (display_args) {
498*4882a593Smuzhiyun 		acpi_os_printf("Initialized Arguments for Method [%4.4s]:  "
499*4882a593Smuzhiyun 			       "(%X arguments defined for method invocation)\n",
500*4882a593Smuzhiyun 			       acpi_ut_get_node_name(node),
501*4882a593Smuzhiyun 			       node->object->method.param_count);
502*4882a593Smuzhiyun 
503*4882a593Smuzhiyun 		for (i = 0; i < ACPI_METHOD_NUM_ARGS; i++) {
504*4882a593Smuzhiyun 			obj_desc = walk_state->arguments[i].object;
505*4882a593Smuzhiyun 			if (obj_desc) {
506*4882a593Smuzhiyun 				acpi_os_printf("  Arg%u:   ", i);
507*4882a593Smuzhiyun 				acpi_db_display_internal_object(obj_desc,
508*4882a593Smuzhiyun 								walk_state);
509*4882a593Smuzhiyun 			}
510*4882a593Smuzhiyun 		}
511*4882a593Smuzhiyun 	} else {
512*4882a593Smuzhiyun 		acpi_os_printf
513*4882a593Smuzhiyun 		    ("No Arguments are initialized for method [%4.4s]\n",
514*4882a593Smuzhiyun 		     acpi_ut_get_node_name(node));
515*4882a593Smuzhiyun 	}
516*4882a593Smuzhiyun }
517