1 /******************************************************************************* 2 * 3 * Module Name: utxferror - Various error/warning output functions 4 * 5 ******************************************************************************/ 6 7 /* 8 * Copyright (C) 2000 - 2012, Intel Corp. 9 * All rights reserved. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions, and the following disclaimer, 16 * without modification. 17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18 * substantially similar to the "NO WARRANTY" disclaimer below 19 * ("Disclaimer") and any redistribution must be conditioned upon 20 * including a substantially similar Disclaimer requirement for further 21 * binary redistribution. 22 * 3. Neither the names of the above-listed copyright holders nor the names 23 * of any contributors may be used to endorse or promote products derived 24 * from this software without specific prior written permission. 25 * 26 * Alternatively, this software may be distributed under the terms of the 27 * GNU General Public License ("GPL") version 2 as published by the Free 28 * Software Foundation. 29 * 30 * NO WARRANTY 31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41 * POSSIBILITY OF SUCH DAMAGES. 42 */ 43 44 #include <linux/export.h> 45 #include <acpi/acpi.h> 46 #include "accommon.h" 47 #include "acnamesp.h" 48 49 #define _COMPONENT ACPI_UTILITIES 50 ACPI_MODULE_NAME("utxferror") 51 52 /* 53 * This module is used for the in-kernel ACPICA as well as the ACPICA 54 * tools/applications. 55 * 56 * For the i_aSL compiler case, the output is redirected to stderr so that 57 * any of the various ACPI errors and warnings do not appear in the output 58 * files, for either the compiler or disassembler portions of the tool. 59 */ 60 #ifdef ACPI_ASL_COMPILER 61 #include <stdio.h> 62 extern FILE *acpi_gbl_output_file; 63 64 #define ACPI_MSG_REDIRECT_BEGIN \ 65 FILE *output_file = acpi_gbl_output_file; \ 66 acpi_os_redirect_output (stderr); 67 68 #define ACPI_MSG_REDIRECT_END \ 69 acpi_os_redirect_output (output_file); 70 71 #else 72 /* 73 * non-i_aSL case - no redirection, nothing to do 74 */ 75 #define ACPI_MSG_REDIRECT_BEGIN 76 #define ACPI_MSG_REDIRECT_END 77 #endif 78 /* 79 * Common message prefixes 80 */ 81 #define ACPI_MSG_ERROR "ACPI Error: " 82 #define ACPI_MSG_EXCEPTION "ACPI Exception: " 83 #define ACPI_MSG_WARNING "ACPI Warning: " 84 #define ACPI_MSG_INFO "ACPI: " 85 /* 86 * Common message suffix 87 */ 88 #define ACPI_MSG_SUFFIX \ 89 acpi_os_printf (" (%8.8X/%s-%u)\n", ACPI_CA_VERSION, module_name, line_number) 90 /******************************************************************************* 91 * 92 * FUNCTION: acpi_error 93 * 94 * PARAMETERS: module_name - Caller's module name (for error output) 95 * line_number - Caller's line number (for error output) 96 * Format - Printf format string + additional args 97 * 98 * RETURN: None 99 * 100 * DESCRIPTION: Print "ACPI Error" message with module/line/version info 101 * 102 ******************************************************************************/ 103 void ACPI_INTERNAL_VAR_XFACE 104 acpi_error(const char *module_name, u32 line_number, const char *format, ...) 105 { 106 va_list arg_list; 107 108 ACPI_MSG_REDIRECT_BEGIN; 109 acpi_os_printf(ACPI_MSG_ERROR); 110 111 va_start(arg_list, format); 112 acpi_os_vprintf(format, arg_list); 113 ACPI_MSG_SUFFIX; 114 va_end(arg_list); 115 116 ACPI_MSG_REDIRECT_END; 117 } 118 119 ACPI_EXPORT_SYMBOL(acpi_error) 120 121 /******************************************************************************* 122 * 123 * FUNCTION: acpi_exception 124 * 125 * PARAMETERS: module_name - Caller's module name (for error output) 126 * line_number - Caller's line number (for error output) 127 * Status - Status to be formatted 128 * Format - Printf format string + additional args 129 * 130 * RETURN: None 131 * 132 * DESCRIPTION: Print "ACPI Exception" message with module/line/version info 133 * and decoded acpi_status. 134 * 135 ******************************************************************************/ 136 void ACPI_INTERNAL_VAR_XFACE 137 acpi_exception(const char *module_name, 138 u32 line_number, acpi_status status, const char *format, ...) 139 { 140 va_list arg_list; 141 142 ACPI_MSG_REDIRECT_BEGIN; 143 acpi_os_printf(ACPI_MSG_EXCEPTION "%s, ", 144 acpi_format_exception(status)); 145 146 va_start(arg_list, format); 147 acpi_os_vprintf(format, arg_list); 148 ACPI_MSG_SUFFIX; 149 va_end(arg_list); 150 151 ACPI_MSG_REDIRECT_END; 152 } 153 154 ACPI_EXPORT_SYMBOL(acpi_exception) 155 156 /******************************************************************************* 157 * 158 * FUNCTION: acpi_warning 159 * 160 * PARAMETERS: module_name - Caller's module name (for error output) 161 * line_number - Caller's line number (for error output) 162 * Format - Printf format string + additional args 163 * 164 * RETURN: None 165 * 166 * DESCRIPTION: Print "ACPI Warning" message with module/line/version info 167 * 168 ******************************************************************************/ 169 void ACPI_INTERNAL_VAR_XFACE 170 acpi_warning(const char *module_name, u32 line_number, const char *format, ...) 171 { 172 va_list arg_list; 173 174 ACPI_MSG_REDIRECT_BEGIN; 175 acpi_os_printf(ACPI_MSG_WARNING); 176 177 va_start(arg_list, format); 178 acpi_os_vprintf(format, arg_list); 179 ACPI_MSG_SUFFIX; 180 va_end(arg_list); 181 182 ACPI_MSG_REDIRECT_END; 183 } 184 185 ACPI_EXPORT_SYMBOL(acpi_warning) 186 187 /******************************************************************************* 188 * 189 * FUNCTION: acpi_info 190 * 191 * PARAMETERS: module_name - Caller's module name (for error output) 192 * line_number - Caller's line number (for error output) 193 * Format - Printf format string + additional args 194 * 195 * RETURN: None 196 * 197 * DESCRIPTION: Print generic "ACPI:" information message. There is no 198 * module/line/version info in order to keep the message simple. 199 * 200 * TBD: module_name and line_number args are not needed, should be removed. 201 * 202 ******************************************************************************/ 203 void ACPI_INTERNAL_VAR_XFACE 204 acpi_info(const char *module_name, u32 line_number, const char *format, ...) 205 { 206 va_list arg_list; 207 208 ACPI_MSG_REDIRECT_BEGIN; 209 acpi_os_printf(ACPI_MSG_INFO); 210 211 va_start(arg_list, format); 212 acpi_os_vprintf(format, arg_list); 213 acpi_os_printf("\n"); 214 va_end(arg_list); 215 216 ACPI_MSG_REDIRECT_END; 217 } 218 219 ACPI_EXPORT_SYMBOL(acpi_info) 220 221 /* 222 * The remainder of this module contains internal error functions that may 223 * be configured out. 224 */ 225 #if !defined (ACPI_NO_ERROR_MESSAGES) && !defined (ACPI_BIN_APP) 226 /******************************************************************************* 227 * 228 * FUNCTION: acpi_ut_predefined_warning 229 * 230 * PARAMETERS: module_name - Caller's module name (for error output) 231 * line_number - Caller's line number (for error output) 232 * Pathname - Full pathname to the node 233 * node_flags - From Namespace node for the method/object 234 * Format - Printf format string + additional args 235 * 236 * RETURN: None 237 * 238 * DESCRIPTION: Warnings for the predefined validation module. Messages are 239 * only emitted the first time a problem with a particular 240 * method/object is detected. This prevents a flood of error 241 * messages for methods that are repeatedly evaluated. 242 * 243 ******************************************************************************/ 244 void ACPI_INTERNAL_VAR_XFACE 245 acpi_ut_predefined_warning(const char *module_name, 246 u32 line_number, 247 char *pathname, 248 u8 node_flags, const char *format, ...) 249 { 250 va_list arg_list; 251 252 /* 253 * Warning messages for this method/object will be disabled after the 254 * first time a validation fails or an object is successfully repaired. 255 */ 256 if (node_flags & ANOBJ_EVALUATED) { 257 return; 258 } 259 260 acpi_os_printf(ACPI_MSG_WARNING "For %s: ", pathname); 261 262 va_start(arg_list, format); 263 acpi_os_vprintf(format, arg_list); 264 ACPI_MSG_SUFFIX; 265 va_end(arg_list); 266 } 267 268 /******************************************************************************* 269 * 270 * FUNCTION: acpi_ut_predefined_info 271 * 272 * PARAMETERS: module_name - Caller's module name (for error output) 273 * line_number - Caller's line number (for error output) 274 * Pathname - Full pathname to the node 275 * node_flags - From Namespace node for the method/object 276 * Format - Printf format string + additional args 277 * 278 * RETURN: None 279 * 280 * DESCRIPTION: Info messages for the predefined validation module. Messages 281 * are only emitted the first time a problem with a particular 282 * method/object is detected. This prevents a flood of 283 * messages for methods that are repeatedly evaluated. 284 * 285 ******************************************************************************/ 286 287 void ACPI_INTERNAL_VAR_XFACE 288 acpi_ut_predefined_info(const char *module_name, 289 u32 line_number, 290 char *pathname, u8 node_flags, const char *format, ...) 291 { 292 va_list arg_list; 293 294 /* 295 * Warning messages for this method/object will be disabled after the 296 * first time a validation fails or an object is successfully repaired. 297 */ 298 if (node_flags & ANOBJ_EVALUATED) { 299 return; 300 } 301 302 acpi_os_printf(ACPI_MSG_INFO "For %s: ", pathname); 303 304 va_start(arg_list, format); 305 acpi_os_vprintf(format, arg_list); 306 ACPI_MSG_SUFFIX; 307 va_end(arg_list); 308 } 309 310 /******************************************************************************* 311 * 312 * FUNCTION: acpi_ut_namespace_error 313 * 314 * PARAMETERS: module_name - Caller's module name (for error output) 315 * line_number - Caller's line number (for error output) 316 * internal_name - Name or path of the namespace node 317 * lookup_status - Exception code from NS lookup 318 * 319 * RETURN: None 320 * 321 * DESCRIPTION: Print error message with the full pathname for the NS node. 322 * 323 ******************************************************************************/ 324 325 void 326 acpi_ut_namespace_error(const char *module_name, 327 u32 line_number, 328 const char *internal_name, acpi_status lookup_status) 329 { 330 acpi_status status; 331 u32 bad_name; 332 char *name = NULL; 333 334 ACPI_MSG_REDIRECT_BEGIN; 335 acpi_os_printf(ACPI_MSG_ERROR); 336 337 if (lookup_status == AE_BAD_CHARACTER) { 338 339 /* There is a non-ascii character in the name */ 340 341 ACPI_MOVE_32_TO_32(&bad_name, 342 ACPI_CAST_PTR(u32, internal_name)); 343 acpi_os_printf("[0x%4.4X] (NON-ASCII)", bad_name); 344 } else { 345 /* Convert path to external format */ 346 347 status = acpi_ns_externalize_name(ACPI_UINT32_MAX, 348 internal_name, NULL, &name); 349 350 /* Print target name */ 351 352 if (ACPI_SUCCESS(status)) { 353 acpi_os_printf("[%s]", name); 354 } else { 355 acpi_os_printf("[COULD NOT EXTERNALIZE NAME]"); 356 } 357 358 if (name) { 359 ACPI_FREE(name); 360 } 361 } 362 363 acpi_os_printf(" Namespace lookup failure, %s", 364 acpi_format_exception(lookup_status)); 365 366 ACPI_MSG_SUFFIX; 367 ACPI_MSG_REDIRECT_END; 368 } 369 370 /******************************************************************************* 371 * 372 * FUNCTION: acpi_ut_method_error 373 * 374 * PARAMETERS: module_name - Caller's module name (for error output) 375 * line_number - Caller's line number (for error output) 376 * Message - Error message to use on failure 377 * prefix_node - Prefix relative to the path 378 * Path - Path to the node (optional) 379 * method_status - Execution status 380 * 381 * RETURN: None 382 * 383 * DESCRIPTION: Print error message with the full pathname for the method. 384 * 385 ******************************************************************************/ 386 387 void 388 acpi_ut_method_error(const char *module_name, 389 u32 line_number, 390 const char *message, 391 struct acpi_namespace_node *prefix_node, 392 const char *path, acpi_status method_status) 393 { 394 acpi_status status; 395 struct acpi_namespace_node *node = prefix_node; 396 397 ACPI_MSG_REDIRECT_BEGIN; 398 acpi_os_printf(ACPI_MSG_ERROR); 399 400 if (path) { 401 status = 402 acpi_ns_get_node(prefix_node, path, ACPI_NS_NO_UPSEARCH, 403 &node); 404 if (ACPI_FAILURE(status)) { 405 acpi_os_printf("[Could not get node by pathname]"); 406 } 407 } 408 409 acpi_ns_print_node_pathname(node, message); 410 acpi_os_printf(", %s", acpi_format_exception(method_status)); 411 412 ACPI_MSG_SUFFIX; 413 ACPI_MSG_REDIRECT_END; 414 } 415 416 #endif /* ACPI_NO_ERROR_MESSAGES */ 417