1 /******************************************************************************* 2 * 3 * Module Name: utxferror - Various error/warning output functions 4 * 5 ******************************************************************************/ 6 7 /* 8 * Copyright (C) 2000 - 2011, 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 #define __UTXFERROR_C__ 45 46 #include "acpi.h" 47 #include "accommon.h" 48 #include "acnamesp.h" 49 50 51 #define _COMPONENT ACPI_UTILITIES 52 ACPI_MODULE_NAME ("utxferror") 53 54 /* 55 * This module is used for the in-kernel ACPICA as well as the ACPICA 56 * tools/applications. 57 * 58 * For the iASL compiler case, the output is redirected to stderr so that 59 * any of the various ACPI errors and warnings do not appear in the output 60 * files, for either the compiler or disassembler portions of the tool. 61 */ 62 #ifdef ACPI_ASL_COMPILER 63 #include <stdio.h> 64 65 extern FILE *AcpiGbl_OutputFile; 66 67 #define ACPI_MSG_REDIRECT_BEGIN \ 68 FILE *OutputFile = AcpiGbl_OutputFile; \ 69 AcpiOsRedirectOutput (stderr); 70 71 #define ACPI_MSG_REDIRECT_END \ 72 AcpiOsRedirectOutput (OutputFile); 73 74 #else 75 /* 76 * non-iASL case - no redirection, nothing to do 77 */ 78 #define ACPI_MSG_REDIRECT_BEGIN 79 #define ACPI_MSG_REDIRECT_END 80 #endif 81 82 /* 83 * Common message prefixes 84 */ 85 #define ACPI_MSG_ERROR "ACPI Error: " 86 #define ACPI_MSG_EXCEPTION "ACPI Exception: " 87 #define ACPI_MSG_WARNING "ACPI Warning: " 88 #define ACPI_MSG_INFO "ACPI: " 89 90 /* 91 * Common message suffix 92 */ 93 #define ACPI_MSG_SUFFIX \ 94 AcpiOsPrintf (" (%8.8X/%s-%u)\n", ACPI_CA_VERSION, ModuleName, LineNumber) 95 96 97 /******************************************************************************* 98 * 99 * FUNCTION: AcpiError 100 * 101 * PARAMETERS: ModuleName - Caller's module name (for error output) 102 * LineNumber - Caller's line number (for error output) 103 * Format - Printf format string + additional args 104 * 105 * RETURN: None 106 * 107 * DESCRIPTION: Print "ACPI Error" message with module/line/version info 108 * 109 ******************************************************************************/ 110 111 void ACPI_INTERNAL_VAR_XFACE 112 AcpiError ( 113 const char *ModuleName, 114 UINT32 LineNumber, 115 const char *Format, 116 ...) 117 { 118 va_list ArgList; 119 120 121 ACPI_MSG_REDIRECT_BEGIN; 122 AcpiOsPrintf (ACPI_MSG_ERROR); 123 124 va_start (ArgList, Format); 125 AcpiOsVprintf (Format, ArgList); 126 ACPI_MSG_SUFFIX; 127 va_end (ArgList); 128 129 ACPI_MSG_REDIRECT_END; 130 } 131 132 ACPI_EXPORT_SYMBOL (AcpiError) 133 134 135 /******************************************************************************* 136 * 137 * FUNCTION: AcpiException 138 * 139 * PARAMETERS: ModuleName - Caller's module name (for error output) 140 * LineNumber - Caller's line number (for error output) 141 * Status - Status to be formatted 142 * Format - Printf format string + additional args 143 * 144 * RETURN: None 145 * 146 * DESCRIPTION: Print "ACPI Exception" message with module/line/version info 147 * and decoded ACPI_STATUS. 148 * 149 ******************************************************************************/ 150 151 void ACPI_INTERNAL_VAR_XFACE 152 AcpiException ( 153 const char *ModuleName, 154 UINT32 LineNumber, 155 ACPI_STATUS Status, 156 const char *Format, 157 ...) 158 { 159 va_list ArgList; 160 161 162 ACPI_MSG_REDIRECT_BEGIN; 163 AcpiOsPrintf (ACPI_MSG_EXCEPTION "%s, ", AcpiFormatException (Status)); 164 165 va_start (ArgList, Format); 166 AcpiOsVprintf (Format, ArgList); 167 ACPI_MSG_SUFFIX; 168 va_end (ArgList); 169 170 ACPI_MSG_REDIRECT_END; 171 } 172 173 ACPI_EXPORT_SYMBOL (AcpiException) 174 175 176 /******************************************************************************* 177 * 178 * FUNCTION: AcpiWarning 179 * 180 * PARAMETERS: ModuleName - Caller's module name (for error output) 181 * LineNumber - Caller's line number (for error output) 182 * Format - Printf format string + additional args 183 * 184 * RETURN: None 185 * 186 * DESCRIPTION: Print "ACPI Warning" message with module/line/version info 187 * 188 ******************************************************************************/ 189 190 void ACPI_INTERNAL_VAR_XFACE 191 AcpiWarning ( 192 const char *ModuleName, 193 UINT32 LineNumber, 194 const char *Format, 195 ...) 196 { 197 va_list ArgList; 198 199 200 ACPI_MSG_REDIRECT_BEGIN; 201 AcpiOsPrintf (ACPI_MSG_WARNING); 202 203 va_start (ArgList, Format); 204 AcpiOsVprintf (Format, ArgList); 205 ACPI_MSG_SUFFIX; 206 va_end (ArgList); 207 208 ACPI_MSG_REDIRECT_END; 209 } 210 211 ACPI_EXPORT_SYMBOL (AcpiWarning) 212 213 214 /******************************************************************************* 215 * 216 * FUNCTION: AcpiInfo 217 * 218 * PARAMETERS: ModuleName - Caller's module name (for error output) 219 * LineNumber - Caller's line number (for error output) 220 * Format - Printf format string + additional args 221 * 222 * RETURN: None 223 * 224 * DESCRIPTION: Print generic "ACPI:" information message. There is no 225 * module/line/version info in order to keep the message simple. 226 * 227 * TBD: ModuleName and LineNumber args are not needed, should be removed. 228 * 229 ******************************************************************************/ 230 231 void ACPI_INTERNAL_VAR_XFACE 232 AcpiInfo ( 233 const char *ModuleName, 234 UINT32 LineNumber, 235 const char *Format, 236 ...) 237 { 238 va_list ArgList; 239 240 241 ACPI_MSG_REDIRECT_BEGIN; 242 AcpiOsPrintf (ACPI_MSG_INFO); 243 244 va_start (ArgList, Format); 245 AcpiOsVprintf (Format, ArgList); 246 AcpiOsPrintf ("\n"); 247 va_end (ArgList); 248 249 ACPI_MSG_REDIRECT_END; 250 } 251 252 ACPI_EXPORT_SYMBOL (AcpiInfo) 253 254 255 /* 256 * The remainder of this module contains internal error functions that may 257 * be configured out. 258 */ 259 #if !defined (ACPI_NO_ERROR_MESSAGES) && !defined (ACPI_BIN_APP) 260 261 /******************************************************************************* 262 * 263 * FUNCTION: AcpiUtPredefinedWarning 264 * 265 * PARAMETERS: ModuleName - Caller's module name (for error output) 266 * LineNumber - Caller's line number (for error output) 267 * Pathname - Full pathname to the node 268 * NodeFlags - From Namespace node for the method/object 269 * Format - Printf format string + additional args 270 * 271 * RETURN: None 272 * 273 * DESCRIPTION: Warnings for the predefined validation module. Messages are 274 * only emitted the first time a problem with a particular 275 * method/object is detected. This prevents a flood of error 276 * messages for methods that are repeatedly evaluated. 277 * 278 ******************************************************************************/ 279 280 void ACPI_INTERNAL_VAR_XFACE 281 AcpiUtPredefinedWarning ( 282 const char *ModuleName, 283 UINT32 LineNumber, 284 char *Pathname, 285 UINT8 NodeFlags, 286 const char *Format, 287 ...) 288 { 289 va_list ArgList; 290 291 292 /* 293 * Warning messages for this method/object will be disabled after the 294 * first time a validation fails or an object is successfully repaired. 295 */ 296 if (NodeFlags & ANOBJ_EVALUATED) 297 { 298 return; 299 } 300 301 AcpiOsPrintf (ACPI_MSG_WARNING "For %s: ", Pathname); 302 303 va_start (ArgList, Format); 304 AcpiOsVprintf (Format, ArgList); 305 ACPI_MSG_SUFFIX; 306 va_end (ArgList); 307 } 308 309 310 /******************************************************************************* 311 * 312 * FUNCTION: AcpiUtPredefinedInfo 313 * 314 * PARAMETERS: ModuleName - Caller's module name (for error output) 315 * LineNumber - Caller's line number (for error output) 316 * Pathname - Full pathname to the node 317 * NodeFlags - From Namespace node for the method/object 318 * Format - Printf format string + additional args 319 * 320 * RETURN: None 321 * 322 * DESCRIPTION: Info messages for the predefined validation module. Messages 323 * are only emitted the first time a problem with a particular 324 * method/object is detected. This prevents a flood of 325 * messages for methods that are repeatedly evaluated. 326 * 327 ******************************************************************************/ 328 329 void ACPI_INTERNAL_VAR_XFACE 330 AcpiUtPredefinedInfo ( 331 const char *ModuleName, 332 UINT32 LineNumber, 333 char *Pathname, 334 UINT8 NodeFlags, 335 const char *Format, 336 ...) 337 { 338 va_list ArgList; 339 340 341 /* 342 * Warning messages for this method/object will be disabled after the 343 * first time a validation fails or an object is successfully repaired. 344 */ 345 if (NodeFlags & ANOBJ_EVALUATED) 346 { 347 return; 348 } 349 350 AcpiOsPrintf (ACPI_MSG_INFO "For %s: ", Pathname); 351 352 va_start (ArgList, Format); 353 AcpiOsVprintf (Format, ArgList); 354 ACPI_MSG_SUFFIX; 355 va_end (ArgList); 356 } 357 358 359 /******************************************************************************* 360 * 361 * FUNCTION: AcpiUtNamespaceError 362 * 363 * PARAMETERS: ModuleName - Caller's module name (for error output) 364 * LineNumber - Caller's line number (for error output) 365 * InternalName - Name or path of the namespace node 366 * LookupStatus - Exception code from NS lookup 367 * 368 * RETURN: None 369 * 370 * DESCRIPTION: Print error message with the full pathname for the NS node. 371 * 372 ******************************************************************************/ 373 374 void 375 AcpiUtNamespaceError ( 376 const char *ModuleName, 377 UINT32 LineNumber, 378 const char *InternalName, 379 ACPI_STATUS LookupStatus) 380 { 381 ACPI_STATUS Status; 382 UINT32 BadName; 383 char *Name = NULL; 384 385 386 ACPI_MSG_REDIRECT_BEGIN; 387 AcpiOsPrintf (ACPI_MSG_ERROR); 388 389 if (LookupStatus == AE_BAD_CHARACTER) 390 { 391 /* There is a non-ascii character in the name */ 392 393 ACPI_MOVE_32_TO_32 (&BadName, ACPI_CAST_PTR (UINT32, InternalName)); 394 AcpiOsPrintf ("[0x%4.4X] (NON-ASCII)", BadName); 395 } 396 else 397 { 398 /* Convert path to external format */ 399 400 Status = AcpiNsExternalizeName (ACPI_UINT32_MAX, 401 InternalName, NULL, &Name); 402 403 /* Print target name */ 404 405 if (ACPI_SUCCESS (Status)) 406 { 407 AcpiOsPrintf ("[%s]", Name); 408 } 409 else 410 { 411 AcpiOsPrintf ("[COULD NOT EXTERNALIZE NAME]"); 412 } 413 414 if (Name) 415 { 416 ACPI_FREE (Name); 417 } 418 } 419 420 AcpiOsPrintf (" Namespace lookup failure, %s", 421 AcpiFormatException (LookupStatus)); 422 423 ACPI_MSG_SUFFIX; 424 ACPI_MSG_REDIRECT_END; 425 } 426 427 428 /******************************************************************************* 429 * 430 * FUNCTION: AcpiUtMethodError 431 * 432 * PARAMETERS: ModuleName - Caller's module name (for error output) 433 * LineNumber - Caller's line number (for error output) 434 * Message - Error message to use on failure 435 * PrefixNode - Prefix relative to the path 436 * Path - Path to the node (optional) 437 * MethodStatus - Execution status 438 * 439 * RETURN: None 440 * 441 * DESCRIPTION: Print error message with the full pathname for the method. 442 * 443 ******************************************************************************/ 444 445 void 446 AcpiUtMethodError ( 447 const char *ModuleName, 448 UINT32 LineNumber, 449 const char *Message, 450 ACPI_NAMESPACE_NODE *PrefixNode, 451 const char *Path, 452 ACPI_STATUS MethodStatus) 453 { 454 ACPI_STATUS Status; 455 ACPI_NAMESPACE_NODE *Node = PrefixNode; 456 457 458 ACPI_MSG_REDIRECT_BEGIN; 459 AcpiOsPrintf (ACPI_MSG_ERROR); 460 461 if (Path) 462 { 463 Status = AcpiNsGetNode (PrefixNode, Path, ACPI_NS_NO_UPSEARCH, 464 &Node); 465 if (ACPI_FAILURE (Status)) 466 { 467 AcpiOsPrintf ("[Could not get node by pathname]"); 468 } 469 } 470 471 AcpiNsPrintNodePathname (Node, Message); 472 AcpiOsPrintf (", %s", AcpiFormatException (MethodStatus)); 473 474 ACPI_MSG_SUFFIX; 475 ACPI_MSG_REDIRECT_END; 476 } 477 478 #endif /* ACPI_NO_ERROR_MESSAGES */