Home | History | Annotate | Line # | Download | only in utilities
uterror.c revision 1.1.1.11.6.1
      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.11.6.1   thorpej  * 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.11.6.1   thorpej  * 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