1212700Sjkim/******************************************************************************* 2212700Sjkim * 3212700Sjkim * Module Name: utxferror - Various error/warning output functions 4212700Sjkim * 5212700Sjkim ******************************************************************************/ 6212700Sjkim 7217365Sjkim/* 8217365Sjkim * Copyright (C) 2000 - 2011, Intel Corp. 9212700Sjkim * All rights reserved. 10212700Sjkim * 11217365Sjkim * Redistribution and use in source and binary forms, with or without 12217365Sjkim * modification, are permitted provided that the following conditions 13217365Sjkim * are met: 14217365Sjkim * 1. Redistributions of source code must retain the above copyright 15217365Sjkim * notice, this list of conditions, and the following disclaimer, 16217365Sjkim * without modification. 17217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18217365Sjkim * substantially similar to the "NO WARRANTY" disclaimer below 19217365Sjkim * ("Disclaimer") and any redistribution must be conditioned upon 20217365Sjkim * including a substantially similar Disclaimer requirement for further 21217365Sjkim * binary redistribution. 22217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names 23217365Sjkim * of any contributors may be used to endorse or promote products derived 24217365Sjkim * from this software without specific prior written permission. 25212700Sjkim * 26217365Sjkim * Alternatively, this software may be distributed under the terms of the 27217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free 28217365Sjkim * Software Foundation. 29212700Sjkim * 30217365Sjkim * NO WARRANTY 31217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41217365Sjkim * POSSIBILITY OF SUCH DAMAGES. 42217365Sjkim */ 43212700Sjkim 44212700Sjkim#define __UTXFERROR_C__ 45212700Sjkim 46212761Sjkim#include <contrib/dev/acpica/include/acpi.h> 47212761Sjkim#include <contrib/dev/acpica/include/accommon.h> 48212761Sjkim#include <contrib/dev/acpica/include/acnamesp.h> 49212700Sjkim 50212700Sjkim 51212700Sjkim#define _COMPONENT ACPI_UTILITIES 52212700Sjkim ACPI_MODULE_NAME ("utxferror") 53212700Sjkim 54212700Sjkim/* 55212700Sjkim * This module is used for the in-kernel ACPICA as well as the ACPICA 56212700Sjkim * tools/applications. 57212700Sjkim * 58212700Sjkim * For the iASL compiler case, the output is redirected to stderr so that 59212700Sjkim * any of the various ACPI errors and warnings do not appear in the output 60212700Sjkim * files, for either the compiler or disassembler portions of the tool. 61212700Sjkim */ 62212700Sjkim#ifdef ACPI_ASL_COMPILER 63212700Sjkim#include <stdio.h> 64212700Sjkim 65212700Sjkimextern FILE *AcpiGbl_OutputFile; 66212700Sjkim 67212700Sjkim#define ACPI_MSG_REDIRECT_BEGIN \ 68212700Sjkim FILE *OutputFile = AcpiGbl_OutputFile; \ 69212700Sjkim AcpiOsRedirectOutput (stderr); 70212700Sjkim 71212700Sjkim#define ACPI_MSG_REDIRECT_END \ 72212700Sjkim AcpiOsRedirectOutput (OutputFile); 73212700Sjkim 74212700Sjkim#else 75212700Sjkim/* 76212700Sjkim * non-iASL case - no redirection, nothing to do 77212700Sjkim */ 78212700Sjkim#define ACPI_MSG_REDIRECT_BEGIN 79212700Sjkim#define ACPI_MSG_REDIRECT_END 80212700Sjkim#endif 81212700Sjkim 82212700Sjkim/* 83212700Sjkim * Common message prefixes 84212700Sjkim */ 85212700Sjkim#define ACPI_MSG_ERROR "ACPI Error: " 86212700Sjkim#define ACPI_MSG_EXCEPTION "ACPI Exception: " 87212700Sjkim#define ACPI_MSG_WARNING "ACPI Warning: " 88212700Sjkim#define ACPI_MSG_INFO "ACPI: " 89212700Sjkim 90212700Sjkim/* 91212700Sjkim * Common message suffix 92212700Sjkim */ 93212700Sjkim#define ACPI_MSG_SUFFIX \ 94212700Sjkim AcpiOsPrintf (" (%8.8X/%s-%u)\n", ACPI_CA_VERSION, ModuleName, LineNumber) 95212700Sjkim 96212700Sjkim 97212700Sjkim/******************************************************************************* 98212700Sjkim * 99212700Sjkim * FUNCTION: AcpiError 100212700Sjkim * 101212700Sjkim * PARAMETERS: ModuleName - Caller's module name (for error output) 102212700Sjkim * LineNumber - Caller's line number (for error output) 103212700Sjkim * Format - Printf format string + additional args 104212700Sjkim * 105212700Sjkim * RETURN: None 106212700Sjkim * 107212700Sjkim * DESCRIPTION: Print "ACPI Error" message with module/line/version info 108212700Sjkim * 109212700Sjkim ******************************************************************************/ 110212700Sjkim 111212700Sjkimvoid ACPI_INTERNAL_VAR_XFACE 112212700SjkimAcpiError ( 113212700Sjkim const char *ModuleName, 114212700Sjkim UINT32 LineNumber, 115212700Sjkim const char *Format, 116212700Sjkim ...) 117212700Sjkim{ 118212700Sjkim va_list ArgList; 119212700Sjkim 120212700Sjkim 121212700Sjkim ACPI_MSG_REDIRECT_BEGIN; 122212700Sjkim AcpiOsPrintf (ACPI_MSG_ERROR); 123212700Sjkim 124212700Sjkim va_start (ArgList, Format); 125212700Sjkim AcpiOsVprintf (Format, ArgList); 126212700Sjkim ACPI_MSG_SUFFIX; 127212700Sjkim va_end (ArgList); 128212700Sjkim 129212700Sjkim ACPI_MSG_REDIRECT_END; 130212700Sjkim} 131212700Sjkim 132212700SjkimACPI_EXPORT_SYMBOL (AcpiError) 133212700Sjkim 134212700Sjkim 135212700Sjkim/******************************************************************************* 136212700Sjkim * 137212700Sjkim * FUNCTION: AcpiException 138212700Sjkim * 139212700Sjkim * PARAMETERS: ModuleName - Caller's module name (for error output) 140212700Sjkim * LineNumber - Caller's line number (for error output) 141212700Sjkim * Status - Status to be formatted 142212700Sjkim * Format - Printf format string + additional args 143212700Sjkim * 144212700Sjkim * RETURN: None 145212700Sjkim * 146212700Sjkim * DESCRIPTION: Print "ACPI Exception" message with module/line/version info 147212700Sjkim * and decoded ACPI_STATUS. 148212700Sjkim * 149212700Sjkim ******************************************************************************/ 150212700Sjkim 151212700Sjkimvoid ACPI_INTERNAL_VAR_XFACE 152212700SjkimAcpiException ( 153212700Sjkim const char *ModuleName, 154212700Sjkim UINT32 LineNumber, 155212700Sjkim ACPI_STATUS Status, 156212700Sjkim const char *Format, 157212700Sjkim ...) 158212700Sjkim{ 159212700Sjkim va_list ArgList; 160212700Sjkim 161212700Sjkim 162212700Sjkim ACPI_MSG_REDIRECT_BEGIN; 163212700Sjkim AcpiOsPrintf (ACPI_MSG_EXCEPTION "%s, ", AcpiFormatException (Status)); 164212700Sjkim 165212700Sjkim va_start (ArgList, Format); 166212700Sjkim AcpiOsVprintf (Format, ArgList); 167212700Sjkim ACPI_MSG_SUFFIX; 168212700Sjkim va_end (ArgList); 169212700Sjkim 170212700Sjkim ACPI_MSG_REDIRECT_END; 171212700Sjkim} 172212700Sjkim 173212700SjkimACPI_EXPORT_SYMBOL (AcpiException) 174212700Sjkim 175212700Sjkim 176212700Sjkim/******************************************************************************* 177212700Sjkim * 178212700Sjkim * FUNCTION: AcpiWarning 179212700Sjkim * 180212700Sjkim * PARAMETERS: ModuleName - Caller's module name (for error output) 181212700Sjkim * LineNumber - Caller's line number (for error output) 182212700Sjkim * Format - Printf format string + additional args 183212700Sjkim * 184212700Sjkim * RETURN: None 185212700Sjkim * 186212700Sjkim * DESCRIPTION: Print "ACPI Warning" message with module/line/version info 187212700Sjkim * 188212700Sjkim ******************************************************************************/ 189212700Sjkim 190212700Sjkimvoid ACPI_INTERNAL_VAR_XFACE 191212700SjkimAcpiWarning ( 192212700Sjkim const char *ModuleName, 193212700Sjkim UINT32 LineNumber, 194212700Sjkim const char *Format, 195212700Sjkim ...) 196212700Sjkim{ 197212700Sjkim va_list ArgList; 198212700Sjkim 199212700Sjkim 200212700Sjkim ACPI_MSG_REDIRECT_BEGIN; 201212700Sjkim AcpiOsPrintf (ACPI_MSG_WARNING); 202212700Sjkim 203212700Sjkim va_start (ArgList, Format); 204212700Sjkim AcpiOsVprintf (Format, ArgList); 205212700Sjkim ACPI_MSG_SUFFIX; 206212700Sjkim va_end (ArgList); 207212700Sjkim 208212700Sjkim ACPI_MSG_REDIRECT_END; 209212700Sjkim} 210212700Sjkim 211212700SjkimACPI_EXPORT_SYMBOL (AcpiWarning) 212212700Sjkim 213212700Sjkim 214212700Sjkim/******************************************************************************* 215212700Sjkim * 216212700Sjkim * FUNCTION: AcpiInfo 217212700Sjkim * 218212700Sjkim * PARAMETERS: ModuleName - Caller's module name (for error output) 219212700Sjkim * LineNumber - Caller's line number (for error output) 220212700Sjkim * Format - Printf format string + additional args 221212700Sjkim * 222212700Sjkim * RETURN: None 223212700Sjkim * 224212700Sjkim * DESCRIPTION: Print generic "ACPI:" information message. There is no 225212700Sjkim * module/line/version info in order to keep the message simple. 226212700Sjkim * 227212700Sjkim * TBD: ModuleName and LineNumber args are not needed, should be removed. 228212700Sjkim * 229212700Sjkim ******************************************************************************/ 230212700Sjkim 231212700Sjkimvoid ACPI_INTERNAL_VAR_XFACE 232212700SjkimAcpiInfo ( 233212700Sjkim const char *ModuleName, 234212700Sjkim UINT32 LineNumber, 235212700Sjkim const char *Format, 236212700Sjkim ...) 237212700Sjkim{ 238212700Sjkim va_list ArgList; 239212700Sjkim 240212761Sjkim#ifdef _KERNEL 241212761Sjkim /* Temporarily hide too verbose printfs. */ 242212761Sjkim if (!bootverbose) 243212761Sjkim return; 244212761Sjkim#endif 245212700Sjkim 246212700Sjkim ACPI_MSG_REDIRECT_BEGIN; 247212700Sjkim AcpiOsPrintf (ACPI_MSG_INFO); 248212700Sjkim 249212700Sjkim va_start (ArgList, Format); 250212700Sjkim AcpiOsVprintf (Format, ArgList); 251212700Sjkim AcpiOsPrintf ("\n"); 252212700Sjkim va_end (ArgList); 253212700Sjkim 254212700Sjkim ACPI_MSG_REDIRECT_END; 255212700Sjkim} 256212700Sjkim 257212700SjkimACPI_EXPORT_SYMBOL (AcpiInfo) 258212700Sjkim 259212700Sjkim 260212700Sjkim/* 261212700Sjkim * The remainder of this module contains internal error functions that may 262212700Sjkim * be configured out. 263212700Sjkim */ 264212700Sjkim#if !defined (ACPI_NO_ERROR_MESSAGES) && !defined (ACPI_BIN_APP) 265212700Sjkim 266212700Sjkim/******************************************************************************* 267212700Sjkim * 268212700Sjkim * FUNCTION: AcpiUtPredefinedWarning 269212700Sjkim * 270212700Sjkim * PARAMETERS: ModuleName - Caller's module name (for error output) 271212700Sjkim * LineNumber - Caller's line number (for error output) 272212700Sjkim * Pathname - Full pathname to the node 273212700Sjkim * NodeFlags - From Namespace node for the method/object 274212700Sjkim * Format - Printf format string + additional args 275212700Sjkim * 276212700Sjkim * RETURN: None 277212700Sjkim * 278212700Sjkim * DESCRIPTION: Warnings for the predefined validation module. Messages are 279212700Sjkim * only emitted the first time a problem with a particular 280212700Sjkim * method/object is detected. This prevents a flood of error 281212700Sjkim * messages for methods that are repeatedly evaluated. 282212700Sjkim * 283212700Sjkim ******************************************************************************/ 284212700Sjkim 285212700Sjkimvoid ACPI_INTERNAL_VAR_XFACE 286212700SjkimAcpiUtPredefinedWarning ( 287212700Sjkim const char *ModuleName, 288212700Sjkim UINT32 LineNumber, 289212700Sjkim char *Pathname, 290212700Sjkim UINT8 NodeFlags, 291212700Sjkim const char *Format, 292212700Sjkim ...) 293212700Sjkim{ 294212700Sjkim va_list ArgList; 295212700Sjkim 296212700Sjkim 297212700Sjkim /* 298212700Sjkim * Warning messages for this method/object will be disabled after the 299212700Sjkim * first time a validation fails or an object is successfully repaired. 300212700Sjkim */ 301212700Sjkim if (NodeFlags & ANOBJ_EVALUATED) 302212700Sjkim { 303212700Sjkim return; 304212700Sjkim } 305212700Sjkim 306212700Sjkim AcpiOsPrintf (ACPI_MSG_WARNING "For %s: ", Pathname); 307212700Sjkim 308212700Sjkim va_start (ArgList, Format); 309212700Sjkim AcpiOsVprintf (Format, ArgList); 310212700Sjkim ACPI_MSG_SUFFIX; 311212700Sjkim va_end (ArgList); 312212700Sjkim} 313212700Sjkim 314212700Sjkim 315212700Sjkim/******************************************************************************* 316212700Sjkim * 317212700Sjkim * FUNCTION: AcpiUtPredefinedInfo 318212700Sjkim * 319212700Sjkim * PARAMETERS: ModuleName - Caller's module name (for error output) 320212700Sjkim * LineNumber - Caller's line number (for error output) 321212700Sjkim * Pathname - Full pathname to the node 322212700Sjkim * NodeFlags - From Namespace node for the method/object 323212700Sjkim * Format - Printf format string + additional args 324212700Sjkim * 325212700Sjkim * RETURN: None 326212700Sjkim * 327212700Sjkim * DESCRIPTION: Info messages for the predefined validation module. Messages 328212700Sjkim * are only emitted the first time a problem with a particular 329212700Sjkim * method/object is detected. This prevents a flood of 330212700Sjkim * messages for methods that are repeatedly evaluated. 331212700Sjkim * 332212700Sjkim ******************************************************************************/ 333212700Sjkim 334212700Sjkimvoid ACPI_INTERNAL_VAR_XFACE 335212700SjkimAcpiUtPredefinedInfo ( 336212700Sjkim const char *ModuleName, 337212700Sjkim UINT32 LineNumber, 338212700Sjkim char *Pathname, 339212700Sjkim UINT8 NodeFlags, 340212700Sjkim const char *Format, 341212700Sjkim ...) 342212700Sjkim{ 343212700Sjkim va_list ArgList; 344212700Sjkim 345212700Sjkim 346212700Sjkim /* 347212700Sjkim * Warning messages for this method/object will be disabled after the 348212700Sjkim * first time a validation fails or an object is successfully repaired. 349212700Sjkim */ 350212700Sjkim if (NodeFlags & ANOBJ_EVALUATED) 351212700Sjkim { 352212700Sjkim return; 353212700Sjkim } 354212700Sjkim 355212700Sjkim AcpiOsPrintf (ACPI_MSG_INFO "For %s: ", Pathname); 356212700Sjkim 357212700Sjkim va_start (ArgList, Format); 358212700Sjkim AcpiOsVprintf (Format, ArgList); 359212700Sjkim ACPI_MSG_SUFFIX; 360212700Sjkim va_end (ArgList); 361212700Sjkim} 362212700Sjkim 363212700Sjkim 364212700Sjkim/******************************************************************************* 365212700Sjkim * 366212700Sjkim * FUNCTION: AcpiUtNamespaceError 367212700Sjkim * 368212700Sjkim * PARAMETERS: ModuleName - Caller's module name (for error output) 369212700Sjkim * LineNumber - Caller's line number (for error output) 370212700Sjkim * InternalName - Name or path of the namespace node 371212700Sjkim * LookupStatus - Exception code from NS lookup 372212700Sjkim * 373212700Sjkim * RETURN: None 374212700Sjkim * 375212700Sjkim * DESCRIPTION: Print error message with the full pathname for the NS node. 376212700Sjkim * 377212700Sjkim ******************************************************************************/ 378212700Sjkim 379212700Sjkimvoid 380212700SjkimAcpiUtNamespaceError ( 381212700Sjkim const char *ModuleName, 382212700Sjkim UINT32 LineNumber, 383212700Sjkim const char *InternalName, 384212700Sjkim ACPI_STATUS LookupStatus) 385212700Sjkim{ 386212700Sjkim ACPI_STATUS Status; 387212700Sjkim UINT32 BadName; 388212700Sjkim char *Name = NULL; 389212700Sjkim 390212700Sjkim 391212700Sjkim ACPI_MSG_REDIRECT_BEGIN; 392212700Sjkim AcpiOsPrintf (ACPI_MSG_ERROR); 393212700Sjkim 394212700Sjkim if (LookupStatus == AE_BAD_CHARACTER) 395212700Sjkim { 396212700Sjkim /* There is a non-ascii character in the name */ 397212700Sjkim 398212700Sjkim ACPI_MOVE_32_TO_32 (&BadName, ACPI_CAST_PTR (UINT32, InternalName)); 399212700Sjkim AcpiOsPrintf ("[0x%4.4X] (NON-ASCII)", BadName); 400212700Sjkim } 401212700Sjkim else 402212700Sjkim { 403212700Sjkim /* Convert path to external format */ 404212700Sjkim 405212700Sjkim Status = AcpiNsExternalizeName (ACPI_UINT32_MAX, 406212700Sjkim InternalName, NULL, &Name); 407212700Sjkim 408212700Sjkim /* Print target name */ 409212700Sjkim 410212700Sjkim if (ACPI_SUCCESS (Status)) 411212700Sjkim { 412212700Sjkim AcpiOsPrintf ("[%s]", Name); 413212700Sjkim } 414212700Sjkim else 415212700Sjkim { 416212700Sjkim AcpiOsPrintf ("[COULD NOT EXTERNALIZE NAME]"); 417212700Sjkim } 418212700Sjkim 419212700Sjkim if (Name) 420212700Sjkim { 421212700Sjkim ACPI_FREE (Name); 422212700Sjkim } 423212700Sjkim } 424212700Sjkim 425212700Sjkim AcpiOsPrintf (" Namespace lookup failure, %s", 426212700Sjkim AcpiFormatException (LookupStatus)); 427212700Sjkim 428212700Sjkim ACPI_MSG_SUFFIX; 429212700Sjkim ACPI_MSG_REDIRECT_END; 430212700Sjkim} 431212700Sjkim 432212700Sjkim 433212700Sjkim/******************************************************************************* 434212700Sjkim * 435212700Sjkim * FUNCTION: AcpiUtMethodError 436212700Sjkim * 437212700Sjkim * PARAMETERS: ModuleName - Caller's module name (for error output) 438212700Sjkim * LineNumber - Caller's line number (for error output) 439212700Sjkim * Message - Error message to use on failure 440212700Sjkim * PrefixNode - Prefix relative to the path 441212700Sjkim * Path - Path to the node (optional) 442212700Sjkim * MethodStatus - Execution status 443212700Sjkim * 444212700Sjkim * RETURN: None 445212700Sjkim * 446212700Sjkim * DESCRIPTION: Print error message with the full pathname for the method. 447212700Sjkim * 448212700Sjkim ******************************************************************************/ 449212700Sjkim 450212700Sjkimvoid 451212700SjkimAcpiUtMethodError ( 452212700Sjkim const char *ModuleName, 453212700Sjkim UINT32 LineNumber, 454212700Sjkim const char *Message, 455212700Sjkim ACPI_NAMESPACE_NODE *PrefixNode, 456212700Sjkim const char *Path, 457212700Sjkim ACPI_STATUS MethodStatus) 458212700Sjkim{ 459212700Sjkim ACPI_STATUS Status; 460212700Sjkim ACPI_NAMESPACE_NODE *Node = PrefixNode; 461212700Sjkim 462212700Sjkim 463212700Sjkim ACPI_MSG_REDIRECT_BEGIN; 464212700Sjkim AcpiOsPrintf (ACPI_MSG_ERROR); 465212700Sjkim 466212700Sjkim if (Path) 467212700Sjkim { 468212700Sjkim Status = AcpiNsGetNode (PrefixNode, Path, ACPI_NS_NO_UPSEARCH, 469212700Sjkim &Node); 470212700Sjkim if (ACPI_FAILURE (Status)) 471212700Sjkim { 472212700Sjkim AcpiOsPrintf ("[Could not get node by pathname]"); 473212700Sjkim } 474212700Sjkim } 475212700Sjkim 476212700Sjkim AcpiNsPrintNodePathname (Node, Message); 477212700Sjkim AcpiOsPrintf (", %s", AcpiFormatException (MethodStatus)); 478212700Sjkim 479212700Sjkim ACPI_MSG_SUFFIX; 480212700Sjkim ACPI_MSG_REDIRECT_END; 481212700Sjkim} 482212700Sjkim 483212700Sjkim#endif /* ACPI_NO_ERROR_MESSAGES */ 484