Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /*******************************************************************************
  2.  *
  3.  * Module Name: uterror - Various internal error/warning output functions
  4.  *
  5.  ******************************************************************************/
  6.  
  7. /*
  8.  * Copyright (C) 2000 - 2015, 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
  49. ACPI_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.  ******************************************************************************/
  74. void ACPI_INTERNAL_VAR_XFACE
  75. acpi_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.  
  117. void ACPI_INTERNAL_VAR_XFACE
  118. acpi_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.  
  159. void ACPI_INTERNAL_VAR_XFACE
  160. acpi_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.  
  198. void
  199. acpi_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 = acpi_ns_externalize_name(ACPI_UINT32_MAX,
  221.                                                   internal_name, NULL, &name);
  222.  
  223.                 /* Print target name */
  224.  
  225.                 if (ACPI_SUCCESS(status)) {
  226.                         acpi_os_printf("[%s]", name);
  227.                 } else {
  228.                         acpi_os_printf("[COULD NOT EXTERNALIZE NAME]");
  229.                 }
  230.  
  231.                 if (name) {
  232.                         ACPI_FREE(name);
  233.                 }
  234.         }
  235.  
  236.         acpi_os_printf(" Namespace lookup failure, %s",
  237.                        acpi_format_exception(lookup_status));
  238.  
  239.         ACPI_MSG_SUFFIX;
  240.         ACPI_MSG_REDIRECT_END;
  241. }
  242.  
  243. /*******************************************************************************
  244.  *
  245.  * FUNCTION:    acpi_ut_method_error
  246.  *
  247.  * PARAMETERS:  module_name         - Caller's module name (for error output)
  248.  *              line_number         - Caller's line number (for error output)
  249.  *              message             - Error message to use on failure
  250.  *              prefix_node         - Prefix relative to the path
  251.  *              path                - Path to the node (optional)
  252.  *              method_status       - Execution status
  253.  *
  254.  * RETURN:      None
  255.  *
  256.  * DESCRIPTION: Print error message with the full pathname for the method.
  257.  *
  258.  ******************************************************************************/
  259.  
  260. void
  261. acpi_ut_method_error(const char *module_name,
  262.                      u32 line_number,
  263.                      const char *message,
  264.                      struct acpi_namespace_node *prefix_node,
  265.                      const char *path, acpi_status method_status)
  266. {
  267.         acpi_status status;
  268.         struct acpi_namespace_node *node = prefix_node;
  269.  
  270.         ACPI_MSG_REDIRECT_BEGIN;
  271.         acpi_os_printf(ACPI_MSG_ERROR);
  272.  
  273.         if (path) {
  274.                 status =
  275.                     acpi_ns_get_node(prefix_node, path, ACPI_NS_NO_UPSEARCH,
  276.                                      &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.