Initial import of binutils 2.22 on the new vendor branch
[dragonfly.git] / sys / contrib / dev / acpica-unix / utilities / utxferror.c
1 /*******************************************************************************
2  *
3  * Module Name: utxferror - Various error/warning output functions
4  *
5  ******************************************************************************/
6
7 /******************************************************************************
8  *
9  * 1. Copyright Notice
10  *
11  * Some or all of this work - Copyright (c) 1999 - 2011, Intel Corp.
12  * All rights reserved.
13  *
14  * 2. License
15  *
16  * 2.1. This is your license from Intel Corp. under its intellectual property
17  * rights.  You may have additional license terms from the party that provided
18  * you this software, covering your right to use that party's intellectual
19  * property rights.
20  *
21  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22  * copy of the source code appearing in this file ("Covered Code") an
23  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24  * base code distributed originally by Intel ("Original Intel Code") to copy,
25  * make derivatives, distribute, use and display any portion of the Covered
26  * Code in any form, with the right to sublicense such rights; and
27  *
28  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29  * license (with the right to sublicense), under only those claims of Intel
30  * patents that are infringed by the Original Intel Code, to make, use, sell,
31  * offer to sell, and import the Covered Code and derivative works thereof
32  * solely to the minimum extent necessary to exercise the above copyright
33  * license, and in no event shall the patent license extend to any additions
34  * to or modifications of the Original Intel Code.  No other license or right
35  * is granted directly or by implication, estoppel or otherwise;
36  *
37  * The above copyright and patent license is granted only if the following
38  * conditions are met:
39  *
40  * 3. Conditions
41  *
42  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43  * Redistribution of source code of any substantial portion of the Covered
44  * Code or modification with rights to further distribute source must include
45  * the above Copyright Notice, the above License, this list of Conditions,
46  * and the following Disclaimer and Export Compliance provision.  In addition,
47  * Licensee must cause all Covered Code to which Licensee contributes to
48  * contain a file documenting the changes Licensee made to create that Covered
49  * Code and the date of any change.  Licensee must include in that file the
50  * documentation of any changes made by any predecessor Licensee.  Licensee
51  * must include a prominent statement that the modification is derived,
52  * directly or indirectly, from Original Intel Code.
53  *
54  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55  * Redistribution of source code of any substantial portion of the Covered
56  * Code or modification without rights to further distribute source must
57  * include the following Disclaimer and Export Compliance provision in the
58  * documentation and/or other materials provided with distribution.  In
59  * addition, Licensee may not authorize further sublicense of source of any
60  * portion of the Covered Code, and must include terms to the effect that the
61  * license from Licensee to its licensee is limited to the intellectual
62  * property embodied in the software Licensee provides to its licensee, and
63  * not to intellectual property embodied in modifications its licensee may
64  * make.
65  *
66  * 3.3. Redistribution of Executable. Redistribution in executable form of any
67  * substantial portion of the Covered Code or modification must reproduce the
68  * above Copyright Notice, and the following Disclaimer and Export Compliance
69  * provision in the documentation and/or other materials provided with the
70  * distribution.
71  *
72  * 3.4. Intel retains all right, title, and interest in and to the Original
73  * Intel Code.
74  *
75  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76  * Intel shall be used in advertising or otherwise to promote the sale, use or
77  * other dealings in products derived from or relating to the Covered Code
78  * without prior written authorization from Intel.
79  *
80  * 4. Disclaimer and Export Compliance
81  *
82  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83  * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
85  * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
86  * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
87  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88  * PARTICULAR PURPOSE.
89  *
90  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
96  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97  * LIMITED REMEDY.
98  *
99  * 4.3. Licensee shall not export, either directly or indirectly, any of this
100  * software or system incorporating such software without first obtaining any
101  * required license or other approval from the U. S. Department of Commerce or
102  * any other agency or department of the United States Government.  In the
103  * event Licensee exports any such software from the United States or
104  * re-exports any such software from a foreign destination, Licensee shall
105  * ensure that the distribution and export/re-export of the software is in
106  * compliance with all laws, regulations, orders, or other restrictions of the
107  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108  * any of its subsidiaries will export/re-export any technical data, process,
109  * software, or service, directly or indirectly, to any country for which the
110  * United States government or any agency thereof requires an export license,
111  * other governmental approval, or letter of assurance, without first obtaining
112  * such license, approval or letter.
113  *
114  *****************************************************************************/
115
116 #define __UTXFERROR_C__
117
118 #include "acpi.h"
119 #include "accommon.h"
120 #include "acnamesp.h"
121
122
123 #define _COMPONENT          ACPI_UTILITIES
124         ACPI_MODULE_NAME    ("utxferror")
125
126 /*
127  * This module is used for the in-kernel ACPICA as well as the ACPICA
128  * tools/applications.
129  *
130  * For the iASL compiler case, the output is redirected to stderr so that
131  * any of the various ACPI errors and warnings do not appear in the output
132  * files, for either the compiler or disassembler portions of the tool.
133  */
134 #ifdef ACPI_ASL_COMPILER
135 #include <stdio.h>
136
137 extern FILE                 *AcpiGbl_OutputFile;
138
139 #define ACPI_MSG_REDIRECT_BEGIN \
140     FILE                    *OutputFile = AcpiGbl_OutputFile; \
141     AcpiOsRedirectOutput (stderr);
142
143 #define ACPI_MSG_REDIRECT_END \
144     AcpiOsRedirectOutput (OutputFile);
145
146 #else
147 /*
148  * non-iASL case - no redirection, nothing to do
149  */
150 #define ACPI_MSG_REDIRECT_BEGIN
151 #define ACPI_MSG_REDIRECT_END
152 #endif
153
154 /*
155  * Common message prefixes
156  */
157 #define ACPI_MSG_ERROR          "ACPI Error: "
158 #define ACPI_MSG_EXCEPTION      "ACPI Exception: "
159 #define ACPI_MSG_WARNING        "ACPI Warning: "
160 #define ACPI_MSG_INFO           "ACPI: "
161
162 /*
163  * Common message suffix
164  */
165 #define ACPI_MSG_SUFFIX \
166     AcpiOsPrintf (" (%8.8X/%s-%u)\n", ACPI_CA_VERSION, ModuleName, LineNumber)
167
168
169 /*******************************************************************************
170  *
171  * FUNCTION:    AcpiError
172  *
173  * PARAMETERS:  ModuleName          - Caller's module name (for error output)
174  *              LineNumber          - Caller's line number (for error output)
175  *              Format              - Printf format string + additional args
176  *
177  * RETURN:      None
178  *
179  * DESCRIPTION: Print "ACPI Error" message with module/line/version info
180  *
181  ******************************************************************************/
182
183 void ACPI_INTERNAL_VAR_XFACE
184 AcpiError (
185     const char              *ModuleName,
186     UINT32                  LineNumber,
187     const char              *Format,
188     ...)
189 {
190     va_list                 ArgList;
191
192
193     ACPI_MSG_REDIRECT_BEGIN;
194     AcpiOsPrintf (ACPI_MSG_ERROR);
195
196     va_start (ArgList, Format);
197     AcpiOsVprintf (Format, ArgList);
198     ACPI_MSG_SUFFIX;
199     va_end (ArgList);
200
201     ACPI_MSG_REDIRECT_END;
202 }
203
204 ACPI_EXPORT_SYMBOL (AcpiError)
205
206
207 /*******************************************************************************
208  *
209  * FUNCTION:    AcpiException
210  *
211  * PARAMETERS:  ModuleName          - Caller's module name (for error output)
212  *              LineNumber          - Caller's line number (for error output)
213  *              Status              - Status to be formatted
214  *              Format              - Printf format string + additional args
215  *
216  * RETURN:      None
217  *
218  * DESCRIPTION: Print "ACPI Exception" message with module/line/version info
219  *              and decoded ACPI_STATUS.
220  *
221  ******************************************************************************/
222
223 void ACPI_INTERNAL_VAR_XFACE
224 AcpiException (
225     const char              *ModuleName,
226     UINT32                  LineNumber,
227     ACPI_STATUS             Status,
228     const char              *Format,
229     ...)
230 {
231     va_list                 ArgList;
232
233
234     ACPI_MSG_REDIRECT_BEGIN;
235     AcpiOsPrintf (ACPI_MSG_EXCEPTION "%s, ", AcpiFormatException (Status));
236
237     va_start (ArgList, Format);
238     AcpiOsVprintf (Format, ArgList);
239     ACPI_MSG_SUFFIX;
240     va_end (ArgList);
241
242     ACPI_MSG_REDIRECT_END;
243 }
244
245 ACPI_EXPORT_SYMBOL (AcpiException)
246
247
248 /*******************************************************************************
249  *
250  * FUNCTION:    AcpiWarning
251  *
252  * PARAMETERS:  ModuleName          - Caller's module name (for error output)
253  *              LineNumber          - Caller's line number (for error output)
254  *              Format              - Printf format string + additional args
255  *
256  * RETURN:      None
257  *
258  * DESCRIPTION: Print "ACPI Warning" message with module/line/version info
259  *
260  ******************************************************************************/
261
262 void ACPI_INTERNAL_VAR_XFACE
263 AcpiWarning (
264     const char              *ModuleName,
265     UINT32                  LineNumber,
266     const char              *Format,
267     ...)
268 {
269     va_list                 ArgList;
270
271
272     ACPI_MSG_REDIRECT_BEGIN;
273     AcpiOsPrintf (ACPI_MSG_WARNING);
274
275     va_start (ArgList, Format);
276     AcpiOsVprintf (Format, ArgList);
277     ACPI_MSG_SUFFIX;
278     va_end (ArgList);
279
280     ACPI_MSG_REDIRECT_END;
281 }
282
283 ACPI_EXPORT_SYMBOL (AcpiWarning)
284
285
286 /*******************************************************************************
287  *
288  * FUNCTION:    AcpiInfo
289  *
290  * PARAMETERS:  ModuleName          - Caller's module name (for error output)
291  *              LineNumber          - Caller's line number (for error output)
292  *              Format              - Printf format string + additional args
293  *
294  * RETURN:      None
295  *
296  * DESCRIPTION: Print generic "ACPI:" information message. There is no
297  *              module/line/version info in order to keep the message simple.
298  *
299  * TBD: ModuleName and LineNumber args are not needed, should be removed.
300  *
301  ******************************************************************************/
302
303 void ACPI_INTERNAL_VAR_XFACE
304 AcpiInfo (
305     const char              *ModuleName,
306     UINT32                  LineNumber,
307     const char              *Format,
308     ...)
309 {
310     va_list                 ArgList;
311
312
313     ACPI_MSG_REDIRECT_BEGIN;
314     AcpiOsPrintf (ACPI_MSG_INFO);
315
316     va_start (ArgList, Format);
317     AcpiOsVprintf (Format, ArgList);
318     AcpiOsPrintf ("\n");
319     va_end (ArgList);
320
321     ACPI_MSG_REDIRECT_END;
322 }
323
324 ACPI_EXPORT_SYMBOL (AcpiInfo)
325
326
327 /*
328  * The remainder of this module contains internal error functions that may
329  * be configured out.
330  */
331 #if !defined (ACPI_NO_ERROR_MESSAGES) && !defined (ACPI_BIN_APP)
332
333 /*******************************************************************************
334  *
335  * FUNCTION:    AcpiUtPredefinedWarning
336  *
337  * PARAMETERS:  ModuleName      - Caller's module name (for error output)
338  *              LineNumber      - Caller's line number (for error output)
339  *              Pathname        - Full pathname to the node
340  *              NodeFlags       - From Namespace node for the method/object
341  *              Format          - Printf format string + additional args
342  *
343  * RETURN:      None
344  *
345  * DESCRIPTION: Warnings for the predefined validation module. Messages are
346  *              only emitted the first time a problem with a particular
347  *              method/object is detected. This prevents a flood of error
348  *              messages for methods that are repeatedly evaluated.
349  *
350  ******************************************************************************/
351
352 void ACPI_INTERNAL_VAR_XFACE
353 AcpiUtPredefinedWarning (
354     const char              *ModuleName,
355     UINT32                  LineNumber,
356     char                    *Pathname,
357     UINT8                   NodeFlags,
358     const char              *Format,
359     ...)
360 {
361     va_list                 ArgList;
362
363
364     /*
365      * Warning messages for this method/object will be disabled after the
366      * first time a validation fails or an object is successfully repaired.
367      */
368     if (NodeFlags & ANOBJ_EVALUATED)
369     {
370         return;
371     }
372
373     AcpiOsPrintf (ACPI_MSG_WARNING "For %s: ", Pathname);
374
375     va_start (ArgList, Format);
376     AcpiOsVprintf (Format, ArgList);
377     ACPI_MSG_SUFFIX;
378     va_end (ArgList);
379 }
380
381
382 /*******************************************************************************
383  *
384  * FUNCTION:    AcpiUtPredefinedInfo
385  *
386  * PARAMETERS:  ModuleName      - Caller's module name (for error output)
387  *              LineNumber      - Caller's line number (for error output)
388  *              Pathname        - Full pathname to the node
389  *              NodeFlags       - From Namespace node for the method/object
390  *              Format          - Printf format string + additional args
391  *
392  * RETURN:      None
393  *
394  * DESCRIPTION: Info messages for the predefined validation module. Messages
395  *              are only emitted the first time a problem with a particular
396  *              method/object is detected. This prevents a flood of
397  *              messages for methods that are repeatedly evaluated.
398  *
399  ******************************************************************************/
400
401 void ACPI_INTERNAL_VAR_XFACE
402 AcpiUtPredefinedInfo (
403     const char              *ModuleName,
404     UINT32                  LineNumber,
405     char                    *Pathname,
406     UINT8                   NodeFlags,
407     const char              *Format,
408     ...)
409 {
410     va_list                 ArgList;
411
412
413     /*
414      * Warning messages for this method/object will be disabled after the
415      * first time a validation fails or an object is successfully repaired.
416      */
417     if (NodeFlags & ANOBJ_EVALUATED)
418     {
419         return;
420     }
421
422     AcpiOsPrintf (ACPI_MSG_INFO "For %s: ", Pathname);
423
424     va_start (ArgList, Format);
425     AcpiOsVprintf (Format, ArgList);
426     ACPI_MSG_SUFFIX;
427     va_end (ArgList);
428 }
429
430
431 /*******************************************************************************
432  *
433  * FUNCTION:    AcpiUtNamespaceError
434  *
435  * PARAMETERS:  ModuleName          - Caller's module name (for error output)
436  *              LineNumber          - Caller's line number (for error output)
437  *              InternalName        - Name or path of the namespace node
438  *              LookupStatus        - Exception code from NS lookup
439  *
440  * RETURN:      None
441  *
442  * DESCRIPTION: Print error message with the full pathname for the NS node.
443  *
444  ******************************************************************************/
445
446 void
447 AcpiUtNamespaceError (
448     const char              *ModuleName,
449     UINT32                  LineNumber,
450     const char              *InternalName,
451     ACPI_STATUS             LookupStatus)
452 {
453     ACPI_STATUS             Status;
454     UINT32                  BadName;
455     char                    *Name = NULL;
456
457
458     ACPI_MSG_REDIRECT_BEGIN;
459     AcpiOsPrintf (ACPI_MSG_ERROR);
460
461     if (LookupStatus == AE_BAD_CHARACTER)
462     {
463         /* There is a non-ascii character in the name */
464
465         ACPI_MOVE_32_TO_32 (&BadName, ACPI_CAST_PTR (UINT32, InternalName));
466         AcpiOsPrintf ("[0x%4.4X] (NON-ASCII)", BadName);
467     }
468     else
469     {
470         /* Convert path to external format */
471
472         Status = AcpiNsExternalizeName (ACPI_UINT32_MAX,
473                     InternalName, NULL, &Name);
474
475         /* Print target name */
476
477         if (ACPI_SUCCESS (Status))
478         {
479             AcpiOsPrintf ("[%s]", Name);
480         }
481         else
482         {
483             AcpiOsPrintf ("[COULD NOT EXTERNALIZE NAME]");
484         }
485
486         if (Name)
487         {
488             ACPI_FREE (Name);
489         }
490     }
491
492     AcpiOsPrintf (" Namespace lookup failure, %s",
493         AcpiFormatException (LookupStatus));
494
495     ACPI_MSG_SUFFIX;
496     ACPI_MSG_REDIRECT_END;
497 }
498
499
500 /*******************************************************************************
501  *
502  * FUNCTION:    AcpiUtMethodError
503  *
504  * PARAMETERS:  ModuleName          - Caller's module name (for error output)
505  *              LineNumber          - Caller's line number (for error output)
506  *              Message             - Error message to use on failure
507  *              PrefixNode          - Prefix relative to the path
508  *              Path                - Path to the node (optional)
509  *              MethodStatus        - Execution status
510  *
511  * RETURN:      None
512  *
513  * DESCRIPTION: Print error message with the full pathname for the method.
514  *
515  ******************************************************************************/
516
517 void
518 AcpiUtMethodError (
519     const char              *ModuleName,
520     UINT32                  LineNumber,
521     const char              *Message,
522     ACPI_NAMESPACE_NODE     *PrefixNode,
523     const char              *Path,
524     ACPI_STATUS             MethodStatus)
525 {
526     ACPI_STATUS             Status;
527     ACPI_NAMESPACE_NODE     *Node = PrefixNode;
528
529
530     ACPI_MSG_REDIRECT_BEGIN;
531     AcpiOsPrintf (ACPI_MSG_ERROR);
532
533     if (Path)
534     {
535         Status = AcpiNsGetNode (PrefixNode, Path, ACPI_NS_NO_UPSEARCH,
536                     &Node);
537         if (ACPI_FAILURE (Status))
538         {
539             AcpiOsPrintf ("[Could not get node by pathname]");
540         }
541     }
542
543     AcpiNsPrintNodePathname (Node, Message);
544     AcpiOsPrintf (", %s", AcpiFormatException (MethodStatus));
545
546     ACPI_MSG_SUFFIX;
547     ACPI_MSG_REDIRECT_END;
548 }
549
550 #endif /* ACPI_NO_ERROR_MESSAGES */