162306a36Sopenharmony_ci// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 262306a36Sopenharmony_ci/******************************************************************************* 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Module Name: uterror - Various internal error/warning output functions 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci ******************************************************************************/ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <acpi/acpi.h> 962306a36Sopenharmony_ci#include "accommon.h" 1062306a36Sopenharmony_ci#include "acnamesp.h" 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#define _COMPONENT ACPI_UTILITIES 1362306a36Sopenharmony_ciACPI_MODULE_NAME("uterror") 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci/* 1662306a36Sopenharmony_ci * This module contains internal error functions that may 1762306a36Sopenharmony_ci * be configured out. 1862306a36Sopenharmony_ci */ 1962306a36Sopenharmony_ci#if !defined (ACPI_NO_ERROR_MESSAGES) 2062306a36Sopenharmony_ci/******************************************************************************* 2162306a36Sopenharmony_ci * 2262306a36Sopenharmony_ci * FUNCTION: acpi_ut_predefined_warning 2362306a36Sopenharmony_ci * 2462306a36Sopenharmony_ci * PARAMETERS: module_name - Caller's module name (for error output) 2562306a36Sopenharmony_ci * line_number - Caller's line number (for error output) 2662306a36Sopenharmony_ci * pathname - Full pathname to the node 2762306a36Sopenharmony_ci * node_flags - From Namespace node for the method/object 2862306a36Sopenharmony_ci * format - Printf format string + additional args 2962306a36Sopenharmony_ci * 3062306a36Sopenharmony_ci * RETURN: None 3162306a36Sopenharmony_ci * 3262306a36Sopenharmony_ci * DESCRIPTION: Warnings for the predefined validation module. Messages are 3362306a36Sopenharmony_ci * only emitted the first time a problem with a particular 3462306a36Sopenharmony_ci * method/object is detected. This prevents a flood of error 3562306a36Sopenharmony_ci * messages for methods that are repeatedly evaluated. 3662306a36Sopenharmony_ci * 3762306a36Sopenharmony_ci ******************************************************************************/ 3862306a36Sopenharmony_civoid ACPI_INTERNAL_VAR_XFACE 3962306a36Sopenharmony_ciacpi_ut_predefined_warning(const char *module_name, 4062306a36Sopenharmony_ci u32 line_number, 4162306a36Sopenharmony_ci char *pathname, 4262306a36Sopenharmony_ci u16 node_flags, const char *format, ...) 4362306a36Sopenharmony_ci{ 4462306a36Sopenharmony_ci va_list arg_list; 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci /* 4762306a36Sopenharmony_ci * Warning messages for this method/object will be disabled after the 4862306a36Sopenharmony_ci * first time a validation fails or an object is successfully repaired. 4962306a36Sopenharmony_ci */ 5062306a36Sopenharmony_ci if (node_flags & ANOBJ_EVALUATED) { 5162306a36Sopenharmony_ci return; 5262306a36Sopenharmony_ci } 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci acpi_os_printf(ACPI_MSG_WARNING "%s: ", pathname); 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci va_start(arg_list, format); 5762306a36Sopenharmony_ci acpi_os_vprintf(format, arg_list); 5862306a36Sopenharmony_ci ACPI_MSG_SUFFIX; 5962306a36Sopenharmony_ci va_end(arg_list); 6062306a36Sopenharmony_ci} 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci/******************************************************************************* 6362306a36Sopenharmony_ci * 6462306a36Sopenharmony_ci * FUNCTION: acpi_ut_predefined_info 6562306a36Sopenharmony_ci * 6662306a36Sopenharmony_ci * PARAMETERS: module_name - Caller's module name (for error output) 6762306a36Sopenharmony_ci * line_number - Caller's line number (for error output) 6862306a36Sopenharmony_ci * pathname - Full pathname to the node 6962306a36Sopenharmony_ci * node_flags - From Namespace node for the method/object 7062306a36Sopenharmony_ci * format - Printf format string + additional args 7162306a36Sopenharmony_ci * 7262306a36Sopenharmony_ci * RETURN: None 7362306a36Sopenharmony_ci * 7462306a36Sopenharmony_ci * DESCRIPTION: Info messages for the predefined validation module. Messages 7562306a36Sopenharmony_ci * are only emitted the first time a problem with a particular 7662306a36Sopenharmony_ci * method/object is detected. This prevents a flood of 7762306a36Sopenharmony_ci * messages for methods that are repeatedly evaluated. 7862306a36Sopenharmony_ci * 7962306a36Sopenharmony_ci ******************************************************************************/ 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_civoid ACPI_INTERNAL_VAR_XFACE 8262306a36Sopenharmony_ciacpi_ut_predefined_info(const char *module_name, 8362306a36Sopenharmony_ci u32 line_number, 8462306a36Sopenharmony_ci char *pathname, u16 node_flags, const char *format, ...) 8562306a36Sopenharmony_ci{ 8662306a36Sopenharmony_ci va_list arg_list; 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci /* 8962306a36Sopenharmony_ci * Warning messages for this method/object will be disabled after the 9062306a36Sopenharmony_ci * first time a validation fails or an object is successfully repaired. 9162306a36Sopenharmony_ci */ 9262306a36Sopenharmony_ci if (node_flags & ANOBJ_EVALUATED) { 9362306a36Sopenharmony_ci return; 9462306a36Sopenharmony_ci } 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci acpi_os_printf(ACPI_MSG_INFO "%s: ", pathname); 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci va_start(arg_list, format); 9962306a36Sopenharmony_ci acpi_os_vprintf(format, arg_list); 10062306a36Sopenharmony_ci ACPI_MSG_SUFFIX; 10162306a36Sopenharmony_ci va_end(arg_list); 10262306a36Sopenharmony_ci} 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci/******************************************************************************* 10562306a36Sopenharmony_ci * 10662306a36Sopenharmony_ci * FUNCTION: acpi_ut_predefined_bios_error 10762306a36Sopenharmony_ci * 10862306a36Sopenharmony_ci * PARAMETERS: module_name - Caller's module name (for error output) 10962306a36Sopenharmony_ci * line_number - Caller's line number (for error output) 11062306a36Sopenharmony_ci * pathname - Full pathname to the node 11162306a36Sopenharmony_ci * node_flags - From Namespace node for the method/object 11262306a36Sopenharmony_ci * format - Printf format string + additional args 11362306a36Sopenharmony_ci * 11462306a36Sopenharmony_ci * RETURN: None 11562306a36Sopenharmony_ci * 11662306a36Sopenharmony_ci * DESCRIPTION: BIOS error message for predefined names. Messages 11762306a36Sopenharmony_ci * are only emitted the first time a problem with a particular 11862306a36Sopenharmony_ci * method/object is detected. This prevents a flood of 11962306a36Sopenharmony_ci * messages for methods that are repeatedly evaluated. 12062306a36Sopenharmony_ci * 12162306a36Sopenharmony_ci ******************************************************************************/ 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_civoid ACPI_INTERNAL_VAR_XFACE 12462306a36Sopenharmony_ciacpi_ut_predefined_bios_error(const char *module_name, 12562306a36Sopenharmony_ci u32 line_number, 12662306a36Sopenharmony_ci char *pathname, 12762306a36Sopenharmony_ci u16 node_flags, const char *format, ...) 12862306a36Sopenharmony_ci{ 12962306a36Sopenharmony_ci va_list arg_list; 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci /* 13262306a36Sopenharmony_ci * Warning messages for this method/object will be disabled after the 13362306a36Sopenharmony_ci * first time a validation fails or an object is successfully repaired. 13462306a36Sopenharmony_ci */ 13562306a36Sopenharmony_ci if (node_flags & ANOBJ_EVALUATED) { 13662306a36Sopenharmony_ci return; 13762306a36Sopenharmony_ci } 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ci acpi_os_printf(ACPI_MSG_BIOS_ERROR "%s: ", pathname); 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci va_start(arg_list, format); 14262306a36Sopenharmony_ci acpi_os_vprintf(format, arg_list); 14362306a36Sopenharmony_ci ACPI_MSG_SUFFIX; 14462306a36Sopenharmony_ci va_end(arg_list); 14562306a36Sopenharmony_ci} 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ci/******************************************************************************* 14862306a36Sopenharmony_ci * 14962306a36Sopenharmony_ci * FUNCTION: acpi_ut_prefixed_namespace_error 15062306a36Sopenharmony_ci * 15162306a36Sopenharmony_ci * PARAMETERS: module_name - Caller's module name (for error output) 15262306a36Sopenharmony_ci * line_number - Caller's line number (for error output) 15362306a36Sopenharmony_ci * prefix_scope - Scope/Path that prefixes the internal path 15462306a36Sopenharmony_ci * internal_path - Name or path of the namespace node 15562306a36Sopenharmony_ci * lookup_status - Exception code from NS lookup 15662306a36Sopenharmony_ci * 15762306a36Sopenharmony_ci * RETURN: None 15862306a36Sopenharmony_ci * 15962306a36Sopenharmony_ci * DESCRIPTION: Print error message with the full pathname constructed this way: 16062306a36Sopenharmony_ci * 16162306a36Sopenharmony_ci * prefix_scope_node_full_path.externalized_internal_path 16262306a36Sopenharmony_ci * 16362306a36Sopenharmony_ci * NOTE: 10/2017: Treat the major ns_lookup errors as firmware errors 16462306a36Sopenharmony_ci * 16562306a36Sopenharmony_ci ******************************************************************************/ 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_civoid 16862306a36Sopenharmony_ciacpi_ut_prefixed_namespace_error(const char *module_name, 16962306a36Sopenharmony_ci u32 line_number, 17062306a36Sopenharmony_ci union acpi_generic_state *prefix_scope, 17162306a36Sopenharmony_ci const char *internal_path, 17262306a36Sopenharmony_ci acpi_status lookup_status) 17362306a36Sopenharmony_ci{ 17462306a36Sopenharmony_ci char *full_path; 17562306a36Sopenharmony_ci const char *message; 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ci /* 17862306a36Sopenharmony_ci * Main cases: 17962306a36Sopenharmony_ci * 1) Object creation, object must not already exist 18062306a36Sopenharmony_ci * 2) Object lookup, object must exist 18162306a36Sopenharmony_ci */ 18262306a36Sopenharmony_ci switch (lookup_status) { 18362306a36Sopenharmony_ci case AE_ALREADY_EXISTS: 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_ci acpi_os_printf(ACPI_MSG_BIOS_ERROR); 18662306a36Sopenharmony_ci message = "Failure creating named object"; 18762306a36Sopenharmony_ci break; 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_ci case AE_NOT_FOUND: 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_ci acpi_os_printf(ACPI_MSG_BIOS_ERROR); 19262306a36Sopenharmony_ci message = "Could not resolve symbol"; 19362306a36Sopenharmony_ci break; 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_ci default: 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_ci acpi_os_printf(ACPI_MSG_ERROR); 19862306a36Sopenharmony_ci message = "Failure resolving symbol"; 19962306a36Sopenharmony_ci break; 20062306a36Sopenharmony_ci } 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_ci /* Concatenate the prefix path and the internal path */ 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_ci full_path = 20562306a36Sopenharmony_ci acpi_ns_build_prefixed_pathname(prefix_scope, internal_path); 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_ci acpi_os_printf("%s [%s], %s", message, 20862306a36Sopenharmony_ci full_path ? full_path : "Could not get pathname", 20962306a36Sopenharmony_ci acpi_format_exception(lookup_status)); 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_ci if (full_path) { 21262306a36Sopenharmony_ci ACPI_FREE(full_path); 21362306a36Sopenharmony_ci } 21462306a36Sopenharmony_ci 21562306a36Sopenharmony_ci ACPI_MSG_SUFFIX; 21662306a36Sopenharmony_ci} 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ci#ifdef __OBSOLETE_FUNCTION 21962306a36Sopenharmony_ci/******************************************************************************* 22062306a36Sopenharmony_ci * 22162306a36Sopenharmony_ci * FUNCTION: acpi_ut_namespace_error 22262306a36Sopenharmony_ci * 22362306a36Sopenharmony_ci * PARAMETERS: module_name - Caller's module name (for error output) 22462306a36Sopenharmony_ci * line_number - Caller's line number (for error output) 22562306a36Sopenharmony_ci * internal_name - Name or path of the namespace node 22662306a36Sopenharmony_ci * lookup_status - Exception code from NS lookup 22762306a36Sopenharmony_ci * 22862306a36Sopenharmony_ci * RETURN: None 22962306a36Sopenharmony_ci * 23062306a36Sopenharmony_ci * DESCRIPTION: Print error message with the full pathname for the NS node. 23162306a36Sopenharmony_ci * 23262306a36Sopenharmony_ci ******************************************************************************/ 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_civoid 23562306a36Sopenharmony_ciacpi_ut_namespace_error(const char *module_name, 23662306a36Sopenharmony_ci u32 line_number, 23762306a36Sopenharmony_ci const char *internal_name, acpi_status lookup_status) 23862306a36Sopenharmony_ci{ 23962306a36Sopenharmony_ci acpi_status status; 24062306a36Sopenharmony_ci u32 bad_name; 24162306a36Sopenharmony_ci char *name = NULL; 24262306a36Sopenharmony_ci 24362306a36Sopenharmony_ci ACPI_MSG_REDIRECT_BEGIN; 24462306a36Sopenharmony_ci acpi_os_printf(ACPI_MSG_ERROR); 24562306a36Sopenharmony_ci 24662306a36Sopenharmony_ci if (lookup_status == AE_BAD_CHARACTER) { 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_ci /* There is a non-ascii character in the name */ 24962306a36Sopenharmony_ci 25062306a36Sopenharmony_ci ACPI_MOVE_32_TO_32(&bad_name, 25162306a36Sopenharmony_ci ACPI_CAST_PTR(u32, internal_name)); 25262306a36Sopenharmony_ci acpi_os_printf("[0x%.8X] (NON-ASCII)", bad_name); 25362306a36Sopenharmony_ci } else { 25462306a36Sopenharmony_ci /* Convert path to external format */ 25562306a36Sopenharmony_ci 25662306a36Sopenharmony_ci status = 25762306a36Sopenharmony_ci acpi_ns_externalize_name(ACPI_UINT32_MAX, internal_name, 25862306a36Sopenharmony_ci NULL, &name); 25962306a36Sopenharmony_ci 26062306a36Sopenharmony_ci /* Print target name */ 26162306a36Sopenharmony_ci 26262306a36Sopenharmony_ci if (ACPI_SUCCESS(status)) { 26362306a36Sopenharmony_ci acpi_os_printf("[%s]", name); 26462306a36Sopenharmony_ci } else { 26562306a36Sopenharmony_ci acpi_os_printf("[COULD NOT EXTERNALIZE NAME]"); 26662306a36Sopenharmony_ci } 26762306a36Sopenharmony_ci 26862306a36Sopenharmony_ci if (name) { 26962306a36Sopenharmony_ci ACPI_FREE(name); 27062306a36Sopenharmony_ci } 27162306a36Sopenharmony_ci } 27262306a36Sopenharmony_ci 27362306a36Sopenharmony_ci acpi_os_printf(" Namespace lookup failure, %s", 27462306a36Sopenharmony_ci acpi_format_exception(lookup_status)); 27562306a36Sopenharmony_ci 27662306a36Sopenharmony_ci ACPI_MSG_SUFFIX; 27762306a36Sopenharmony_ci ACPI_MSG_REDIRECT_END; 27862306a36Sopenharmony_ci} 27962306a36Sopenharmony_ci#endif 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_ci/******************************************************************************* 28262306a36Sopenharmony_ci * 28362306a36Sopenharmony_ci * FUNCTION: acpi_ut_method_error 28462306a36Sopenharmony_ci * 28562306a36Sopenharmony_ci * PARAMETERS: module_name - Caller's module name (for error output) 28662306a36Sopenharmony_ci * line_number - Caller's line number (for error output) 28762306a36Sopenharmony_ci * message - Error message to use on failure 28862306a36Sopenharmony_ci * prefix_node - Prefix relative to the path 28962306a36Sopenharmony_ci * path - Path to the node (optional) 29062306a36Sopenharmony_ci * method_status - Execution status 29162306a36Sopenharmony_ci * 29262306a36Sopenharmony_ci * RETURN: None 29362306a36Sopenharmony_ci * 29462306a36Sopenharmony_ci * DESCRIPTION: Print error message with the full pathname for the method. 29562306a36Sopenharmony_ci * 29662306a36Sopenharmony_ci ******************************************************************************/ 29762306a36Sopenharmony_ci 29862306a36Sopenharmony_civoid 29962306a36Sopenharmony_ciacpi_ut_method_error(const char *module_name, 30062306a36Sopenharmony_ci u32 line_number, 30162306a36Sopenharmony_ci const char *message, 30262306a36Sopenharmony_ci struct acpi_namespace_node *prefix_node, 30362306a36Sopenharmony_ci const char *path, acpi_status method_status) 30462306a36Sopenharmony_ci{ 30562306a36Sopenharmony_ci acpi_status status; 30662306a36Sopenharmony_ci struct acpi_namespace_node *node = prefix_node; 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_ci ACPI_MSG_REDIRECT_BEGIN; 30962306a36Sopenharmony_ci acpi_os_printf(ACPI_MSG_ERROR); 31062306a36Sopenharmony_ci 31162306a36Sopenharmony_ci if (path) { 31262306a36Sopenharmony_ci status = acpi_ns_get_node(prefix_node, path, 31362306a36Sopenharmony_ci ACPI_NS_NO_UPSEARCH, &node); 31462306a36Sopenharmony_ci if (ACPI_FAILURE(status)) { 31562306a36Sopenharmony_ci acpi_os_printf("[Could not get node by pathname]"); 31662306a36Sopenharmony_ci } 31762306a36Sopenharmony_ci } 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_ci acpi_ns_print_node_pathname(node, message); 32062306a36Sopenharmony_ci acpi_os_printf(" due to previous error (%s)", 32162306a36Sopenharmony_ci acpi_format_exception(method_status)); 32262306a36Sopenharmony_ci 32362306a36Sopenharmony_ci ACPI_MSG_SUFFIX; 32462306a36Sopenharmony_ci ACPI_MSG_REDIRECT_END; 32562306a36Sopenharmony_ci} 32662306a36Sopenharmony_ci 32762306a36Sopenharmony_ci#endif /* ACPI_NO_ERROR_MESSAGES */ 328