1212700Sjkim/*******************************************************************************
2212700Sjkim *
3212700Sjkim * Module Name: utxferror - Various error/warning output functions
4212700Sjkim *
5212700Sjkim ******************************************************************************/
6212700Sjkim
7217365Sjkim/*
8217365Sjkim * Copyright (C) 2000 - 2011, Intel Corp.
9212700Sjkim * All rights reserved.
10212700Sjkim *
11217365Sjkim * Redistribution and use in source and binary forms, with or without
12217365Sjkim * modification, are permitted provided that the following conditions
13217365Sjkim * are met:
14217365Sjkim * 1. Redistributions of source code must retain the above copyright
15217365Sjkim *    notice, this list of conditions, and the following disclaimer,
16217365Sjkim *    without modification.
17217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18217365Sjkim *    substantially similar to the "NO WARRANTY" disclaimer below
19217365Sjkim *    ("Disclaimer") and any redistribution must be conditioned upon
20217365Sjkim *    including a substantially similar Disclaimer requirement for further
21217365Sjkim *    binary redistribution.
22217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names
23217365Sjkim *    of any contributors may be used to endorse or promote products derived
24217365Sjkim *    from this software without specific prior written permission.
25212700Sjkim *
26217365Sjkim * Alternatively, this software may be distributed under the terms of the
27217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free
28217365Sjkim * Software Foundation.
29212700Sjkim *
30217365Sjkim * NO WARRANTY
31217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41217365Sjkim * POSSIBILITY OF SUCH DAMAGES.
42217365Sjkim */
43212700Sjkim
44212700Sjkim#define __UTXFERROR_C__
45212700Sjkim
46212761Sjkim#include <contrib/dev/acpica/include/acpi.h>
47212761Sjkim#include <contrib/dev/acpica/include/accommon.h>
48212761Sjkim#include <contrib/dev/acpica/include/acnamesp.h>
49212700Sjkim
50212700Sjkim
51212700Sjkim#define _COMPONENT          ACPI_UTILITIES
52212700Sjkim        ACPI_MODULE_NAME    ("utxferror")
53212700Sjkim
54212700Sjkim/*
55212700Sjkim * This module is used for the in-kernel ACPICA as well as the ACPICA
56212700Sjkim * tools/applications.
57212700Sjkim *
58212700Sjkim * For the iASL compiler case, the output is redirected to stderr so that
59212700Sjkim * any of the various ACPI errors and warnings do not appear in the output
60212700Sjkim * files, for either the compiler or disassembler portions of the tool.
61212700Sjkim */
62212700Sjkim#ifdef ACPI_ASL_COMPILER
63212700Sjkim#include <stdio.h>
64212700Sjkim
65212700Sjkimextern FILE                 *AcpiGbl_OutputFile;
66212700Sjkim
67212700Sjkim#define ACPI_MSG_REDIRECT_BEGIN \
68212700Sjkim    FILE                    *OutputFile = AcpiGbl_OutputFile; \
69212700Sjkim    AcpiOsRedirectOutput (stderr);
70212700Sjkim
71212700Sjkim#define ACPI_MSG_REDIRECT_END \
72212700Sjkim    AcpiOsRedirectOutput (OutputFile);
73212700Sjkim
74212700Sjkim#else
75212700Sjkim/*
76212700Sjkim * non-iASL case - no redirection, nothing to do
77212700Sjkim */
78212700Sjkim#define ACPI_MSG_REDIRECT_BEGIN
79212700Sjkim#define ACPI_MSG_REDIRECT_END
80212700Sjkim#endif
81212700Sjkim
82212700Sjkim/*
83212700Sjkim * Common message prefixes
84212700Sjkim */
85212700Sjkim#define ACPI_MSG_ERROR          "ACPI Error: "
86212700Sjkim#define ACPI_MSG_EXCEPTION      "ACPI Exception: "
87212700Sjkim#define ACPI_MSG_WARNING        "ACPI Warning: "
88212700Sjkim#define ACPI_MSG_INFO           "ACPI: "
89212700Sjkim
90212700Sjkim/*
91212700Sjkim * Common message suffix
92212700Sjkim */
93212700Sjkim#define ACPI_MSG_SUFFIX \
94212700Sjkim    AcpiOsPrintf (" (%8.8X/%s-%u)\n", ACPI_CA_VERSION, ModuleName, LineNumber)
95212700Sjkim
96212700Sjkim
97212700Sjkim/*******************************************************************************
98212700Sjkim *
99212700Sjkim * FUNCTION:    AcpiError
100212700Sjkim *
101212700Sjkim * PARAMETERS:  ModuleName          - Caller's module name (for error output)
102212700Sjkim *              LineNumber          - Caller's line number (for error output)
103212700Sjkim *              Format              - Printf format string + additional args
104212700Sjkim *
105212700Sjkim * RETURN:      None
106212700Sjkim *
107212700Sjkim * DESCRIPTION: Print "ACPI Error" message with module/line/version info
108212700Sjkim *
109212700Sjkim ******************************************************************************/
110212700Sjkim
111212700Sjkimvoid ACPI_INTERNAL_VAR_XFACE
112212700SjkimAcpiError (
113212700Sjkim    const char              *ModuleName,
114212700Sjkim    UINT32                  LineNumber,
115212700Sjkim    const char              *Format,
116212700Sjkim    ...)
117212700Sjkim{
118212700Sjkim    va_list                 ArgList;
119212700Sjkim
120212700Sjkim
121212700Sjkim    ACPI_MSG_REDIRECT_BEGIN;
122212700Sjkim    AcpiOsPrintf (ACPI_MSG_ERROR);
123212700Sjkim
124212700Sjkim    va_start (ArgList, Format);
125212700Sjkim    AcpiOsVprintf (Format, ArgList);
126212700Sjkim    ACPI_MSG_SUFFIX;
127212700Sjkim    va_end (ArgList);
128212700Sjkim
129212700Sjkim    ACPI_MSG_REDIRECT_END;
130212700Sjkim}
131212700Sjkim
132212700SjkimACPI_EXPORT_SYMBOL (AcpiError)
133212700Sjkim
134212700Sjkim
135212700Sjkim/*******************************************************************************
136212700Sjkim *
137212700Sjkim * FUNCTION:    AcpiException
138212700Sjkim *
139212700Sjkim * PARAMETERS:  ModuleName          - Caller's module name (for error output)
140212700Sjkim *              LineNumber          - Caller's line number (for error output)
141212700Sjkim *              Status              - Status to be formatted
142212700Sjkim *              Format              - Printf format string + additional args
143212700Sjkim *
144212700Sjkim * RETURN:      None
145212700Sjkim *
146212700Sjkim * DESCRIPTION: Print "ACPI Exception" message with module/line/version info
147212700Sjkim *              and decoded ACPI_STATUS.
148212700Sjkim *
149212700Sjkim ******************************************************************************/
150212700Sjkim
151212700Sjkimvoid ACPI_INTERNAL_VAR_XFACE
152212700SjkimAcpiException (
153212700Sjkim    const char              *ModuleName,
154212700Sjkim    UINT32                  LineNumber,
155212700Sjkim    ACPI_STATUS             Status,
156212700Sjkim    const char              *Format,
157212700Sjkim    ...)
158212700Sjkim{
159212700Sjkim    va_list                 ArgList;
160212700Sjkim
161212700Sjkim
162212700Sjkim    ACPI_MSG_REDIRECT_BEGIN;
163212700Sjkim    AcpiOsPrintf (ACPI_MSG_EXCEPTION "%s, ", AcpiFormatException (Status));
164212700Sjkim
165212700Sjkim    va_start (ArgList, Format);
166212700Sjkim    AcpiOsVprintf (Format, ArgList);
167212700Sjkim    ACPI_MSG_SUFFIX;
168212700Sjkim    va_end (ArgList);
169212700Sjkim
170212700Sjkim    ACPI_MSG_REDIRECT_END;
171212700Sjkim}
172212700Sjkim
173212700SjkimACPI_EXPORT_SYMBOL (AcpiException)
174212700Sjkim
175212700Sjkim
176212700Sjkim/*******************************************************************************
177212700Sjkim *
178212700Sjkim * FUNCTION:    AcpiWarning
179212700Sjkim *
180212700Sjkim * PARAMETERS:  ModuleName          - Caller's module name (for error output)
181212700Sjkim *              LineNumber          - Caller's line number (for error output)
182212700Sjkim *              Format              - Printf format string + additional args
183212700Sjkim *
184212700Sjkim * RETURN:      None
185212700Sjkim *
186212700Sjkim * DESCRIPTION: Print "ACPI Warning" message with module/line/version info
187212700Sjkim *
188212700Sjkim ******************************************************************************/
189212700Sjkim
190212700Sjkimvoid ACPI_INTERNAL_VAR_XFACE
191212700SjkimAcpiWarning (
192212700Sjkim    const char              *ModuleName,
193212700Sjkim    UINT32                  LineNumber,
194212700Sjkim    const char              *Format,
195212700Sjkim    ...)
196212700Sjkim{
197212700Sjkim    va_list                 ArgList;
198212700Sjkim
199212700Sjkim
200212700Sjkim    ACPI_MSG_REDIRECT_BEGIN;
201212700Sjkim    AcpiOsPrintf (ACPI_MSG_WARNING);
202212700Sjkim
203212700Sjkim    va_start (ArgList, Format);
204212700Sjkim    AcpiOsVprintf (Format, ArgList);
205212700Sjkim    ACPI_MSG_SUFFIX;
206212700Sjkim    va_end (ArgList);
207212700Sjkim
208212700Sjkim    ACPI_MSG_REDIRECT_END;
209212700Sjkim}
210212700Sjkim
211212700SjkimACPI_EXPORT_SYMBOL (AcpiWarning)
212212700Sjkim
213212700Sjkim
214212700Sjkim/*******************************************************************************
215212700Sjkim *
216212700Sjkim * FUNCTION:    AcpiInfo
217212700Sjkim *
218212700Sjkim * PARAMETERS:  ModuleName          - Caller's module name (for error output)
219212700Sjkim *              LineNumber          - Caller's line number (for error output)
220212700Sjkim *              Format              - Printf format string + additional args
221212700Sjkim *
222212700Sjkim * RETURN:      None
223212700Sjkim *
224212700Sjkim * DESCRIPTION: Print generic "ACPI:" information message. There is no
225212700Sjkim *              module/line/version info in order to keep the message simple.
226212700Sjkim *
227212700Sjkim * TBD: ModuleName and LineNumber args are not needed, should be removed.
228212700Sjkim *
229212700Sjkim ******************************************************************************/
230212700Sjkim
231212700Sjkimvoid ACPI_INTERNAL_VAR_XFACE
232212700SjkimAcpiInfo (
233212700Sjkim    const char              *ModuleName,
234212700Sjkim    UINT32                  LineNumber,
235212700Sjkim    const char              *Format,
236212700Sjkim    ...)
237212700Sjkim{
238212700Sjkim    va_list                 ArgList;
239212700Sjkim
240212761Sjkim#ifdef _KERNEL
241212761Sjkim    /* Temporarily hide too verbose printfs. */
242212761Sjkim    if (!bootverbose)
243212761Sjkim	return;
244212761Sjkim#endif
245212700Sjkim
246212700Sjkim    ACPI_MSG_REDIRECT_BEGIN;
247212700Sjkim    AcpiOsPrintf (ACPI_MSG_INFO);
248212700Sjkim
249212700Sjkim    va_start (ArgList, Format);
250212700Sjkim    AcpiOsVprintf (Format, ArgList);
251212700Sjkim    AcpiOsPrintf ("\n");
252212700Sjkim    va_end (ArgList);
253212700Sjkim
254212700Sjkim    ACPI_MSG_REDIRECT_END;
255212700Sjkim}
256212700Sjkim
257212700SjkimACPI_EXPORT_SYMBOL (AcpiInfo)
258212700Sjkim
259212700Sjkim
260212700Sjkim/*
261212700Sjkim * The remainder of this module contains internal error functions that may
262212700Sjkim * be configured out.
263212700Sjkim */
264212700Sjkim#if !defined (ACPI_NO_ERROR_MESSAGES) && !defined (ACPI_BIN_APP)
265212700Sjkim
266212700Sjkim/*******************************************************************************
267212700Sjkim *
268212700Sjkim * FUNCTION:    AcpiUtPredefinedWarning
269212700Sjkim *
270212700Sjkim * PARAMETERS:  ModuleName      - Caller's module name (for error output)
271212700Sjkim *              LineNumber      - Caller's line number (for error output)
272212700Sjkim *              Pathname        - Full pathname to the node
273212700Sjkim *              NodeFlags       - From Namespace node for the method/object
274212700Sjkim *              Format          - Printf format string + additional args
275212700Sjkim *
276212700Sjkim * RETURN:      None
277212700Sjkim *
278212700Sjkim * DESCRIPTION: Warnings for the predefined validation module. Messages are
279212700Sjkim *              only emitted the first time a problem with a particular
280212700Sjkim *              method/object is detected. This prevents a flood of error
281212700Sjkim *              messages for methods that are repeatedly evaluated.
282212700Sjkim *
283212700Sjkim ******************************************************************************/
284212700Sjkim
285212700Sjkimvoid ACPI_INTERNAL_VAR_XFACE
286212700SjkimAcpiUtPredefinedWarning (
287212700Sjkim    const char              *ModuleName,
288212700Sjkim    UINT32                  LineNumber,
289212700Sjkim    char                    *Pathname,
290212700Sjkim    UINT8                   NodeFlags,
291212700Sjkim    const char              *Format,
292212700Sjkim    ...)
293212700Sjkim{
294212700Sjkim    va_list                 ArgList;
295212700Sjkim
296212700Sjkim
297212700Sjkim    /*
298212700Sjkim     * Warning messages for this method/object will be disabled after the
299212700Sjkim     * first time a validation fails or an object is successfully repaired.
300212700Sjkim     */
301212700Sjkim    if (NodeFlags & ANOBJ_EVALUATED)
302212700Sjkim    {
303212700Sjkim        return;
304212700Sjkim    }
305212700Sjkim
306212700Sjkim    AcpiOsPrintf (ACPI_MSG_WARNING "For %s: ", Pathname);
307212700Sjkim
308212700Sjkim    va_start (ArgList, Format);
309212700Sjkim    AcpiOsVprintf (Format, ArgList);
310212700Sjkim    ACPI_MSG_SUFFIX;
311212700Sjkim    va_end (ArgList);
312212700Sjkim}
313212700Sjkim
314212700Sjkim
315212700Sjkim/*******************************************************************************
316212700Sjkim *
317212700Sjkim * FUNCTION:    AcpiUtPredefinedInfo
318212700Sjkim *
319212700Sjkim * PARAMETERS:  ModuleName      - Caller's module name (for error output)
320212700Sjkim *              LineNumber      - Caller's line number (for error output)
321212700Sjkim *              Pathname        - Full pathname to the node
322212700Sjkim *              NodeFlags       - From Namespace node for the method/object
323212700Sjkim *              Format          - Printf format string + additional args
324212700Sjkim *
325212700Sjkim * RETURN:      None
326212700Sjkim *
327212700Sjkim * DESCRIPTION: Info messages for the predefined validation module. Messages
328212700Sjkim *              are only emitted the first time a problem with a particular
329212700Sjkim *              method/object is detected. This prevents a flood of
330212700Sjkim *              messages for methods that are repeatedly evaluated.
331212700Sjkim *
332212700Sjkim ******************************************************************************/
333212700Sjkim
334212700Sjkimvoid ACPI_INTERNAL_VAR_XFACE
335212700SjkimAcpiUtPredefinedInfo (
336212700Sjkim    const char              *ModuleName,
337212700Sjkim    UINT32                  LineNumber,
338212700Sjkim    char                    *Pathname,
339212700Sjkim    UINT8                   NodeFlags,
340212700Sjkim    const char              *Format,
341212700Sjkim    ...)
342212700Sjkim{
343212700Sjkim    va_list                 ArgList;
344212700Sjkim
345212700Sjkim
346212700Sjkim    /*
347212700Sjkim     * Warning messages for this method/object will be disabled after the
348212700Sjkim     * first time a validation fails or an object is successfully repaired.
349212700Sjkim     */
350212700Sjkim    if (NodeFlags & ANOBJ_EVALUATED)
351212700Sjkim    {
352212700Sjkim        return;
353212700Sjkim    }
354212700Sjkim
355212700Sjkim    AcpiOsPrintf (ACPI_MSG_INFO "For %s: ", Pathname);
356212700Sjkim
357212700Sjkim    va_start (ArgList, Format);
358212700Sjkim    AcpiOsVprintf (Format, ArgList);
359212700Sjkim    ACPI_MSG_SUFFIX;
360212700Sjkim    va_end (ArgList);
361212700Sjkim}
362212700Sjkim
363212700Sjkim
364212700Sjkim/*******************************************************************************
365212700Sjkim *
366212700Sjkim * FUNCTION:    AcpiUtNamespaceError
367212700Sjkim *
368212700Sjkim * PARAMETERS:  ModuleName          - Caller's module name (for error output)
369212700Sjkim *              LineNumber          - Caller's line number (for error output)
370212700Sjkim *              InternalName        - Name or path of the namespace node
371212700Sjkim *              LookupStatus        - Exception code from NS lookup
372212700Sjkim *
373212700Sjkim * RETURN:      None
374212700Sjkim *
375212700Sjkim * DESCRIPTION: Print error message with the full pathname for the NS node.
376212700Sjkim *
377212700Sjkim ******************************************************************************/
378212700Sjkim
379212700Sjkimvoid
380212700SjkimAcpiUtNamespaceError (
381212700Sjkim    const char              *ModuleName,
382212700Sjkim    UINT32                  LineNumber,
383212700Sjkim    const char              *InternalName,
384212700Sjkim    ACPI_STATUS             LookupStatus)
385212700Sjkim{
386212700Sjkim    ACPI_STATUS             Status;
387212700Sjkim    UINT32                  BadName;
388212700Sjkim    char                    *Name = NULL;
389212700Sjkim
390212700Sjkim
391212700Sjkim    ACPI_MSG_REDIRECT_BEGIN;
392212700Sjkim    AcpiOsPrintf (ACPI_MSG_ERROR);
393212700Sjkim
394212700Sjkim    if (LookupStatus == AE_BAD_CHARACTER)
395212700Sjkim    {
396212700Sjkim        /* There is a non-ascii character in the name */
397212700Sjkim
398212700Sjkim        ACPI_MOVE_32_TO_32 (&BadName, ACPI_CAST_PTR (UINT32, InternalName));
399212700Sjkim        AcpiOsPrintf ("[0x%4.4X] (NON-ASCII)", BadName);
400212700Sjkim    }
401212700Sjkim    else
402212700Sjkim    {
403212700Sjkim        /* Convert path to external format */
404212700Sjkim
405212700Sjkim        Status = AcpiNsExternalizeName (ACPI_UINT32_MAX,
406212700Sjkim                    InternalName, NULL, &Name);
407212700Sjkim
408212700Sjkim        /* Print target name */
409212700Sjkim
410212700Sjkim        if (ACPI_SUCCESS (Status))
411212700Sjkim        {
412212700Sjkim            AcpiOsPrintf ("[%s]", Name);
413212700Sjkim        }
414212700Sjkim        else
415212700Sjkim        {
416212700Sjkim            AcpiOsPrintf ("[COULD NOT EXTERNALIZE NAME]");
417212700Sjkim        }
418212700Sjkim
419212700Sjkim        if (Name)
420212700Sjkim        {
421212700Sjkim            ACPI_FREE (Name);
422212700Sjkim        }
423212700Sjkim    }
424212700Sjkim
425212700Sjkim    AcpiOsPrintf (" Namespace lookup failure, %s",
426212700Sjkim        AcpiFormatException (LookupStatus));
427212700Sjkim
428212700Sjkim    ACPI_MSG_SUFFIX;
429212700Sjkim    ACPI_MSG_REDIRECT_END;
430212700Sjkim}
431212700Sjkim
432212700Sjkim
433212700Sjkim/*******************************************************************************
434212700Sjkim *
435212700Sjkim * FUNCTION:    AcpiUtMethodError
436212700Sjkim *
437212700Sjkim * PARAMETERS:  ModuleName          - Caller's module name (for error output)
438212700Sjkim *              LineNumber          - Caller's line number (for error output)
439212700Sjkim *              Message             - Error message to use on failure
440212700Sjkim *              PrefixNode          - Prefix relative to the path
441212700Sjkim *              Path                - Path to the node (optional)
442212700Sjkim *              MethodStatus        - Execution status
443212700Sjkim *
444212700Sjkim * RETURN:      None
445212700Sjkim *
446212700Sjkim * DESCRIPTION: Print error message with the full pathname for the method.
447212700Sjkim *
448212700Sjkim ******************************************************************************/
449212700Sjkim
450212700Sjkimvoid
451212700SjkimAcpiUtMethodError (
452212700Sjkim    const char              *ModuleName,
453212700Sjkim    UINT32                  LineNumber,
454212700Sjkim    const char              *Message,
455212700Sjkim    ACPI_NAMESPACE_NODE     *PrefixNode,
456212700Sjkim    const char              *Path,
457212700Sjkim    ACPI_STATUS             MethodStatus)
458212700Sjkim{
459212700Sjkim    ACPI_STATUS             Status;
460212700Sjkim    ACPI_NAMESPACE_NODE     *Node = PrefixNode;
461212700Sjkim
462212700Sjkim
463212700Sjkim    ACPI_MSG_REDIRECT_BEGIN;
464212700Sjkim    AcpiOsPrintf (ACPI_MSG_ERROR);
465212700Sjkim
466212700Sjkim    if (Path)
467212700Sjkim    {
468212700Sjkim        Status = AcpiNsGetNode (PrefixNode, Path, ACPI_NS_NO_UPSEARCH,
469212700Sjkim                    &Node);
470212700Sjkim        if (ACPI_FAILURE (Status))
471212700Sjkim        {
472212700Sjkim            AcpiOsPrintf ("[Could not get node by pathname]");
473212700Sjkim        }
474212700Sjkim    }
475212700Sjkim
476212700Sjkim    AcpiNsPrintNodePathname (Node, Message);
477212700Sjkim    AcpiOsPrintf (", %s", AcpiFormatException (MethodStatus));
478212700Sjkim
479212700Sjkim    ACPI_MSG_SUFFIX;
480212700Sjkim    ACPI_MSG_REDIRECT_END;
481212700Sjkim}
482212700Sjkim
483212700Sjkim#endif /* ACPI_NO_ERROR_MESSAGES */
484