Branch data Line data Source code
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 : 0 : acpi_ut_predefined_warning(const char *module_name,
40 : : u32 line_number,
41 : : char *pathname,
42 : : u16 node_flags, const char *format, ...)
43 : : {
44 : 0 : 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 [ # # ]: 0 : if (node_flags & ANOBJ_EVALUATED) {
51 : 0 : return;
52 : : }
53 : :
54 : 0 : acpi_os_printf(ACPI_MSG_WARNING "%s: ", pathname);
55 : :
56 : 0 : va_start(arg_list, format);
57 : 0 : acpi_os_vprintf(format, arg_list);
58 : 0 : ACPI_MSG_SUFFIX;
59 : 0 : 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 : 0 : acpi_ut_predefined_info(const char *module_name,
83 : : u32 line_number,
84 : : char *pathname, u16 node_flags, const char *format, ...)
85 : : {
86 : 0 : 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 [ # # ]: 0 : if (node_flags & ANOBJ_EVALUATED) {
93 : 0 : return;
94 : : }
95 : :
96 : 0 : acpi_os_printf(ACPI_MSG_INFO "%s: ", pathname);
97 : :
98 : 0 : va_start(arg_list, format);
99 : 0 : acpi_os_vprintf(format, arg_list);
100 : 0 : ACPI_MSG_SUFFIX;
101 : 0 : 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 : 0 : 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 : 0 : 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 [ # # ]: 0 : if (node_flags & ANOBJ_EVALUATED) {
136 : 0 : return;
137 : : }
138 : :
139 : 0 : acpi_os_printf(ACPI_MSG_BIOS_ERROR "%s: ", pathname);
140 : :
141 : 0 : va_start(arg_list, format);
142 : 0 : acpi_os_vprintf(format, arg_list);
143 : 0 : ACPI_MSG_SUFFIX;
144 : 0 : 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 : 0 : 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 : 0 : char *full_path;
175 : 0 : 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 [ # # # ]: 0 : switch (lookup_status) {
183 : 0 : case AE_ALREADY_EXISTS:
184 : :
185 : 0 : acpi_os_printf(ACPI_MSG_BIOS_ERROR);
186 : 0 : message = "Failure creating named object";
187 : 0 : break;
188 : :
189 : 0 : case AE_NOT_FOUND:
190 : :
191 : 0 : acpi_os_printf(ACPI_MSG_BIOS_ERROR);
192 : 0 : message = "Could not resolve symbol";
193 : 0 : break;
194 : :
195 : 0 : default:
196 : :
197 : 0 : acpi_os_printf(ACPI_MSG_ERROR);
198 : 0 : message = "Failure resolving symbol";
199 : 0 : break;
200 : : }
201 : :
202 : : /* Concatenate the prefix path and the internal path */
203 : :
204 : 0 : full_path =
205 : 0 : acpi_ns_build_prefixed_pathname(prefix_scope, internal_path);
206 : :
207 [ # # ]: 0 : acpi_os_printf("%s [%s], %s", message,
208 : : full_path ? full_path : "Could not get pathname",
209 : : acpi_format_exception(lookup_status));
210 : :
211 [ # # ]: 0 : if (full_path) {
212 : 0 : ACPI_FREE(full_path);
213 : : }
214 : :
215 : 0 : ACPI_MSG_SUFFIX;
216 : 0 : }
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 : 0 : 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 : 0 : acpi_status status;
306 : 0 : struct acpi_namespace_node *node = prefix_node;
307 : :
308 : 0 : ACPI_MSG_REDIRECT_BEGIN;
309 : 0 : acpi_os_printf(ACPI_MSG_ERROR);
310 : :
311 [ # # ]: 0 : if (path) {
312 : 0 : status = acpi_ns_get_node(prefix_node, path,
313 : : ACPI_NS_NO_UPSEARCH, &node);
314 [ # # ]: 0 : if (ACPI_FAILURE(status)) {
315 : 0 : acpi_os_printf("[Could not get node by pathname]");
316 : : }
317 : : }
318 : :
319 : 0 : acpi_ns_print_node_pathname(node, message);
320 : 0 : acpi_os_printf(" due to previous error (%s)",
321 : : acpi_format_exception(method_status));
322 : :
323 : 0 : ACPI_MSG_SUFFIX;
324 : 0 : ACPI_MSG_REDIRECT_END;
325 : 0 : }
326 : :
327 : : #endif /* ACPI_NO_ERROR_MESSAGES */
|