162306a36Sopenharmony_ci// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 262306a36Sopenharmony_ci/******************************************************************************* 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Module Name: dbutils - AML debugger utilities 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("dbutils") 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci/* Local prototypes */ 1762306a36Sopenharmony_ci#ifdef ACPI_OBSOLETE_FUNCTIONS 1862306a36Sopenharmony_ciacpi_status acpi_db_second_pass_parse(union acpi_parse_object *root); 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_civoid acpi_db_dump_buffer(u32 address); 2162306a36Sopenharmony_ci#endif 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci/******************************************************************************* 2462306a36Sopenharmony_ci * 2562306a36Sopenharmony_ci * FUNCTION: acpi_db_match_argument 2662306a36Sopenharmony_ci * 2762306a36Sopenharmony_ci * PARAMETERS: user_argument - User command line 2862306a36Sopenharmony_ci * arguments - Array of commands to match against 2962306a36Sopenharmony_ci * 3062306a36Sopenharmony_ci * RETURN: Index into command array or ACPI_TYPE_NOT_FOUND if not found 3162306a36Sopenharmony_ci * 3262306a36Sopenharmony_ci * DESCRIPTION: Search command array for a command match 3362306a36Sopenharmony_ci * 3462306a36Sopenharmony_ci ******************************************************************************/ 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ciacpi_object_type 3762306a36Sopenharmony_ciacpi_db_match_argument(char *user_argument, 3862306a36Sopenharmony_ci struct acpi_db_argument_info *arguments) 3962306a36Sopenharmony_ci{ 4062306a36Sopenharmony_ci u32 i; 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci if (!user_argument || user_argument[0] == 0) { 4362306a36Sopenharmony_ci return (ACPI_TYPE_NOT_FOUND); 4462306a36Sopenharmony_ci } 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci for (i = 0; arguments[i].name; i++) { 4762306a36Sopenharmony_ci if (strstr(ACPI_CAST_PTR(char, arguments[i].name), 4862306a36Sopenharmony_ci ACPI_CAST_PTR(char, 4962306a36Sopenharmony_ci user_argument)) == arguments[i].name) { 5062306a36Sopenharmony_ci return (i); 5162306a36Sopenharmony_ci } 5262306a36Sopenharmony_ci } 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci /* Argument not recognized */ 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci return (ACPI_TYPE_NOT_FOUND); 5762306a36Sopenharmony_ci} 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci/******************************************************************************* 6062306a36Sopenharmony_ci * 6162306a36Sopenharmony_ci * FUNCTION: acpi_db_set_output_destination 6262306a36Sopenharmony_ci * 6362306a36Sopenharmony_ci * PARAMETERS: output_flags - Current flags word 6462306a36Sopenharmony_ci * 6562306a36Sopenharmony_ci * RETURN: None 6662306a36Sopenharmony_ci * 6762306a36Sopenharmony_ci * DESCRIPTION: Set the current destination for debugger output. Also sets 6862306a36Sopenharmony_ci * the debug output level accordingly. 6962306a36Sopenharmony_ci * 7062306a36Sopenharmony_ci ******************************************************************************/ 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_civoid acpi_db_set_output_destination(u32 output_flags) 7362306a36Sopenharmony_ci{ 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci acpi_gbl_db_output_flags = (u8)output_flags; 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci if ((output_flags & ACPI_DB_REDIRECTABLE_OUTPUT) && 7862306a36Sopenharmony_ci acpi_gbl_db_output_to_file) { 7962306a36Sopenharmony_ci acpi_dbg_level = acpi_gbl_db_debug_level; 8062306a36Sopenharmony_ci } else { 8162306a36Sopenharmony_ci acpi_dbg_level = acpi_gbl_db_console_debug_level; 8262306a36Sopenharmony_ci } 8362306a36Sopenharmony_ci} 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci/******************************************************************************* 8662306a36Sopenharmony_ci * 8762306a36Sopenharmony_ci * FUNCTION: acpi_db_dump_external_object 8862306a36Sopenharmony_ci * 8962306a36Sopenharmony_ci * PARAMETERS: obj_desc - External ACPI object to dump 9062306a36Sopenharmony_ci * level - Nesting level. 9162306a36Sopenharmony_ci * 9262306a36Sopenharmony_ci * RETURN: None 9362306a36Sopenharmony_ci * 9462306a36Sopenharmony_ci * DESCRIPTION: Dump the contents of an ACPI external object 9562306a36Sopenharmony_ci * 9662306a36Sopenharmony_ci ******************************************************************************/ 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_civoid acpi_db_dump_external_object(union acpi_object *obj_desc, u32 level) 9962306a36Sopenharmony_ci{ 10062306a36Sopenharmony_ci u32 i; 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci if (!obj_desc) { 10362306a36Sopenharmony_ci acpi_os_printf("[Null Object]\n"); 10462306a36Sopenharmony_ci return; 10562306a36Sopenharmony_ci } 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci for (i = 0; i < level; i++) { 10862306a36Sopenharmony_ci acpi_os_printf(" "); 10962306a36Sopenharmony_ci } 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci switch (obj_desc->type) { 11262306a36Sopenharmony_ci case ACPI_TYPE_ANY: 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ci acpi_os_printf("[Null Object] (Type=0)\n"); 11562306a36Sopenharmony_ci break; 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci case ACPI_TYPE_INTEGER: 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci acpi_os_printf("[Integer] = %8.8X%8.8X\n", 12062306a36Sopenharmony_ci ACPI_FORMAT_UINT64(obj_desc->integer.value)); 12162306a36Sopenharmony_ci break; 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ci case ACPI_TYPE_STRING: 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ci acpi_os_printf("[String] Length %.2X = ", 12662306a36Sopenharmony_ci obj_desc->string.length); 12762306a36Sopenharmony_ci acpi_ut_print_string(obj_desc->string.pointer, ACPI_UINT8_MAX); 12862306a36Sopenharmony_ci acpi_os_printf("\n"); 12962306a36Sopenharmony_ci break; 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci case ACPI_TYPE_BUFFER: 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci acpi_os_printf("[Buffer] Length %.2X = ", 13462306a36Sopenharmony_ci obj_desc->buffer.length); 13562306a36Sopenharmony_ci if (obj_desc->buffer.length) { 13662306a36Sopenharmony_ci if (obj_desc->buffer.length > 16) { 13762306a36Sopenharmony_ci acpi_os_printf("\n"); 13862306a36Sopenharmony_ci } 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci acpi_ut_debug_dump_buffer(ACPI_CAST_PTR 14162306a36Sopenharmony_ci (u8, 14262306a36Sopenharmony_ci obj_desc->buffer.pointer), 14362306a36Sopenharmony_ci obj_desc->buffer.length, 14462306a36Sopenharmony_ci DB_BYTE_DISPLAY, _COMPONENT); 14562306a36Sopenharmony_ci } else { 14662306a36Sopenharmony_ci acpi_os_printf("\n"); 14762306a36Sopenharmony_ci } 14862306a36Sopenharmony_ci break; 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_ci case ACPI_TYPE_PACKAGE: 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_ci acpi_os_printf("[Package] Contains %u Elements:\n", 15362306a36Sopenharmony_ci obj_desc->package.count); 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_ci for (i = 0; i < obj_desc->package.count; i++) { 15662306a36Sopenharmony_ci acpi_db_dump_external_object(&obj_desc->package. 15762306a36Sopenharmony_ci elements[i], level + 1); 15862306a36Sopenharmony_ci } 15962306a36Sopenharmony_ci break; 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_ci case ACPI_TYPE_LOCAL_REFERENCE: 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ci acpi_os_printf("[Object Reference] = "); 16462306a36Sopenharmony_ci acpi_db_display_internal_object(obj_desc->reference.handle, 16562306a36Sopenharmony_ci NULL); 16662306a36Sopenharmony_ci break; 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_ci case ACPI_TYPE_PROCESSOR: 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_ci acpi_os_printf("[Processor]\n"); 17162306a36Sopenharmony_ci break; 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci case ACPI_TYPE_POWER: 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_ci acpi_os_printf("[Power Resource]\n"); 17662306a36Sopenharmony_ci break; 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_ci default: 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_ci acpi_os_printf("[Unknown Type] %X\n", obj_desc->type); 18162306a36Sopenharmony_ci break; 18262306a36Sopenharmony_ci } 18362306a36Sopenharmony_ci} 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_ci/******************************************************************************* 18662306a36Sopenharmony_ci * 18762306a36Sopenharmony_ci * FUNCTION: acpi_db_prep_namestring 18862306a36Sopenharmony_ci * 18962306a36Sopenharmony_ci * PARAMETERS: name - String to prepare 19062306a36Sopenharmony_ci * 19162306a36Sopenharmony_ci * RETURN: None 19262306a36Sopenharmony_ci * 19362306a36Sopenharmony_ci * DESCRIPTION: Translate all forward slashes and dots to backslashes. 19462306a36Sopenharmony_ci * 19562306a36Sopenharmony_ci ******************************************************************************/ 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_civoid acpi_db_prep_namestring(char *name) 19862306a36Sopenharmony_ci{ 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_ci if (!name) { 20162306a36Sopenharmony_ci return; 20262306a36Sopenharmony_ci } 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_ci acpi_ut_strupr(name); 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_ci /* Convert a leading forward slash to a backslash */ 20762306a36Sopenharmony_ci 20862306a36Sopenharmony_ci if (*name == '/') { 20962306a36Sopenharmony_ci *name = '\\'; 21062306a36Sopenharmony_ci } 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_ci /* Ignore a leading backslash, this is the root prefix */ 21362306a36Sopenharmony_ci 21462306a36Sopenharmony_ci if (ACPI_IS_ROOT_PREFIX(*name)) { 21562306a36Sopenharmony_ci name++; 21662306a36Sopenharmony_ci } 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ci /* Convert all slash path separators to dots */ 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_ci while (*name) { 22162306a36Sopenharmony_ci if ((*name == '/') || (*name == '\\')) { 22262306a36Sopenharmony_ci *name = '.'; 22362306a36Sopenharmony_ci } 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_ci name++; 22662306a36Sopenharmony_ci } 22762306a36Sopenharmony_ci} 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_ci/******************************************************************************* 23062306a36Sopenharmony_ci * 23162306a36Sopenharmony_ci * FUNCTION: acpi_db_local_ns_lookup 23262306a36Sopenharmony_ci * 23362306a36Sopenharmony_ci * PARAMETERS: name - Name to lookup 23462306a36Sopenharmony_ci * 23562306a36Sopenharmony_ci * RETURN: Pointer to a namespace node, null on failure 23662306a36Sopenharmony_ci * 23762306a36Sopenharmony_ci * DESCRIPTION: Lookup a name in the ACPI namespace 23862306a36Sopenharmony_ci * 23962306a36Sopenharmony_ci * Note: Currently begins search from the root. Could be enhanced to use 24062306a36Sopenharmony_ci * the current prefix (scope) node as the search beginning point. 24162306a36Sopenharmony_ci * 24262306a36Sopenharmony_ci ******************************************************************************/ 24362306a36Sopenharmony_ci 24462306a36Sopenharmony_cistruct acpi_namespace_node *acpi_db_local_ns_lookup(char *name) 24562306a36Sopenharmony_ci{ 24662306a36Sopenharmony_ci char *internal_path; 24762306a36Sopenharmony_ci acpi_status status; 24862306a36Sopenharmony_ci struct acpi_namespace_node *node = NULL; 24962306a36Sopenharmony_ci 25062306a36Sopenharmony_ci acpi_db_prep_namestring(name); 25162306a36Sopenharmony_ci 25262306a36Sopenharmony_ci /* Build an internal namestring */ 25362306a36Sopenharmony_ci 25462306a36Sopenharmony_ci status = acpi_ns_internalize_name(name, &internal_path); 25562306a36Sopenharmony_ci if (ACPI_FAILURE(status)) { 25662306a36Sopenharmony_ci acpi_os_printf("Invalid namestring: %s\n", name); 25762306a36Sopenharmony_ci return (NULL); 25862306a36Sopenharmony_ci } 25962306a36Sopenharmony_ci 26062306a36Sopenharmony_ci /* 26162306a36Sopenharmony_ci * Lookup the name. 26262306a36Sopenharmony_ci * (Uses root node as the search starting point) 26362306a36Sopenharmony_ci */ 26462306a36Sopenharmony_ci status = acpi_ns_lookup(NULL, internal_path, ACPI_TYPE_ANY, 26562306a36Sopenharmony_ci ACPI_IMODE_EXECUTE, 26662306a36Sopenharmony_ci ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE, 26762306a36Sopenharmony_ci NULL, &node); 26862306a36Sopenharmony_ci if (ACPI_FAILURE(status)) { 26962306a36Sopenharmony_ci acpi_os_printf("Could not locate name: %s, %s\n", 27062306a36Sopenharmony_ci name, acpi_format_exception(status)); 27162306a36Sopenharmony_ci } 27262306a36Sopenharmony_ci 27362306a36Sopenharmony_ci ACPI_FREE(internal_path); 27462306a36Sopenharmony_ci return (node); 27562306a36Sopenharmony_ci} 27662306a36Sopenharmony_ci 27762306a36Sopenharmony_ci/******************************************************************************* 27862306a36Sopenharmony_ci * 27962306a36Sopenharmony_ci * FUNCTION: acpi_db_uint32_to_hex_string 28062306a36Sopenharmony_ci * 28162306a36Sopenharmony_ci * PARAMETERS: value - The value to be converted to string 28262306a36Sopenharmony_ci * buffer - Buffer for result (not less than 11 bytes) 28362306a36Sopenharmony_ci * 28462306a36Sopenharmony_ci * RETURN: None 28562306a36Sopenharmony_ci * 28662306a36Sopenharmony_ci * DESCRIPTION: Convert the unsigned 32-bit value to the hexadecimal image 28762306a36Sopenharmony_ci * 28862306a36Sopenharmony_ci * NOTE: It is the caller's responsibility to ensure that the length of buffer 28962306a36Sopenharmony_ci * is sufficient. 29062306a36Sopenharmony_ci * 29162306a36Sopenharmony_ci ******************************************************************************/ 29262306a36Sopenharmony_ci 29362306a36Sopenharmony_civoid acpi_db_uint32_to_hex_string(u32 value, char *buffer) 29462306a36Sopenharmony_ci{ 29562306a36Sopenharmony_ci int i; 29662306a36Sopenharmony_ci 29762306a36Sopenharmony_ci if (value == 0) { 29862306a36Sopenharmony_ci strcpy(buffer, "0"); 29962306a36Sopenharmony_ci return; 30062306a36Sopenharmony_ci } 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_ci buffer[8] = '\0'; 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_ci for (i = 7; i >= 0; i--) { 30562306a36Sopenharmony_ci buffer[i] = acpi_gbl_upper_hex_digits[value & 0x0F]; 30662306a36Sopenharmony_ci value = value >> 4; 30762306a36Sopenharmony_ci } 30862306a36Sopenharmony_ci} 30962306a36Sopenharmony_ci 31062306a36Sopenharmony_ci#ifdef ACPI_OBSOLETE_FUNCTIONS 31162306a36Sopenharmony_ci/******************************************************************************* 31262306a36Sopenharmony_ci * 31362306a36Sopenharmony_ci * FUNCTION: acpi_db_second_pass_parse 31462306a36Sopenharmony_ci * 31562306a36Sopenharmony_ci * PARAMETERS: root - Root of the parse tree 31662306a36Sopenharmony_ci * 31762306a36Sopenharmony_ci * RETURN: Status 31862306a36Sopenharmony_ci * 31962306a36Sopenharmony_ci * DESCRIPTION: Second pass parse of the ACPI tables. We need to wait until 32062306a36Sopenharmony_ci * second pass to parse the control methods 32162306a36Sopenharmony_ci * 32262306a36Sopenharmony_ci ******************************************************************************/ 32362306a36Sopenharmony_ci 32462306a36Sopenharmony_ciacpi_status acpi_db_second_pass_parse(union acpi_parse_object *root) 32562306a36Sopenharmony_ci{ 32662306a36Sopenharmony_ci union acpi_parse_object *op = root; 32762306a36Sopenharmony_ci union acpi_parse_object *method; 32862306a36Sopenharmony_ci union acpi_parse_object *search_op; 32962306a36Sopenharmony_ci union acpi_parse_object *start_op; 33062306a36Sopenharmony_ci acpi_status status = AE_OK; 33162306a36Sopenharmony_ci u32 base_aml_offset; 33262306a36Sopenharmony_ci struct acpi_walk_state *walk_state; 33362306a36Sopenharmony_ci 33462306a36Sopenharmony_ci ACPI_FUNCTION_ENTRY(); 33562306a36Sopenharmony_ci 33662306a36Sopenharmony_ci acpi_os_printf("Pass two parse ....\n"); 33762306a36Sopenharmony_ci 33862306a36Sopenharmony_ci while (op) { 33962306a36Sopenharmony_ci if (op->common.aml_opcode == AML_METHOD_OP) { 34062306a36Sopenharmony_ci method = op; 34162306a36Sopenharmony_ci 34262306a36Sopenharmony_ci /* Create a new walk state for the parse */ 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_ci walk_state = 34562306a36Sopenharmony_ci acpi_ds_create_walk_state(0, NULL, NULL, NULL); 34662306a36Sopenharmony_ci if (!walk_state) { 34762306a36Sopenharmony_ci return (AE_NO_MEMORY); 34862306a36Sopenharmony_ci } 34962306a36Sopenharmony_ci 35062306a36Sopenharmony_ci /* Init the Walk State */ 35162306a36Sopenharmony_ci 35262306a36Sopenharmony_ci walk_state->parser_state.aml = 35362306a36Sopenharmony_ci walk_state->parser_state.aml_start = 35462306a36Sopenharmony_ci method->named.data; 35562306a36Sopenharmony_ci walk_state->parser_state.aml_end = 35662306a36Sopenharmony_ci walk_state->parser_state.pkg_end = 35762306a36Sopenharmony_ci method->named.data + method->named.length; 35862306a36Sopenharmony_ci walk_state->parser_state.start_scope = op; 35962306a36Sopenharmony_ci 36062306a36Sopenharmony_ci walk_state->descending_callback = 36162306a36Sopenharmony_ci acpi_ds_load1_begin_op; 36262306a36Sopenharmony_ci walk_state->ascending_callback = acpi_ds_load1_end_op; 36362306a36Sopenharmony_ci 36462306a36Sopenharmony_ci /* Perform the AML parse */ 36562306a36Sopenharmony_ci 36662306a36Sopenharmony_ci status = acpi_ps_parse_aml(walk_state); 36762306a36Sopenharmony_ci 36862306a36Sopenharmony_ci base_aml_offset = 36962306a36Sopenharmony_ci (method->common.value.arg)->common.aml_offset + 1; 37062306a36Sopenharmony_ci start_op = (method->common.value.arg)->common.next; 37162306a36Sopenharmony_ci search_op = start_op; 37262306a36Sopenharmony_ci 37362306a36Sopenharmony_ci while (search_op) { 37462306a36Sopenharmony_ci search_op->common.aml_offset += base_aml_offset; 37562306a36Sopenharmony_ci search_op = 37662306a36Sopenharmony_ci acpi_ps_get_depth_next(start_op, search_op); 37762306a36Sopenharmony_ci } 37862306a36Sopenharmony_ci } 37962306a36Sopenharmony_ci 38062306a36Sopenharmony_ci if (op->common.aml_opcode == AML_REGION_OP) { 38162306a36Sopenharmony_ci 38262306a36Sopenharmony_ci /* TBD: [Investigate] this isn't quite the right thing to do! */ 38362306a36Sopenharmony_ci /* 38462306a36Sopenharmony_ci * 38562306a36Sopenharmony_ci * Method = (ACPI_DEFERRED_OP *) Op; 38662306a36Sopenharmony_ci * Status = acpi_ps_parse_aml (Op, Method->Body, Method->body_length); 38762306a36Sopenharmony_ci */ 38862306a36Sopenharmony_ci } 38962306a36Sopenharmony_ci 39062306a36Sopenharmony_ci if (ACPI_FAILURE(status)) { 39162306a36Sopenharmony_ci break; 39262306a36Sopenharmony_ci } 39362306a36Sopenharmony_ci 39462306a36Sopenharmony_ci op = acpi_ps_get_depth_next(root, op); 39562306a36Sopenharmony_ci } 39662306a36Sopenharmony_ci 39762306a36Sopenharmony_ci return (status); 39862306a36Sopenharmony_ci} 39962306a36Sopenharmony_ci 40062306a36Sopenharmony_ci/******************************************************************************* 40162306a36Sopenharmony_ci * 40262306a36Sopenharmony_ci * FUNCTION: acpi_db_dump_buffer 40362306a36Sopenharmony_ci * 40462306a36Sopenharmony_ci * PARAMETERS: address - Pointer to the buffer 40562306a36Sopenharmony_ci * 40662306a36Sopenharmony_ci * RETURN: None 40762306a36Sopenharmony_ci * 40862306a36Sopenharmony_ci * DESCRIPTION: Print a portion of a buffer 40962306a36Sopenharmony_ci * 41062306a36Sopenharmony_ci ******************************************************************************/ 41162306a36Sopenharmony_ci 41262306a36Sopenharmony_civoid acpi_db_dump_buffer(u32 address) 41362306a36Sopenharmony_ci{ 41462306a36Sopenharmony_ci 41562306a36Sopenharmony_ci acpi_os_printf("\nLocation %X:\n", address); 41662306a36Sopenharmony_ci 41762306a36Sopenharmony_ci acpi_dbg_level |= ACPI_LV_TABLES; 41862306a36Sopenharmony_ci acpi_ut_debug_dump_buffer(ACPI_TO_POINTER(address), 64, DB_BYTE_DISPLAY, 41962306a36Sopenharmony_ci ACPI_UINT32_MAX); 42062306a36Sopenharmony_ci} 42162306a36Sopenharmony_ci#endif 422