Home | History | Annotate | Line # | Download | only in utilities
uterror.c revision 1.1.1.12
      1       1.1  christos /*******************************************************************************
      2       1.1  christos  *
      3       1.1  christos  * Module Name: uterror - Various internal error/warning output functions
      4       1.1  christos  *
      5       1.1  christos  ******************************************************************************/
      6       1.1  christos 
      7       1.1  christos /*
      8  1.1.1.12  christos  * Copyright (C) 2000 - 2021, Intel Corp.
      9       1.1  christos  * All rights reserved.
     10       1.1  christos  *
     11       1.1  christos  * Redistribution and use in source and binary forms, with or without
     12       1.1  christos  * modification, are permitted provided that the following conditions
     13       1.1  christos  * are met:
     14       1.1  christos  * 1. Redistributions of source code must retain the above copyright
     15       1.1  christos  *    notice, this list of conditions, and the following disclaimer,
     16       1.1  christos  *    without modification.
     17       1.1  christos  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     18       1.1  christos  *    substantially similar to the "NO WARRANTY" disclaimer below
     19       1.1  christos  *    ("Disclaimer") and any redistribution must be conditioned upon
     20       1.1  christos  *    including a substantially similar Disclaimer requirement for further
     21       1.1  christos  *    binary redistribution.
     22       1.1  christos  * 3. Neither the names of the above-listed copyright holders nor the names
     23       1.1  christos  *    of any contributors may be used to endorse or promote products derived
     24       1.1  christos  *    from this software without specific prior written permission.
     25       1.1  christos  *
     26       1.1  christos  * Alternatively, this software may be distributed under the terms of the
     27       1.1  christos  * GNU General Public License ("GPL") version 2 as published by the Free
     28       1.1  christos  * Software Foundation.
     29       1.1  christos  *
     30       1.1  christos  * NO WARRANTY
     31       1.1  christos  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     32       1.1  christos  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     33  1.1.1.12  christos  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     34       1.1  christos  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     35       1.1  christos  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     36       1.1  christos  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     37       1.1  christos  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     38       1.1  christos  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     39       1.1  christos  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     40       1.1  christos  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     41       1.1  christos  * POSSIBILITY OF SUCH DAMAGES.
     42       1.1  christos  */
     43       1.1  christos 
     44       1.1  christos #include "acpi.h"
     45       1.1  christos #include "accommon.h"
     46       1.1  christos #include "acnamesp.h"
     47       1.1  christos 
     48       1.1  christos 
     49       1.1  christos #define _COMPONENT          ACPI_UTILITIES
     50       1.1  christos         ACPI_MODULE_NAME    ("uterror")
     51       1.1  christos 
     52       1.1  christos 
     53       1.1  christos /*
     54       1.1  christos  * This module contains internal error functions that may
     55       1.1  christos  * be configured out.
     56       1.1  christos  */
     57       1.1  christos #if !defined (ACPI_NO_ERROR_MESSAGES)
     58       1.1  christos 
     59       1.1  christos /*******************************************************************************
     60       1.1  christos  *
     61       1.1  christos  * FUNCTION:    AcpiUtPredefinedWarning
     62       1.1  christos  *
     63       1.1  christos  * PARAMETERS:  ModuleName      - Caller's module name (for error output)
     64       1.1  christos  *              LineNumber      - Caller's line number (for error output)
     65       1.1  christos  *              Pathname        - Full pathname to the node
     66       1.1  christos  *              NodeFlags       - From Namespace node for the method/object
     67       1.1  christos  *              Format          - Printf format string + additional args
     68       1.1  christos  *
     69       1.1  christos  * RETURN:      None
     70       1.1  christos  *
     71       1.1  christos  * DESCRIPTION: Warnings for the predefined validation module. Messages are
     72       1.1  christos  *              only emitted the first time a problem with a particular
     73       1.1  christos  *              method/object is detected. This prevents a flood of error
     74       1.1  christos  *              messages for methods that are repeatedly evaluated.
     75       1.1  christos  *
     76       1.1  christos  ******************************************************************************/
     77       1.1  christos 
     78       1.1  christos void ACPI_INTERNAL_VAR_XFACE
     79       1.1  christos AcpiUtPredefinedWarning (
     80       1.1  christos     const char              *ModuleName,
     81       1.1  christos     UINT32                  LineNumber,
     82       1.1  christos     char                    *Pathname,
     83  1.1.1.10  christos     UINT16                  NodeFlags,
     84       1.1  christos     const char              *Format,
     85       1.1  christos     ...)
     86       1.1  christos {
     87       1.1  christos     va_list                 ArgList;
     88       1.1  christos 
     89       1.1  christos 
     90       1.1  christos     /*
     91       1.1  christos      * Warning messages for this method/object will be disabled after the
     92       1.1  christos      * first time a validation fails or an object is successfully repaired.
     93       1.1  christos      */
     94       1.1  christos     if (NodeFlags & ANOBJ_EVALUATED)
     95       1.1  christos     {
     96       1.1  christos         return;
     97       1.1  christos     }
     98       1.1  christos 
     99       1.1  christos     AcpiOsPrintf (ACPI_MSG_WARNING "%s: ", Pathname);
    100       1.1  christos 
    101       1.1  christos     va_start (ArgList, Format);
    102       1.1  christos     AcpiOsVprintf (Format, ArgList);
    103       1.1  christos     ACPI_MSG_SUFFIX;
    104       1.1  christos     va_end (ArgList);
    105       1.1  christos }
    106       1.1  christos 
    107       1.1  christos 
    108       1.1  christos /*******************************************************************************
    109       1.1  christos  *
    110       1.1  christos  * FUNCTION:    AcpiUtPredefinedInfo
    111       1.1  christos  *
    112       1.1  christos  * PARAMETERS:  ModuleName      - Caller's module name (for error output)
    113       1.1  christos  *              LineNumber      - Caller's line number (for error output)
    114       1.1  christos  *              Pathname        - Full pathname to the node
    115       1.1  christos  *              NodeFlags       - From Namespace node for the method/object
    116       1.1  christos  *              Format          - Printf format string + additional args
    117       1.1  christos  *
    118       1.1  christos  * RETURN:      None
    119       1.1  christos  *
    120       1.1  christos  * DESCRIPTION: Info messages for the predefined validation module. Messages
    121       1.1  christos  *              are only emitted the first time a problem with a particular
    122       1.1  christos  *              method/object is detected. This prevents a flood of
    123       1.1  christos  *              messages for methods that are repeatedly evaluated.
    124       1.1  christos  *
    125       1.1  christos  ******************************************************************************/
    126       1.1  christos 
    127       1.1  christos void ACPI_INTERNAL_VAR_XFACE
    128       1.1  christos AcpiUtPredefinedInfo (
    129       1.1  christos     const char              *ModuleName,
    130       1.1  christos     UINT32                  LineNumber,
    131       1.1  christos     char                    *Pathname,
    132  1.1.1.10  christos     UINT16                  NodeFlags,
    133       1.1  christos     const char              *Format,
    134       1.1  christos     ...)
    135       1.1  christos {
    136       1.1  christos     va_list                 ArgList;
    137       1.1  christos 
    138       1.1  christos 
    139       1.1  christos     /*
    140       1.1  christos      * Warning messages for this method/object will be disabled after the
    141       1.1  christos      * first time a validation fails or an object is successfully repaired.
    142       1.1  christos      */
    143       1.1  christos     if (NodeFlags & ANOBJ_EVALUATED)
    144       1.1  christos     {
    145       1.1  christos         return;
    146       1.1  christos     }
    147       1.1  christos 
    148       1.1  christos     AcpiOsPrintf (ACPI_MSG_INFO "%s: ", Pathname);
    149       1.1  christos 
    150       1.1  christos     va_start (ArgList, Format);
    151       1.1  christos     AcpiOsVprintf (Format, ArgList);
    152       1.1  christos     ACPI_MSG_SUFFIX;
    153       1.1  christos     va_end (ArgList);
    154       1.1  christos }
    155       1.1  christos 
    156       1.1  christos 
    157       1.1  christos /*******************************************************************************
    158       1.1  christos  *
    159       1.1  christos  * FUNCTION:    AcpiUtPredefinedBiosError
    160       1.1  christos  *
    161       1.1  christos  * PARAMETERS:  ModuleName      - Caller's module name (for error output)
    162       1.1  christos  *              LineNumber      - Caller's line number (for error output)
    163       1.1  christos  *              Pathname        - Full pathname to the node
    164       1.1  christos  *              NodeFlags       - From Namespace node for the method/object
    165       1.1  christos  *              Format          - Printf format string + additional args
    166       1.1  christos  *
    167       1.1  christos  * RETURN:      None
    168       1.1  christos  *
    169       1.1  christos  * DESCRIPTION: BIOS error message for predefined names. Messages
    170       1.1  christos  *              are only emitted the first time a problem with a particular
    171       1.1  christos  *              method/object is detected. This prevents a flood of
    172       1.1  christos  *              messages for methods that are repeatedly evaluated.
    173       1.1  christos  *
    174       1.1  christos  ******************************************************************************/
    175       1.1  christos 
    176       1.1  christos void ACPI_INTERNAL_VAR_XFACE
    177       1.1  christos AcpiUtPredefinedBiosError (
    178       1.1  christos     const char              *ModuleName,
    179       1.1  christos     UINT32                  LineNumber,
    180       1.1  christos     char                    *Pathname,
    181  1.1.1.10  christos     UINT16                  NodeFlags,
    182       1.1  christos     const char              *Format,
    183       1.1  christos     ...)
    184       1.1  christos {
    185       1.1  christos     va_list                 ArgList;
    186       1.1  christos 
    187       1.1  christos 
    188       1.1  christos     /*
    189       1.1  christos      * Warning messages for this method/object will be disabled after the
    190       1.1  christos      * first time a validation fails or an object is successfully repaired.
    191       1.1  christos      */
    192       1.1  christos     if (NodeFlags & ANOBJ_EVALUATED)
    193       1.1  christos     {
    194       1.1  christos         return;
    195       1.1  christos     }
    196       1.1  christos 
    197       1.1  christos     AcpiOsPrintf (ACPI_MSG_BIOS_ERROR "%s: ", Pathname);
    198       1.1  christos 
    199       1.1  christos     va_start (ArgList, Format);
    200       1.1  christos     AcpiOsVprintf (Format, ArgList);
    201       1.1  christos     ACPI_MSG_SUFFIX;
    202       1.1  christos     va_end (ArgList);
    203       1.1  christos }
    204       1.1  christos 
    205       1.1  christos 
    206       1.1  christos /*******************************************************************************
    207       1.1  christos  *
    208   1.1.1.6  christos  * FUNCTION:    AcpiUtPrefixedNamespaceError
    209   1.1.1.6  christos  *
    210   1.1.1.6  christos  * PARAMETERS:  ModuleName          - Caller's module name (for error output)
    211   1.1.1.6  christos  *              LineNumber          - Caller's line number (for error output)
    212   1.1.1.6  christos  *              PrefixScope         - Scope/Path that prefixes the internal path
    213   1.1.1.6  christos  *              InternalPath        - Name or path of the namespace node
    214   1.1.1.6  christos  *              LookupStatus        - Exception code from NS lookup
    215   1.1.1.6  christos  *
    216   1.1.1.6  christos  * RETURN:      None
    217   1.1.1.6  christos  *
    218   1.1.1.6  christos  * DESCRIPTION: Print error message with the full pathname constructed this way:
    219   1.1.1.6  christos  *
    220   1.1.1.6  christos  *                  PrefixScopeNodeFullPath.ExternalizedInternalPath
    221   1.1.1.6  christos  *
    222   1.1.1.6  christos  * NOTE:        10/2017: Treat the major NsLookup errors as firmware errors
    223   1.1.1.6  christos  *
    224   1.1.1.6  christos  ******************************************************************************/
    225   1.1.1.6  christos 
    226   1.1.1.6  christos void
    227   1.1.1.6  christos AcpiUtPrefixedNamespaceError (
    228   1.1.1.6  christos     const char              *ModuleName,
    229   1.1.1.6  christos     UINT32                  LineNumber,
    230   1.1.1.6  christos     ACPI_GENERIC_STATE      *PrefixScope,
    231   1.1.1.6  christos     const char              *InternalPath,
    232   1.1.1.6  christos     ACPI_STATUS             LookupStatus)
    233   1.1.1.6  christos {
    234   1.1.1.6  christos     char                    *FullPath;
    235   1.1.1.6  christos     const char              *Message;
    236   1.1.1.6  christos 
    237   1.1.1.6  christos 
    238   1.1.1.6  christos     /*
    239   1.1.1.6  christos      * Main cases:
    240   1.1.1.6  christos      * 1) Object creation, object must not already exist
    241   1.1.1.6  christos      * 2) Object lookup, object must exist
    242   1.1.1.6  christos      */
    243   1.1.1.6  christos     switch (LookupStatus)
    244   1.1.1.6  christos     {
    245   1.1.1.6  christos     case AE_ALREADY_EXISTS:
    246   1.1.1.6  christos 
    247   1.1.1.6  christos         AcpiOsPrintf (ACPI_MSG_BIOS_ERROR);
    248   1.1.1.9  christos         Message = "Failure creating named object";
    249   1.1.1.6  christos         break;
    250   1.1.1.6  christos 
    251   1.1.1.6  christos     case AE_NOT_FOUND:
    252   1.1.1.6  christos 
    253   1.1.1.6  christos         AcpiOsPrintf (ACPI_MSG_BIOS_ERROR);
    254   1.1.1.9  christos         Message = "Could not resolve symbol";
    255   1.1.1.6  christos         break;
    256   1.1.1.6  christos 
    257   1.1.1.6  christos     default:
    258   1.1.1.6  christos 
    259   1.1.1.6  christos         AcpiOsPrintf (ACPI_MSG_ERROR);
    260   1.1.1.9  christos         Message = "Failure resolving symbol";
    261   1.1.1.6  christos         break;
    262   1.1.1.6  christos     }
    263   1.1.1.6  christos 
    264   1.1.1.6  christos     /* Concatenate the prefix path and the internal path */
    265   1.1.1.6  christos 
    266   1.1.1.6  christos     FullPath = AcpiNsBuildPrefixedPathname (PrefixScope, InternalPath);
    267   1.1.1.6  christos 
    268   1.1.1.6  christos     AcpiOsPrintf ("%s [%s], %s", Message,
    269   1.1.1.6  christos         FullPath ? FullPath : "Could not get pathname",
    270   1.1.1.6  christos         AcpiFormatException (LookupStatus));
    271   1.1.1.6  christos 
    272   1.1.1.6  christos     if (FullPath)
    273   1.1.1.6  christos     {
    274   1.1.1.6  christos         ACPI_FREE (FullPath);
    275   1.1.1.6  christos     }
    276   1.1.1.6  christos 
    277   1.1.1.6  christos     ACPI_MSG_SUFFIX;
    278   1.1.1.6  christos }
    279   1.1.1.6  christos 
    280   1.1.1.6  christos 
    281   1.1.1.6  christos #ifdef __OBSOLETE_FUNCTION
    282   1.1.1.6  christos /*******************************************************************************
    283   1.1.1.6  christos  *
    284       1.1  christos  * FUNCTION:    AcpiUtNamespaceError
    285       1.1  christos  *
    286       1.1  christos  * PARAMETERS:  ModuleName          - Caller's module name (for error output)
    287       1.1  christos  *              LineNumber          - Caller's line number (for error output)
    288       1.1  christos  *              InternalName        - Name or path of the namespace node
    289       1.1  christos  *              LookupStatus        - Exception code from NS lookup
    290       1.1  christos  *
    291       1.1  christos  * RETURN:      None
    292       1.1  christos  *
    293       1.1  christos  * DESCRIPTION: Print error message with the full pathname for the NS node.
    294       1.1  christos  *
    295       1.1  christos  ******************************************************************************/
    296       1.1  christos 
    297       1.1  christos void
    298       1.1  christos AcpiUtNamespaceError (
    299       1.1  christos     const char              *ModuleName,
    300       1.1  christos     UINT32                  LineNumber,
    301       1.1  christos     const char              *InternalName,
    302       1.1  christos     ACPI_STATUS             LookupStatus)
    303       1.1  christos {
    304       1.1  christos     ACPI_STATUS             Status;
    305       1.1  christos     UINT32                  BadName;
    306       1.1  christos     char                    *Name = NULL;
    307       1.1  christos 
    308       1.1  christos 
    309       1.1  christos     ACPI_MSG_REDIRECT_BEGIN;
    310       1.1  christos     AcpiOsPrintf (ACPI_MSG_ERROR);
    311       1.1  christos 
    312       1.1  christos     if (LookupStatus == AE_BAD_CHARACTER)
    313       1.1  christos     {
    314       1.1  christos         /* There is a non-ascii character in the name */
    315       1.1  christos 
    316       1.1  christos         ACPI_MOVE_32_TO_32 (&BadName, ACPI_CAST_PTR (UINT32, InternalName));
    317       1.1  christos         AcpiOsPrintf ("[0x%.8X] (NON-ASCII)", BadName);
    318       1.1  christos     }
    319       1.1  christos     else
    320       1.1  christos     {
    321       1.1  christos         /* Convert path to external format */
    322       1.1  christos 
    323   1.1.1.4  christos         Status = AcpiNsExternalizeName (
    324   1.1.1.4  christos             ACPI_UINT32_MAX, InternalName, NULL, &Name);
    325       1.1  christos 
    326       1.1  christos         /* Print target name */
    327       1.1  christos 
    328       1.1  christos         if (ACPI_SUCCESS (Status))
    329       1.1  christos         {
    330       1.1  christos             AcpiOsPrintf ("[%s]", Name);
    331       1.1  christos         }
    332       1.1  christos         else
    333       1.1  christos         {
    334       1.1  christos             AcpiOsPrintf ("[COULD NOT EXTERNALIZE NAME]");
    335       1.1  christos         }
    336       1.1  christos 
    337       1.1  christos         if (Name)
    338       1.1  christos         {
    339       1.1  christos             ACPI_FREE (Name);
    340       1.1  christos         }
    341       1.1  christos     }
    342       1.1  christos 
    343       1.1  christos     AcpiOsPrintf (" Namespace lookup failure, %s",
    344       1.1  christos         AcpiFormatException (LookupStatus));
    345       1.1  christos 
    346       1.1  christos     ACPI_MSG_SUFFIX;
    347       1.1  christos     ACPI_MSG_REDIRECT_END;
    348       1.1  christos }
    349   1.1.1.6  christos #endif
    350       1.1  christos 
    351       1.1  christos /*******************************************************************************
    352       1.1  christos  *
    353       1.1  christos  * FUNCTION:    AcpiUtMethodError
    354       1.1  christos  *
    355       1.1  christos  * PARAMETERS:  ModuleName          - Caller's module name (for error output)
    356       1.1  christos  *              LineNumber          - Caller's line number (for error output)
    357       1.1  christos  *              Message             - Error message to use on failure
    358       1.1  christos  *              PrefixNode          - Prefix relative to the path
    359       1.1  christos  *              Path                - Path to the node (optional)
    360       1.1  christos  *              MethodStatus        - Execution status
    361       1.1  christos  *
    362       1.1  christos  * RETURN:      None
    363       1.1  christos  *
    364       1.1  christos  * DESCRIPTION: Print error message with the full pathname for the method.
    365       1.1  christos  *
    366       1.1  christos  ******************************************************************************/
    367       1.1  christos 
    368       1.1  christos void
    369       1.1  christos AcpiUtMethodError (
    370       1.1  christos     const char              *ModuleName,
    371       1.1  christos     UINT32                  LineNumber,
    372       1.1  christos     const char              *Message,
    373       1.1  christos     ACPI_NAMESPACE_NODE     *PrefixNode,
    374       1.1  christos     const char              *Path,
    375       1.1  christos     ACPI_STATUS             MethodStatus)
    376       1.1  christos {
    377       1.1  christos     ACPI_STATUS             Status;
    378       1.1  christos     ACPI_NAMESPACE_NODE     *Node = PrefixNode;
    379       1.1  christos 
    380       1.1  christos 
    381       1.1  christos     ACPI_MSG_REDIRECT_BEGIN;
    382       1.1  christos     AcpiOsPrintf (ACPI_MSG_ERROR);
    383       1.1  christos 
    384       1.1  christos     if (Path)
    385       1.1  christos     {
    386   1.1.1.4  christos         Status = AcpiNsGetNode (PrefixNode, Path,
    387   1.1.1.4  christos             ACPI_NS_NO_UPSEARCH, &Node);
    388       1.1  christos         if (ACPI_FAILURE (Status))
    389       1.1  christos         {
    390       1.1  christos             AcpiOsPrintf ("[Could not get node by pathname]");
    391       1.1  christos         }
    392       1.1  christos     }
    393       1.1  christos 
    394       1.1  christos     AcpiNsPrintNodePathname (Node, Message);
    395   1.1.1.9  christos     AcpiOsPrintf (" due to previous error (%s)",
    396   1.1.1.9  christos         AcpiFormatException (MethodStatus));
    397       1.1  christos 
    398       1.1  christos     ACPI_MSG_SUFFIX;
    399       1.1  christos     ACPI_MSG_REDIRECT_END;
    400       1.1  christos }
    401       1.1  christos 
    402       1.1  christos #endif /* ACPI_NO_ERROR_MESSAGES */
    403