1 // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 2 /******************************************************************************* 3 * 4 * Module Name: uterror - Various internal error/warning output functions 5 * 6 ******************************************************************************/ 7 8 #include <acpi/acpi.h> 9 #include "accommon.h" 10 #include "acnamesp.h" 11 12 #define _COMPONENT ACPI_UTILITIES 13 ACPI_MODULE_NAME("uterror") 14 15 /* 16 * This module contains internal error functions that may 17 * be configured out. 18 */ 19 #if !defined (ACPI_NO_ERROR_MESSAGES) 20 /******************************************************************************* 21 * 22 * FUNCTION: acpi_ut_predefined_warning 23 * 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 node 27 * node_flags - From Namespace node for the method/object 28 * format - Printf format string + additional args 29 * 30 * RETURN: None 31 * 32 * DESCRIPTION: Warnings for the predefined validation module. Messages are 33 * only emitted the first time a problem with a particular 34 * method/object is detected. This prevents a flood of error 35 * messages for methods that are repeatedly evaluated. 36 * 37 ******************************************************************************/ 38 void ACPI_INTERNAL_VAR_XFACE 39 acpi_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 the 48 * 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_info 65 * 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 node 69 * node_flags - From Namespace node for the method/object 70 * format - Printf format string + additional args 71 * 72 * RETURN: None 73 * 74 * DESCRIPTION: Info messages for the predefined validation module. Messages 75 * are only emitted the first time a problem with a particular 76 * method/object is detected. This prevents a flood of 77 * messages for methods that are repeatedly evaluated. 78 * 79 ******************************************************************************/ 80 81 void ACPI_INTERNAL_VAR_XFACE 82 acpi_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 the 90 * 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_error 107 * 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 node 111 * node_flags - From Namespace node for the method/object 112 * format - Printf format string + additional args 113 * 114 * RETURN: None 115 * 116 * DESCRIPTION: BIOS error message for predefined names. Messages 117 * are only emitted the first time a problem with a particular 118 * method/object is detected. This prevents a flood of 119 * messages for methods that are repeatedly evaluated. 120 * 121 ******************************************************************************/ 122 123 void ACPI_INTERNAL_VAR_XFACE 124 acpi_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 the 133 * 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_error 150 * 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 path 154 * internal_path - Name or path of the namespace node 155 * lookup_status - Exception code from NS lookup 156 * 157 * RETURN: None 158 * 159 * DESCRIPTION: Print error message with the full pathname constructed this way: 160 * 161 * prefix_scope_node_full_path.externalized_internal_path 162 * 163 * NOTE: 10/2017: Treat the major ns_lookup errors as firmware errors 164 * 165 ******************************************************************************/ 166 167 void 168 acpi_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 exist 180 * 2) Object lookup, object must exist 181 */ 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_FUNCTION 219 /******************************************************************************* 220 * 221 * FUNCTION: acpi_ut_namespace_error 222 * 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 node 226 * lookup_status - Exception code from NS lookup 227 * 228 * RETURN: None 229 * 230 * DESCRIPTION: Print error message with the full pathname for the NS node. 231 * 232 ******************************************************************************/ 233 234 void 235 acpi_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 #endif 280 281 /******************************************************************************* 282 * 283 * FUNCTION: acpi_ut_method_error 284 * 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 failure 288 * prefix_node - Prefix relative to the path 289 * path - Path to the node (optional) 290 * method_status - Execution status 291 * 292 * RETURN: None 293 * 294 * DESCRIPTION: Print error message with the full pathname for the method. 295 * 296 ******************************************************************************/ 297 298 void 299 acpi_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