Home | History | Annotate | Line # | Download | only in utilities
utxferror.c revision 1.1
      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 */
    479