cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

uterror.c (9894B)


      1// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
      2/*******************************************************************************
      3 *
      4 * Module Name: uterror - Various internal error/warning output functions
      5 *
      6 ******************************************************************************/
      7
      8#include <acpi/acpi.h>
      9#include "accommon.h"
     10#include "acnamesp.h"
     11
     12#define _COMPONENT          ACPI_UTILITIES
     13ACPI_MODULE_NAME("uterror")
     14
     15/*
     16 * This module contains internal error functions that may
     17 * be configured out.
     18 */
     19#if !defined (ACPI_NO_ERROR_MESSAGES)
     20/*******************************************************************************
     21 *
     22 * FUNCTION:    acpi_ut_predefined_warning
     23 *
     24 * PARAMETERS:  module_name     - Caller's module name (for error output)
     25 *              line_number     - Caller's line number (for error output)
     26 *              pathname        - Full pathname to the node
     27 *              node_flags      - From Namespace node for the method/object
     28 *              format          - Printf format string + additional args
     29 *
     30 * RETURN:      None
     31 *
     32 * DESCRIPTION: Warnings for the predefined validation module. Messages are
     33 *              only emitted the first time a problem with a particular
     34 *              method/object is detected. This prevents a flood of error
     35 *              messages for methods that are repeatedly evaluated.
     36 *
     37 ******************************************************************************/
     38void ACPI_INTERNAL_VAR_XFACE
     39acpi_ut_predefined_warning(const char *module_name,
     40			   u32 line_number,
     41			   char *pathname,
     42			   u16 node_flags, const char *format, ...)
     43{
     44	va_list arg_list;
     45
     46	/*
     47	 * Warning messages for this method/object will be disabled after the
     48	 * first time a validation fails or an object is successfully repaired.
     49	 */
     50	if (node_flags & ANOBJ_EVALUATED) {
     51		return;
     52	}
     53
     54	acpi_os_printf(ACPI_MSG_WARNING "%s: ", pathname);
     55
     56	va_start(arg_list, format);
     57	acpi_os_vprintf(format, arg_list);
     58	ACPI_MSG_SUFFIX;
     59	va_end(arg_list);
     60}
     61
     62/*******************************************************************************
     63 *
     64 * FUNCTION:    acpi_ut_predefined_info
     65 *
     66 * PARAMETERS:  module_name     - Caller's module name (for error output)
     67 *              line_number     - Caller's line number (for error output)
     68 *              pathname        - Full pathname to the node
     69 *              node_flags      - From Namespace node for the method/object
     70 *              format          - Printf format string + additional args
     71 *
     72 * RETURN:      None
     73 *
     74 * DESCRIPTION: Info messages for the predefined validation module. Messages
     75 *              are only emitted the first time a problem with a particular
     76 *              method/object is detected. This prevents a flood of
     77 *              messages for methods that are repeatedly evaluated.
     78 *
     79 ******************************************************************************/
     80
     81void ACPI_INTERNAL_VAR_XFACE
     82acpi_ut_predefined_info(const char *module_name,
     83			u32 line_number,
     84			char *pathname, u16 node_flags, const char *format, ...)
     85{
     86	va_list arg_list;
     87
     88	/*
     89	 * Warning messages for this method/object will be disabled after the
     90	 * first time a validation fails or an object is successfully repaired.
     91	 */
     92	if (node_flags & ANOBJ_EVALUATED) {
     93		return;
     94	}
     95
     96	acpi_os_printf(ACPI_MSG_INFO "%s: ", pathname);
     97
     98	va_start(arg_list, format);
     99	acpi_os_vprintf(format, arg_list);
    100	ACPI_MSG_SUFFIX;
    101	va_end(arg_list);
    102}
    103
    104/*******************************************************************************
    105 *
    106 * FUNCTION:    acpi_ut_predefined_bios_error
    107 *
    108 * PARAMETERS:  module_name     - Caller's module name (for error output)
    109 *              line_number     - Caller's line number (for error output)
    110 *              pathname        - Full pathname to the node
    111 *              node_flags      - From Namespace node for the method/object
    112 *              format          - Printf format string + additional args
    113 *
    114 * RETURN:      None
    115 *
    116 * DESCRIPTION: BIOS error message for predefined names. Messages
    117 *              are only emitted the first time a problem with a particular
    118 *              method/object is detected. This prevents a flood of
    119 *              messages for methods that are repeatedly evaluated.
    120 *
    121 ******************************************************************************/
    122
    123void ACPI_INTERNAL_VAR_XFACE
    124acpi_ut_predefined_bios_error(const char *module_name,
    125			      u32 line_number,
    126			      char *pathname,
    127			      u16 node_flags, const char *format, ...)
    128{
    129	va_list arg_list;
    130
    131	/*
    132	 * Warning messages for this method/object will be disabled after the
    133	 * first time a validation fails or an object is successfully repaired.
    134	 */
    135	if (node_flags & ANOBJ_EVALUATED) {
    136		return;
    137	}
    138
    139	acpi_os_printf(ACPI_MSG_BIOS_ERROR "%s: ", pathname);
    140
    141	va_start(arg_list, format);
    142	acpi_os_vprintf(format, arg_list);
    143	ACPI_MSG_SUFFIX;
    144	va_end(arg_list);
    145}
    146
    147/*******************************************************************************
    148 *
    149 * FUNCTION:    acpi_ut_prefixed_namespace_error
    150 *
    151 * PARAMETERS:  module_name         - Caller's module name (for error output)
    152 *              line_number         - Caller's line number (for error output)
    153 *              prefix_scope        - Scope/Path that prefixes the internal path
    154 *              internal_path       - Name or path of the namespace node
    155 *              lookup_status       - Exception code from NS lookup
    156 *
    157 * RETURN:      None
    158 *
    159 * DESCRIPTION: Print error message with the full pathname constructed this way:
    160 *
    161 *                  prefix_scope_node_full_path.externalized_internal_path
    162 *
    163 * NOTE:        10/2017: Treat the major ns_lookup errors as firmware errors
    164 *
    165 ******************************************************************************/
    166
    167void
    168acpi_ut_prefixed_namespace_error(const char *module_name,
    169				 u32 line_number,
    170				 union acpi_generic_state *prefix_scope,
    171				 const char *internal_path,
    172				 acpi_status lookup_status)
    173{
    174	char *full_path;
    175	const char *message;
    176
    177	/*
    178	 * Main cases:
    179	 * 1) Object creation, object must not already exist
    180	 * 2) Object lookup, object must exist
    181	 */
    182	switch (lookup_status) {
    183	case AE_ALREADY_EXISTS:
    184
    185		acpi_os_printf(ACPI_MSG_BIOS_ERROR);
    186		message = "Failure creating named object";
    187		break;
    188
    189	case AE_NOT_FOUND:
    190
    191		acpi_os_printf(ACPI_MSG_BIOS_ERROR);
    192		message = "Could not resolve symbol";
    193		break;
    194
    195	default:
    196
    197		acpi_os_printf(ACPI_MSG_ERROR);
    198		message = "Failure resolving symbol";
    199		break;
    200	}
    201
    202	/* Concatenate the prefix path and the internal path */
    203
    204	full_path =
    205	    acpi_ns_build_prefixed_pathname(prefix_scope, internal_path);
    206
    207	acpi_os_printf("%s [%s], %s", message,
    208		       full_path ? full_path : "Could not get pathname",
    209		       acpi_format_exception(lookup_status));
    210
    211	if (full_path) {
    212		ACPI_FREE(full_path);
    213	}
    214
    215	ACPI_MSG_SUFFIX;
    216}
    217
    218#ifdef __OBSOLETE_FUNCTION
    219/*******************************************************************************
    220 *
    221 * FUNCTION:    acpi_ut_namespace_error
    222 *
    223 * PARAMETERS:  module_name         - Caller's module name (for error output)
    224 *              line_number         - Caller's line number (for error output)
    225 *              internal_name       - Name or path of the namespace node
    226 *              lookup_status       - Exception code from NS lookup
    227 *
    228 * RETURN:      None
    229 *
    230 * DESCRIPTION: Print error message with the full pathname for the NS node.
    231 *
    232 ******************************************************************************/
    233
    234void
    235acpi_ut_namespace_error(const char *module_name,
    236			u32 line_number,
    237			const char *internal_name, acpi_status lookup_status)
    238{
    239	acpi_status status;
    240	u32 bad_name;
    241	char *name = NULL;
    242
    243	ACPI_MSG_REDIRECT_BEGIN;
    244	acpi_os_printf(ACPI_MSG_ERROR);
    245
    246	if (lookup_status == AE_BAD_CHARACTER) {
    247
    248		/* There is a non-ascii character in the name */
    249
    250		ACPI_MOVE_32_TO_32(&bad_name,
    251				   ACPI_CAST_PTR(u32, internal_name));
    252		acpi_os_printf("[0x%.8X] (NON-ASCII)", bad_name);
    253	} else {
    254		/* Convert path to external format */
    255
    256		status =
    257		    acpi_ns_externalize_name(ACPI_UINT32_MAX, internal_name,
    258					     NULL, &name);
    259
    260		/* Print target name */
    261
    262		if (ACPI_SUCCESS(status)) {
    263			acpi_os_printf("[%s]", name);
    264		} else {
    265			acpi_os_printf("[COULD NOT EXTERNALIZE NAME]");
    266		}
    267
    268		if (name) {
    269			ACPI_FREE(name);
    270		}
    271	}
    272
    273	acpi_os_printf(" Namespace lookup failure, %s",
    274		       acpi_format_exception(lookup_status));
    275
    276	ACPI_MSG_SUFFIX;
    277	ACPI_MSG_REDIRECT_END;
    278}
    279#endif
    280
    281/*******************************************************************************
    282 *
    283 * FUNCTION:    acpi_ut_method_error
    284 *
    285 * PARAMETERS:  module_name         - Caller's module name (for error output)
    286 *              line_number         - Caller's line number (for error output)
    287 *              message             - Error message to use on failure
    288 *              prefix_node         - Prefix relative to the path
    289 *              path                - Path to the node (optional)
    290 *              method_status       - Execution status
    291 *
    292 * RETURN:      None
    293 *
    294 * DESCRIPTION: Print error message with the full pathname for the method.
    295 *
    296 ******************************************************************************/
    297
    298void
    299acpi_ut_method_error(const char *module_name,
    300		     u32 line_number,
    301		     const char *message,
    302		     struct acpi_namespace_node *prefix_node,
    303		     const char *path, acpi_status method_status)
    304{
    305	acpi_status status;
    306	struct acpi_namespace_node *node = prefix_node;
    307
    308	ACPI_MSG_REDIRECT_BEGIN;
    309	acpi_os_printf(ACPI_MSG_ERROR);
    310
    311	if (path) {
    312		status = acpi_ns_get_node(prefix_node, path,
    313					  ACPI_NS_NO_UPSEARCH, &node);
    314		if (ACPI_FAILURE(status)) {
    315			acpi_os_printf("[Could not get node by pathname]");
    316		}
    317	}
    318
    319	acpi_ns_print_node_pathname(node, message);
    320	acpi_os_printf(" due to previous error (%s)",
    321		       acpi_format_exception(method_status));
    322
    323	ACPI_MSG_SUFFIX;
    324	ACPI_MSG_REDIRECT_END;
    325}
    326
    327#endif				/* ACPI_NO_ERROR_MESSAGES */