xref: /linux/drivers/acpi/acpica/uterror.c (revision 24bce201d79807b668bf9d9e0aca801c5c0d5f78)
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
13 ACPI_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  ******************************************************************************/
38 void ACPI_INTERNAL_VAR_XFACE
39 acpi_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 
81 void ACPI_INTERNAL_VAR_XFACE
82 acpi_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 
123 void ACPI_INTERNAL_VAR_XFACE
124 acpi_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 
167 void
168 acpi_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 
234 void
235 acpi_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 
298 void
299 acpi_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 */
328