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