root/drivers/acpi/acpica/uterror.c
// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
/*******************************************************************************
 *
 * Module Name: uterror - Various internal error/warning output functions
 *
 ******************************************************************************/

#include <acpi/acpi.h>
#include "accommon.h"
#include "acnamesp.h"

#define _COMPONENT          ACPI_UTILITIES
ACPI_MODULE_NAME("uterror")

/*
 * This module contains internal error functions that may
 * be configured out.
 */
#if !defined (ACPI_NO_ERROR_MESSAGES)
/*******************************************************************************
 *
 * FUNCTION:    acpi_ut_predefined_warning
 *
 * PARAMETERS:  module_name     - Caller's module name (for error output)
 *              line_number     - Caller's line number (for error output)
 *              pathname        - Full pathname to the node
 *              node_flags      - From Namespace node for the method/object
 *              format          - Printf format string + additional args
 *
 * RETURN:      None
 *
 * DESCRIPTION: Warnings for the predefined validation module. Messages are
 *              only emitted the first time a problem with a particular
 *              method/object is detected. This prevents a flood of error
 *              messages for methods that are repeatedly evaluated.
 *
 ******************************************************************************/
void ACPI_INTERNAL_VAR_XFACE
acpi_ut_predefined_warning(const char *module_name,
                           u32 line_number,
                           char *pathname,
                           u16 node_flags, const char *format, ...)
{
        va_list arg_list;

        /*
         * Warning messages for this method/object will be disabled after the
         * first time a validation fails or an object is successfully repaired.
         */
        if (node_flags & ANOBJ_EVALUATED) {
                return;
        }

        acpi_os_printf(ACPI_MSG_WARNING "%s: ", pathname);

        va_start(arg_list, format);
        acpi_os_vprintf(format, arg_list);
        ACPI_MSG_SUFFIX;
        va_end(arg_list);
}

/*******************************************************************************
 *
 * FUNCTION:    acpi_ut_predefined_info
 *
 * PARAMETERS:  module_name     - Caller's module name (for error output)
 *              line_number     - Caller's line number (for error output)
 *              pathname        - Full pathname to the node
 *              node_flags      - From Namespace node for the method/object
 *              format          - Printf format string + additional args
 *
 * RETURN:      None
 *
 * DESCRIPTION: Info messages for the predefined validation module. Messages
 *              are only emitted the first time a problem with a particular
 *              method/object is detected. This prevents a flood of
 *              messages for methods that are repeatedly evaluated.
 *
 ******************************************************************************/

void ACPI_INTERNAL_VAR_XFACE
acpi_ut_predefined_info(const char *module_name,
                        u32 line_number,
                        char *pathname, u16 node_flags, const char *format, ...)
{
        va_list arg_list;

        /*
         * Warning messages for this method/object will be disabled after the
         * first time a validation fails or an object is successfully repaired.
         */
        if (node_flags & ANOBJ_EVALUATED) {
                return;
        }

        acpi_os_printf(ACPI_MSG_INFO "%s: ", pathname);

        va_start(arg_list, format);
        acpi_os_vprintf(format, arg_list);
        ACPI_MSG_SUFFIX;
        va_end(arg_list);
}

/*******************************************************************************
 *
 * FUNCTION:    acpi_ut_predefined_bios_error
 *
 * PARAMETERS:  module_name     - Caller's module name (for error output)
 *              line_number     - Caller's line number (for error output)
 *              pathname        - Full pathname to the node
 *              node_flags      - From Namespace node for the method/object
 *              format          - Printf format string + additional args
 *
 * RETURN:      None
 *
 * DESCRIPTION: BIOS error message for predefined names. Messages
 *              are only emitted the first time a problem with a particular
 *              method/object is detected. This prevents a flood of
 *              messages for methods that are repeatedly evaluated.
 *
 ******************************************************************************/

void ACPI_INTERNAL_VAR_XFACE
acpi_ut_predefined_bios_error(const char *module_name,
                              u32 line_number,
                              char *pathname,
                              u16 node_flags, const char *format, ...)
{
        va_list arg_list;

        /*
         * Warning messages for this method/object will be disabled after the
         * first time a validation fails or an object is successfully repaired.
         */
        if (node_flags & ANOBJ_EVALUATED) {
                return;
        }

        acpi_os_printf(ACPI_MSG_BIOS_ERROR "%s: ", pathname);

        va_start(arg_list, format);
        acpi_os_vprintf(format, arg_list);
        ACPI_MSG_SUFFIX;
        va_end(arg_list);
}

/*******************************************************************************
 *
 * FUNCTION:    acpi_ut_prefixed_namespace_error
 *
 * PARAMETERS:  module_name         - Caller's module name (for error output)
 *              line_number         - Caller's line number (for error output)
 *              prefix_scope        - Scope/Path that prefixes the internal path
 *              internal_path       - Name or path of the namespace node
 *              lookup_status       - Exception code from NS lookup
 *
 * RETURN:      None
 *
 * DESCRIPTION: Print error message with the full pathname constructed this way:
 *
 *                  prefix_scope_node_full_path.externalized_internal_path
 *
 * NOTE:        10/2017: Treat the major ns_lookup errors as firmware errors
 *
 ******************************************************************************/

void
acpi_ut_prefixed_namespace_error(const char *module_name,
                                 u32 line_number,
                                 union acpi_generic_state *prefix_scope,
                                 const char *internal_path,
                                 acpi_status lookup_status)
{
        char *full_path;
        const char *message;

        /*
         * Main cases:
         * 1) Object creation, object must not already exist
         * 2) Object lookup, object must exist
         */
        switch (lookup_status) {
        case AE_ALREADY_EXISTS:

                acpi_os_printf(ACPI_MSG_BIOS_ERROR);
                message = "Failure creating named object";
                break;

        case AE_NOT_FOUND:

                acpi_os_printf(ACPI_MSG_BIOS_ERROR);
                message = "Could not resolve symbol";
                break;

        default:

                acpi_os_printf(ACPI_MSG_ERROR);
                message = "Failure resolving symbol";
                break;
        }

        /* Concatenate the prefix path and the internal path */

        full_path =
            acpi_ns_build_prefixed_pathname(prefix_scope, internal_path);

        acpi_os_printf("%s [%s], %s", message,
                       full_path ? full_path : "Could not get pathname",
                       acpi_format_exception(lookup_status));

        if (full_path) {
                ACPI_FREE(full_path);
        }

        ACPI_MSG_SUFFIX;
}

#ifdef __OBSOLETE_FUNCTION
/*******************************************************************************
 *
 * FUNCTION:    acpi_ut_namespace_error
 *
 * PARAMETERS:  module_name         - Caller's module name (for error output)
 *              line_number         - Caller's line number (for error output)
 *              internal_name       - Name or path of the namespace node
 *              lookup_status       - Exception code from NS lookup
 *
 * RETURN:      None
 *
 * DESCRIPTION: Print error message with the full pathname for the NS node.
 *
 ******************************************************************************/

void
acpi_ut_namespace_error(const char *module_name,
                        u32 line_number,
                        const char *internal_name, acpi_status lookup_status)
{
        acpi_status status;
        u32 bad_name;
        char *name = NULL;

        ACPI_MSG_REDIRECT_BEGIN;
        acpi_os_printf(ACPI_MSG_ERROR);

        if (lookup_status == AE_BAD_CHARACTER) {

                /* There is a non-ascii character in the name */

                ACPI_MOVE_32_TO_32(&bad_name,
                                   ACPI_CAST_PTR(u32, internal_name));
                acpi_os_printf("[0x%.8X] (NON-ASCII)", bad_name);
        } else {
                /* Convert path to external format */

                status =
                    acpi_ns_externalize_name(ACPI_UINT32_MAX, internal_name,
                                             NULL, &name);

                /* Print target name */

                if (ACPI_SUCCESS(status)) {
                        acpi_os_printf("[%s]", name);
                } else {
                        acpi_os_printf("[COULD NOT EXTERNALIZE NAME]");
                }

                if (name) {
                        ACPI_FREE(name);
                }
        }

        acpi_os_printf(" Namespace lookup failure, %s",
                       acpi_format_exception(lookup_status));

        ACPI_MSG_SUFFIX;
        ACPI_MSG_REDIRECT_END;
}
#endif

/*******************************************************************************
 *
 * FUNCTION:    acpi_ut_method_error
 *
 * PARAMETERS:  module_name         - Caller's module name (for error output)
 *              line_number         - Caller's line number (for error output)
 *              message             - Error message to use on failure
 *              prefix_node         - Prefix relative to the path
 *              path                - Path to the node (optional)
 *              method_status       - Execution status
 *
 * RETURN:      None
 *
 * DESCRIPTION: Print error message with the full pathname for the method.
 *
 ******************************************************************************/

void
acpi_ut_method_error(const char *module_name,
                     u32 line_number,
                     const char *message,
                     struct acpi_namespace_node *prefix_node,
                     const char *path, acpi_status method_status)
{
        acpi_status status;
        struct acpi_namespace_node *node = prefix_node;

        ACPI_MSG_REDIRECT_BEGIN;
        acpi_os_printf(ACPI_MSG_ERROR);

        if (path) {
                status = acpi_ns_get_node(prefix_node, path,
                                          ACPI_NS_NO_UPSEARCH, &node);
                if (ACPI_FAILURE(status)) {
                        acpi_os_printf("[Could not get node by pathname]");
                }
        }

        acpi_ns_print_node_pathname(node, message);
        acpi_os_printf(" due to previous error (%s)",
                       acpi_format_exception(method_status));

        ACPI_MSG_SUFFIX;
        ACPI_MSG_REDIRECT_END;
}

#endif                          /* ACPI_NO_ERROR_MESSAGES */