328 lines · c
1// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.02/*******************************************************************************3 *4 * Module Name: uterror - Various internal error/warning output functions5 *6 ******************************************************************************/7 8#include <acpi/acpi.h>9#include "accommon.h"10#include "acnamesp.h"11 12#define _COMPONENT ACPI_UTILITIES13ACPI_MODULE_NAME("uterror")14 15/*16 * This module contains internal error functions that may17 * be configured out.18 */19#if !defined (ACPI_NO_ERROR_MESSAGES)20/*******************************************************************************21 *22 * FUNCTION: acpi_ut_predefined_warning23 *24 * PARAMETERS: module_name - Caller's module name (for error output)25 * line_number - Caller's line number (for error output)26 * pathname - Full pathname to the node27 * node_flags - From Namespace node for the method/object28 * format - Printf format string + additional args29 *30 * RETURN: None31 *32 * DESCRIPTION: Warnings for the predefined validation module. Messages are33 * only emitted the first time a problem with a particular34 * method/object is detected. This prevents a flood of error35 * messages for methods that are repeatedly evaluated.36 *37 ******************************************************************************/38void ACPI_INTERNAL_VAR_XFACE39acpi_ut_predefined_warning(const char *module_name,40 u32 line_number,41 char *pathname,42 u16 node_flags, const char *format, ...)43{44 va_list arg_list;45 46 /*47 * Warning messages for this method/object will be disabled after the48 * first time a validation fails or an object is successfully repaired.49 */50 if (node_flags & ANOBJ_EVALUATED) {51 return;52 }53 54 acpi_os_printf(ACPI_MSG_WARNING "%s: ", pathname);55 56 va_start(arg_list, format);57 acpi_os_vprintf(format, arg_list);58 ACPI_MSG_SUFFIX;59 va_end(arg_list);60}61 62/*******************************************************************************63 *64 * FUNCTION: acpi_ut_predefined_info65 *66 * PARAMETERS: module_name - Caller's module name (for error output)67 * line_number - Caller's line number (for error output)68 * pathname - Full pathname to the node69 * node_flags - From Namespace node for the method/object70 * format - Printf format string + additional args71 *72 * RETURN: None73 *74 * DESCRIPTION: Info messages for the predefined validation module. Messages75 * are only emitted the first time a problem with a particular76 * method/object is detected. This prevents a flood of77 * messages for methods that are repeatedly evaluated.78 *79 ******************************************************************************/80 81void ACPI_INTERNAL_VAR_XFACE82acpi_ut_predefined_info(const char *module_name,83 u32 line_number,84 char *pathname, u16 node_flags, const char *format, ...)85{86 va_list arg_list;87 88 /*89 * Warning messages for this method/object will be disabled after the90 * first time a validation fails or an object is successfully repaired.91 */92 if (node_flags & ANOBJ_EVALUATED) {93 return;94 }95 96 acpi_os_printf(ACPI_MSG_INFO "%s: ", pathname);97 98 va_start(arg_list, format);99 acpi_os_vprintf(format, arg_list);100 ACPI_MSG_SUFFIX;101 va_end(arg_list);102}103 104/*******************************************************************************105 *106 * FUNCTION: acpi_ut_predefined_bios_error107 *108 * PARAMETERS: module_name - Caller's module name (for error output)109 * line_number - Caller's line number (for error output)110 * pathname - Full pathname to the node111 * node_flags - From Namespace node for the method/object112 * format - Printf format string + additional args113 *114 * RETURN: None115 *116 * DESCRIPTION: BIOS error message for predefined names. Messages117 * are only emitted the first time a problem with a particular118 * method/object is detected. This prevents a flood of119 * messages for methods that are repeatedly evaluated.120 *121 ******************************************************************************/122 123void ACPI_INTERNAL_VAR_XFACE124acpi_ut_predefined_bios_error(const char *module_name,125 u32 line_number,126 char *pathname,127 u16 node_flags, const char *format, ...)128{129 va_list arg_list;130 131 /*132 * Warning messages for this method/object will be disabled after the133 * first time a validation fails or an object is successfully repaired.134 */135 if (node_flags & ANOBJ_EVALUATED) {136 return;137 }138 139 acpi_os_printf(ACPI_MSG_BIOS_ERROR "%s: ", pathname);140 141 va_start(arg_list, format);142 acpi_os_vprintf(format, arg_list);143 ACPI_MSG_SUFFIX;144 va_end(arg_list);145}146 147/*******************************************************************************148 *149 * FUNCTION: acpi_ut_prefixed_namespace_error150 *151 * PARAMETERS: module_name - Caller's module name (for error output)152 * line_number - Caller's line number (for error output)153 * prefix_scope - Scope/Path that prefixes the internal path154 * internal_path - Name or path of the namespace node155 * lookup_status - Exception code from NS lookup156 *157 * RETURN: None158 *159 * DESCRIPTION: Print error message with the full pathname constructed this way:160 *161 * prefix_scope_node_full_path.externalized_internal_path162 *163 * NOTE: 10/2017: Treat the major ns_lookup errors as firmware errors164 *165 ******************************************************************************/166 167void168acpi_ut_prefixed_namespace_error(const char *module_name,169 u32 line_number,170 union acpi_generic_state *prefix_scope,171 const char *internal_path,172 acpi_status lookup_status)173{174 char *full_path;175 const char *message;176 177 /*178 * Main cases:179 * 1) Object creation, object must not already exist180 * 2) Object lookup, object must exist181 */182 switch (lookup_status) {183 case AE_ALREADY_EXISTS:184 185 acpi_os_printf(ACPI_MSG_BIOS_ERROR);186 message = "Failure creating named object";187 break;188 189 case AE_NOT_FOUND:190 191 acpi_os_printf(ACPI_MSG_BIOS_ERROR);192 message = "Could not resolve symbol";193 break;194 195 default:196 197 acpi_os_printf(ACPI_MSG_ERROR);198 message = "Failure resolving symbol";199 break;200 }201 202 /* Concatenate the prefix path and the internal path */203 204 full_path =205 acpi_ns_build_prefixed_pathname(prefix_scope, internal_path);206 207 acpi_os_printf("%s [%s], %s", message,208 full_path ? full_path : "Could not get pathname",209 acpi_format_exception(lookup_status));210 211 if (full_path) {212 ACPI_FREE(full_path);213 }214 215 ACPI_MSG_SUFFIX;216}217 218#ifdef __OBSOLETE_FUNCTION219/*******************************************************************************220 *221 * FUNCTION: acpi_ut_namespace_error222 *223 * PARAMETERS: module_name - Caller's module name (for error output)224 * line_number - Caller's line number (for error output)225 * internal_name - Name or path of the namespace node226 * lookup_status - Exception code from NS lookup227 *228 * RETURN: None229 *230 * DESCRIPTION: Print error message with the full pathname for the NS node.231 *232 ******************************************************************************/233 234void235acpi_ut_namespace_error(const char *module_name,236 u32 line_number,237 const char *internal_name, acpi_status lookup_status)238{239 acpi_status status;240 u32 bad_name;241 char *name = NULL;242 243 ACPI_MSG_REDIRECT_BEGIN;244 acpi_os_printf(ACPI_MSG_ERROR);245 246 if (lookup_status == AE_BAD_CHARACTER) {247 248 /* There is a non-ascii character in the name */249 250 ACPI_MOVE_32_TO_32(&bad_name,251 ACPI_CAST_PTR(u32, internal_name));252 acpi_os_printf("[0x%.8X] (NON-ASCII)", bad_name);253 } else {254 /* Convert path to external format */255 256 status =257 acpi_ns_externalize_name(ACPI_UINT32_MAX, internal_name,258 NULL, &name);259 260 /* Print target name */261 262 if (ACPI_SUCCESS(status)) {263 acpi_os_printf("[%s]", name);264 } else {265 acpi_os_printf("[COULD NOT EXTERNALIZE NAME]");266 }267 268 if (name) {269 ACPI_FREE(name);270 }271 }272 273 acpi_os_printf(" Namespace lookup failure, %s",274 acpi_format_exception(lookup_status));275 276 ACPI_MSG_SUFFIX;277 ACPI_MSG_REDIRECT_END;278}279#endif280 281/*******************************************************************************282 *283 * FUNCTION: acpi_ut_method_error284 *285 * PARAMETERS: module_name - Caller's module name (for error output)286 * line_number - Caller's line number (for error output)287 * message - Error message to use on failure288 * prefix_node - Prefix relative to the path289 * path - Path to the node (optional)290 * method_status - Execution status291 *292 * RETURN: None293 *294 * DESCRIPTION: Print error message with the full pathname for the method.295 *296 ******************************************************************************/297 298void299acpi_ut_method_error(const char *module_name,300 u32 line_number,301 const char *message,302 struct acpi_namespace_node *prefix_node,303 const char *path, acpi_status method_status)304{305 acpi_status status;306 struct acpi_namespace_node *node = prefix_node;307 308 ACPI_MSG_REDIRECT_BEGIN;309 acpi_os_printf(ACPI_MSG_ERROR);310 311 if (path) {312 status = acpi_ns_get_node(prefix_node, path,313 ACPI_NS_NO_UPSEARCH, &node);314 if (ACPI_FAILURE(status)) {315 acpi_os_printf("[Could not get node by pathname]");316 }317 }318 319 acpi_ns_print_node_pathname(node, message);320 acpi_os_printf(" due to previous error (%s)",321 acpi_format_exception(method_status));322 323 ACPI_MSG_SUFFIX;324 ACPI_MSG_REDIRECT_END;325}326 327#endif /* ACPI_NO_ERROR_MESSAGES */328