linux/drivers/acpi/acpica/uterror.c
<<
>>
Prefs
   1/*******************************************************************************
   2 *
   3 * Module Name: uterror - Various internal error/warning output functions
   4 *
   5 ******************************************************************************/
   6
   7/*
   8 * Copyright (C) 2000 - 2016, 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#include <acpi/acpi.h>
  45#include "accommon.h"
  46#include "acnamesp.h"
  47
  48#define _COMPONENT          ACPI_UTILITIES
  49ACPI_MODULE_NAME("uterror")
  50
  51/*
  52 * This module contains internal error functions that may
  53 * be configured out.
  54 */
  55#if !defined (ACPI_NO_ERROR_MESSAGES)
  56/*******************************************************************************
  57 *
  58 * FUNCTION:    acpi_ut_predefined_warning
  59 *
  60 * PARAMETERS:  module_name     - Caller's module name (for error output)
  61 *              line_number     - Caller's line number (for error output)
  62 *              pathname        - Full pathname to the node
  63 *              node_flags      - From Namespace node for the method/object
  64 *              format          - Printf format string + additional args
  65 *
  66 * RETURN:      None
  67 *
  68 * DESCRIPTION: Warnings for the predefined validation module. Messages are
  69 *              only emitted the first time a problem with a particular
  70 *              method/object is detected. This prevents a flood of error
  71 *              messages for methods that are repeatedly evaluated.
  72 *
  73 ******************************************************************************/
  74void ACPI_INTERNAL_VAR_XFACE
  75acpi_ut_predefined_warning(const char *module_name,
  76                           u32 line_number,
  77                           char *pathname,
  78                           u8 node_flags, const char *format, ...)
  79{
  80        va_list arg_list;
  81
  82        /*
  83         * Warning messages for this method/object will be disabled after the
  84         * first time a validation fails or an object is successfully repaired.
  85         */
  86        if (node_flags & ANOBJ_EVALUATED) {
  87                return;
  88        }
  89
  90        acpi_os_printf(ACPI_MSG_WARNING "%s: ", pathname);
  91
  92        va_start(arg_list, format);
  93        acpi_os_vprintf(format, arg_list);
  94        ACPI_MSG_SUFFIX;
  95        va_end(arg_list);
  96}
  97
  98/*******************************************************************************
  99 *
 100 * FUNCTION:    acpi_ut_predefined_info
 101 *
 102 * PARAMETERS:  module_name     - Caller's module name (for error output)
 103 *              line_number     - Caller's line number (for error output)
 104 *              pathname        - Full pathname to the node
 105 *              node_flags      - From Namespace node for the method/object
 106 *              format          - Printf format string + additional args
 107 *
 108 * RETURN:      None
 109 *
 110 * DESCRIPTION: Info messages for the predefined validation module. Messages
 111 *              are only emitted the first time a problem with a particular
 112 *              method/object is detected. This prevents a flood of
 113 *              messages for methods that are repeatedly evaluated.
 114 *
 115 ******************************************************************************/
 116
 117void ACPI_INTERNAL_VAR_XFACE
 118acpi_ut_predefined_info(const char *module_name,
 119                        u32 line_number,
 120                        char *pathname, u8 node_flags, const char *format, ...)
 121{
 122        va_list arg_list;
 123
 124        /*
 125         * Warning messages for this method/object will be disabled after the
 126         * first time a validation fails or an object is successfully repaired.
 127         */
 128        if (node_flags & ANOBJ_EVALUATED) {
 129                return;
 130        }
 131
 132        acpi_os_printf(ACPI_MSG_INFO "%s: ", pathname);
 133
 134        va_start(arg_list, format);
 135        acpi_os_vprintf(format, arg_list);
 136        ACPI_MSG_SUFFIX;
 137        va_end(arg_list);
 138}
 139
 140/*******************************************************************************
 141 *
 142 * FUNCTION:    acpi_ut_predefined_bios_error
 143 *
 144 * PARAMETERS:  module_name     - Caller's module name (for error output)
 145 *              line_number     - Caller's line number (for error output)
 146 *              pathname        - Full pathname to the node
 147 *              node_flags      - From Namespace node for the method/object
 148 *              format          - Printf format string + additional args
 149 *
 150 * RETURN:      None
 151 *
 152 * DESCRIPTION: BIOS error message for predefined names. Messages
 153 *              are only emitted the first time a problem with a particular
 154 *              method/object is detected. This prevents a flood of
 155 *              messages for methods that are repeatedly evaluated.
 156 *
 157 ******************************************************************************/
 158
 159void ACPI_INTERNAL_VAR_XFACE
 160acpi_ut_predefined_bios_error(const char *module_name,
 161                              u32 line_number,
 162                              char *pathname,
 163                              u8 node_flags, const char *format, ...)
 164{
 165        va_list arg_list;
 166
 167        /*
 168         * Warning messages for this method/object will be disabled after the
 169         * first time a validation fails or an object is successfully repaired.
 170         */
 171        if (node_flags & ANOBJ_EVALUATED) {
 172                return;
 173        }
 174
 175        acpi_os_printf(ACPI_MSG_BIOS_ERROR "%s: ", pathname);
 176
 177        va_start(arg_list, format);
 178        acpi_os_vprintf(format, arg_list);
 179        ACPI_MSG_SUFFIX;
 180        va_end(arg_list);
 181}
 182
 183/*******************************************************************************
 184 *
 185 * FUNCTION:    acpi_ut_namespace_error
 186 *
 187 * PARAMETERS:  module_name         - Caller's module name (for error output)
 188 *              line_number         - Caller's line number (for error output)
 189 *              internal_name       - Name or path of the namespace node
 190 *              lookup_status       - Exception code from NS lookup
 191 *
 192 * RETURN:      None
 193 *
 194 * DESCRIPTION: Print error message with the full pathname for the NS node.
 195 *
 196 ******************************************************************************/
 197
 198void
 199acpi_ut_namespace_error(const char *module_name,
 200                        u32 line_number,
 201                        const char *internal_name, acpi_status lookup_status)
 202{
 203        acpi_status status;
 204        u32 bad_name;
 205        char *name = NULL;
 206
 207        ACPI_MSG_REDIRECT_BEGIN;
 208        acpi_os_printf(ACPI_MSG_ERROR);
 209
 210        if (lookup_status == AE_BAD_CHARACTER) {
 211
 212                /* There is a non-ascii character in the name */
 213
 214                ACPI_MOVE_32_TO_32(&bad_name,
 215                                   ACPI_CAST_PTR(u32, internal_name));
 216                acpi_os_printf("[0x%.8X] (NON-ASCII)", bad_name);
 217        } else {
 218                /* Convert path to external format */
 219
 220                status =
 221                    acpi_ns_externalize_name(ACPI_UINT32_MAX, internal_name,
 222                                             NULL, &name);
 223
 224                /* Print target name */
 225
 226                if (ACPI_SUCCESS(status)) {
 227                        acpi_os_printf("[%s]", name);
 228                } else {
 229                        acpi_os_printf("[COULD NOT EXTERNALIZE NAME]");
 230                }
 231
 232                if (name) {
 233                        ACPI_FREE(name);
 234                }
 235        }
 236
 237        acpi_os_printf(" Namespace lookup failure, %s",
 238                       acpi_format_exception(lookup_status));
 239
 240        ACPI_MSG_SUFFIX;
 241        ACPI_MSG_REDIRECT_END;
 242}
 243
 244/*******************************************************************************
 245 *
 246 * FUNCTION:    acpi_ut_method_error
 247 *
 248 * PARAMETERS:  module_name         - Caller's module name (for error output)
 249 *              line_number         - Caller's line number (for error output)
 250 *              message             - Error message to use on failure
 251 *              prefix_node         - Prefix relative to the path
 252 *              path                - Path to the node (optional)
 253 *              method_status       - Execution status
 254 *
 255 * RETURN:      None
 256 *
 257 * DESCRIPTION: Print error message with the full pathname for the method.
 258 *
 259 ******************************************************************************/
 260
 261void
 262acpi_ut_method_error(const char *module_name,
 263                     u32 line_number,
 264                     const char *message,
 265                     struct acpi_namespace_node *prefix_node,
 266                     const char *path, acpi_status method_status)
 267{
 268        acpi_status status;
 269        struct acpi_namespace_node *node = prefix_node;
 270
 271        ACPI_MSG_REDIRECT_BEGIN;
 272        acpi_os_printf(ACPI_MSG_ERROR);
 273
 274        if (path) {
 275                status = acpi_ns_get_node(prefix_node, path,
 276                                          ACPI_NS_NO_UPSEARCH, &node);
 277                if (ACPI_FAILURE(status)) {
 278                        acpi_os_printf("[Could not get node by pathname]");
 279                }
 280        }
 281
 282        acpi_ns_print_node_pathname(node, message);
 283        acpi_os_printf(", %s", acpi_format_exception(method_status));
 284
 285        ACPI_MSG_SUFFIX;
 286        ACPI_MSG_REDIRECT_END;
 287}
 288
 289#endif                          /* ACPI_NO_ERROR_MESSAGES */
 290