162306a36Sopenharmony_ci// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 262306a36Sopenharmony_ci/******************************************************************************* 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Module Name: dbobject - ACPI object decode and display 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci ******************************************************************************/ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <acpi/acpi.h> 962306a36Sopenharmony_ci#include "accommon.h" 1062306a36Sopenharmony_ci#include "acnamesp.h" 1162306a36Sopenharmony_ci#include "acdebug.h" 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#define _COMPONENT ACPI_CA_DEBUGGER 1462306a36Sopenharmony_ciACPI_MODULE_NAME("dbobject") 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci/* Local prototypes */ 1762306a36Sopenharmony_cistatic void acpi_db_decode_node(struct acpi_namespace_node *node); 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci/******************************************************************************* 2062306a36Sopenharmony_ci * 2162306a36Sopenharmony_ci * FUNCTION: acpi_db_dump_method_info 2262306a36Sopenharmony_ci * 2362306a36Sopenharmony_ci * PARAMETERS: status - Method execution status 2462306a36Sopenharmony_ci * walk_state - Current state of the parse tree walk 2562306a36Sopenharmony_ci * 2662306a36Sopenharmony_ci * RETURN: None 2762306a36Sopenharmony_ci * 2862306a36Sopenharmony_ci * DESCRIPTION: Called when a method has been aborted because of an error. 2962306a36Sopenharmony_ci * Dumps the method execution stack, and the method locals/args, 3062306a36Sopenharmony_ci * and disassembles the AML opcode that failed. 3162306a36Sopenharmony_ci * 3262306a36Sopenharmony_ci ******************************************************************************/ 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_civoid 3562306a36Sopenharmony_ciacpi_db_dump_method_info(acpi_status status, struct acpi_walk_state *walk_state) 3662306a36Sopenharmony_ci{ 3762306a36Sopenharmony_ci struct acpi_thread_state *thread; 3862306a36Sopenharmony_ci struct acpi_namespace_node *node; 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci node = walk_state->method_node; 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci /* There are no locals or arguments for the module-level code case */ 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci if (node == acpi_gbl_root_node) { 4562306a36Sopenharmony_ci return; 4662306a36Sopenharmony_ci } 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci /* Ignore control codes, they are not errors */ 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci if (ACPI_CNTL_EXCEPTION(status)) { 5162306a36Sopenharmony_ci return; 5262306a36Sopenharmony_ci } 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci /* We may be executing a deferred opcode */ 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci if (walk_state->deferred_node) { 5762306a36Sopenharmony_ci acpi_os_printf("Executing subtree for Buffer/Package/Region\n"); 5862306a36Sopenharmony_ci return; 5962306a36Sopenharmony_ci } 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci /* 6262306a36Sopenharmony_ci * If there is no Thread, we are not actually executing a method. 6362306a36Sopenharmony_ci * This can happen when the iASL compiler calls the interpreter 6462306a36Sopenharmony_ci * to perform constant folding. 6562306a36Sopenharmony_ci */ 6662306a36Sopenharmony_ci thread = walk_state->thread; 6762306a36Sopenharmony_ci if (!thread) { 6862306a36Sopenharmony_ci return; 6962306a36Sopenharmony_ci } 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci /* Display the method locals and arguments */ 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci acpi_os_printf("\n"); 7462306a36Sopenharmony_ci acpi_db_decode_locals(walk_state); 7562306a36Sopenharmony_ci acpi_os_printf("\n"); 7662306a36Sopenharmony_ci acpi_db_decode_arguments(walk_state); 7762306a36Sopenharmony_ci acpi_os_printf("\n"); 7862306a36Sopenharmony_ci} 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci/******************************************************************************* 8162306a36Sopenharmony_ci * 8262306a36Sopenharmony_ci * FUNCTION: acpi_db_decode_internal_object 8362306a36Sopenharmony_ci * 8462306a36Sopenharmony_ci * PARAMETERS: obj_desc - Object to be displayed 8562306a36Sopenharmony_ci * 8662306a36Sopenharmony_ci * RETURN: None 8762306a36Sopenharmony_ci * 8862306a36Sopenharmony_ci * DESCRIPTION: Short display of an internal object. Numbers/Strings/Buffers. 8962306a36Sopenharmony_ci * 9062306a36Sopenharmony_ci ******************************************************************************/ 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_civoid acpi_db_decode_internal_object(union acpi_operand_object *obj_desc) 9362306a36Sopenharmony_ci{ 9462306a36Sopenharmony_ci u32 i; 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci if (!obj_desc) { 9762306a36Sopenharmony_ci acpi_os_printf(" Uninitialized"); 9862306a36Sopenharmony_ci return; 9962306a36Sopenharmony_ci } 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ci if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) != ACPI_DESC_TYPE_OPERAND) { 10262306a36Sopenharmony_ci acpi_os_printf(" %p [%s]", obj_desc, 10362306a36Sopenharmony_ci acpi_ut_get_descriptor_name(obj_desc)); 10462306a36Sopenharmony_ci return; 10562306a36Sopenharmony_ci } 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci acpi_os_printf(" %s", acpi_ut_get_object_type_name(obj_desc)); 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci switch (obj_desc->common.type) { 11062306a36Sopenharmony_ci case ACPI_TYPE_INTEGER: 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci acpi_os_printf(" %8.8X%8.8X", 11362306a36Sopenharmony_ci ACPI_FORMAT_UINT64(obj_desc->integer.value)); 11462306a36Sopenharmony_ci break; 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_ci case ACPI_TYPE_STRING: 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci acpi_os_printf("(%u) \"%.60s", 11962306a36Sopenharmony_ci obj_desc->string.length, 12062306a36Sopenharmony_ci obj_desc->string.pointer); 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci if (obj_desc->string.length > 60) { 12362306a36Sopenharmony_ci acpi_os_printf("..."); 12462306a36Sopenharmony_ci } else { 12562306a36Sopenharmony_ci acpi_os_printf("\""); 12662306a36Sopenharmony_ci } 12762306a36Sopenharmony_ci break; 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci case ACPI_TYPE_BUFFER: 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci acpi_os_printf("(%u)", obj_desc->buffer.length); 13262306a36Sopenharmony_ci for (i = 0; (i < 8) && (i < obj_desc->buffer.length); i++) { 13362306a36Sopenharmony_ci acpi_os_printf(" %2.2X", obj_desc->buffer.pointer[i]); 13462306a36Sopenharmony_ci } 13562306a36Sopenharmony_ci break; 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci default: 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ci acpi_os_printf(" %p", obj_desc); 14062306a36Sopenharmony_ci break; 14162306a36Sopenharmony_ci } 14262306a36Sopenharmony_ci} 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ci/******************************************************************************* 14562306a36Sopenharmony_ci * 14662306a36Sopenharmony_ci * FUNCTION: acpi_db_decode_node 14762306a36Sopenharmony_ci * 14862306a36Sopenharmony_ci * PARAMETERS: node - Object to be displayed 14962306a36Sopenharmony_ci * 15062306a36Sopenharmony_ci * RETURN: None 15162306a36Sopenharmony_ci * 15262306a36Sopenharmony_ci * DESCRIPTION: Short display of a namespace node 15362306a36Sopenharmony_ci * 15462306a36Sopenharmony_ci ******************************************************************************/ 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_cistatic void acpi_db_decode_node(struct acpi_namespace_node *node) 15762306a36Sopenharmony_ci{ 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_ci acpi_os_printf("<Node> Name %4.4s", 16062306a36Sopenharmony_ci acpi_ut_get_node_name(node)); 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_ci if (node->flags & ANOBJ_METHOD_ARG) { 16362306a36Sopenharmony_ci acpi_os_printf(" [Method Arg]"); 16462306a36Sopenharmony_ci } 16562306a36Sopenharmony_ci if (node->flags & ANOBJ_METHOD_LOCAL) { 16662306a36Sopenharmony_ci acpi_os_printf(" [Method Local]"); 16762306a36Sopenharmony_ci } 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_ci switch (node->type) { 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_ci /* These types have no attached object */ 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci case ACPI_TYPE_DEVICE: 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_ci acpi_os_printf(" Device"); 17662306a36Sopenharmony_ci break; 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_ci case ACPI_TYPE_THERMAL: 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_ci acpi_os_printf(" Thermal Zone"); 18162306a36Sopenharmony_ci break; 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_ci default: 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_ci acpi_db_decode_internal_object(acpi_ns_get_attached_object 18662306a36Sopenharmony_ci (node)); 18762306a36Sopenharmony_ci break; 18862306a36Sopenharmony_ci } 18962306a36Sopenharmony_ci} 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_ci/******************************************************************************* 19262306a36Sopenharmony_ci * 19362306a36Sopenharmony_ci * FUNCTION: acpi_db_display_internal_object 19462306a36Sopenharmony_ci * 19562306a36Sopenharmony_ci * PARAMETERS: obj_desc - Object to be displayed 19662306a36Sopenharmony_ci * walk_state - Current walk state 19762306a36Sopenharmony_ci * 19862306a36Sopenharmony_ci * RETURN: None 19962306a36Sopenharmony_ci * 20062306a36Sopenharmony_ci * DESCRIPTION: Short display of an internal object 20162306a36Sopenharmony_ci * 20262306a36Sopenharmony_ci ******************************************************************************/ 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_civoid 20562306a36Sopenharmony_ciacpi_db_display_internal_object(union acpi_operand_object *obj_desc, 20662306a36Sopenharmony_ci struct acpi_walk_state *walk_state) 20762306a36Sopenharmony_ci{ 20862306a36Sopenharmony_ci u8 type; 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_ci acpi_os_printf("%p ", obj_desc); 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_ci if (!obj_desc) { 21362306a36Sopenharmony_ci acpi_os_printf("<Null Object>\n"); 21462306a36Sopenharmony_ci return; 21562306a36Sopenharmony_ci } 21662306a36Sopenharmony_ci 21762306a36Sopenharmony_ci /* Decode the object type */ 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_ci switch (ACPI_GET_DESCRIPTOR_TYPE(obj_desc)) { 22062306a36Sopenharmony_ci case ACPI_DESC_TYPE_PARSER: 22162306a36Sopenharmony_ci 22262306a36Sopenharmony_ci acpi_os_printf("<Parser> "); 22362306a36Sopenharmony_ci break; 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_ci case ACPI_DESC_TYPE_NAMED: 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_ci acpi_db_decode_node((struct acpi_namespace_node *)obj_desc); 22862306a36Sopenharmony_ci break; 22962306a36Sopenharmony_ci 23062306a36Sopenharmony_ci case ACPI_DESC_TYPE_OPERAND: 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_ci type = obj_desc->common.type; 23362306a36Sopenharmony_ci if (type > ACPI_TYPE_LOCAL_MAX) { 23462306a36Sopenharmony_ci acpi_os_printf(" Type %X [Invalid Type]", (u32)type); 23562306a36Sopenharmony_ci return; 23662306a36Sopenharmony_ci } 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_ci /* Decode the ACPI object type */ 23962306a36Sopenharmony_ci 24062306a36Sopenharmony_ci switch (obj_desc->common.type) { 24162306a36Sopenharmony_ci case ACPI_TYPE_LOCAL_REFERENCE: 24262306a36Sopenharmony_ci 24362306a36Sopenharmony_ci acpi_os_printf("[%s] ", 24462306a36Sopenharmony_ci acpi_ut_get_reference_name(obj_desc)); 24562306a36Sopenharmony_ci 24662306a36Sopenharmony_ci /* Decode the reference */ 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_ci switch (obj_desc->reference.class) { 24962306a36Sopenharmony_ci case ACPI_REFCLASS_LOCAL: 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_ci acpi_os_printf("%X ", 25262306a36Sopenharmony_ci obj_desc->reference.value); 25362306a36Sopenharmony_ci if (walk_state) { 25462306a36Sopenharmony_ci obj_desc = walk_state->local_variables 25562306a36Sopenharmony_ci [obj_desc->reference.value].object; 25662306a36Sopenharmony_ci acpi_os_printf("%p", obj_desc); 25762306a36Sopenharmony_ci acpi_db_decode_internal_object 25862306a36Sopenharmony_ci (obj_desc); 25962306a36Sopenharmony_ci } 26062306a36Sopenharmony_ci break; 26162306a36Sopenharmony_ci 26262306a36Sopenharmony_ci case ACPI_REFCLASS_ARG: 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_ci acpi_os_printf("%X ", 26562306a36Sopenharmony_ci obj_desc->reference.value); 26662306a36Sopenharmony_ci if (walk_state) { 26762306a36Sopenharmony_ci obj_desc = walk_state->arguments 26862306a36Sopenharmony_ci [obj_desc->reference.value].object; 26962306a36Sopenharmony_ci acpi_os_printf("%p", obj_desc); 27062306a36Sopenharmony_ci acpi_db_decode_internal_object 27162306a36Sopenharmony_ci (obj_desc); 27262306a36Sopenharmony_ci } 27362306a36Sopenharmony_ci break; 27462306a36Sopenharmony_ci 27562306a36Sopenharmony_ci case ACPI_REFCLASS_INDEX: 27662306a36Sopenharmony_ci 27762306a36Sopenharmony_ci switch (obj_desc->reference.target_type) { 27862306a36Sopenharmony_ci case ACPI_TYPE_BUFFER_FIELD: 27962306a36Sopenharmony_ci 28062306a36Sopenharmony_ci acpi_os_printf("%p", 28162306a36Sopenharmony_ci obj_desc->reference. 28262306a36Sopenharmony_ci object); 28362306a36Sopenharmony_ci acpi_db_decode_internal_object 28462306a36Sopenharmony_ci (obj_desc->reference.object); 28562306a36Sopenharmony_ci break; 28662306a36Sopenharmony_ci 28762306a36Sopenharmony_ci case ACPI_TYPE_PACKAGE: 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_ci acpi_os_printf("%p", 29062306a36Sopenharmony_ci obj_desc->reference. 29162306a36Sopenharmony_ci where); 29262306a36Sopenharmony_ci if (!obj_desc->reference.where) { 29362306a36Sopenharmony_ci acpi_os_printf 29462306a36Sopenharmony_ci (" Uninitialized WHERE pointer"); 29562306a36Sopenharmony_ci } else { 29662306a36Sopenharmony_ci acpi_db_decode_internal_object(* 29762306a36Sopenharmony_ci (obj_desc-> 29862306a36Sopenharmony_ci reference. 29962306a36Sopenharmony_ci where)); 30062306a36Sopenharmony_ci } 30162306a36Sopenharmony_ci break; 30262306a36Sopenharmony_ci 30362306a36Sopenharmony_ci default: 30462306a36Sopenharmony_ci 30562306a36Sopenharmony_ci acpi_os_printf 30662306a36Sopenharmony_ci ("Unknown index target type"); 30762306a36Sopenharmony_ci break; 30862306a36Sopenharmony_ci } 30962306a36Sopenharmony_ci break; 31062306a36Sopenharmony_ci 31162306a36Sopenharmony_ci case ACPI_REFCLASS_REFOF: 31262306a36Sopenharmony_ci 31362306a36Sopenharmony_ci if (!obj_desc->reference.object) { 31462306a36Sopenharmony_ci acpi_os_printf 31562306a36Sopenharmony_ci ("Uninitialized reference subobject pointer"); 31662306a36Sopenharmony_ci break; 31762306a36Sopenharmony_ci } 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_ci /* Reference can be to a Node or an Operand object */ 32062306a36Sopenharmony_ci 32162306a36Sopenharmony_ci switch (ACPI_GET_DESCRIPTOR_TYPE 32262306a36Sopenharmony_ci (obj_desc->reference.object)) { 32362306a36Sopenharmony_ci case ACPI_DESC_TYPE_NAMED: 32462306a36Sopenharmony_ci 32562306a36Sopenharmony_ci acpi_db_decode_node(obj_desc->reference. 32662306a36Sopenharmony_ci object); 32762306a36Sopenharmony_ci break; 32862306a36Sopenharmony_ci 32962306a36Sopenharmony_ci case ACPI_DESC_TYPE_OPERAND: 33062306a36Sopenharmony_ci 33162306a36Sopenharmony_ci acpi_db_decode_internal_object 33262306a36Sopenharmony_ci (obj_desc->reference.object); 33362306a36Sopenharmony_ci break; 33462306a36Sopenharmony_ci 33562306a36Sopenharmony_ci default: 33662306a36Sopenharmony_ci break; 33762306a36Sopenharmony_ci } 33862306a36Sopenharmony_ci break; 33962306a36Sopenharmony_ci 34062306a36Sopenharmony_ci case ACPI_REFCLASS_NAME: 34162306a36Sopenharmony_ci 34262306a36Sopenharmony_ci acpi_db_decode_node(obj_desc->reference.node); 34362306a36Sopenharmony_ci break; 34462306a36Sopenharmony_ci 34562306a36Sopenharmony_ci case ACPI_REFCLASS_DEBUG: 34662306a36Sopenharmony_ci case ACPI_REFCLASS_TABLE: 34762306a36Sopenharmony_ci 34862306a36Sopenharmony_ci acpi_os_printf("\n"); 34962306a36Sopenharmony_ci break; 35062306a36Sopenharmony_ci 35162306a36Sopenharmony_ci default: /* Unknown reference class */ 35262306a36Sopenharmony_ci 35362306a36Sopenharmony_ci acpi_os_printf("%2.2X\n", 35462306a36Sopenharmony_ci obj_desc->reference.class); 35562306a36Sopenharmony_ci break; 35662306a36Sopenharmony_ci } 35762306a36Sopenharmony_ci break; 35862306a36Sopenharmony_ci 35962306a36Sopenharmony_ci default: 36062306a36Sopenharmony_ci 36162306a36Sopenharmony_ci acpi_os_printf("<Obj> "); 36262306a36Sopenharmony_ci acpi_db_decode_internal_object(obj_desc); 36362306a36Sopenharmony_ci break; 36462306a36Sopenharmony_ci } 36562306a36Sopenharmony_ci break; 36662306a36Sopenharmony_ci 36762306a36Sopenharmony_ci default: 36862306a36Sopenharmony_ci 36962306a36Sopenharmony_ci acpi_os_printf("<Not a valid ACPI Object Descriptor> [%s]", 37062306a36Sopenharmony_ci acpi_ut_get_descriptor_name(obj_desc)); 37162306a36Sopenharmony_ci break; 37262306a36Sopenharmony_ci } 37362306a36Sopenharmony_ci 37462306a36Sopenharmony_ci acpi_os_printf("\n"); 37562306a36Sopenharmony_ci} 37662306a36Sopenharmony_ci 37762306a36Sopenharmony_ci/******************************************************************************* 37862306a36Sopenharmony_ci * 37962306a36Sopenharmony_ci * FUNCTION: acpi_db_decode_locals 38062306a36Sopenharmony_ci * 38162306a36Sopenharmony_ci * PARAMETERS: walk_state - State for current method 38262306a36Sopenharmony_ci * 38362306a36Sopenharmony_ci * RETURN: None 38462306a36Sopenharmony_ci * 38562306a36Sopenharmony_ci * DESCRIPTION: Display all locals for the currently running control method 38662306a36Sopenharmony_ci * 38762306a36Sopenharmony_ci ******************************************************************************/ 38862306a36Sopenharmony_ci 38962306a36Sopenharmony_civoid acpi_db_decode_locals(struct acpi_walk_state *walk_state) 39062306a36Sopenharmony_ci{ 39162306a36Sopenharmony_ci u32 i; 39262306a36Sopenharmony_ci union acpi_operand_object *obj_desc; 39362306a36Sopenharmony_ci struct acpi_namespace_node *node; 39462306a36Sopenharmony_ci u8 display_locals = FALSE; 39562306a36Sopenharmony_ci 39662306a36Sopenharmony_ci node = walk_state->method_node; 39762306a36Sopenharmony_ci 39862306a36Sopenharmony_ci /* There are no locals for the module-level code case */ 39962306a36Sopenharmony_ci 40062306a36Sopenharmony_ci if (node == acpi_gbl_root_node) { 40162306a36Sopenharmony_ci return; 40262306a36Sopenharmony_ci } 40362306a36Sopenharmony_ci 40462306a36Sopenharmony_ci if (!node) { 40562306a36Sopenharmony_ci acpi_os_printf 40662306a36Sopenharmony_ci ("No method node (Executing subtree for buffer or opregion)\n"); 40762306a36Sopenharmony_ci return; 40862306a36Sopenharmony_ci } 40962306a36Sopenharmony_ci 41062306a36Sopenharmony_ci if (node->type != ACPI_TYPE_METHOD) { 41162306a36Sopenharmony_ci acpi_os_printf("Executing subtree for Buffer/Package/Region\n"); 41262306a36Sopenharmony_ci return; 41362306a36Sopenharmony_ci } 41462306a36Sopenharmony_ci 41562306a36Sopenharmony_ci /* Are any locals actually set? */ 41662306a36Sopenharmony_ci 41762306a36Sopenharmony_ci for (i = 0; i < ACPI_METHOD_NUM_LOCALS; i++) { 41862306a36Sopenharmony_ci obj_desc = walk_state->local_variables[i].object; 41962306a36Sopenharmony_ci if (obj_desc) { 42062306a36Sopenharmony_ci display_locals = TRUE; 42162306a36Sopenharmony_ci break; 42262306a36Sopenharmony_ci } 42362306a36Sopenharmony_ci } 42462306a36Sopenharmony_ci 42562306a36Sopenharmony_ci /* If any are set, only display the ones that are set */ 42662306a36Sopenharmony_ci 42762306a36Sopenharmony_ci if (display_locals) { 42862306a36Sopenharmony_ci acpi_os_printf 42962306a36Sopenharmony_ci ("\nInitialized Local Variables for Method [%4.4s]:\n", 43062306a36Sopenharmony_ci acpi_ut_get_node_name(node)); 43162306a36Sopenharmony_ci 43262306a36Sopenharmony_ci for (i = 0; i < ACPI_METHOD_NUM_LOCALS; i++) { 43362306a36Sopenharmony_ci obj_desc = walk_state->local_variables[i].object; 43462306a36Sopenharmony_ci if (obj_desc) { 43562306a36Sopenharmony_ci acpi_os_printf(" Local%X: ", i); 43662306a36Sopenharmony_ci acpi_db_display_internal_object(obj_desc, 43762306a36Sopenharmony_ci walk_state); 43862306a36Sopenharmony_ci } 43962306a36Sopenharmony_ci } 44062306a36Sopenharmony_ci } else { 44162306a36Sopenharmony_ci acpi_os_printf 44262306a36Sopenharmony_ci ("No Local Variables are initialized for Method [%4.4s]\n", 44362306a36Sopenharmony_ci acpi_ut_get_node_name(node)); 44462306a36Sopenharmony_ci } 44562306a36Sopenharmony_ci} 44662306a36Sopenharmony_ci 44762306a36Sopenharmony_ci/******************************************************************************* 44862306a36Sopenharmony_ci * 44962306a36Sopenharmony_ci * FUNCTION: acpi_db_decode_arguments 45062306a36Sopenharmony_ci * 45162306a36Sopenharmony_ci * PARAMETERS: walk_state - State for current method 45262306a36Sopenharmony_ci * 45362306a36Sopenharmony_ci * RETURN: None 45462306a36Sopenharmony_ci * 45562306a36Sopenharmony_ci * DESCRIPTION: Display all arguments for the currently running control method 45662306a36Sopenharmony_ci * 45762306a36Sopenharmony_ci ******************************************************************************/ 45862306a36Sopenharmony_ci 45962306a36Sopenharmony_civoid acpi_db_decode_arguments(struct acpi_walk_state *walk_state) 46062306a36Sopenharmony_ci{ 46162306a36Sopenharmony_ci u32 i; 46262306a36Sopenharmony_ci union acpi_operand_object *obj_desc; 46362306a36Sopenharmony_ci struct acpi_namespace_node *node; 46462306a36Sopenharmony_ci u8 display_args = FALSE; 46562306a36Sopenharmony_ci 46662306a36Sopenharmony_ci node = walk_state->method_node; 46762306a36Sopenharmony_ci 46862306a36Sopenharmony_ci /* There are no arguments for the module-level code case */ 46962306a36Sopenharmony_ci 47062306a36Sopenharmony_ci if (node == acpi_gbl_root_node) { 47162306a36Sopenharmony_ci return; 47262306a36Sopenharmony_ci } 47362306a36Sopenharmony_ci 47462306a36Sopenharmony_ci if (!node) { 47562306a36Sopenharmony_ci acpi_os_printf 47662306a36Sopenharmony_ci ("No method node (Executing subtree for buffer or opregion)\n"); 47762306a36Sopenharmony_ci return; 47862306a36Sopenharmony_ci } 47962306a36Sopenharmony_ci 48062306a36Sopenharmony_ci if (node->type != ACPI_TYPE_METHOD) { 48162306a36Sopenharmony_ci acpi_os_printf("Executing subtree for Buffer/Package/Region\n"); 48262306a36Sopenharmony_ci return; 48362306a36Sopenharmony_ci } 48462306a36Sopenharmony_ci 48562306a36Sopenharmony_ci /* Are any arguments actually set? */ 48662306a36Sopenharmony_ci 48762306a36Sopenharmony_ci for (i = 0; i < ACPI_METHOD_NUM_ARGS; i++) { 48862306a36Sopenharmony_ci obj_desc = walk_state->arguments[i].object; 48962306a36Sopenharmony_ci if (obj_desc) { 49062306a36Sopenharmony_ci display_args = TRUE; 49162306a36Sopenharmony_ci break; 49262306a36Sopenharmony_ci } 49362306a36Sopenharmony_ci } 49462306a36Sopenharmony_ci 49562306a36Sopenharmony_ci /* If any are set, only display the ones that are set */ 49662306a36Sopenharmony_ci 49762306a36Sopenharmony_ci if (display_args) { 49862306a36Sopenharmony_ci acpi_os_printf("Initialized Arguments for Method [%4.4s]: " 49962306a36Sopenharmony_ci "(%X arguments defined for method invocation)\n", 50062306a36Sopenharmony_ci acpi_ut_get_node_name(node), 50162306a36Sopenharmony_ci node->object->method.param_count); 50262306a36Sopenharmony_ci 50362306a36Sopenharmony_ci for (i = 0; i < ACPI_METHOD_NUM_ARGS; i++) { 50462306a36Sopenharmony_ci obj_desc = walk_state->arguments[i].object; 50562306a36Sopenharmony_ci if (obj_desc) { 50662306a36Sopenharmony_ci acpi_os_printf(" Arg%u: ", i); 50762306a36Sopenharmony_ci acpi_db_display_internal_object(obj_desc, 50862306a36Sopenharmony_ci walk_state); 50962306a36Sopenharmony_ci } 51062306a36Sopenharmony_ci } 51162306a36Sopenharmony_ci } else { 51262306a36Sopenharmony_ci acpi_os_printf 51362306a36Sopenharmony_ci ("No Arguments are initialized for method [%4.4s]\n", 51462306a36Sopenharmony_ci acpi_ut_get_node_name(node)); 51562306a36Sopenharmony_ci } 51662306a36Sopenharmony_ci} 517