1 /*******************************************************************************
2  *
3  * Module Name: uterror - Various internal error/warning output functions
4  *
5  ******************************************************************************/
6 
7 /*
8  * Copyright (C) 2000 - 2022, 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 MERCHANTABILITY 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 #include "acpi.h"
45 #include "accommon.h"
46 #include "acnamesp.h"
47 
48 
49 #define _COMPONENT          ACPI_UTILITIES
50         ACPI_MODULE_NAME    ("uterror")
51 
52 
53 /*
54  * This module contains internal error functions that may
55  * be configured out.
56  */
57 #if !defined (ACPI_NO_ERROR_MESSAGES)
58 
59 /*******************************************************************************
60  *
61  * FUNCTION:    AcpiUtPredefinedWarning
62  *
63  * PARAMETERS:  ModuleName      - Caller's module name (for error output)
64  *              LineNumber      - Caller's line number (for error output)
65  *              Pathname        - Full pathname to the node
66  *              NodeFlags       - From Namespace node for the method/object
67  *              Format          - Printf format string + additional args
68  *
69  * RETURN:      None
70  *
71  * DESCRIPTION: Warnings for the predefined validation module. Messages are
72  *              only emitted the first time a problem with a particular
73  *              method/object is detected. This prevents a flood of error
74  *              messages for methods that are repeatedly evaluated.
75  *
76  ******************************************************************************/
77 
78 void ACPI_INTERNAL_VAR_XFACE
AcpiUtPredefinedWarning(const char * ModuleName,UINT32 LineNumber,char * Pathname,UINT16 NodeFlags,const char * Format,...)79 AcpiUtPredefinedWarning (
80     const char              *ModuleName,
81     UINT32                  LineNumber,
82     char                    *Pathname,
83     UINT16                  NodeFlags,
84     const char              *Format,
85     ...)
86 {
87     va_list                 ArgList;
88 
89 
90     /*
91      * Warning messages for this method/object will be disabled after the
92      * first time a validation fails or an object is successfully repaired.
93      */
94     if (NodeFlags & ANOBJ_EVALUATED)
95     {
96         return;
97     }
98 
99     AcpiOsPrintf (ACPI_MSG_WARNING "%s: ", Pathname);
100 
101     va_start (ArgList, Format);
102     AcpiOsVprintf (Format, ArgList);
103     ACPI_MSG_SUFFIX;
104     va_end (ArgList);
105 }
106 
107 
108 /*******************************************************************************
109  *
110  * FUNCTION:    AcpiUtPredefinedInfo
111  *
112  * PARAMETERS:  ModuleName      - Caller's module name (for error output)
113  *              LineNumber      - Caller's line number (for error output)
114  *              Pathname        - Full pathname to the node
115  *              NodeFlags       - From Namespace node for the method/object
116  *              Format          - Printf format string + additional args
117  *
118  * RETURN:      None
119  *
120  * DESCRIPTION: Info messages for the predefined validation module. Messages
121  *              are only emitted the first time a problem with a particular
122  *              method/object is detected. This prevents a flood of
123  *              messages for methods that are repeatedly evaluated.
124  *
125  ******************************************************************************/
126 
127 void ACPI_INTERNAL_VAR_XFACE
AcpiUtPredefinedInfo(const char * ModuleName,UINT32 LineNumber,char * Pathname,UINT16 NodeFlags,const char * Format,...)128 AcpiUtPredefinedInfo (
129     const char              *ModuleName,
130     UINT32                  LineNumber,
131     char                    *Pathname,
132     UINT16                  NodeFlags,
133     const char              *Format,
134     ...)
135 {
136     va_list                 ArgList;
137 
138 
139     /*
140      * Warning messages for this method/object will be disabled after the
141      * first time a validation fails or an object is successfully repaired.
142      */
143     if (NodeFlags & ANOBJ_EVALUATED)
144     {
145         return;
146     }
147 
148     AcpiOsPrintf (ACPI_MSG_INFO "%s: ", Pathname);
149 
150     va_start (ArgList, Format);
151     AcpiOsVprintf (Format, ArgList);
152     ACPI_MSG_SUFFIX;
153     va_end (ArgList);
154 }
155 
156 
157 /*******************************************************************************
158  *
159  * FUNCTION:    AcpiUtPredefinedBiosError
160  *
161  * PARAMETERS:  ModuleName      - Caller's module name (for error output)
162  *              LineNumber      - Caller's line number (for error output)
163  *              Pathname        - Full pathname to the node
164  *              NodeFlags       - From Namespace node for the method/object
165  *              Format          - Printf format string + additional args
166  *
167  * RETURN:      None
168  *
169  * DESCRIPTION: BIOS error message for predefined names. Messages
170  *              are only emitted the first time a problem with a particular
171  *              method/object is detected. This prevents a flood of
172  *              messages for methods that are repeatedly evaluated.
173  *
174  ******************************************************************************/
175 
176 void ACPI_INTERNAL_VAR_XFACE
AcpiUtPredefinedBiosError(const char * ModuleName,UINT32 LineNumber,char * Pathname,UINT16 NodeFlags,const char * Format,...)177 AcpiUtPredefinedBiosError (
178     const char              *ModuleName,
179     UINT32                  LineNumber,
180     char                    *Pathname,
181     UINT16                  NodeFlags,
182     const char              *Format,
183     ...)
184 {
185     va_list                 ArgList;
186 
187 
188     /*
189      * Warning messages for this method/object will be disabled after the
190      * first time a validation fails or an object is successfully repaired.
191      */
192     if (NodeFlags & ANOBJ_EVALUATED)
193     {
194         return;
195     }
196 
197     AcpiOsPrintf (ACPI_MSG_BIOS_ERROR "%s: ", Pathname);
198 
199     va_start (ArgList, Format);
200     AcpiOsVprintf (Format, ArgList);
201     ACPI_MSG_SUFFIX;
202     va_end (ArgList);
203 }
204 
205 
206 /*******************************************************************************
207  *
208  * FUNCTION:    AcpiUtPrefixedNamespaceError
209  *
210  * PARAMETERS:  ModuleName          - Caller's module name (for error output)
211  *              LineNumber          - Caller's line number (for error output)
212  *              PrefixScope         - Scope/Path that prefixes the internal path
213  *              InternalPath        - Name or path of the namespace node
214  *              LookupStatus        - Exception code from NS lookup
215  *
216  * RETURN:      None
217  *
218  * DESCRIPTION: Print error message with the full pathname constructed this way:
219  *
220  *                  PrefixScopeNodeFullPath.ExternalizedInternalPath
221  *
222  * NOTE:        10/2017: Treat the major NsLookup errors as firmware errors
223  *
224  ******************************************************************************/
225 
226 void
AcpiUtPrefixedNamespaceError(const char * ModuleName,UINT32 LineNumber,ACPI_GENERIC_STATE * PrefixScope,const char * InternalPath,ACPI_STATUS LookupStatus)227 AcpiUtPrefixedNamespaceError (
228     const char              *ModuleName,
229     UINT32                  LineNumber,
230     ACPI_GENERIC_STATE      *PrefixScope,
231     const char              *InternalPath,
232     ACPI_STATUS             LookupStatus)
233 {
234     char                    *FullPath;
235     const char              *Message;
236 
237 
238     /*
239      * Main cases:
240      * 1) Object creation, object must not already exist
241      * 2) Object lookup, object must exist
242      */
243     switch (LookupStatus)
244     {
245     case AE_ALREADY_EXISTS:
246 
247         AcpiOsPrintf (ACPI_MSG_BIOS_ERROR);
248         Message = "Failure creating named object";
249         break;
250 
251     case AE_NOT_FOUND:
252 
253         AcpiOsPrintf (ACPI_MSG_BIOS_ERROR);
254         Message = "Could not resolve symbol";
255         break;
256 
257     default:
258 
259         AcpiOsPrintf (ACPI_MSG_ERROR);
260         Message = "Failure resolving symbol";
261         break;
262     }
263 
264     /* Concatenate the prefix path and the internal path */
265 
266     FullPath = AcpiNsBuildPrefixedPathname (PrefixScope, InternalPath);
267 
268     AcpiOsPrintf ("%s [%s], %s", Message,
269         FullPath ? FullPath : "Could not get pathname",
270         AcpiFormatException (LookupStatus));
271 
272     if (FullPath)
273     {
274         ACPI_FREE (FullPath);
275     }
276 
277     ACPI_MSG_SUFFIX;
278 }
279 
280 
281 #ifdef __OBSOLETE_FUNCTION
282 /*******************************************************************************
283  *
284  * FUNCTION:    AcpiUtNamespaceError
285  *
286  * PARAMETERS:  ModuleName          - Caller's module name (for error output)
287  *              LineNumber          - Caller's line number (for error output)
288  *              InternalName        - Name or path of the namespace node
289  *              LookupStatus        - Exception code from NS lookup
290  *
291  * RETURN:      None
292  *
293  * DESCRIPTION: Print error message with the full pathname for the NS node.
294  *
295  ******************************************************************************/
296 
297 void
AcpiUtNamespaceError(const char * ModuleName,UINT32 LineNumber,const char * InternalName,ACPI_STATUS LookupStatus)298 AcpiUtNamespaceError (
299     const char              *ModuleName,
300     UINT32                  LineNumber,
301     const char              *InternalName,
302     ACPI_STATUS             LookupStatus)
303 {
304     ACPI_STATUS             Status;
305     UINT32                  BadName;
306     char                    *Name = NULL;
307 
308 
309     ACPI_MSG_REDIRECT_BEGIN;
310     AcpiOsPrintf (ACPI_MSG_ERROR);
311 
312     if (LookupStatus == AE_BAD_CHARACTER)
313     {
314         /* There is a non-ascii character in the name */
315 
316         ACPI_MOVE_32_TO_32 (&BadName, ACPI_CAST_PTR (UINT32, InternalName));
317         AcpiOsPrintf ("[0x%.8X] (NON-ASCII)", BadName);
318     }
319     else
320     {
321         /* Convert path to external format */
322 
323         Status = AcpiNsExternalizeName (
324             ACPI_UINT32_MAX, InternalName, NULL, &Name);
325 
326         /* Print target name */
327 
328         if (ACPI_SUCCESS (Status))
329         {
330             AcpiOsPrintf ("[%s]", Name);
331         }
332         else
333         {
334             AcpiOsPrintf ("[COULD NOT EXTERNALIZE NAME]");
335         }
336 
337         if (Name)
338         {
339             ACPI_FREE (Name);
340         }
341     }
342 
343     AcpiOsPrintf (" Namespace lookup failure, %s",
344         AcpiFormatException (LookupStatus));
345 
346     ACPI_MSG_SUFFIX;
347     ACPI_MSG_REDIRECT_END;
348 }
349 #endif
350 
351 /*******************************************************************************
352  *
353  * FUNCTION:    AcpiUtMethodError
354  *
355  * PARAMETERS:  ModuleName          - Caller's module name (for error output)
356  *              LineNumber          - Caller's line number (for error output)
357  *              Message             - Error message to use on failure
358  *              PrefixNode          - Prefix relative to the path
359  *              Path                - Path to the node (optional)
360  *              MethodStatus        - Execution status
361  *
362  * RETURN:      None
363  *
364  * DESCRIPTION: Print error message with the full pathname for the method.
365  *
366  ******************************************************************************/
367 
368 void
AcpiUtMethodError(const char * ModuleName,UINT32 LineNumber,const char * Message,ACPI_NAMESPACE_NODE * PrefixNode,const char * Path,ACPI_STATUS MethodStatus)369 AcpiUtMethodError (
370     const char              *ModuleName,
371     UINT32                  LineNumber,
372     const char              *Message,
373     ACPI_NAMESPACE_NODE     *PrefixNode,
374     const char              *Path,
375     ACPI_STATUS             MethodStatus)
376 {
377     ACPI_STATUS             Status;
378     ACPI_NAMESPACE_NODE     *Node = PrefixNode;
379 
380 
381     ACPI_MSG_REDIRECT_BEGIN;
382     AcpiOsPrintf (ACPI_MSG_ERROR);
383 
384     if (Path)
385     {
386         Status = AcpiNsGetNode (PrefixNode, Path,
387             ACPI_NS_NO_UPSEARCH, &Node);
388         if (ACPI_FAILURE (Status))
389         {
390             AcpiOsPrintf ("[Could not get node by pathname]");
391         }
392     }
393 
394     AcpiNsPrintNodePathname (Node, Message);
395     AcpiOsPrintf (" due to previous error (%s)",
396         AcpiFormatException (MethodStatus));
397 
398     ACPI_MSG_SUFFIX;
399     ACPI_MSG_REDIRECT_END;
400 }
401 
402 #endif /* ACPI_NO_ERROR_MESSAGES */
403