Home | History | Annotate | Line # | Download | only in utilities
uterror.c revision 1.1.1.1
      1 /*******************************************************************************
      2  *
      3  * Module Name: uterror - Various internal error/warning output functions
      4  *
      5  ******************************************************************************/
      6 
      7 /*
      8  * Copyright (C) 2000 - 2013, 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 __UTERROR_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    ("uterror")
     53 
     54 
     55 /*
     56  * This module contains internal error functions that may
     57  * be configured out.
     58  */
     59 #if !defined (ACPI_NO_ERROR_MESSAGES)
     60 
     61 /*******************************************************************************
     62  *
     63  * FUNCTION:    AcpiUtPredefinedWarning
     64  *
     65  * PARAMETERS:  ModuleName      - Caller's module name (for error output)
     66  *              LineNumber      - Caller's line number (for error output)
     67  *              Pathname        - Full pathname to the node
     68  *              NodeFlags       - From Namespace node for the method/object
     69  *              Format          - Printf format string + additional args
     70  *
     71  * RETURN:      None
     72  *
     73  * DESCRIPTION: Warnings for the predefined validation module. Messages are
     74  *              only emitted the first time a problem with a particular
     75  *              method/object is detected. This prevents a flood of error
     76  *              messages for methods that are repeatedly evaluated.
     77  *
     78  ******************************************************************************/
     79 
     80 void ACPI_INTERNAL_VAR_XFACE
     81 AcpiUtPredefinedWarning (
     82     const char              *ModuleName,
     83     UINT32                  LineNumber,
     84     char                    *Pathname,
     85     UINT8                   NodeFlags,
     86     const char              *Format,
     87     ...)
     88 {
     89     va_list                 ArgList;
     90 
     91 
     92     /*
     93      * Warning messages for this method/object will be disabled after the
     94      * first time a validation fails or an object is successfully repaired.
     95      */
     96     if (NodeFlags & ANOBJ_EVALUATED)
     97     {
     98         return;
     99     }
    100 
    101     AcpiOsPrintf (ACPI_MSG_WARNING "%s: ", Pathname);
    102 
    103     va_start (ArgList, Format);
    104     AcpiOsVprintf (Format, ArgList);
    105     ACPI_MSG_SUFFIX;
    106     va_end (ArgList);
    107 }
    108 
    109 
    110 /*******************************************************************************
    111  *
    112  * FUNCTION:    AcpiUtPredefinedInfo
    113  *
    114  * PARAMETERS:  ModuleName      - Caller's module name (for error output)
    115  *              LineNumber      - Caller's line number (for error output)
    116  *              Pathname        - Full pathname to the node
    117  *              NodeFlags       - From Namespace node for the method/object
    118  *              Format          - Printf format string + additional args
    119  *
    120  * RETURN:      None
    121  *
    122  * DESCRIPTION: Info messages for the predefined validation module. Messages
    123  *              are only emitted the first time a problem with a particular
    124  *              method/object is detected. This prevents a flood of
    125  *              messages for methods that are repeatedly evaluated.
    126  *
    127  ******************************************************************************/
    128 
    129 void ACPI_INTERNAL_VAR_XFACE
    130 AcpiUtPredefinedInfo (
    131     const char              *ModuleName,
    132     UINT32                  LineNumber,
    133     char                    *Pathname,
    134     UINT8                   NodeFlags,
    135     const char              *Format,
    136     ...)
    137 {
    138     va_list                 ArgList;
    139 
    140 
    141     /*
    142      * Warning messages for this method/object will be disabled after the
    143      * first time a validation fails or an object is successfully repaired.
    144      */
    145     if (NodeFlags & ANOBJ_EVALUATED)
    146     {
    147         return;
    148     }
    149 
    150     AcpiOsPrintf (ACPI_MSG_INFO "%s: ", Pathname);
    151 
    152     va_start (ArgList, Format);
    153     AcpiOsVprintf (Format, ArgList);
    154     ACPI_MSG_SUFFIX;
    155     va_end (ArgList);
    156 }
    157 
    158 
    159 /*******************************************************************************
    160  *
    161  * FUNCTION:    AcpiUtPredefinedBiosError
    162  *
    163  * PARAMETERS:  ModuleName      - Caller's module name (for error output)
    164  *              LineNumber      - Caller's line number (for error output)
    165  *              Pathname        - Full pathname to the node
    166  *              NodeFlags       - From Namespace node for the method/object
    167  *              Format          - Printf format string + additional args
    168  *
    169  * RETURN:      None
    170  *
    171  * DESCRIPTION: BIOS error message for predefined names. Messages
    172  *              are only emitted the first time a problem with a particular
    173  *              method/object is detected. This prevents a flood of
    174  *              messages for methods that are repeatedly evaluated.
    175  *
    176  ******************************************************************************/
    177 
    178 void ACPI_INTERNAL_VAR_XFACE
    179 AcpiUtPredefinedBiosError (
    180     const char              *ModuleName,
    181     UINT32                  LineNumber,
    182     char                    *Pathname,
    183     UINT8                   NodeFlags,
    184     const char              *Format,
    185     ...)
    186 {
    187     va_list                 ArgList;
    188 
    189 
    190     /*
    191      * Warning messages for this method/object will be disabled after the
    192      * first time a validation fails or an object is successfully repaired.
    193      */
    194     if (NodeFlags & ANOBJ_EVALUATED)
    195     {
    196         return;
    197     }
    198 
    199     AcpiOsPrintf (ACPI_MSG_BIOS_ERROR "%s: ", Pathname);
    200 
    201     va_start (ArgList, Format);
    202     AcpiOsVprintf (Format, ArgList);
    203     ACPI_MSG_SUFFIX;
    204     va_end (ArgList);
    205 }
    206 
    207 
    208 /*******************************************************************************
    209  *
    210  * FUNCTION:    AcpiUtNamespaceError
    211  *
    212  * PARAMETERS:  ModuleName          - Caller's module name (for error output)
    213  *              LineNumber          - Caller's line number (for error output)
    214  *              InternalName        - Name or path of the namespace node
    215  *              LookupStatus        - Exception code from NS lookup
    216  *
    217  * RETURN:      None
    218  *
    219  * DESCRIPTION: Print error message with the full pathname for the NS node.
    220  *
    221  ******************************************************************************/
    222 
    223 void
    224 AcpiUtNamespaceError (
    225     const char              *ModuleName,
    226     UINT32                  LineNumber,
    227     const char              *InternalName,
    228     ACPI_STATUS             LookupStatus)
    229 {
    230     ACPI_STATUS             Status;
    231     UINT32                  BadName;
    232     char                    *Name = NULL;
    233 
    234 
    235     ACPI_MSG_REDIRECT_BEGIN;
    236     AcpiOsPrintf (ACPI_MSG_ERROR);
    237 
    238     if (LookupStatus == AE_BAD_CHARACTER)
    239     {
    240         /* There is a non-ascii character in the name */
    241 
    242         ACPI_MOVE_32_TO_32 (&BadName, ACPI_CAST_PTR (UINT32, InternalName));
    243         AcpiOsPrintf ("[0x%.8X] (NON-ASCII)", BadName);
    244     }
    245     else
    246     {
    247         /* Convert path to external format */
    248 
    249         Status = AcpiNsExternalizeName (ACPI_UINT32_MAX,
    250                     InternalName, NULL, &Name);
    251 
    252         /* Print target name */
    253 
    254         if (ACPI_SUCCESS (Status))
    255         {
    256             AcpiOsPrintf ("[%s]", Name);
    257         }
    258         else
    259         {
    260             AcpiOsPrintf ("[COULD NOT EXTERNALIZE NAME]");
    261         }
    262 
    263         if (Name)
    264         {
    265             ACPI_FREE (Name);
    266         }
    267     }
    268 
    269     AcpiOsPrintf (" Namespace lookup failure, %s",
    270         AcpiFormatException (LookupStatus));
    271 
    272     ACPI_MSG_SUFFIX;
    273     ACPI_MSG_REDIRECT_END;
    274 }
    275 
    276 
    277 /*******************************************************************************
    278  *
    279  * FUNCTION:    AcpiUtMethodError
    280  *
    281  * PARAMETERS:  ModuleName          - Caller's module name (for error output)
    282  *              LineNumber          - Caller's line number (for error output)
    283  *              Message             - Error message to use on failure
    284  *              PrefixNode          - Prefix relative to the path
    285  *              Path                - Path to the node (optional)
    286  *              MethodStatus        - Execution status
    287  *
    288  * RETURN:      None
    289  *
    290  * DESCRIPTION: Print error message with the full pathname for the method.
    291  *
    292  ******************************************************************************/
    293 
    294 void
    295 AcpiUtMethodError (
    296     const char              *ModuleName,
    297     UINT32                  LineNumber,
    298     const char              *Message,
    299     ACPI_NAMESPACE_NODE     *PrefixNode,
    300     const char              *Path,
    301     ACPI_STATUS             MethodStatus)
    302 {
    303     ACPI_STATUS             Status;
    304     ACPI_NAMESPACE_NODE     *Node = PrefixNode;
    305 
    306 
    307     ACPI_MSG_REDIRECT_BEGIN;
    308     AcpiOsPrintf (ACPI_MSG_ERROR);
    309 
    310     if (Path)
    311     {
    312         Status = AcpiNsGetNode (PrefixNode, Path, ACPI_NS_NO_UPSEARCH,
    313                     &Node);
    314         if (ACPI_FAILURE (Status))
    315         {
    316             AcpiOsPrintf ("[Could not get node by pathname]");
    317         }
    318     }
    319 
    320     AcpiNsPrintNodePathname (Node, Message);
    321     AcpiOsPrintf (", %s", AcpiFormatException (MethodStatus));
    322 
    323     ACPI_MSG_SUFFIX;
    324     ACPI_MSG_REDIRECT_END;
    325 }
    326 
    327 #endif /* ACPI_NO_ERROR_MESSAGES */
    328