162306a36Sopenharmony_ci// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
262306a36Sopenharmony_ci/*******************************************************************************
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Module Name: uterror - Various internal error/warning output functions
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci ******************************************************************************/
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <acpi/acpi.h>
962306a36Sopenharmony_ci#include "accommon.h"
1062306a36Sopenharmony_ci#include "acnamesp.h"
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#define _COMPONENT          ACPI_UTILITIES
1362306a36Sopenharmony_ciACPI_MODULE_NAME("uterror")
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci/*
1662306a36Sopenharmony_ci * This module contains internal error functions that may
1762306a36Sopenharmony_ci * be configured out.
1862306a36Sopenharmony_ci */
1962306a36Sopenharmony_ci#if !defined (ACPI_NO_ERROR_MESSAGES)
2062306a36Sopenharmony_ci/*******************************************************************************
2162306a36Sopenharmony_ci *
2262306a36Sopenharmony_ci * FUNCTION:    acpi_ut_predefined_warning
2362306a36Sopenharmony_ci *
2462306a36Sopenharmony_ci * PARAMETERS:  module_name     - Caller's module name (for error output)
2562306a36Sopenharmony_ci *              line_number     - Caller's line number (for error output)
2662306a36Sopenharmony_ci *              pathname        - Full pathname to the node
2762306a36Sopenharmony_ci *              node_flags      - From Namespace node for the method/object
2862306a36Sopenharmony_ci *              format          - Printf format string + additional args
2962306a36Sopenharmony_ci *
3062306a36Sopenharmony_ci * RETURN:      None
3162306a36Sopenharmony_ci *
3262306a36Sopenharmony_ci * DESCRIPTION: Warnings for the predefined validation module. Messages are
3362306a36Sopenharmony_ci *              only emitted the first time a problem with a particular
3462306a36Sopenharmony_ci *              method/object is detected. This prevents a flood of error
3562306a36Sopenharmony_ci *              messages for methods that are repeatedly evaluated.
3662306a36Sopenharmony_ci *
3762306a36Sopenharmony_ci ******************************************************************************/
3862306a36Sopenharmony_civoid ACPI_INTERNAL_VAR_XFACE
3962306a36Sopenharmony_ciacpi_ut_predefined_warning(const char *module_name,
4062306a36Sopenharmony_ci			   u32 line_number,
4162306a36Sopenharmony_ci			   char *pathname,
4262306a36Sopenharmony_ci			   u16 node_flags, const char *format, ...)
4362306a36Sopenharmony_ci{
4462306a36Sopenharmony_ci	va_list arg_list;
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci	/*
4762306a36Sopenharmony_ci	 * Warning messages for this method/object will be disabled after the
4862306a36Sopenharmony_ci	 * first time a validation fails or an object is successfully repaired.
4962306a36Sopenharmony_ci	 */
5062306a36Sopenharmony_ci	if (node_flags & ANOBJ_EVALUATED) {
5162306a36Sopenharmony_ci		return;
5262306a36Sopenharmony_ci	}
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci	acpi_os_printf(ACPI_MSG_WARNING "%s: ", pathname);
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci	va_start(arg_list, format);
5762306a36Sopenharmony_ci	acpi_os_vprintf(format, arg_list);
5862306a36Sopenharmony_ci	ACPI_MSG_SUFFIX;
5962306a36Sopenharmony_ci	va_end(arg_list);
6062306a36Sopenharmony_ci}
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci/*******************************************************************************
6362306a36Sopenharmony_ci *
6462306a36Sopenharmony_ci * FUNCTION:    acpi_ut_predefined_info
6562306a36Sopenharmony_ci *
6662306a36Sopenharmony_ci * PARAMETERS:  module_name     - Caller's module name (for error output)
6762306a36Sopenharmony_ci *              line_number     - Caller's line number (for error output)
6862306a36Sopenharmony_ci *              pathname        - Full pathname to the node
6962306a36Sopenharmony_ci *              node_flags      - From Namespace node for the method/object
7062306a36Sopenharmony_ci *              format          - Printf format string + additional args
7162306a36Sopenharmony_ci *
7262306a36Sopenharmony_ci * RETURN:      None
7362306a36Sopenharmony_ci *
7462306a36Sopenharmony_ci * DESCRIPTION: Info messages for the predefined validation module. Messages
7562306a36Sopenharmony_ci *              are only emitted the first time a problem with a particular
7662306a36Sopenharmony_ci *              method/object is detected. This prevents a flood of
7762306a36Sopenharmony_ci *              messages for methods that are repeatedly evaluated.
7862306a36Sopenharmony_ci *
7962306a36Sopenharmony_ci ******************************************************************************/
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_civoid ACPI_INTERNAL_VAR_XFACE
8262306a36Sopenharmony_ciacpi_ut_predefined_info(const char *module_name,
8362306a36Sopenharmony_ci			u32 line_number,
8462306a36Sopenharmony_ci			char *pathname, u16 node_flags, const char *format, ...)
8562306a36Sopenharmony_ci{
8662306a36Sopenharmony_ci	va_list arg_list;
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci	/*
8962306a36Sopenharmony_ci	 * Warning messages for this method/object will be disabled after the
9062306a36Sopenharmony_ci	 * first time a validation fails or an object is successfully repaired.
9162306a36Sopenharmony_ci	 */
9262306a36Sopenharmony_ci	if (node_flags & ANOBJ_EVALUATED) {
9362306a36Sopenharmony_ci		return;
9462306a36Sopenharmony_ci	}
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ci	acpi_os_printf(ACPI_MSG_INFO "%s: ", pathname);
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci	va_start(arg_list, format);
9962306a36Sopenharmony_ci	acpi_os_vprintf(format, arg_list);
10062306a36Sopenharmony_ci	ACPI_MSG_SUFFIX;
10162306a36Sopenharmony_ci	va_end(arg_list);
10262306a36Sopenharmony_ci}
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci/*******************************************************************************
10562306a36Sopenharmony_ci *
10662306a36Sopenharmony_ci * FUNCTION:    acpi_ut_predefined_bios_error
10762306a36Sopenharmony_ci *
10862306a36Sopenharmony_ci * PARAMETERS:  module_name     - Caller's module name (for error output)
10962306a36Sopenharmony_ci *              line_number     - Caller's line number (for error output)
11062306a36Sopenharmony_ci *              pathname        - Full pathname to the node
11162306a36Sopenharmony_ci *              node_flags      - From Namespace node for the method/object
11262306a36Sopenharmony_ci *              format          - Printf format string + additional args
11362306a36Sopenharmony_ci *
11462306a36Sopenharmony_ci * RETURN:      None
11562306a36Sopenharmony_ci *
11662306a36Sopenharmony_ci * DESCRIPTION: BIOS error message for predefined names. Messages
11762306a36Sopenharmony_ci *              are only emitted the first time a problem with a particular
11862306a36Sopenharmony_ci *              method/object is detected. This prevents a flood of
11962306a36Sopenharmony_ci *              messages for methods that are repeatedly evaluated.
12062306a36Sopenharmony_ci *
12162306a36Sopenharmony_ci ******************************************************************************/
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_civoid ACPI_INTERNAL_VAR_XFACE
12462306a36Sopenharmony_ciacpi_ut_predefined_bios_error(const char *module_name,
12562306a36Sopenharmony_ci			      u32 line_number,
12662306a36Sopenharmony_ci			      char *pathname,
12762306a36Sopenharmony_ci			      u16 node_flags, const char *format, ...)
12862306a36Sopenharmony_ci{
12962306a36Sopenharmony_ci	va_list arg_list;
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_ci	/*
13262306a36Sopenharmony_ci	 * Warning messages for this method/object will be disabled after the
13362306a36Sopenharmony_ci	 * first time a validation fails or an object is successfully repaired.
13462306a36Sopenharmony_ci	 */
13562306a36Sopenharmony_ci	if (node_flags & ANOBJ_EVALUATED) {
13662306a36Sopenharmony_ci		return;
13762306a36Sopenharmony_ci	}
13862306a36Sopenharmony_ci
13962306a36Sopenharmony_ci	acpi_os_printf(ACPI_MSG_BIOS_ERROR "%s: ", pathname);
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_ci	va_start(arg_list, format);
14262306a36Sopenharmony_ci	acpi_os_vprintf(format, arg_list);
14362306a36Sopenharmony_ci	ACPI_MSG_SUFFIX;
14462306a36Sopenharmony_ci	va_end(arg_list);
14562306a36Sopenharmony_ci}
14662306a36Sopenharmony_ci
14762306a36Sopenharmony_ci/*******************************************************************************
14862306a36Sopenharmony_ci *
14962306a36Sopenharmony_ci * FUNCTION:    acpi_ut_prefixed_namespace_error
15062306a36Sopenharmony_ci *
15162306a36Sopenharmony_ci * PARAMETERS:  module_name         - Caller's module name (for error output)
15262306a36Sopenharmony_ci *              line_number         - Caller's line number (for error output)
15362306a36Sopenharmony_ci *              prefix_scope        - Scope/Path that prefixes the internal path
15462306a36Sopenharmony_ci *              internal_path       - Name or path of the namespace node
15562306a36Sopenharmony_ci *              lookup_status       - Exception code from NS lookup
15662306a36Sopenharmony_ci *
15762306a36Sopenharmony_ci * RETURN:      None
15862306a36Sopenharmony_ci *
15962306a36Sopenharmony_ci * DESCRIPTION: Print error message with the full pathname constructed this way:
16062306a36Sopenharmony_ci *
16162306a36Sopenharmony_ci *                  prefix_scope_node_full_path.externalized_internal_path
16262306a36Sopenharmony_ci *
16362306a36Sopenharmony_ci * NOTE:        10/2017: Treat the major ns_lookup errors as firmware errors
16462306a36Sopenharmony_ci *
16562306a36Sopenharmony_ci ******************************************************************************/
16662306a36Sopenharmony_ci
16762306a36Sopenharmony_civoid
16862306a36Sopenharmony_ciacpi_ut_prefixed_namespace_error(const char *module_name,
16962306a36Sopenharmony_ci				 u32 line_number,
17062306a36Sopenharmony_ci				 union acpi_generic_state *prefix_scope,
17162306a36Sopenharmony_ci				 const char *internal_path,
17262306a36Sopenharmony_ci				 acpi_status lookup_status)
17362306a36Sopenharmony_ci{
17462306a36Sopenharmony_ci	char *full_path;
17562306a36Sopenharmony_ci	const char *message;
17662306a36Sopenharmony_ci
17762306a36Sopenharmony_ci	/*
17862306a36Sopenharmony_ci	 * Main cases:
17962306a36Sopenharmony_ci	 * 1) Object creation, object must not already exist
18062306a36Sopenharmony_ci	 * 2) Object lookup, object must exist
18162306a36Sopenharmony_ci	 */
18262306a36Sopenharmony_ci	switch (lookup_status) {
18362306a36Sopenharmony_ci	case AE_ALREADY_EXISTS:
18462306a36Sopenharmony_ci
18562306a36Sopenharmony_ci		acpi_os_printf(ACPI_MSG_BIOS_ERROR);
18662306a36Sopenharmony_ci		message = "Failure creating named object";
18762306a36Sopenharmony_ci		break;
18862306a36Sopenharmony_ci
18962306a36Sopenharmony_ci	case AE_NOT_FOUND:
19062306a36Sopenharmony_ci
19162306a36Sopenharmony_ci		acpi_os_printf(ACPI_MSG_BIOS_ERROR);
19262306a36Sopenharmony_ci		message = "Could not resolve symbol";
19362306a36Sopenharmony_ci		break;
19462306a36Sopenharmony_ci
19562306a36Sopenharmony_ci	default:
19662306a36Sopenharmony_ci
19762306a36Sopenharmony_ci		acpi_os_printf(ACPI_MSG_ERROR);
19862306a36Sopenharmony_ci		message = "Failure resolving symbol";
19962306a36Sopenharmony_ci		break;
20062306a36Sopenharmony_ci	}
20162306a36Sopenharmony_ci
20262306a36Sopenharmony_ci	/* Concatenate the prefix path and the internal path */
20362306a36Sopenharmony_ci
20462306a36Sopenharmony_ci	full_path =
20562306a36Sopenharmony_ci	    acpi_ns_build_prefixed_pathname(prefix_scope, internal_path);
20662306a36Sopenharmony_ci
20762306a36Sopenharmony_ci	acpi_os_printf("%s [%s], %s", message,
20862306a36Sopenharmony_ci		       full_path ? full_path : "Could not get pathname",
20962306a36Sopenharmony_ci		       acpi_format_exception(lookup_status));
21062306a36Sopenharmony_ci
21162306a36Sopenharmony_ci	if (full_path) {
21262306a36Sopenharmony_ci		ACPI_FREE(full_path);
21362306a36Sopenharmony_ci	}
21462306a36Sopenharmony_ci
21562306a36Sopenharmony_ci	ACPI_MSG_SUFFIX;
21662306a36Sopenharmony_ci}
21762306a36Sopenharmony_ci
21862306a36Sopenharmony_ci#ifdef __OBSOLETE_FUNCTION
21962306a36Sopenharmony_ci/*******************************************************************************
22062306a36Sopenharmony_ci *
22162306a36Sopenharmony_ci * FUNCTION:    acpi_ut_namespace_error
22262306a36Sopenharmony_ci *
22362306a36Sopenharmony_ci * PARAMETERS:  module_name         - Caller's module name (for error output)
22462306a36Sopenharmony_ci *              line_number         - Caller's line number (for error output)
22562306a36Sopenharmony_ci *              internal_name       - Name or path of the namespace node
22662306a36Sopenharmony_ci *              lookup_status       - Exception code from NS lookup
22762306a36Sopenharmony_ci *
22862306a36Sopenharmony_ci * RETURN:      None
22962306a36Sopenharmony_ci *
23062306a36Sopenharmony_ci * DESCRIPTION: Print error message with the full pathname for the NS node.
23162306a36Sopenharmony_ci *
23262306a36Sopenharmony_ci ******************************************************************************/
23362306a36Sopenharmony_ci
23462306a36Sopenharmony_civoid
23562306a36Sopenharmony_ciacpi_ut_namespace_error(const char *module_name,
23662306a36Sopenharmony_ci			u32 line_number,
23762306a36Sopenharmony_ci			const char *internal_name, acpi_status lookup_status)
23862306a36Sopenharmony_ci{
23962306a36Sopenharmony_ci	acpi_status status;
24062306a36Sopenharmony_ci	u32 bad_name;
24162306a36Sopenharmony_ci	char *name = NULL;
24262306a36Sopenharmony_ci
24362306a36Sopenharmony_ci	ACPI_MSG_REDIRECT_BEGIN;
24462306a36Sopenharmony_ci	acpi_os_printf(ACPI_MSG_ERROR);
24562306a36Sopenharmony_ci
24662306a36Sopenharmony_ci	if (lookup_status == AE_BAD_CHARACTER) {
24762306a36Sopenharmony_ci
24862306a36Sopenharmony_ci		/* There is a non-ascii character in the name */
24962306a36Sopenharmony_ci
25062306a36Sopenharmony_ci		ACPI_MOVE_32_TO_32(&bad_name,
25162306a36Sopenharmony_ci				   ACPI_CAST_PTR(u32, internal_name));
25262306a36Sopenharmony_ci		acpi_os_printf("[0x%.8X] (NON-ASCII)", bad_name);
25362306a36Sopenharmony_ci	} else {
25462306a36Sopenharmony_ci		/* Convert path to external format */
25562306a36Sopenharmony_ci
25662306a36Sopenharmony_ci		status =
25762306a36Sopenharmony_ci		    acpi_ns_externalize_name(ACPI_UINT32_MAX, internal_name,
25862306a36Sopenharmony_ci					     NULL, &name);
25962306a36Sopenharmony_ci
26062306a36Sopenharmony_ci		/* Print target name */
26162306a36Sopenharmony_ci
26262306a36Sopenharmony_ci		if (ACPI_SUCCESS(status)) {
26362306a36Sopenharmony_ci			acpi_os_printf("[%s]", name);
26462306a36Sopenharmony_ci		} else {
26562306a36Sopenharmony_ci			acpi_os_printf("[COULD NOT EXTERNALIZE NAME]");
26662306a36Sopenharmony_ci		}
26762306a36Sopenharmony_ci
26862306a36Sopenharmony_ci		if (name) {
26962306a36Sopenharmony_ci			ACPI_FREE(name);
27062306a36Sopenharmony_ci		}
27162306a36Sopenharmony_ci	}
27262306a36Sopenharmony_ci
27362306a36Sopenharmony_ci	acpi_os_printf(" Namespace lookup failure, %s",
27462306a36Sopenharmony_ci		       acpi_format_exception(lookup_status));
27562306a36Sopenharmony_ci
27662306a36Sopenharmony_ci	ACPI_MSG_SUFFIX;
27762306a36Sopenharmony_ci	ACPI_MSG_REDIRECT_END;
27862306a36Sopenharmony_ci}
27962306a36Sopenharmony_ci#endif
28062306a36Sopenharmony_ci
28162306a36Sopenharmony_ci/*******************************************************************************
28262306a36Sopenharmony_ci *
28362306a36Sopenharmony_ci * FUNCTION:    acpi_ut_method_error
28462306a36Sopenharmony_ci *
28562306a36Sopenharmony_ci * PARAMETERS:  module_name         - Caller's module name (for error output)
28662306a36Sopenharmony_ci *              line_number         - Caller's line number (for error output)
28762306a36Sopenharmony_ci *              message             - Error message to use on failure
28862306a36Sopenharmony_ci *              prefix_node         - Prefix relative to the path
28962306a36Sopenharmony_ci *              path                - Path to the node (optional)
29062306a36Sopenharmony_ci *              method_status       - Execution status
29162306a36Sopenharmony_ci *
29262306a36Sopenharmony_ci * RETURN:      None
29362306a36Sopenharmony_ci *
29462306a36Sopenharmony_ci * DESCRIPTION: Print error message with the full pathname for the method.
29562306a36Sopenharmony_ci *
29662306a36Sopenharmony_ci ******************************************************************************/
29762306a36Sopenharmony_ci
29862306a36Sopenharmony_civoid
29962306a36Sopenharmony_ciacpi_ut_method_error(const char *module_name,
30062306a36Sopenharmony_ci		     u32 line_number,
30162306a36Sopenharmony_ci		     const char *message,
30262306a36Sopenharmony_ci		     struct acpi_namespace_node *prefix_node,
30362306a36Sopenharmony_ci		     const char *path, acpi_status method_status)
30462306a36Sopenharmony_ci{
30562306a36Sopenharmony_ci	acpi_status status;
30662306a36Sopenharmony_ci	struct acpi_namespace_node *node = prefix_node;
30762306a36Sopenharmony_ci
30862306a36Sopenharmony_ci	ACPI_MSG_REDIRECT_BEGIN;
30962306a36Sopenharmony_ci	acpi_os_printf(ACPI_MSG_ERROR);
31062306a36Sopenharmony_ci
31162306a36Sopenharmony_ci	if (path) {
31262306a36Sopenharmony_ci		status = acpi_ns_get_node(prefix_node, path,
31362306a36Sopenharmony_ci					  ACPI_NS_NO_UPSEARCH, &node);
31462306a36Sopenharmony_ci		if (ACPI_FAILURE(status)) {
31562306a36Sopenharmony_ci			acpi_os_printf("[Could not get node by pathname]");
31662306a36Sopenharmony_ci		}
31762306a36Sopenharmony_ci	}
31862306a36Sopenharmony_ci
31962306a36Sopenharmony_ci	acpi_ns_print_node_pathname(node, message);
32062306a36Sopenharmony_ci	acpi_os_printf(" due to previous error (%s)",
32162306a36Sopenharmony_ci		       acpi_format_exception(method_status));
32262306a36Sopenharmony_ci
32362306a36Sopenharmony_ci	ACPI_MSG_SUFFIX;
32462306a36Sopenharmony_ci	ACPI_MSG_REDIRECT_END;
32562306a36Sopenharmony_ci}
32662306a36Sopenharmony_ci
32762306a36Sopenharmony_ci#endif				/* ACPI_NO_ERROR_MESSAGES */
328