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 50ACPI_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> 62extern 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 ******************************************************************************/ 103void ACPI_INTERNAL_VAR_XFACE 104acpi_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 119ACPI_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 ******************************************************************************/ 136void ACPI_INTERNAL_VAR_XFACE 137acpi_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 154ACPI_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 ******************************************************************************/ 169void ACPI_INTERNAL_VAR_XFACE 170acpi_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 185ACPI_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 ******************************************************************************/ 203void ACPI_INTERNAL_VAR_XFACE 204acpi_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 219ACPI_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 ******************************************************************************/ 244void ACPI_INTERNAL_VAR_XFACE 245acpi_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 287void ACPI_INTERNAL_VAR_XFACE 288acpi_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 325void 326acpi_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 387void 388acpi_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