]> CyberLeo.Net >> Repos - FreeBSD/releng/8.2.git/blob - sys/contrib/dev/acpica/utilities/utxferror.c
Copy stable/8 to releng/8.2 in preparation for FreeBSD-8.2 release.
[FreeBSD/releng/8.2.git] / sys / contrib / dev / acpica / 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 - 2010, 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 <contrib/dev/acpica/include/acpi.h>
119 #include <contrib/dev/acpica/include/accommon.h>
120 #include <contrib/dev/acpica/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 #ifdef _KERNEL
313     /* Temporarily hide too verbose printfs. */
314     if (!bootverbose)
315         return;
316 #endif
317
318     ACPI_MSG_REDIRECT_BEGIN;
319     AcpiOsPrintf (ACPI_MSG_INFO);
320
321     va_start (ArgList, Format);
322     AcpiOsVprintf (Format, ArgList);
323     AcpiOsPrintf ("\n");
324     va_end (ArgList);
325
326     ACPI_MSG_REDIRECT_END;
327 }
328
329 ACPI_EXPORT_SYMBOL (AcpiInfo)
330
331
332 /*
333  * The remainder of this module contains internal error functions that may
334  * be configured out.
335  */
336 #if !defined (ACPI_NO_ERROR_MESSAGES) && !defined (ACPI_BIN_APP)
337
338 /*******************************************************************************
339  *
340  * FUNCTION:    AcpiUtPredefinedWarning
341  *
342  * PARAMETERS:  ModuleName      - Caller's module name (for error output)
343  *              LineNumber      - Caller's line number (for error output)
344  *              Pathname        - Full pathname to the node
345  *              NodeFlags       - From Namespace node for the method/object
346  *              Format          - Printf format string + additional args
347  *
348  * RETURN:      None
349  *
350  * DESCRIPTION: Warnings for the predefined validation module. Messages are
351  *              only emitted the first time a problem with a particular
352  *              method/object is detected. This prevents a flood of error
353  *              messages for methods that are repeatedly evaluated.
354  *
355  ******************************************************************************/
356
357 void ACPI_INTERNAL_VAR_XFACE
358 AcpiUtPredefinedWarning (
359     const char              *ModuleName,
360     UINT32                  LineNumber,
361     char                    *Pathname,
362     UINT8                   NodeFlags,
363     const char              *Format,
364     ...)
365 {
366     va_list                 ArgList;
367
368
369     /*
370      * Warning messages for this method/object will be disabled after the
371      * first time a validation fails or an object is successfully repaired.
372      */
373     if (NodeFlags & ANOBJ_EVALUATED)
374     {
375         return;
376     }
377
378     AcpiOsPrintf (ACPI_MSG_WARNING "For %s: ", Pathname);
379
380     va_start (ArgList, Format);
381     AcpiOsVprintf (Format, ArgList);
382     ACPI_MSG_SUFFIX;
383     va_end (ArgList);
384 }
385
386
387 /*******************************************************************************
388  *
389  * FUNCTION:    AcpiUtPredefinedInfo
390  *
391  * PARAMETERS:  ModuleName      - Caller's module name (for error output)
392  *              LineNumber      - Caller's line number (for error output)
393  *              Pathname        - Full pathname to the node
394  *              NodeFlags       - From Namespace node for the method/object
395  *              Format          - Printf format string + additional args
396  *
397  * RETURN:      None
398  *
399  * DESCRIPTION: Info messages for the predefined validation module. Messages
400  *              are only emitted the first time a problem with a particular
401  *              method/object is detected. This prevents a flood of
402  *              messages for methods that are repeatedly evaluated.
403  *
404  ******************************************************************************/
405
406 void ACPI_INTERNAL_VAR_XFACE
407 AcpiUtPredefinedInfo (
408     const char              *ModuleName,
409     UINT32                  LineNumber,
410     char                    *Pathname,
411     UINT8                   NodeFlags,
412     const char              *Format,
413     ...)
414 {
415     va_list                 ArgList;
416
417
418     /*
419      * Warning messages for this method/object will be disabled after the
420      * first time a validation fails or an object is successfully repaired.
421      */
422     if (NodeFlags & ANOBJ_EVALUATED)
423     {
424         return;
425     }
426
427     AcpiOsPrintf (ACPI_MSG_INFO "For %s: ", Pathname);
428
429     va_start (ArgList, Format);
430     AcpiOsVprintf (Format, ArgList);
431     ACPI_MSG_SUFFIX;
432     va_end (ArgList);
433 }
434
435
436 /*******************************************************************************
437  *
438  * FUNCTION:    AcpiUtNamespaceError
439  *
440  * PARAMETERS:  ModuleName          - Caller's module name (for error output)
441  *              LineNumber          - Caller's line number (for error output)
442  *              InternalName        - Name or path of the namespace node
443  *              LookupStatus        - Exception code from NS lookup
444  *
445  * RETURN:      None
446  *
447  * DESCRIPTION: Print error message with the full pathname for the NS node.
448  *
449  ******************************************************************************/
450
451 void
452 AcpiUtNamespaceError (
453     const char              *ModuleName,
454     UINT32                  LineNumber,
455     const char              *InternalName,
456     ACPI_STATUS             LookupStatus)
457 {
458     ACPI_STATUS             Status;
459     UINT32                  BadName;
460     char                    *Name = NULL;
461
462
463     ACPI_MSG_REDIRECT_BEGIN;
464     AcpiOsPrintf (ACPI_MSG_ERROR);
465
466     if (LookupStatus == AE_BAD_CHARACTER)
467     {
468         /* There is a non-ascii character in the name */
469
470         ACPI_MOVE_32_TO_32 (&BadName, ACPI_CAST_PTR (UINT32, InternalName));
471         AcpiOsPrintf ("[0x%4.4X] (NON-ASCII)", BadName);
472     }
473     else
474     {
475         /* Convert path to external format */
476
477         Status = AcpiNsExternalizeName (ACPI_UINT32_MAX,
478                     InternalName, NULL, &Name);
479
480         /* Print target name */
481
482         if (ACPI_SUCCESS (Status))
483         {
484             AcpiOsPrintf ("[%s]", Name);
485         }
486         else
487         {
488             AcpiOsPrintf ("[COULD NOT EXTERNALIZE NAME]");
489         }
490
491         if (Name)
492         {
493             ACPI_FREE (Name);
494         }
495     }
496
497     AcpiOsPrintf (" Namespace lookup failure, %s",
498         AcpiFormatException (LookupStatus));
499
500     ACPI_MSG_SUFFIX;
501     ACPI_MSG_REDIRECT_END;
502 }
503
504
505 /*******************************************************************************
506  *
507  * FUNCTION:    AcpiUtMethodError
508  *
509  * PARAMETERS:  ModuleName          - Caller's module name (for error output)
510  *              LineNumber          - Caller's line number (for error output)
511  *              Message             - Error message to use on failure
512  *              PrefixNode          - Prefix relative to the path
513  *              Path                - Path to the node (optional)
514  *              MethodStatus        - Execution status
515  *
516  * RETURN:      None
517  *
518  * DESCRIPTION: Print error message with the full pathname for the method.
519  *
520  ******************************************************************************/
521
522 void
523 AcpiUtMethodError (
524     const char              *ModuleName,
525     UINT32                  LineNumber,
526     const char              *Message,
527     ACPI_NAMESPACE_NODE     *PrefixNode,
528     const char              *Path,
529     ACPI_STATUS             MethodStatus)
530 {
531     ACPI_STATUS             Status;
532     ACPI_NAMESPACE_NODE     *Node = PrefixNode;
533
534
535     ACPI_MSG_REDIRECT_BEGIN;
536     AcpiOsPrintf (ACPI_MSG_ERROR);
537
538     if (Path)
539     {
540         Status = AcpiNsGetNode (PrefixNode, Path, ACPI_NS_NO_UPSEARCH,
541                     &Node);
542         if (ACPI_FAILURE (Status))
543         {
544             AcpiOsPrintf ("[Could not get node by pathname]");
545         }
546     }
547
548     AcpiNsPrintNodePathname (Node, Message);
549     AcpiOsPrintf (", %s", AcpiFormatException (MethodStatus));
550
551     ACPI_MSG_SUFFIX;
552     ACPI_MSG_REDIRECT_END;
553 }
554
555 #endif /* ACPI_NO_ERROR_MESSAGES */