xref: /netbsd-src/sys/external/bsd/acpica/dist/utilities/utxferror.c (revision a5847cc334d9a7029f6352b847e9e8d71a0f9e0c)
1 /*******************************************************************************
2  *
3  * Module Name: utxferror - Various error/warning output functions
4  *
5  ******************************************************************************/
6 
7 /*
8  * Copyright (C) 2000 - 2011, Intel Corp.
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions, and the following disclaimer,
16  *    without modification.
17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18  *    substantially similar to the "NO WARRANTY" disclaimer below
19  *    ("Disclaimer") and any redistribution must be conditioned upon
20  *    including a substantially similar Disclaimer requirement for further
21  *    binary redistribution.
22  * 3. Neither the names of the above-listed copyright holders nor the names
23  *    of any contributors may be used to endorse or promote products derived
24  *    from this software without specific prior written permission.
25  *
26  * Alternatively, this software may be distributed under the terms of the
27  * GNU General Public License ("GPL") version 2 as published by the Free
28  * Software Foundation.
29  *
30  * NO WARRANTY
31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41  * POSSIBILITY OF SUCH DAMAGES.
42  */
43 
44 #define __UTXFERROR_C__
45 
46 #include "acpi.h"
47 #include "accommon.h"
48 #include "acnamesp.h"
49 
50 
51 #define _COMPONENT          ACPI_UTILITIES
52         ACPI_MODULE_NAME    ("utxferror")
53 
54 /*
55  * This module is used for the in-kernel ACPICA as well as the ACPICA
56  * tools/applications.
57  *
58  * For the iASL compiler case, the output is redirected to stderr so that
59  * any of the various ACPI errors and warnings do not appear in the output
60  * files, for either the compiler or disassembler portions of the tool.
61  */
62 #ifdef ACPI_ASL_COMPILER
63 #include <stdio.h>
64 
65 extern FILE                 *AcpiGbl_OutputFile;
66 
67 #define ACPI_MSG_REDIRECT_BEGIN \
68     FILE                    *OutputFile = AcpiGbl_OutputFile; \
69     AcpiOsRedirectOutput (stderr);
70 
71 #define ACPI_MSG_REDIRECT_END \
72     AcpiOsRedirectOutput (OutputFile);
73 
74 #else
75 /*
76  * non-iASL case - no redirection, nothing to do
77  */
78 #define ACPI_MSG_REDIRECT_BEGIN
79 #define ACPI_MSG_REDIRECT_END
80 #endif
81 
82 /*
83  * Common message prefixes
84  */
85 #define ACPI_MSG_ERROR          "ACPI Error: "
86 #define ACPI_MSG_EXCEPTION      "ACPI Exception: "
87 #define ACPI_MSG_WARNING        "ACPI Warning: "
88 #define ACPI_MSG_INFO           "ACPI: "
89 
90 /*
91  * Common message suffix
92  */
93 #define ACPI_MSG_SUFFIX \
94     AcpiOsPrintf (" (%8.8X/%s-%u)\n", ACPI_CA_VERSION, ModuleName, LineNumber)
95 
96 
97 /*******************************************************************************
98  *
99  * FUNCTION:    AcpiError
100  *
101  * PARAMETERS:  ModuleName          - Caller's module name (for error output)
102  *              LineNumber          - Caller's line number (for error output)
103  *              Format              - Printf format string + additional args
104  *
105  * RETURN:      None
106  *
107  * DESCRIPTION: Print "ACPI Error" message with module/line/version info
108  *
109  ******************************************************************************/
110 
111 void ACPI_INTERNAL_VAR_XFACE
112 AcpiError (
113     const char              *ModuleName,
114     UINT32                  LineNumber,
115     const char              *Format,
116     ...)
117 {
118     va_list                 ArgList;
119 
120 
121     ACPI_MSG_REDIRECT_BEGIN;
122     AcpiOsPrintf (ACPI_MSG_ERROR);
123 
124     va_start (ArgList, Format);
125     AcpiOsVprintf (Format, ArgList);
126     ACPI_MSG_SUFFIX;
127     va_end (ArgList);
128 
129     ACPI_MSG_REDIRECT_END;
130 }
131 
132 ACPI_EXPORT_SYMBOL (AcpiError)
133 
134 
135 /*******************************************************************************
136  *
137  * FUNCTION:    AcpiException
138  *
139  * PARAMETERS:  ModuleName          - Caller's module name (for error output)
140  *              LineNumber          - Caller's line number (for error output)
141  *              Status              - Status to be formatted
142  *              Format              - Printf format string + additional args
143  *
144  * RETURN:      None
145  *
146  * DESCRIPTION: Print "ACPI Exception" message with module/line/version info
147  *              and decoded ACPI_STATUS.
148  *
149  ******************************************************************************/
150 
151 void ACPI_INTERNAL_VAR_XFACE
152 AcpiException (
153     const char              *ModuleName,
154     UINT32                  LineNumber,
155     ACPI_STATUS             Status,
156     const char              *Format,
157     ...)
158 {
159     va_list                 ArgList;
160 
161 
162     ACPI_MSG_REDIRECT_BEGIN;
163     AcpiOsPrintf (ACPI_MSG_EXCEPTION "%s, ", AcpiFormatException (Status));
164 
165     va_start (ArgList, Format);
166     AcpiOsVprintf (Format, ArgList);
167     ACPI_MSG_SUFFIX;
168     va_end (ArgList);
169 
170     ACPI_MSG_REDIRECT_END;
171 }
172 
173 ACPI_EXPORT_SYMBOL (AcpiException)
174 
175 
176 /*******************************************************************************
177  *
178  * FUNCTION:    AcpiWarning
179  *
180  * PARAMETERS:  ModuleName          - Caller's module name (for error output)
181  *              LineNumber          - Caller's line number (for error output)
182  *              Format              - Printf format string + additional args
183  *
184  * RETURN:      None
185  *
186  * DESCRIPTION: Print "ACPI Warning" message with module/line/version info
187  *
188  ******************************************************************************/
189 
190 void ACPI_INTERNAL_VAR_XFACE
191 AcpiWarning (
192     const char              *ModuleName,
193     UINT32                  LineNumber,
194     const char              *Format,
195     ...)
196 {
197     va_list                 ArgList;
198 
199 
200     ACPI_MSG_REDIRECT_BEGIN;
201     AcpiOsPrintf (ACPI_MSG_WARNING);
202 
203     va_start (ArgList, Format);
204     AcpiOsVprintf (Format, ArgList);
205     ACPI_MSG_SUFFIX;
206     va_end (ArgList);
207 
208     ACPI_MSG_REDIRECT_END;
209 }
210 
211 ACPI_EXPORT_SYMBOL (AcpiWarning)
212 
213 
214 /*******************************************************************************
215  *
216  * FUNCTION:    AcpiInfo
217  *
218  * PARAMETERS:  ModuleName          - Caller's module name (for error output)
219  *              LineNumber          - Caller's line number (for error output)
220  *              Format              - Printf format string + additional args
221  *
222  * RETURN:      None
223  *
224  * DESCRIPTION: Print generic "ACPI:" information message. There is no
225  *              module/line/version info in order to keep the message simple.
226  *
227  * TBD: ModuleName and LineNumber args are not needed, should be removed.
228  *
229  ******************************************************************************/
230 
231 void ACPI_INTERNAL_VAR_XFACE
232 AcpiInfo (
233     const char              *ModuleName,
234     UINT32                  LineNumber,
235     const char              *Format,
236     ...)
237 {
238     va_list                 ArgList;
239 
240 
241     ACPI_MSG_REDIRECT_BEGIN;
242     AcpiOsPrintf (ACPI_MSG_INFO);
243 
244     va_start (ArgList, Format);
245     AcpiOsVprintf (Format, ArgList);
246     AcpiOsPrintf ("\n");
247     va_end (ArgList);
248 
249     ACPI_MSG_REDIRECT_END;
250 }
251 
252 ACPI_EXPORT_SYMBOL (AcpiInfo)
253 
254 
255 /*
256  * The remainder of this module contains internal error functions that may
257  * be configured out.
258  */
259 #if !defined (ACPI_NO_ERROR_MESSAGES) && !defined (ACPI_BIN_APP)
260 
261 /*******************************************************************************
262  *
263  * FUNCTION:    AcpiUtPredefinedWarning
264  *
265  * PARAMETERS:  ModuleName      - Caller's module name (for error output)
266  *              LineNumber      - Caller's line number (for error output)
267  *              Pathname        - Full pathname to the node
268  *              NodeFlags       - From Namespace node for the method/object
269  *              Format          - Printf format string + additional args
270  *
271  * RETURN:      None
272  *
273  * DESCRIPTION: Warnings for the predefined validation module. Messages are
274  *              only emitted the first time a problem with a particular
275  *              method/object is detected. This prevents a flood of error
276  *              messages for methods that are repeatedly evaluated.
277  *
278  ******************************************************************************/
279 
280 void ACPI_INTERNAL_VAR_XFACE
281 AcpiUtPredefinedWarning (
282     const char              *ModuleName,
283     UINT32                  LineNumber,
284     char                    *Pathname,
285     UINT8                   NodeFlags,
286     const char              *Format,
287     ...)
288 {
289     va_list                 ArgList;
290 
291 
292     /*
293      * Warning messages for this method/object will be disabled after the
294      * first time a validation fails or an object is successfully repaired.
295      */
296     if (NodeFlags & ANOBJ_EVALUATED)
297     {
298         return;
299     }
300 
301     AcpiOsPrintf (ACPI_MSG_WARNING "For %s: ", Pathname);
302 
303     va_start (ArgList, Format);
304     AcpiOsVprintf (Format, ArgList);
305     ACPI_MSG_SUFFIX;
306     va_end (ArgList);
307 }
308 
309 
310 /*******************************************************************************
311  *
312  * FUNCTION:    AcpiUtPredefinedInfo
313  *
314  * PARAMETERS:  ModuleName      - Caller's module name (for error output)
315  *              LineNumber      - Caller's line number (for error output)
316  *              Pathname        - Full pathname to the node
317  *              NodeFlags       - From Namespace node for the method/object
318  *              Format          - Printf format string + additional args
319  *
320  * RETURN:      None
321  *
322  * DESCRIPTION: Info messages for the predefined validation module. Messages
323  *              are only emitted the first time a problem with a particular
324  *              method/object is detected. This prevents a flood of
325  *              messages for methods that are repeatedly evaluated.
326  *
327  ******************************************************************************/
328 
329 void ACPI_INTERNAL_VAR_XFACE
330 AcpiUtPredefinedInfo (
331     const char              *ModuleName,
332     UINT32                  LineNumber,
333     char                    *Pathname,
334     UINT8                   NodeFlags,
335     const char              *Format,
336     ...)
337 {
338     va_list                 ArgList;
339 
340 
341     /*
342      * Warning messages for this method/object will be disabled after the
343      * first time a validation fails or an object is successfully repaired.
344      */
345     if (NodeFlags & ANOBJ_EVALUATED)
346     {
347         return;
348     }
349 
350     AcpiOsPrintf (ACPI_MSG_INFO "For %s: ", Pathname);
351 
352     va_start (ArgList, Format);
353     AcpiOsVprintf (Format, ArgList);
354     ACPI_MSG_SUFFIX;
355     va_end (ArgList);
356 }
357 
358 
359 /*******************************************************************************
360  *
361  * FUNCTION:    AcpiUtNamespaceError
362  *
363  * PARAMETERS:  ModuleName          - Caller's module name (for error output)
364  *              LineNumber          - Caller's line number (for error output)
365  *              InternalName        - Name or path of the namespace node
366  *              LookupStatus        - Exception code from NS lookup
367  *
368  * RETURN:      None
369  *
370  * DESCRIPTION: Print error message with the full pathname for the NS node.
371  *
372  ******************************************************************************/
373 
374 void
375 AcpiUtNamespaceError (
376     const char              *ModuleName,
377     UINT32                  LineNumber,
378     const char              *InternalName,
379     ACPI_STATUS             LookupStatus)
380 {
381     ACPI_STATUS             Status;
382     UINT32                  BadName;
383     char                    *Name = NULL;
384 
385 
386     ACPI_MSG_REDIRECT_BEGIN;
387     AcpiOsPrintf (ACPI_MSG_ERROR);
388 
389     if (LookupStatus == AE_BAD_CHARACTER)
390     {
391         /* There is a non-ascii character in the name */
392 
393         ACPI_MOVE_32_TO_32 (&BadName, ACPI_CAST_PTR (UINT32, InternalName));
394         AcpiOsPrintf ("[0x%4.4X] (NON-ASCII)", BadName);
395     }
396     else
397     {
398         /* Convert path to external format */
399 
400         Status = AcpiNsExternalizeName (ACPI_UINT32_MAX,
401                     InternalName, NULL, &Name);
402 
403         /* Print target name */
404 
405         if (ACPI_SUCCESS (Status))
406         {
407             AcpiOsPrintf ("[%s]", Name);
408         }
409         else
410         {
411             AcpiOsPrintf ("[COULD NOT EXTERNALIZE NAME]");
412         }
413 
414         if (Name)
415         {
416             ACPI_FREE (Name);
417         }
418     }
419 
420     AcpiOsPrintf (" Namespace lookup failure, %s",
421         AcpiFormatException (LookupStatus));
422 
423     ACPI_MSG_SUFFIX;
424     ACPI_MSG_REDIRECT_END;
425 }
426 
427 
428 /*******************************************************************************
429  *
430  * FUNCTION:    AcpiUtMethodError
431  *
432  * PARAMETERS:  ModuleName          - Caller's module name (for error output)
433  *              LineNumber          - Caller's line number (for error output)
434  *              Message             - Error message to use on failure
435  *              PrefixNode          - Prefix relative to the path
436  *              Path                - Path to the node (optional)
437  *              MethodStatus        - Execution status
438  *
439  * RETURN:      None
440  *
441  * DESCRIPTION: Print error message with the full pathname for the method.
442  *
443  ******************************************************************************/
444 
445 void
446 AcpiUtMethodError (
447     const char              *ModuleName,
448     UINT32                  LineNumber,
449     const char              *Message,
450     ACPI_NAMESPACE_NODE     *PrefixNode,
451     const char              *Path,
452     ACPI_STATUS             MethodStatus)
453 {
454     ACPI_STATUS             Status;
455     ACPI_NAMESPACE_NODE     *Node = PrefixNode;
456 
457 
458     ACPI_MSG_REDIRECT_BEGIN;
459     AcpiOsPrintf (ACPI_MSG_ERROR);
460 
461     if (Path)
462     {
463         Status = AcpiNsGetNode (PrefixNode, Path, ACPI_NS_NO_UPSEARCH,
464                     &Node);
465         if (ACPI_FAILURE (Status))
466         {
467             AcpiOsPrintf ("[Could not get node by pathname]");
468         }
469     }
470 
471     AcpiNsPrintNodePathname (Node, Message);
472     AcpiOsPrintf (", %s", AcpiFormatException (MethodStatus));
473 
474     ACPI_MSG_SUFFIX;
475     ACPI_MSG_REDIRECT_END;
476 }
477 
478 #endif /* ACPI_NO_ERROR_MESSAGES */
479