1/*******************************************************************************
2 *
3 * Module Name: uterror - Various internal error/warning output functions
4 *
5 ******************************************************************************/
6
7/*
8 * Copyright (C) 2000 - 2013, 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 __UTERROR_C__
45
46#include <contrib/dev/acpica/include/acpi.h>
47#include <contrib/dev/acpica/include/accommon.h>
48#include <contrib/dev/acpica/include/acnamesp.h>
49
50
51#define _COMPONENT          ACPI_UTILITIES
52        ACPI_MODULE_NAME    ("uterror")
53
54
55/*
56 * This module contains internal error functions that may
57 * be configured out.
58 */
59#if !defined (ACPI_NO_ERROR_MESSAGES)
60
61/*******************************************************************************
62 *
63 * FUNCTION:    AcpiUtPredefinedWarning
64 *
65 * PARAMETERS:  ModuleName      - Caller's module name (for error output)
66 *              LineNumber      - Caller's line number (for error output)
67 *              Pathname        - Full pathname to the node
68 *              NodeFlags       - From Namespace node for the method/object
69 *              Format          - Printf format string + additional args
70 *
71 * RETURN:      None
72 *
73 * DESCRIPTION: Warnings for the predefined validation module. Messages are
74 *              only emitted the first time a problem with a particular
75 *              method/object is detected. This prevents a flood of error
76 *              messages for methods that are repeatedly evaluated.
77 *
78 ******************************************************************************/
79
80void ACPI_INTERNAL_VAR_XFACE
81AcpiUtPredefinedWarning (
82    const char              *ModuleName,
83    UINT32                  LineNumber,
84    char                    *Pathname,
85    UINT8                   NodeFlags,
86    const char              *Format,
87    ...)
88{
89    va_list                 ArgList;
90
91
92    /*
93     * Warning messages for this method/object will be disabled after the
94     * first time a validation fails or an object is successfully repaired.
95     */
96    if (NodeFlags & ANOBJ_EVALUATED)
97    {
98        return;
99    }
100
101    AcpiOsPrintf (ACPI_MSG_WARNING "%s: ", Pathname);
102
103    va_start (ArgList, Format);
104    AcpiOsVprintf (Format, ArgList);
105    ACPI_MSG_SUFFIX;
106    va_end (ArgList);
107}
108
109
110/*******************************************************************************
111 *
112 * FUNCTION:    AcpiUtPredefinedInfo
113 *
114 * PARAMETERS:  ModuleName      - Caller's module name (for error output)
115 *              LineNumber      - Caller's line number (for error output)
116 *              Pathname        - Full pathname to the node
117 *              NodeFlags       - From Namespace node for the method/object
118 *              Format          - Printf format string + additional args
119 *
120 * RETURN:      None
121 *
122 * DESCRIPTION: Info messages for the predefined validation module. Messages
123 *              are only emitted the first time a problem with a particular
124 *              method/object is detected. This prevents a flood of
125 *              messages for methods that are repeatedly evaluated.
126 *
127 ******************************************************************************/
128
129void ACPI_INTERNAL_VAR_XFACE
130AcpiUtPredefinedInfo (
131    const char              *ModuleName,
132    UINT32                  LineNumber,
133    char                    *Pathname,
134    UINT8                   NodeFlags,
135    const char              *Format,
136    ...)
137{
138    va_list                 ArgList;
139
140
141    /*
142     * Warning messages for this method/object will be disabled after the
143     * first time a validation fails or an object is successfully repaired.
144     */
145    if (NodeFlags & ANOBJ_EVALUATED)
146    {
147        return;
148    }
149
150    AcpiOsPrintf (ACPI_MSG_INFO "%s: ", Pathname);
151
152    va_start (ArgList, Format);
153    AcpiOsVprintf (Format, ArgList);
154    ACPI_MSG_SUFFIX;
155    va_end (ArgList);
156}
157
158
159/*******************************************************************************
160 *
161 * FUNCTION:    AcpiUtPredefinedBiosError
162 *
163 * PARAMETERS:  ModuleName      - Caller's module name (for error output)
164 *              LineNumber      - Caller's line number (for error output)
165 *              Pathname        - Full pathname to the node
166 *              NodeFlags       - From Namespace node for the method/object
167 *              Format          - Printf format string + additional args
168 *
169 * RETURN:      None
170 *
171 * DESCRIPTION: BIOS error message for predefined names. Messages
172 *              are only emitted the first time a problem with a particular
173 *              method/object is detected. This prevents a flood of
174 *              messages for methods that are repeatedly evaluated.
175 *
176 ******************************************************************************/
177
178void ACPI_INTERNAL_VAR_XFACE
179AcpiUtPredefinedBiosError (
180    const char              *ModuleName,
181    UINT32                  LineNumber,
182    char                    *Pathname,
183    UINT8                   NodeFlags,
184    const char              *Format,
185    ...)
186{
187    va_list                 ArgList;
188
189
190    /*
191     * Warning messages for this method/object will be disabled after the
192     * first time a validation fails or an object is successfully repaired.
193     */
194    if (NodeFlags & ANOBJ_EVALUATED)
195    {
196        return;
197    }
198
199    AcpiOsPrintf (ACPI_MSG_BIOS_ERROR "%s: ", Pathname);
200
201    va_start (ArgList, Format);
202    AcpiOsVprintf (Format, ArgList);
203    ACPI_MSG_SUFFIX;
204    va_end (ArgList);
205}
206
207
208/*******************************************************************************
209 *
210 * FUNCTION:    AcpiUtNamespaceError
211 *
212 * PARAMETERS:  ModuleName          - Caller's module name (for error output)
213 *              LineNumber          - Caller's line number (for error output)
214 *              InternalName        - Name or path of the namespace node
215 *              LookupStatus        - Exception code from NS lookup
216 *
217 * RETURN:      None
218 *
219 * DESCRIPTION: Print error message with the full pathname for the NS node.
220 *
221 ******************************************************************************/
222
223void
224AcpiUtNamespaceError (
225    const char              *ModuleName,
226    UINT32                  LineNumber,
227    const char              *InternalName,
228    ACPI_STATUS             LookupStatus)
229{
230    ACPI_STATUS             Status;
231    UINT32                  BadName;
232    char                    *Name = NULL;
233
234
235    ACPI_MSG_REDIRECT_BEGIN;
236    AcpiOsPrintf (ACPI_MSG_ERROR);
237
238    if (LookupStatus == AE_BAD_CHARACTER)
239    {
240        /* There is a non-ascii character in the name */
241
242        ACPI_MOVE_32_TO_32 (&BadName, ACPI_CAST_PTR (UINT32, InternalName));
243        AcpiOsPrintf ("[0x%.8X] (NON-ASCII)", BadName);
244    }
245    else
246    {
247        /* Convert path to external format */
248
249        Status = AcpiNsExternalizeName (ACPI_UINT32_MAX,
250                    InternalName, NULL, &Name);
251
252        /* Print target name */
253
254        if (ACPI_SUCCESS (Status))
255        {
256            AcpiOsPrintf ("[%s]", Name);
257        }
258        else
259        {
260            AcpiOsPrintf ("[COULD NOT EXTERNALIZE NAME]");
261        }
262
263        if (Name)
264        {
265            ACPI_FREE (Name);
266        }
267    }
268
269    AcpiOsPrintf (" Namespace lookup failure, %s",
270        AcpiFormatException (LookupStatus));
271
272    ACPI_MSG_SUFFIX;
273    ACPI_MSG_REDIRECT_END;
274}
275
276
277/*******************************************************************************
278 *
279 * FUNCTION:    AcpiUtMethodError
280 *
281 * PARAMETERS:  ModuleName          - Caller's module name (for error output)
282 *              LineNumber          - Caller's line number (for error output)
283 *              Message             - Error message to use on failure
284 *              PrefixNode          - Prefix relative to the path
285 *              Path                - Path to the node (optional)
286 *              MethodStatus        - Execution status
287 *
288 * RETURN:      None
289 *
290 * DESCRIPTION: Print error message with the full pathname for the method.
291 *
292 ******************************************************************************/
293
294void
295AcpiUtMethodError (
296    const char              *ModuleName,
297    UINT32                  LineNumber,
298    const char              *Message,
299    ACPI_NAMESPACE_NODE     *PrefixNode,
300    const char              *Path,
301    ACPI_STATUS             MethodStatus)
302{
303    ACPI_STATUS             Status;
304    ACPI_NAMESPACE_NODE     *Node = PrefixNode;
305
306
307    ACPI_MSG_REDIRECT_BEGIN;
308    AcpiOsPrintf (ACPI_MSG_ERROR);
309
310    if (Path)
311    {
312        Status = AcpiNsGetNode (PrefixNode, Path, ACPI_NS_NO_UPSEARCH,
313                    &Node);
314        if (ACPI_FAILURE (Status))
315        {
316            AcpiOsPrintf ("[Could not get node by pathname]");
317        }
318    }
319
320    AcpiNsPrintNodePathname (Node, Message);
321    AcpiOsPrintf (", %s", AcpiFormatException (MethodStatus));
322
323    ACPI_MSG_SUFFIX;
324    ACPI_MSG_REDIRECT_END;
325}
326
327#endif /* ACPI_NO_ERROR_MESSAGES */
328