forked from mirrors/linux
		
	ACPICA commit 1f1652dad88b9d767767bc1f7eb4f7d99e6b5324 From 255 to 4095 possible IDs. Link: https://github.com/acpica/acpica/commit/1f1652da Reported-by: Hedi Berriche <hedi.berriche @hpe.com> Signed-off-by: Bob Moore <robert.moore@intel.com> Signed-off-by: Erik Schmauss <erik.schmauss@intel.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
		
			
				
	
	
		
			327 lines
		
	
	
	
		
			9.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			327 lines
		
	
	
	
		
			9.7 KiB
		
	
	
	
		
			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 */
 |