xref: /dflybsd-src/sys/contrib/dev/acpica/source/compiler/aslutils.c (revision 0672a19b343a7dc4779f259e126307624463026c)
10d02842fSSascha Wildner /******************************************************************************
20d02842fSSascha Wildner  *
30d02842fSSascha Wildner  * Module Name: aslutils -- compiler utilities
40d02842fSSascha Wildner  *
50d02842fSSascha Wildner  *****************************************************************************/
60d02842fSSascha Wildner 
7b4315fc7SSascha Wildner /******************************************************************************
8b4315fc7SSascha Wildner  *
9b4315fc7SSascha Wildner  * 1. Copyright Notice
10b4315fc7SSascha Wildner  *
11383048acSSascha Wildner  * Some or all of this work - Copyright (c) 1999 - 2021, Intel Corp.
120d02842fSSascha Wildner  * All rights reserved.
130d02842fSSascha Wildner  *
14b4315fc7SSascha Wildner  * 2. License
15b4315fc7SSascha Wildner  *
16b4315fc7SSascha Wildner  * 2.1. This is your license from Intel Corp. under its intellectual property
17b4315fc7SSascha Wildner  * rights. You may have additional license terms from the party that provided
18b4315fc7SSascha Wildner  * you this software, covering your right to use that party's intellectual
19b4315fc7SSascha Wildner  * property rights.
20b4315fc7SSascha Wildner  *
21b4315fc7SSascha Wildner  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22b4315fc7SSascha Wildner  * copy of the source code appearing in this file ("Covered Code") an
23b4315fc7SSascha Wildner  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24b4315fc7SSascha Wildner  * base code distributed originally by Intel ("Original Intel Code") to copy,
25b4315fc7SSascha Wildner  * make derivatives, distribute, use and display any portion of the Covered
26b4315fc7SSascha Wildner  * Code in any form, with the right to sublicense such rights; and
27b4315fc7SSascha Wildner  *
28b4315fc7SSascha Wildner  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29b4315fc7SSascha Wildner  * license (with the right to sublicense), under only those claims of Intel
30b4315fc7SSascha Wildner  * patents that are infringed by the Original Intel Code, to make, use, sell,
31b4315fc7SSascha Wildner  * offer to sell, and import the Covered Code and derivative works thereof
32b4315fc7SSascha Wildner  * solely to the minimum extent necessary to exercise the above copyright
33b4315fc7SSascha Wildner  * license, and in no event shall the patent license extend to any additions
34b4315fc7SSascha Wildner  * to or modifications of the Original Intel Code. No other license or right
35b4315fc7SSascha Wildner  * is granted directly or by implication, estoppel or otherwise;
36b4315fc7SSascha Wildner  *
37b4315fc7SSascha Wildner  * The above copyright and patent license is granted only if the following
38b4315fc7SSascha Wildner  * conditions are met:
39b4315fc7SSascha Wildner  *
40b4315fc7SSascha Wildner  * 3. Conditions
41b4315fc7SSascha Wildner  *
42b4315fc7SSascha Wildner  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43b4315fc7SSascha Wildner  * Redistribution of source code of any substantial portion of the Covered
44b4315fc7SSascha Wildner  * Code or modification with rights to further distribute source must include
45b4315fc7SSascha Wildner  * the above Copyright Notice, the above License, this list of Conditions,
46b4315fc7SSascha Wildner  * and the following Disclaimer and Export Compliance provision. In addition,
47b4315fc7SSascha Wildner  * Licensee must cause all Covered Code to which Licensee contributes to
48b4315fc7SSascha Wildner  * contain a file documenting the changes Licensee made to create that Covered
49b4315fc7SSascha Wildner  * Code and the date of any change. Licensee must include in that file the
50b4315fc7SSascha Wildner  * documentation of any changes made by any predecessor Licensee. Licensee
51b4315fc7SSascha Wildner  * must include a prominent statement that the modification is derived,
52b4315fc7SSascha Wildner  * directly or indirectly, from Original Intel Code.
53b4315fc7SSascha Wildner  *
54b4315fc7SSascha Wildner  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55b4315fc7SSascha Wildner  * Redistribution of source code of any substantial portion of the Covered
56b4315fc7SSascha Wildner  * Code or modification without rights to further distribute source must
57b4315fc7SSascha Wildner  * include the following Disclaimer and Export Compliance provision in the
58b4315fc7SSascha Wildner  * documentation and/or other materials provided with distribution. In
59b4315fc7SSascha Wildner  * addition, Licensee may not authorize further sublicense of source of any
60b4315fc7SSascha Wildner  * portion of the Covered Code, and must include terms to the effect that the
61b4315fc7SSascha Wildner  * license from Licensee to its licensee is limited to the intellectual
62b4315fc7SSascha Wildner  * property embodied in the software Licensee provides to its licensee, and
63b4315fc7SSascha Wildner  * not to intellectual property embodied in modifications its licensee may
64b4315fc7SSascha Wildner  * make.
65b4315fc7SSascha Wildner  *
66b4315fc7SSascha Wildner  * 3.3. Redistribution of Executable. Redistribution in executable form of any
67b4315fc7SSascha Wildner  * substantial portion of the Covered Code or modification must reproduce the
68b4315fc7SSascha Wildner  * above Copyright Notice, and the following Disclaimer and Export Compliance
69b4315fc7SSascha Wildner  * provision in the documentation and/or other materials provided with the
70b4315fc7SSascha Wildner  * distribution.
71b4315fc7SSascha Wildner  *
72b4315fc7SSascha Wildner  * 3.4. Intel retains all right, title, and interest in and to the Original
73b4315fc7SSascha Wildner  * Intel Code.
74b4315fc7SSascha Wildner  *
75b4315fc7SSascha Wildner  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76b4315fc7SSascha Wildner  * Intel shall be used in advertising or otherwise to promote the sale, use or
77b4315fc7SSascha Wildner  * other dealings in products derived from or relating to the Covered Code
78b4315fc7SSascha Wildner  * without prior written authorization from Intel.
79b4315fc7SSascha Wildner  *
80b4315fc7SSascha Wildner  * 4. Disclaimer and Export Compliance
81b4315fc7SSascha Wildner  *
82b4315fc7SSascha Wildner  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83b4315fc7SSascha Wildner  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84b4315fc7SSascha Wildner  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85b4315fc7SSascha Wildner  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86b4315fc7SSascha Wildner  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87b4315fc7SSascha Wildner  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88b4315fc7SSascha Wildner  * PARTICULAR PURPOSE.
89b4315fc7SSascha Wildner  *
90b4315fc7SSascha Wildner  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91b4315fc7SSascha Wildner  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92b4315fc7SSascha Wildner  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93b4315fc7SSascha Wildner  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94b4315fc7SSascha Wildner  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95b4315fc7SSascha Wildner  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96b4315fc7SSascha Wildner  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97b4315fc7SSascha Wildner  * LIMITED REMEDY.
98b4315fc7SSascha Wildner  *
99b4315fc7SSascha Wildner  * 4.3. Licensee shall not export, either directly or indirectly, any of this
100b4315fc7SSascha Wildner  * software or system incorporating such software without first obtaining any
101b4315fc7SSascha Wildner  * required license or other approval from the U. S. Department of Commerce or
102b4315fc7SSascha Wildner  * any other agency or department of the United States Government. In the
103b4315fc7SSascha Wildner  * event Licensee exports any such software from the United States or
104b4315fc7SSascha Wildner  * re-exports any such software from a foreign destination, Licensee shall
105b4315fc7SSascha Wildner  * ensure that the distribution and export/re-export of the software is in
106b4315fc7SSascha Wildner  * compliance with all laws, regulations, orders, or other restrictions of the
107b4315fc7SSascha Wildner  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108b4315fc7SSascha Wildner  * any of its subsidiaries will export/re-export any technical data, process,
109b4315fc7SSascha Wildner  * software, or service, directly or indirectly, to any country for which the
110b4315fc7SSascha Wildner  * United States government or any agency thereof requires an export license,
111b4315fc7SSascha Wildner  * other governmental approval, or letter of assurance, without first obtaining
112b4315fc7SSascha Wildner  * such license, approval or letter.
113b4315fc7SSascha Wildner  *
114b4315fc7SSascha Wildner  *****************************************************************************
115b4315fc7SSascha Wildner  *
116b4315fc7SSascha Wildner  * Alternatively, you may choose to be licensed under the terms of the
117b4315fc7SSascha Wildner  * following license:
118b4315fc7SSascha Wildner  *
1190d02842fSSascha Wildner  * Redistribution and use in source and binary forms, with or without
1200d02842fSSascha Wildner  * modification, are permitted provided that the following conditions
1210d02842fSSascha Wildner  * are met:
1220d02842fSSascha Wildner  * 1. Redistributions of source code must retain the above copyright
1230d02842fSSascha Wildner  *    notice, this list of conditions, and the following disclaimer,
1240d02842fSSascha Wildner  *    without modification.
1250d02842fSSascha Wildner  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
1260d02842fSSascha Wildner  *    substantially similar to the "NO WARRANTY" disclaimer below
1270d02842fSSascha Wildner  *    ("Disclaimer") and any redistribution must be conditioned upon
1280d02842fSSascha Wildner  *    including a substantially similar Disclaimer requirement for further
1290d02842fSSascha Wildner  *    binary redistribution.
1300d02842fSSascha Wildner  * 3. Neither the names of the above-listed copyright holders nor the names
1310d02842fSSascha Wildner  *    of any contributors may be used to endorse or promote products derived
1320d02842fSSascha Wildner  *    from this software without specific prior written permission.
1330d02842fSSascha Wildner  *
134b4315fc7SSascha Wildner  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
135b4315fc7SSascha Wildner  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
136b4315fc7SSascha Wildner  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
137b4315fc7SSascha Wildner  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
138b4315fc7SSascha Wildner  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
139b4315fc7SSascha Wildner  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
140b4315fc7SSascha Wildner  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
141b4315fc7SSascha Wildner  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
142b4315fc7SSascha Wildner  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
143b4315fc7SSascha Wildner  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
144b4315fc7SSascha Wildner  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
145b4315fc7SSascha Wildner  *
146b4315fc7SSascha Wildner  * Alternatively, you may choose to be licensed under the terms of the
1470d02842fSSascha Wildner  * GNU General Public License ("GPL") version 2 as published by the Free
1480d02842fSSascha Wildner  * Software Foundation.
1490d02842fSSascha Wildner  *
150b4315fc7SSascha Wildner  *****************************************************************************/
1510d02842fSSascha Wildner 
1520d02842fSSascha Wildner #include "aslcompiler.h"
1530d02842fSSascha Wildner #include "aslcompiler.y.h"
1540d02842fSSascha Wildner #include "acdisasm.h"
1550d02842fSSascha Wildner #include "acnamesp.h"
1560d02842fSSascha Wildner #include "amlcode.h"
157f5f76cf2SSascha Wildner #include "acapps.h"
158f5f76cf2SSascha Wildner #include <sys/stat.h>
159f5f76cf2SSascha Wildner 
1600d02842fSSascha Wildner 
1610d02842fSSascha Wildner #define _COMPONENT          ACPI_COMPILER
1620d02842fSSascha Wildner         ACPI_MODULE_NAME    ("aslutils")
1630d02842fSSascha Wildner 
1640d02842fSSascha Wildner 
1650d02842fSSascha Wildner /* Local prototypes */
1660d02842fSSascha Wildner 
1670d02842fSSascha Wildner static void
1680d02842fSSascha Wildner UtPadNameWithUnderscores (
1690d02842fSSascha Wildner     char                    *NameSeg,
1700d02842fSSascha Wildner     char                    *PaddedNameSeg);
1710d02842fSSascha Wildner 
1720d02842fSSascha Wildner static void
1730d02842fSSascha Wildner UtAttachNameseg (
1740d02842fSSascha Wildner     ACPI_PARSE_OBJECT       *Op,
1750d02842fSSascha Wildner     char                    *Name);
1760d02842fSSascha Wildner 
177a4b9c0c9SSascha Wildner static void
178a4b9c0c9SSascha Wildner UtDisplayErrorSummary (
179a4b9c0c9SSascha Wildner     UINT32                  FileId);
180a4b9c0c9SSascha Wildner 
1810d02842fSSascha Wildner 
1827c9678bcSSascha Wildner /*******************************************************************************
1837c9678bcSSascha Wildner  *
1847c9678bcSSascha Wildner  * FUNCTION:    UtIsBigEndianMachine
1857c9678bcSSascha Wildner  *
1867c9678bcSSascha Wildner  * PARAMETERS:  None
1877c9678bcSSascha Wildner  *
1887c9678bcSSascha Wildner  * RETURN:      TRUE if machine is big endian
1897c9678bcSSascha Wildner  *              FALSE if machine is little endian
1907c9678bcSSascha Wildner  *
1917c9678bcSSascha Wildner  * DESCRIPTION: Detect whether machine is little endian or big endian.
1927c9678bcSSascha Wildner  *
1937c9678bcSSascha Wildner  ******************************************************************************/
1947c9678bcSSascha Wildner 
1957c9678bcSSascha Wildner UINT8
UtIsBigEndianMachine(void)1967c9678bcSSascha Wildner UtIsBigEndianMachine (
1977c9678bcSSascha Wildner     void)
1987c9678bcSSascha Wildner {
1997c9678bcSSascha Wildner     union {
2007c9678bcSSascha Wildner         UINT32              Integer;
2017c9678bcSSascha Wildner         UINT8               Bytes[4];
2027c9678bcSSascha Wildner     } Overlay =                 {0xFF000000};
2037c9678bcSSascha Wildner 
2047c9678bcSSascha Wildner 
2057c9678bcSSascha Wildner     return (Overlay.Bytes[0]); /* Returns 0xFF (TRUE) for big endian */
2067c9678bcSSascha Wildner }
2077c9678bcSSascha Wildner 
2087c9678bcSSascha Wildner 
2094898bea4SSascha Wildner /*******************************************************************************
2104898bea4SSascha Wildner  *
2114898bea4SSascha Wildner  * FUNCTION:    UtIsIdInteger
2124898bea4SSascha Wildner  *
2134898bea4SSascha Wildner  * PARAMETERS:  Pointer to an ACPI ID (HID, CID) string
2144898bea4SSascha Wildner  *
2154898bea4SSascha Wildner  * RETURN:      TRUE if string is an integer
2164898bea4SSascha Wildner  *              FALSE if string is not an integer
2174898bea4SSascha Wildner  *
2184898bea4SSascha Wildner  * DESCRIPTION: Determine whether the input ACPI ID string can be converted to
2194898bea4SSascha Wildner  *              an integer value.
2204898bea4SSascha Wildner  *
2214898bea4SSascha Wildner  ******************************************************************************/
2224898bea4SSascha Wildner 
2234898bea4SSascha Wildner BOOLEAN
UtIsIdInteger(UINT8 * Target)2244898bea4SSascha Wildner UtIsIdInteger (
2254898bea4SSascha Wildner     UINT8                   *Target)
2264898bea4SSascha Wildner {
2274898bea4SSascha Wildner     UINT32                  i;
2284898bea4SSascha Wildner 
2294898bea4SSascha Wildner 
2304898bea4SSascha Wildner     /* The first three characters of the string must be alphabetic */
2314898bea4SSascha Wildner 
2324898bea4SSascha Wildner     for (i = 0; i < 3; i++)
2334898bea4SSascha Wildner     {
2344898bea4SSascha Wildner         if (!isalpha ((int) Target[i]))
2354898bea4SSascha Wildner         {
2364898bea4SSascha Wildner             break;
2374898bea4SSascha Wildner         }
2384898bea4SSascha Wildner     }
2394898bea4SSascha Wildner 
2404898bea4SSascha Wildner     if (i < 3)
2414898bea4SSascha Wildner     {
2424898bea4SSascha Wildner         return (TRUE);
2434898bea4SSascha Wildner     }
2444898bea4SSascha Wildner 
2454898bea4SSascha Wildner     return (FALSE);
2464898bea4SSascha Wildner }
2474898bea4SSascha Wildner 
2484898bea4SSascha Wildner 
249f5f76cf2SSascha Wildner /******************************************************************************
250f5f76cf2SSascha Wildner  *
251f5f76cf2SSascha Wildner  * FUNCTION:    UtQueryForOverwrite
252f5f76cf2SSascha Wildner  *
253f5f76cf2SSascha Wildner  * PARAMETERS:  Pathname            - Output filename
254f5f76cf2SSascha Wildner  *
255f5f76cf2SSascha Wildner  * RETURN:      TRUE if file does not exist or overwrite is authorized
256f5f76cf2SSascha Wildner  *
257f5f76cf2SSascha Wildner  * DESCRIPTION: Query for file overwrite if it already exists.
258f5f76cf2SSascha Wildner  *
259f5f76cf2SSascha Wildner  ******************************************************************************/
260f5f76cf2SSascha Wildner 
261f5f76cf2SSascha Wildner BOOLEAN
UtQueryForOverwrite(char * Pathname)262f5f76cf2SSascha Wildner UtQueryForOverwrite (
263f5f76cf2SSascha Wildner     char                    *Pathname)
264f5f76cf2SSascha Wildner {
265f5f76cf2SSascha Wildner     struct stat             StatInfo;
266e5412f1eSSascha Wildner     int                     InChar;
267f5f76cf2SSascha Wildner 
268f5f76cf2SSascha Wildner 
269f5f76cf2SSascha Wildner     if (!stat (Pathname, &StatInfo))
270f5f76cf2SSascha Wildner     {
271f5f76cf2SSascha Wildner         fprintf (stderr, "Target file \"%s\" already exists, overwrite? [y|n] ",
272f5f76cf2SSascha Wildner             Pathname);
273f5f76cf2SSascha Wildner 
274e5412f1eSSascha Wildner         InChar = fgetc (stdin);
275e5412f1eSSascha Wildner         if (InChar == '\n')
276e5412f1eSSascha Wildner         {
277e5412f1eSSascha Wildner             InChar = fgetc (stdin);
278e5412f1eSSascha Wildner         }
279e5412f1eSSascha Wildner 
280e5412f1eSSascha Wildner         if ((InChar != 'y') && (InChar != 'Y'))
281f5f76cf2SSascha Wildner         {
282f5f76cf2SSascha Wildner             return (FALSE);
283f5f76cf2SSascha Wildner         }
284f5f76cf2SSascha Wildner     }
285f5f76cf2SSascha Wildner 
286f5f76cf2SSascha Wildner     return (TRUE);
287f5f76cf2SSascha Wildner }
288f5f76cf2SSascha Wildner 
289f5f76cf2SSascha Wildner 
2900d02842fSSascha Wildner /*******************************************************************************
2910d02842fSSascha Wildner  *
2927bcb6cafSSascha Wildner  * FUNCTION:    UtNodeIsDescendantOf
2937bcb6cafSSascha Wildner  *
2947bcb6cafSSascha Wildner  * PARAMETERS:  Node1                   - Child node
2957bcb6cafSSascha Wildner  *              Node2                   - Possible parent node
2967bcb6cafSSascha Wildner  *
2977bcb6cafSSascha Wildner  * RETURN:      Boolean
2987bcb6cafSSascha Wildner  *
2997bcb6cafSSascha Wildner  * DESCRIPTION: Returns TRUE if Node1 is a descendant of Node2. Otherwise,
3007bcb6cafSSascha Wildner  *              return FALSE. Note, we assume a NULL Node2 element to be the
3017bcb6cafSSascha Wildner  *              topmost (root) scope. All nodes are descendants of the root.
3027bcb6cafSSascha Wildner  *              Note: Nodes at the same level (siblings) are not considered
3037bcb6cafSSascha Wildner  *              descendants.
3047bcb6cafSSascha Wildner  *
3057bcb6cafSSascha Wildner  ******************************************************************************/
3067bcb6cafSSascha Wildner 
3077bcb6cafSSascha Wildner BOOLEAN
UtNodeIsDescendantOf(ACPI_NAMESPACE_NODE * Node1,ACPI_NAMESPACE_NODE * Node2)3087bcb6cafSSascha Wildner UtNodeIsDescendantOf (
3097bcb6cafSSascha Wildner     ACPI_NAMESPACE_NODE     *Node1,
3107bcb6cafSSascha Wildner     ACPI_NAMESPACE_NODE     *Node2)
3117bcb6cafSSascha Wildner {
3127bcb6cafSSascha Wildner 
3137bcb6cafSSascha Wildner     if (Node1 == Node2)
3147bcb6cafSSascha Wildner     {
3157bcb6cafSSascha Wildner         return (FALSE);
3167bcb6cafSSascha Wildner     }
3177bcb6cafSSascha Wildner 
3187bcb6cafSSascha Wildner     if (!Node2)
3197bcb6cafSSascha Wildner     {
3207bcb6cafSSascha Wildner         return (TRUE); /* All nodes descend from the root */
3217bcb6cafSSascha Wildner     }
3227bcb6cafSSascha Wildner 
3237bcb6cafSSascha Wildner     /* Walk upward until the root is reached or parent is found */
3247bcb6cafSSascha Wildner 
3257bcb6cafSSascha Wildner     while (Node1)
3267bcb6cafSSascha Wildner     {
3277bcb6cafSSascha Wildner         if (Node1 == Node2)
3287bcb6cafSSascha Wildner         {
3297bcb6cafSSascha Wildner             return (TRUE);
3307bcb6cafSSascha Wildner         }
3317bcb6cafSSascha Wildner 
3327bcb6cafSSascha Wildner         Node1 = Node1->Parent;
3337bcb6cafSSascha Wildner     }
3347bcb6cafSSascha Wildner 
3357bcb6cafSSascha Wildner     return (FALSE);
3367bcb6cafSSascha Wildner }
3377bcb6cafSSascha Wildner 
3387bcb6cafSSascha Wildner 
3397bcb6cafSSascha Wildner /*******************************************************************************
3407bcb6cafSSascha Wildner  *
341ff3cb46dSSascha Wildner  * FUNCTION:    UtGetParentMethodNode
3427bcb6cafSSascha Wildner  *
3437bcb6cafSSascha Wildner  * PARAMETERS:  Node                    - Namespace node for any object
3447bcb6cafSSascha Wildner  *
3457bcb6cafSSascha Wildner  * RETURN:      Namespace node for the parent method
3467bcb6cafSSascha Wildner  *              NULL - object is not within a method
3477bcb6cafSSascha Wildner  *
3487bcb6cafSSascha Wildner  * DESCRIPTION: Find the parent (owning) method node for a namespace object
3497bcb6cafSSascha Wildner  *
3507bcb6cafSSascha Wildner  ******************************************************************************/
3517bcb6cafSSascha Wildner 
352ff3cb46dSSascha Wildner ACPI_NAMESPACE_NODE *
UtGetParentMethodNode(ACPI_NAMESPACE_NODE * Node)353ff3cb46dSSascha Wildner UtGetParentMethodNode (
3547bcb6cafSSascha Wildner     ACPI_NAMESPACE_NODE     *Node)
3557bcb6cafSSascha Wildner {
3567bcb6cafSSascha Wildner     ACPI_NAMESPACE_NODE     *ParentNode;
3577bcb6cafSSascha Wildner 
3587bcb6cafSSascha Wildner 
3597bcb6cafSSascha Wildner     if (!Node)
3607bcb6cafSSascha Wildner     {
3617bcb6cafSSascha Wildner         return (NULL);
3627bcb6cafSSascha Wildner     }
3637bcb6cafSSascha Wildner 
3647bcb6cafSSascha Wildner     /* Walk upward until a method is found, or the root is reached */
3657bcb6cafSSascha Wildner 
3667bcb6cafSSascha Wildner     ParentNode = Node->Parent;
3677bcb6cafSSascha Wildner     while (ParentNode)
3687bcb6cafSSascha Wildner     {
3697bcb6cafSSascha Wildner         if (ParentNode->Type == ACPI_TYPE_METHOD)
3707bcb6cafSSascha Wildner         {
3717bcb6cafSSascha Wildner             return (ParentNode);
3727bcb6cafSSascha Wildner         }
3737bcb6cafSSascha Wildner 
3747bcb6cafSSascha Wildner         ParentNode = ParentNode->Parent;
3757bcb6cafSSascha Wildner     }
3767bcb6cafSSascha Wildner 
3777bcb6cafSSascha Wildner     return (NULL); /* Object is not within a control method */
3787bcb6cafSSascha Wildner }
3797bcb6cafSSascha Wildner 
3807bcb6cafSSascha Wildner 
3817bcb6cafSSascha Wildner /*******************************************************************************
3827bcb6cafSSascha Wildner  *
383ff3cb46dSSascha Wildner  * FUNCTION:    UtGetParentMethodOp
384ff3cb46dSSascha Wildner  *
385ff3cb46dSSascha Wildner  * PARAMETERS:  Op                      - Parse Op to be checked
386ff3cb46dSSascha Wildner  *
387ff3cb46dSSascha Wildner  * RETURN:      Control method Op if found. NULL otherwise
388ff3cb46dSSascha Wildner  *
389ff3cb46dSSascha Wildner  * DESCRIPTION: Find the control method parent of a parse op. Returns NULL if
390ff3cb46dSSascha Wildner  *              the input Op is not within a control method.
391ff3cb46dSSascha Wildner  *
392ff3cb46dSSascha Wildner  ******************************************************************************/
393ff3cb46dSSascha Wildner 
394ff3cb46dSSascha Wildner ACPI_PARSE_OBJECT *
UtGetParentMethodOp(ACPI_PARSE_OBJECT * Op)395ff3cb46dSSascha Wildner UtGetParentMethodOp (
396ff3cb46dSSascha Wildner     ACPI_PARSE_OBJECT       *Op)
397ff3cb46dSSascha Wildner {
398ff3cb46dSSascha Wildner     ACPI_PARSE_OBJECT       *NextOp;
399ff3cb46dSSascha Wildner 
400ff3cb46dSSascha Wildner 
401ff3cb46dSSascha Wildner     NextOp = Op->Asl.Parent;
402ff3cb46dSSascha Wildner     while (NextOp)
403ff3cb46dSSascha Wildner     {
404ff3cb46dSSascha Wildner         if (NextOp->Asl.AmlOpcode == AML_METHOD_OP)
405ff3cb46dSSascha Wildner         {
406ff3cb46dSSascha Wildner             return (NextOp);
407ff3cb46dSSascha Wildner         }
408ff3cb46dSSascha Wildner 
409ff3cb46dSSascha Wildner         NextOp = NextOp->Asl.Parent;
410ff3cb46dSSascha Wildner     }
411ff3cb46dSSascha Wildner 
412ff3cb46dSSascha Wildner     return (NULL); /* No parent method found */
413ff3cb46dSSascha Wildner }
414ff3cb46dSSascha Wildner 
415ff3cb46dSSascha Wildner 
416ff3cb46dSSascha Wildner /*******************************************************************************
417ff3cb46dSSascha Wildner  *
4180d02842fSSascha Wildner  * FUNCTION:    UtDisplaySupportedTables
4190d02842fSSascha Wildner  *
4200d02842fSSascha Wildner  * PARAMETERS:  None
4210d02842fSSascha Wildner  *
4220d02842fSSascha Wildner  * RETURN:      None
4230d02842fSSascha Wildner  *
4240d02842fSSascha Wildner  * DESCRIPTION: Print all supported ACPI table names.
4250d02842fSSascha Wildner  *
4260d02842fSSascha Wildner  ******************************************************************************/
4270d02842fSSascha Wildner 
4280d02842fSSascha Wildner void
UtDisplaySupportedTables(void)4290d02842fSSascha Wildner UtDisplaySupportedTables (
4300d02842fSSascha Wildner     void)
4310d02842fSSascha Wildner {
432896f2e3aSSascha Wildner     const AH_TABLE          *TableData;
4330d02842fSSascha Wildner     UINT32                  i;
4340d02842fSSascha Wildner 
4350d02842fSSascha Wildner 
4360d02842fSSascha Wildner     printf ("\nACPI tables supported by iASL version %8.8X:\n"
437*0672a19bSSascha Wildner         "  (Compiler, Disassembler, Template Generator)\n",
4380d02842fSSascha Wildner         ACPI_CA_VERSION);
4390d02842fSSascha Wildner 
440896f2e3aSSascha Wildner     /* All ACPI tables with the common table header */
4410d02842fSSascha Wildner 
442*0672a19bSSascha Wildner     printf ("\nKnown/Supported ACPI tables:\n");
443806343b9SSascha Wildner     for (TableData = AcpiGbl_SupportedTables, i = 1;
444896f2e3aSSascha Wildner          TableData->Signature; TableData++, i++)
4450d02842fSSascha Wildner     {
446896f2e3aSSascha Wildner         printf ("%8u) %s    %s\n", i,
447896f2e3aSSascha Wildner             TableData->Signature, TableData->Description);
4480d02842fSSascha Wildner     }
449*0672a19bSSascha Wildner 
450*0672a19bSSascha Wildner     printf ("\nTotal %u ACPI tables\n\n", i-1);
4510d02842fSSascha Wildner }
4520d02842fSSascha Wildner 
4530d02842fSSascha Wildner 
4540d02842fSSascha Wildner /*******************************************************************************
4550d02842fSSascha Wildner  *
4560d02842fSSascha Wildner  * FUNCTION:    UtDisplayConstantOpcodes
4570d02842fSSascha Wildner  *
4580d02842fSSascha Wildner  * PARAMETERS:  None
4590d02842fSSascha Wildner  *
4600d02842fSSascha Wildner  * RETURN:      None
4610d02842fSSascha Wildner  *
4620d02842fSSascha Wildner  * DESCRIPTION: Print AML opcodes that can be used in constant expressions.
4630d02842fSSascha Wildner  *
4640d02842fSSascha Wildner  ******************************************************************************/
4650d02842fSSascha Wildner 
4660d02842fSSascha Wildner void
UtDisplayConstantOpcodes(void)4670d02842fSSascha Wildner UtDisplayConstantOpcodes (
4680d02842fSSascha Wildner     void)
4690d02842fSSascha Wildner {
4700d02842fSSascha Wildner     UINT32                  i;
4710d02842fSSascha Wildner 
4720d02842fSSascha Wildner 
4730d02842fSSascha Wildner     printf ("Constant expression opcode information\n\n");
4740d02842fSSascha Wildner 
4750d02842fSSascha Wildner     for (i = 0; i < sizeof (AcpiGbl_AmlOpInfo) / sizeof (ACPI_OPCODE_INFO); i++)
4760d02842fSSascha Wildner     {
4770d02842fSSascha Wildner         if (AcpiGbl_AmlOpInfo[i].Flags & AML_CONSTANT)
4780d02842fSSascha Wildner         {
4790d02842fSSascha Wildner             printf ("%s\n", AcpiGbl_AmlOpInfo[i].Name);
4800d02842fSSascha Wildner         }
4810d02842fSSascha Wildner     }
4820d02842fSSascha Wildner }
4830d02842fSSascha Wildner 
4840d02842fSSascha Wildner 
4850d02842fSSascha Wildner /*******************************************************************************
4860d02842fSSascha Wildner  *
4870d02842fSSascha Wildner  * FUNCTION:    UtBeginEvent
4880d02842fSSascha Wildner  *
4890d02842fSSascha Wildner  * PARAMETERS:  Name                - Ascii name of this event
4900d02842fSSascha Wildner  *
4910d02842fSSascha Wildner  * RETURN:      Event number (integer index)
4920d02842fSSascha Wildner  *
4930d02842fSSascha Wildner  * DESCRIPTION: Saves the current time with this event
4940d02842fSSascha Wildner  *
4950d02842fSSascha Wildner  ******************************************************************************/
4960d02842fSSascha Wildner 
4970d02842fSSascha Wildner UINT8
UtBeginEvent(char * Name)4980d02842fSSascha Wildner UtBeginEvent (
4990d02842fSSascha Wildner     char                    *Name)
5000d02842fSSascha Wildner {
5010d02842fSSascha Wildner 
5020d02842fSSascha Wildner     if (AslGbl_NextEvent >= ASL_NUM_EVENTS)
5030d02842fSSascha Wildner     {
5040d02842fSSascha Wildner         AcpiOsPrintf ("Ran out of compiler event structs!\n");
5050d02842fSSascha Wildner         return (AslGbl_NextEvent);
5060d02842fSSascha Wildner     }
5070d02842fSSascha Wildner 
5080d02842fSSascha Wildner     /* Init event with current (start) time */
5090d02842fSSascha Wildner 
5100d02842fSSascha Wildner     AslGbl_Events[AslGbl_NextEvent].StartTime = AcpiOsGetTimer ();
5110d02842fSSascha Wildner     AslGbl_Events[AslGbl_NextEvent].EventName = Name;
5120d02842fSSascha Wildner     AslGbl_Events[AslGbl_NextEvent].Valid = TRUE;
5130d02842fSSascha Wildner     return (AslGbl_NextEvent++);
5140d02842fSSascha Wildner }
5150d02842fSSascha Wildner 
5160d02842fSSascha Wildner 
5170d02842fSSascha Wildner /*******************************************************************************
5180d02842fSSascha Wildner  *
5190d02842fSSascha Wildner  * FUNCTION:    UtEndEvent
5200d02842fSSascha Wildner  *
5210d02842fSSascha Wildner  * PARAMETERS:  Event               - Event number (integer index)
5220d02842fSSascha Wildner  *
5230d02842fSSascha Wildner  * RETURN:      None
5240d02842fSSascha Wildner  *
5250d02842fSSascha Wildner  * DESCRIPTION: Saves the current time (end time) with this event
5260d02842fSSascha Wildner  *
5270d02842fSSascha Wildner  ******************************************************************************/
5280d02842fSSascha Wildner 
5290d02842fSSascha Wildner void
UtEndEvent(UINT8 Event)5300d02842fSSascha Wildner UtEndEvent (
5310d02842fSSascha Wildner     UINT8                   Event)
5320d02842fSSascha Wildner {
5330d02842fSSascha Wildner 
5340d02842fSSascha Wildner     if (Event >= ASL_NUM_EVENTS)
5350d02842fSSascha Wildner     {
5360d02842fSSascha Wildner         return;
5370d02842fSSascha Wildner     }
5380d02842fSSascha Wildner 
5390d02842fSSascha Wildner     /* Insert end time for event */
5400d02842fSSascha Wildner 
5410d02842fSSascha Wildner     AslGbl_Events[Event].EndTime = AcpiOsGetTimer ();
5420d02842fSSascha Wildner }
5430d02842fSSascha Wildner 
5440d02842fSSascha Wildner 
5450d02842fSSascha Wildner /*******************************************************************************
5460d02842fSSascha Wildner  *
5470d02842fSSascha Wildner  * FUNCTION:    DbgPrint
5480d02842fSSascha Wildner  *
5490d02842fSSascha Wildner  * PARAMETERS:  Type                - Type of output
5500d02842fSSascha Wildner  *              Fmt                 - Printf format string
5510d02842fSSascha Wildner  *              ...                 - variable printf list
5520d02842fSSascha Wildner  *
5530d02842fSSascha Wildner  * RETURN:      None
5540d02842fSSascha Wildner  *
5550d02842fSSascha Wildner  * DESCRIPTION: Conditional print statement. Prints to stderr only if the
5560d02842fSSascha Wildner  *              debug flag is set.
5570d02842fSSascha Wildner  *
5580d02842fSSascha Wildner  ******************************************************************************/
5590d02842fSSascha Wildner 
5600d02842fSSascha Wildner void
DbgPrint(UINT32 Type,char * Fmt,...)5610d02842fSSascha Wildner DbgPrint (
5620d02842fSSascha Wildner     UINT32                  Type,
5630d02842fSSascha Wildner     char                    *Fmt,
5640d02842fSSascha Wildner     ...)
5650d02842fSSascha Wildner {
5660d02842fSSascha Wildner     va_list                 Args;
5670d02842fSSascha Wildner 
5680d02842fSSascha Wildner 
569806343b9SSascha Wildner     if (!AslGbl_DebugFlag)
5700d02842fSSascha Wildner     {
5710d02842fSSascha Wildner         return;
5720d02842fSSascha Wildner     }
5730d02842fSSascha Wildner 
5740d02842fSSascha Wildner     if ((Type == ASL_PARSE_OUTPUT) &&
5750d02842fSSascha Wildner         (!(AslCompilerdebug)))
5760d02842fSSascha Wildner     {
5770d02842fSSascha Wildner         return;
5780d02842fSSascha Wildner     }
5790d02842fSSascha Wildner 
5800d02842fSSascha Wildner     va_start (Args, Fmt);
5810d02842fSSascha Wildner     (void) vfprintf (stderr, Fmt, Args);
5820d02842fSSascha Wildner     va_end (Args);
5830d02842fSSascha Wildner     return;
5840d02842fSSascha Wildner }
5850d02842fSSascha Wildner 
5860d02842fSSascha Wildner 
5870d02842fSSascha Wildner /*******************************************************************************
5880d02842fSSascha Wildner  *
5890d02842fSSascha Wildner  * FUNCTION:    UtSetParseOpName
5900d02842fSSascha Wildner  *
5910d02842fSSascha Wildner  * PARAMETERS:  Op                  - Parse op to be named.
5920d02842fSSascha Wildner  *
5930d02842fSSascha Wildner  * RETURN:      None
5940d02842fSSascha Wildner  *
5950d02842fSSascha Wildner  * DESCRIPTION: Insert the ascii name of the parse opcode
5960d02842fSSascha Wildner  *
5970d02842fSSascha Wildner  ******************************************************************************/
5980d02842fSSascha Wildner 
5990d02842fSSascha Wildner void
UtSetParseOpName(ACPI_PARSE_OBJECT * Op)6000d02842fSSascha Wildner UtSetParseOpName (
6010d02842fSSascha Wildner     ACPI_PARSE_OBJECT       *Op)
6020d02842fSSascha Wildner {
6030d02842fSSascha Wildner 
6047bcb6cafSSascha Wildner     AcpiUtSafeStrncpy (Op->Asl.ParseOpName, UtGetOpName (Op->Asl.ParseOpcode),
6050d02842fSSascha Wildner         ACPI_MAX_PARSEOP_NAME);
6060d02842fSSascha Wildner }
6070d02842fSSascha Wildner 
6080d02842fSSascha Wildner 
6090d02842fSSascha Wildner /*******************************************************************************
6100d02842fSSascha Wildner  *
611a4b9c0c9SSascha Wildner  * FUNCTION:    UtDisplayOneSummary
6120d02842fSSascha Wildner  *
6130d02842fSSascha Wildner  * PARAMETERS:  FileID              - ID of outpout file
6140d02842fSSascha Wildner  *
6150d02842fSSascha Wildner  * RETURN:      None
6160d02842fSSascha Wildner  *
617a4b9c0c9SSascha Wildner  * DESCRIPTION: Display compilation statistics for one input file
6180d02842fSSascha Wildner  *
6190d02842fSSascha Wildner  ******************************************************************************/
6200d02842fSSascha Wildner 
6210d02842fSSascha Wildner void
UtDisplayOneSummary(UINT32 FileId,BOOLEAN DisplayErrorSummary)622a4b9c0c9SSascha Wildner UtDisplayOneSummary (
623a4b9c0c9SSascha Wildner     UINT32                  FileId,
624a4b9c0c9SSascha Wildner     BOOLEAN                 DisplayErrorSummary)
6250d02842fSSascha Wildner {
6260d02842fSSascha Wildner     UINT32                  i;
627a4b9c0c9SSascha Wildner     ASL_GLOBAL_FILE_NODE    *FileNode;
628835079a2SSascha Wildner     BOOLEAN                 DisplayAMLSummary;
6290d02842fSSascha Wildner 
6300d02842fSSascha Wildner 
631835079a2SSascha Wildner     DisplayAMLSummary =
632835079a2SSascha Wildner         !AslGbl_PreprocessOnly && !AslGbl_ParserErrorDetected &&
633835079a2SSascha Wildner         ((AslGbl_ExceptionCount[ASL_ERROR] == 0) || AslGbl_IgnoreErrors) &&
634835079a2SSascha Wildner         AslGbl_Files[ASL_FILE_AML_OUTPUT].Handle;
635835079a2SSascha Wildner 
6360d02842fSSascha Wildner     if (FileId != ASL_FILE_STDOUT)
6370d02842fSSascha Wildner     {
6380d02842fSSascha Wildner         /* Compiler name and version number */
6390d02842fSSascha Wildner 
640c5f0c4c2SSascha Wildner         FlPrintFile (FileId, "%s version %X [%s]\n\n",
641c5f0c4c2SSascha Wildner             ASL_COMPILER_NAME, (UINT32) ACPI_CA_VERSION, __DATE__);
6420d02842fSSascha Wildner     }
6430d02842fSSascha Wildner 
6440d02842fSSascha Wildner     /* Summary of main input and output files */
6450d02842fSSascha Wildner 
646a4b9c0c9SSascha Wildner     FileNode = FlGetCurrentFileNode ();
647e5412f1eSSascha Wildner 
648a4b9c0c9SSascha Wildner     if (FileNode->ParserErrorDetected)
649a4b9c0c9SSascha Wildner     {
6500d02842fSSascha Wildner         FlPrintFile (FileId,
651a4b9c0c9SSascha Wildner             "%-14s %s - Compilation aborted due to parser-detected syntax error(s)\n",
652e5412f1eSSascha Wildner             "Input file:", AslGbl_Files[ASL_FILE_INPUT].Filename);
653a4b9c0c9SSascha Wildner     }
654e5412f1eSSascha Wildner     else if (FileNode->FileType == ASL_INPUT_TYPE_ASCII_DATA)
655e5412f1eSSascha Wildner     {
656e5412f1eSSascha Wildner         FlPrintFile (FileId,
657e5412f1eSSascha Wildner             "%-14s %s - %7u bytes %6u fields %8u source lines\n",
658e5412f1eSSascha Wildner             "Table Input:",
659e5412f1eSSascha Wildner             AslGbl_Files[ASL_FILE_INPUT].Filename,
660e5412f1eSSascha Wildner             FileNode->OriginalInputFileSize, FileNode->TotalFields,
661e5412f1eSSascha Wildner             FileNode->TotalLineCount);
662e5412f1eSSascha Wildner 
663e5412f1eSSascha Wildner         FlPrintFile (FileId,
664e5412f1eSSascha Wildner             "%-14s %s - %7u bytes\n",
665e5412f1eSSascha Wildner             "Binary Output:",
666e5412f1eSSascha Wildner             AslGbl_Files[ASL_FILE_AML_OUTPUT].Filename, FileNode->OutputByteLength);
667e5412f1eSSascha Wildner     }
668e5412f1eSSascha Wildner     else if (FileNode->FileType == ASL_INPUT_TYPE_ASCII_ASL)
669a4b9c0c9SSascha Wildner     {
670a4b9c0c9SSascha Wildner         FlPrintFile (FileId,
671a4b9c0c9SSascha Wildner             "%-14s %s - %7u bytes %6u keywords %6u source lines\n",
6720d02842fSSascha Wildner             "ASL Input:",
673a4b9c0c9SSascha Wildner             AslGbl_Files[ASL_FILE_INPUT].Filename,
674a4b9c0c9SSascha Wildner             FileNode->OriginalInputFileSize,
675a4b9c0c9SSascha Wildner             FileNode->TotalKeywords,
676a4b9c0c9SSascha Wildner             FileNode->TotalLineCount);
6770d02842fSSascha Wildner 
6780d02842fSSascha Wildner         /* AML summary */
6790d02842fSSascha Wildner 
680835079a2SSascha Wildner         if (DisplayAMLSummary)
68125ca8c79SSascha Wildner         {
6820d02842fSSascha Wildner             FlPrintFile (FileId,
683a4b9c0c9SSascha Wildner                 "%-14s %s - %7u bytes %6u opcodes  %6u named objects\n",
6840d02842fSSascha Wildner                 "AML Output:",
685806343b9SSascha Wildner                 AslGbl_Files[ASL_FILE_AML_OUTPUT].Filename,
686f5f76cf2SSascha Wildner                 FlGetFileSize (ASL_FILE_AML_OUTPUT),
687a4b9c0c9SSascha Wildner                 FileNode->TotalExecutableOpcodes,
688a4b9c0c9SSascha Wildner                 FileNode->TotalNamedObjects);
6890d02842fSSascha Wildner         }
6900d02842fSSascha Wildner     }
6910d02842fSSascha Wildner 
6920d02842fSSascha Wildner     /* Display summary of any optional files */
6930d02842fSSascha Wildner 
6940d02842fSSascha Wildner     for (i = ASL_FILE_SOURCE_OUTPUT; i <= ASL_MAX_FILE_TYPE; i++)
6950d02842fSSascha Wildner     {
696806343b9SSascha Wildner         if (!AslGbl_Files[i].Filename || !AslGbl_Files[i].Handle)
6970d02842fSSascha Wildner         {
6980d02842fSSascha Wildner             continue;
6990d02842fSSascha Wildner         }
7000d02842fSSascha Wildner 
7010d02842fSSascha Wildner         /* .SRC is a temp file unless specifically requested */
7020d02842fSSascha Wildner 
703806343b9SSascha Wildner         if ((i == ASL_FILE_SOURCE_OUTPUT) && (!AslGbl_SourceOutputFlag))
7040d02842fSSascha Wildner         {
7050d02842fSSascha Wildner             continue;
7060d02842fSSascha Wildner         }
7070d02842fSSascha Wildner 
70825ca8c79SSascha Wildner         /* .PRE is the preprocessor intermediate file */
7090d02842fSSascha Wildner 
710806343b9SSascha Wildner         if ((i == ASL_FILE_PREPROCESSOR)  && (!AslGbl_KeepPreprocessorTempFile))
7110d02842fSSascha Wildner         {
7120d02842fSSascha Wildner             continue;
7130d02842fSSascha Wildner         }
7140d02842fSSascha Wildner 
715835079a2SSascha Wildner         FlPrintFile (FileId, "%-14s %s - %7u bytes\n",
716a4b9c0c9SSascha Wildner             AslGbl_FileDescs[i].ShortDescription,
717806343b9SSascha Wildner             AslGbl_Files[i].Filename, FlGetFileSize (i));
7180d02842fSSascha Wildner     }
7190d02842fSSascha Wildner 
720a4b9c0c9SSascha Wildner 
721a4b9c0c9SSascha Wildner     /*
722a4b9c0c9SSascha Wildner      * Optionally emit an error summary for a file. This is used to enhance the
723a4b9c0c9SSascha Wildner      * appearance of listing files.
724a4b9c0c9SSascha Wildner      */
725a4b9c0c9SSascha Wildner     if (DisplayErrorSummary)
726a4b9c0c9SSascha Wildner     {
727a4b9c0c9SSascha Wildner         UtDisplayErrorSummary (FileId);
728a4b9c0c9SSascha Wildner     }
729a4b9c0c9SSascha Wildner }
730a4b9c0c9SSascha Wildner 
731a4b9c0c9SSascha Wildner 
732a4b9c0c9SSascha Wildner /*******************************************************************************
733a4b9c0c9SSascha Wildner  *
734a4b9c0c9SSascha Wildner  * FUNCTION:    UtDisplayErrorSummary
735a4b9c0c9SSascha Wildner  *
736a4b9c0c9SSascha Wildner  * PARAMETERS:  FileID              - ID of outpout file
737a4b9c0c9SSascha Wildner  *
738a4b9c0c9SSascha Wildner  * RETURN:      None
739a4b9c0c9SSascha Wildner  *
740a4b9c0c9SSascha Wildner  * DESCRIPTION: Display compilation statistics for all input files
741a4b9c0c9SSascha Wildner  *
742a4b9c0c9SSascha Wildner  ******************************************************************************/
743a4b9c0c9SSascha Wildner 
744a4b9c0c9SSascha Wildner static void
UtDisplayErrorSummary(UINT32 FileId)745a4b9c0c9SSascha Wildner UtDisplayErrorSummary (
746a4b9c0c9SSascha Wildner     UINT32                  FileId)
747a4b9c0c9SSascha Wildner {
748a4b9c0c9SSascha Wildner     BOOLEAN                 ErrorDetected;
749a4b9c0c9SSascha Wildner 
750a4b9c0c9SSascha Wildner 
751a4b9c0c9SSascha Wildner     ErrorDetected = AslGbl_ParserErrorDetected ||
752a4b9c0c9SSascha Wildner         ((AslGbl_ExceptionCount[ASL_ERROR] > 0) && !AslGbl_IgnoreErrors);
753a4b9c0c9SSascha Wildner 
754a4b9c0c9SSascha Wildner     if (ErrorDetected)
755a4b9c0c9SSascha Wildner     {
756a4b9c0c9SSascha Wildner         FlPrintFile (FileId, "\nCompilation failed. ");
757a4b9c0c9SSascha Wildner     }
758a4b9c0c9SSascha Wildner     else
759a4b9c0c9SSascha Wildner     {
760a4b9c0c9SSascha Wildner         FlPrintFile (FileId, "\nCompilation successful. ");
761a4b9c0c9SSascha Wildner     }
7620d02842fSSascha Wildner 
7630d02842fSSascha Wildner     FlPrintFile (FileId,
764a4b9c0c9SSascha Wildner         "%u Errors, %u Warnings, %u Remarks",
765806343b9SSascha Wildner         AslGbl_ExceptionCount[ASL_ERROR],
766806343b9SSascha Wildner         AslGbl_ExceptionCount[ASL_WARNING] +
767806343b9SSascha Wildner             AslGbl_ExceptionCount[ASL_WARNING2] +
768806343b9SSascha Wildner             AslGbl_ExceptionCount[ASL_WARNING3],
769806343b9SSascha Wildner         AslGbl_ExceptionCount[ASL_REMARK]);
7700d02842fSSascha Wildner 
771806343b9SSascha Wildner     if (AslGbl_FileType != ASL_INPUT_TYPE_ASCII_DATA)
7720d02842fSSascha Wildner     {
773a4b9c0c9SSascha Wildner         if (AslGbl_ParserErrorDetected)
774a4b9c0c9SSascha Wildner         {
775a4b9c0c9SSascha Wildner             FlPrintFile (FileId,
776a4b9c0c9SSascha Wildner                 "\nNo AML files were generated due to syntax error(s)\n");
777a4b9c0c9SSascha Wildner             return;
778a4b9c0c9SSascha Wildner         }
779a4b9c0c9SSascha Wildner         else if (ErrorDetected)
780a4b9c0c9SSascha Wildner         {
781a4b9c0c9SSascha Wildner             FlPrintFile (FileId,
782a4b9c0c9SSascha Wildner                 "\nNo AML files were generated due to compiler error(s)\n");
783a4b9c0c9SSascha Wildner             return;
784a4b9c0c9SSascha Wildner         }
785a4b9c0c9SSascha Wildner 
7865943f66cSSascha Wildner         FlPrintFile (FileId, ", %u Optimizations",
787806343b9SSascha Wildner             AslGbl_ExceptionCount[ASL_OPTIMIZATION]);
7885943f66cSSascha Wildner 
789806343b9SSascha Wildner         if (AslGbl_TotalFolds)
7905943f66cSSascha Wildner         {
791806343b9SSascha Wildner             FlPrintFile (FileId, ", %u Constants Folded", AslGbl_TotalFolds);
7925943f66cSSascha Wildner         }
7930d02842fSSascha Wildner     }
7940d02842fSSascha Wildner 
7950d02842fSSascha Wildner     FlPrintFile (FileId, "\n");
7960d02842fSSascha Wildner }
7970d02842fSSascha Wildner 
7980d02842fSSascha Wildner 
7990d02842fSSascha Wildner /*******************************************************************************
8000d02842fSSascha Wildner  *
801a4b9c0c9SSascha Wildner  * FUNCTION:    UtDisplaySummary
802a4b9c0c9SSascha Wildner  *
803a4b9c0c9SSascha Wildner  * PARAMETERS:  FileID              - ID of outpout file
804a4b9c0c9SSascha Wildner  *
805a4b9c0c9SSascha Wildner  * RETURN:      None
806a4b9c0c9SSascha Wildner  *
807a4b9c0c9SSascha Wildner  * DESCRIPTION: Display compilation statistics for all input files
808a4b9c0c9SSascha Wildner  *
809a4b9c0c9SSascha Wildner  ******************************************************************************/
810a4b9c0c9SSascha Wildner 
811a4b9c0c9SSascha Wildner void
UtDisplaySummary(UINT32 FileId)812a4b9c0c9SSascha Wildner UtDisplaySummary (
813a4b9c0c9SSascha Wildner     UINT32                  FileId)
814a4b9c0c9SSascha Wildner {
815a4b9c0c9SSascha Wildner     ASL_GLOBAL_FILE_NODE    *Current = AslGbl_FilesList;
816a4b9c0c9SSascha Wildner 
817a4b9c0c9SSascha Wildner 
818a4b9c0c9SSascha Wildner     while (Current)
819a4b9c0c9SSascha Wildner     {
820a4b9c0c9SSascha Wildner         switch  (FlSwitchFileSet(Current->Files[ASL_FILE_INPUT].Filename))
821a4b9c0c9SSascha Wildner         {
822a4b9c0c9SSascha Wildner             case SWITCH_TO_SAME_FILE:
823a4b9c0c9SSascha Wildner             case SWITCH_TO_DIFFERENT_FILE:
824a4b9c0c9SSascha Wildner 
825a4b9c0c9SSascha Wildner                 UtDisplayOneSummary (FileId, FALSE);
826a4b9c0c9SSascha Wildner                 Current = Current->Next;
827a4b9c0c9SSascha Wildner                 break;
828a4b9c0c9SSascha Wildner 
829a4b9c0c9SSascha Wildner             case FILE_NOT_FOUND:
830a4b9c0c9SSascha Wildner             default:
831a4b9c0c9SSascha Wildner 
832a4b9c0c9SSascha Wildner                 Current = NULL;
833a4b9c0c9SSascha Wildner                 break;
834a4b9c0c9SSascha Wildner         }
835a4b9c0c9SSascha Wildner     }
836a4b9c0c9SSascha Wildner     UtDisplayErrorSummary (FileId);
837a4b9c0c9SSascha Wildner }
838a4b9c0c9SSascha Wildner 
839a4b9c0c9SSascha Wildner /*******************************************************************************
840a4b9c0c9SSascha Wildner  *
8410d02842fSSascha Wildner  * FUNCTION:    UtCheckIntegerRange
8420d02842fSSascha Wildner  *
8430d02842fSSascha Wildner  * PARAMETERS:  Op                  - Integer parse node
8440d02842fSSascha Wildner  *              LowValue            - Smallest allowed value
8450d02842fSSascha Wildner  *              HighValue           - Largest allowed value
8460d02842fSSascha Wildner  *
8470d02842fSSascha Wildner  * RETURN:      Op if OK, otherwise NULL
8480d02842fSSascha Wildner  *
8490d02842fSSascha Wildner  * DESCRIPTION: Check integer for an allowable range
8500d02842fSSascha Wildner  *
8510d02842fSSascha Wildner  ******************************************************************************/
8520d02842fSSascha Wildner 
8530d02842fSSascha Wildner ACPI_PARSE_OBJECT *
UtCheckIntegerRange(ACPI_PARSE_OBJECT * Op,UINT32 LowValue,UINT32 HighValue)8540d02842fSSascha Wildner UtCheckIntegerRange (
8550d02842fSSascha Wildner     ACPI_PARSE_OBJECT       *Op,
8560d02842fSSascha Wildner     UINT32                  LowValue,
8570d02842fSSascha Wildner     UINT32                  HighValue)
8580d02842fSSascha Wildner {
8590d02842fSSascha Wildner 
8600d02842fSSascha Wildner     if (!Op)
8610d02842fSSascha Wildner     {
8620d02842fSSascha Wildner         return (NULL);
8630d02842fSSascha Wildner     }
8640d02842fSSascha Wildner 
8650d02842fSSascha Wildner     if ((Op->Asl.Value.Integer < LowValue) ||
8660d02842fSSascha Wildner         (Op->Asl.Value.Integer > HighValue))
8670d02842fSSascha Wildner     {
868806343b9SSascha Wildner         sprintf (AslGbl_MsgBuffer, "0x%X, allowable: 0x%X-0x%X",
8690d02842fSSascha Wildner             (UINT32) Op->Asl.Value.Integer, LowValue, HighValue);
8700d02842fSSascha Wildner 
871806343b9SSascha Wildner         AslError (ASL_ERROR, ASL_MSG_RANGE, Op, AslGbl_MsgBuffer);
8720d02842fSSascha Wildner         return (NULL);
8730d02842fSSascha Wildner     }
8740d02842fSSascha Wildner 
8750d02842fSSascha Wildner     return (Op);
8760d02842fSSascha Wildner }
8770d02842fSSascha Wildner 
8780d02842fSSascha Wildner 
8790d02842fSSascha Wildner /*******************************************************************************
8800d02842fSSascha Wildner  *
8810d02842fSSascha Wildner  * FUNCTION:    UtInternalizeName
8820d02842fSSascha Wildner  *
8830d02842fSSascha Wildner  * PARAMETERS:  ExternalName        - Name to convert
8840d02842fSSascha Wildner  *              ConvertedName       - Where the converted name is returned
8850d02842fSSascha Wildner  *
8860d02842fSSascha Wildner  * RETURN:      Status
8870d02842fSSascha Wildner  *
8880d02842fSSascha Wildner  * DESCRIPTION: Convert an external (ASL) name to an internal (AML) name
8890d02842fSSascha Wildner  *
8900d02842fSSascha Wildner  ******************************************************************************/
8910d02842fSSascha Wildner 
8920d02842fSSascha Wildner ACPI_STATUS
UtInternalizeName(char * ExternalName,char ** ConvertedName)8930d02842fSSascha Wildner UtInternalizeName (
8940d02842fSSascha Wildner     char                    *ExternalName,
8950d02842fSSascha Wildner     char                    **ConvertedName)
8960d02842fSSascha Wildner {
8970d02842fSSascha Wildner     ACPI_NAMESTRING_INFO    Info;
8980d02842fSSascha Wildner     ACPI_STATUS             Status;
8990d02842fSSascha Wildner 
9000d02842fSSascha Wildner 
9010d02842fSSascha Wildner     if (!ExternalName)
9020d02842fSSascha Wildner     {
9030d02842fSSascha Wildner         return (AE_OK);
9040d02842fSSascha Wildner     }
9050d02842fSSascha Wildner 
9060d02842fSSascha Wildner     /* Get the length of the new internal name */
9070d02842fSSascha Wildner 
9080d02842fSSascha Wildner     Info.ExternalName = ExternalName;
9090d02842fSSascha Wildner     AcpiNsGetInternalNameLength (&Info);
9100d02842fSSascha Wildner 
9110d02842fSSascha Wildner     /* We need a segment to store the internal name */
9120d02842fSSascha Wildner 
9137bcb6cafSSascha Wildner     Info.InternalName = UtLocalCacheCalloc (Info.Length);
9140d02842fSSascha Wildner 
9150d02842fSSascha Wildner     /* Build the name */
9160d02842fSSascha Wildner 
9170d02842fSSascha Wildner     Status = AcpiNsBuildInternalName (&Info);
9180d02842fSSascha Wildner     if (ACPI_FAILURE (Status))
9190d02842fSSascha Wildner     {
9200d02842fSSascha Wildner         return (Status);
9210d02842fSSascha Wildner     }
9220d02842fSSascha Wildner 
9230d02842fSSascha Wildner     *ConvertedName = Info.InternalName;
9240d02842fSSascha Wildner     return (AE_OK);
9250d02842fSSascha Wildner }
9260d02842fSSascha Wildner 
9270d02842fSSascha Wildner 
9280d02842fSSascha Wildner /*******************************************************************************
9290d02842fSSascha Wildner  *
9300d02842fSSascha Wildner  * FUNCTION:    UtPadNameWithUnderscores
9310d02842fSSascha Wildner  *
9320d02842fSSascha Wildner  * PARAMETERS:  NameSeg             - Input nameseg
9330d02842fSSascha Wildner  *              PaddedNameSeg       - Output padded nameseg
9340d02842fSSascha Wildner  *
9350d02842fSSascha Wildner  * RETURN:      Padded nameseg.
9360d02842fSSascha Wildner  *
9370d02842fSSascha Wildner  * DESCRIPTION: Pads a NameSeg with underscores if necessary to form a full
9380d02842fSSascha Wildner  *              ACPI_NAME.
9390d02842fSSascha Wildner  *
9400d02842fSSascha Wildner  ******************************************************************************/
9410d02842fSSascha Wildner 
9420d02842fSSascha Wildner static void
UtPadNameWithUnderscores(char * NameSeg,char * PaddedNameSeg)9430d02842fSSascha Wildner UtPadNameWithUnderscores (
9440d02842fSSascha Wildner     char                    *NameSeg,
9450d02842fSSascha Wildner     char                    *PaddedNameSeg)
9460d02842fSSascha Wildner {
9470d02842fSSascha Wildner     UINT32                  i;
9480d02842fSSascha Wildner 
9490d02842fSSascha Wildner 
950c1776041SSascha Wildner     for (i = 0; (i < ACPI_NAMESEG_SIZE); i++)
9510d02842fSSascha Wildner     {
9520d02842fSSascha Wildner         if (*NameSeg)
9530d02842fSSascha Wildner         {
9540d02842fSSascha Wildner             *PaddedNameSeg = *NameSeg;
9550d02842fSSascha Wildner             NameSeg++;
9560d02842fSSascha Wildner         }
9570d02842fSSascha Wildner         else
9580d02842fSSascha Wildner         {
9590d02842fSSascha Wildner             *PaddedNameSeg = '_';
9600d02842fSSascha Wildner         }
961820c5b08SSascha Wildner 
9620d02842fSSascha Wildner         PaddedNameSeg++;
9630d02842fSSascha Wildner     }
9640d02842fSSascha Wildner }
9650d02842fSSascha Wildner 
9660d02842fSSascha Wildner 
9670d02842fSSascha Wildner /*******************************************************************************
9680d02842fSSascha Wildner  *
9690d02842fSSascha Wildner  * FUNCTION:    UtAttachNameseg
9700d02842fSSascha Wildner  *
9710d02842fSSascha Wildner  * PARAMETERS:  Op                  - Parent parse node
9720d02842fSSascha Wildner  *              Name                - Full ExternalName
9730d02842fSSascha Wildner  *
9740d02842fSSascha Wildner  * RETURN:      None; Sets the NameSeg field in parent node
9750d02842fSSascha Wildner  *
9760d02842fSSascha Wildner  * DESCRIPTION: Extract the last nameseg of the ExternalName and store it
9770d02842fSSascha Wildner  *              in the NameSeg field of the Op.
9780d02842fSSascha Wildner  *
9790d02842fSSascha Wildner  ******************************************************************************/
9800d02842fSSascha Wildner 
9810d02842fSSascha Wildner static void
UtAttachNameseg(ACPI_PARSE_OBJECT * Op,char * Name)9820d02842fSSascha Wildner UtAttachNameseg (
9830d02842fSSascha Wildner     ACPI_PARSE_OBJECT       *Op,
9840d02842fSSascha Wildner     char                    *Name)
9850d02842fSSascha Wildner {
9860d02842fSSascha Wildner     char                    *NameSeg;
9870d02842fSSascha Wildner     char                    PaddedNameSeg[4];
9880d02842fSSascha Wildner 
9890d02842fSSascha Wildner 
9900d02842fSSascha Wildner     if (!Name)
9910d02842fSSascha Wildner     {
9920d02842fSSascha Wildner         return;
9930d02842fSSascha Wildner     }
9940d02842fSSascha Wildner 
9950d02842fSSascha Wildner     /* Look for the last dot in the namepath */
9960d02842fSSascha Wildner 
9970d02842fSSascha Wildner     NameSeg = strrchr (Name, '.');
9980d02842fSSascha Wildner     if (NameSeg)
9990d02842fSSascha Wildner     {
10000d02842fSSascha Wildner         /* Found last dot, we have also found the final nameseg */
10010d02842fSSascha Wildner 
10020d02842fSSascha Wildner         NameSeg++;
10030d02842fSSascha Wildner         UtPadNameWithUnderscores (NameSeg, PaddedNameSeg);
10040d02842fSSascha Wildner     }
10050d02842fSSascha Wildner     else
10060d02842fSSascha Wildner     {
10070d02842fSSascha Wildner         /* No dots in the namepath, there is only a single nameseg. */
10080d02842fSSascha Wildner         /* Handle prefixes */
10090d02842fSSascha Wildner 
10100d02842fSSascha Wildner         while (ACPI_IS_ROOT_PREFIX (*Name) ||
10110d02842fSSascha Wildner                ACPI_IS_PARENT_PREFIX (*Name))
10120d02842fSSascha Wildner         {
10130d02842fSSascha Wildner             Name++;
10140d02842fSSascha Wildner         }
10150d02842fSSascha Wildner 
10160d02842fSSascha Wildner         /* Remaining string should be one single nameseg */
10170d02842fSSascha Wildner 
10180d02842fSSascha Wildner         UtPadNameWithUnderscores (Name, PaddedNameSeg);
10190d02842fSSascha Wildner     }
10200d02842fSSascha Wildner 
1021c1776041SSascha Wildner     ACPI_COPY_NAMESEG (Op->Asl.NameSeg, PaddedNameSeg);
10220d02842fSSascha Wildner }
10230d02842fSSascha Wildner 
10240d02842fSSascha Wildner 
10250d02842fSSascha Wildner /*******************************************************************************
10260d02842fSSascha Wildner  *
10270d02842fSSascha Wildner  * FUNCTION:    UtAttachNamepathToOwner
10280d02842fSSascha Wildner  *
10290d02842fSSascha Wildner  * PARAMETERS:  Op                  - Parent parse node
10300d02842fSSascha Wildner  *              NameOp              - Node that contains the name
10310d02842fSSascha Wildner  *
10320d02842fSSascha Wildner  * RETURN:      Sets the ExternalName and Namepath in the parent node
10330d02842fSSascha Wildner  *
10340d02842fSSascha Wildner  * DESCRIPTION: Store the name in two forms in the parent node: The original
10350d02842fSSascha Wildner  *              (external) name, and the internalized name that is used within
10360d02842fSSascha Wildner  *              the ACPI namespace manager.
10370d02842fSSascha Wildner  *
10380d02842fSSascha Wildner  ******************************************************************************/
10390d02842fSSascha Wildner 
10400d02842fSSascha Wildner void
UtAttachNamepathToOwner(ACPI_PARSE_OBJECT * Op,ACPI_PARSE_OBJECT * NameOp)10410d02842fSSascha Wildner UtAttachNamepathToOwner (
10420d02842fSSascha Wildner     ACPI_PARSE_OBJECT       *Op,
10430d02842fSSascha Wildner     ACPI_PARSE_OBJECT       *NameOp)
10440d02842fSSascha Wildner {
10450d02842fSSascha Wildner     ACPI_STATUS             Status;
10460d02842fSSascha Wildner 
10470d02842fSSascha Wildner 
10480d02842fSSascha Wildner     /* Full external path */
10490d02842fSSascha Wildner 
10500d02842fSSascha Wildner     Op->Asl.ExternalName = NameOp->Asl.Value.String;
10510d02842fSSascha Wildner 
10520d02842fSSascha Wildner     /* Save the NameOp for possible error reporting later */
10530d02842fSSascha Wildner 
10540d02842fSSascha Wildner     Op->Asl.ParentMethod = (void *) NameOp;
10550d02842fSSascha Wildner 
10560d02842fSSascha Wildner     /* Last nameseg of the path */
10570d02842fSSascha Wildner 
10580d02842fSSascha Wildner     UtAttachNameseg (Op, Op->Asl.ExternalName);
10590d02842fSSascha Wildner 
10600d02842fSSascha Wildner     /* Create internalized path */
10610d02842fSSascha Wildner 
10620d02842fSSascha Wildner     Status = UtInternalizeName (NameOp->Asl.Value.String, &Op->Asl.Namepath);
10630d02842fSSascha Wildner     if (ACPI_FAILURE (Status))
10640d02842fSSascha Wildner     {
10650d02842fSSascha Wildner         /* TBD: abort on no memory */
10660d02842fSSascha Wildner     }
10670d02842fSSascha Wildner }
10680d02842fSSascha Wildner 
10690d02842fSSascha Wildner 
10700d02842fSSascha Wildner /*******************************************************************************
10710d02842fSSascha Wildner  *
1072e5412f1eSSascha Wildner  * FUNCTION:    UtNameContainsAllPrefix
1073e5412f1eSSascha Wildner  *
1074e5412f1eSSascha Wildner  * PARAMETERS:  Op                  - Op containing NameString
1075e5412f1eSSascha Wildner  *
1076e5412f1eSSascha Wildner  * RETURN:      NameString consists of all ^ characters
1077e5412f1eSSascha Wildner  *
1078e5412f1eSSascha Wildner  * DESCRIPTION: Determine if this Op contains a name segment that consists of
1079e5412f1eSSascha Wildner  *              all '^' characters.
1080e5412f1eSSascha Wildner  *
1081e5412f1eSSascha Wildner  ******************************************************************************/
1082e5412f1eSSascha Wildner 
1083e5412f1eSSascha Wildner BOOLEAN
UtNameContainsAllPrefix(ACPI_PARSE_OBJECT * Op)1084e5412f1eSSascha Wildner UtNameContainsAllPrefix (
1085e5412f1eSSascha Wildner     ACPI_PARSE_OBJECT       *Op)
1086e5412f1eSSascha Wildner {
1087e5412f1eSSascha Wildner     UINT32                  Length = Op->Asl.AmlLength;
1088e5412f1eSSascha Wildner     UINT32                  i;
1089e5412f1eSSascha Wildner 
1090e5412f1eSSascha Wildner     for (i = 0; i < Length; i++)
1091e5412f1eSSascha Wildner     {
1092e5412f1eSSascha Wildner         if (Op->Asl.Value.String[i] != '^')
1093e5412f1eSSascha Wildner         {
1094e5412f1eSSascha Wildner             return (FALSE);
1095e5412f1eSSascha Wildner         }
1096e5412f1eSSascha Wildner     }
1097e5412f1eSSascha Wildner 
1098e5412f1eSSascha Wildner     return (TRUE);
1099e5412f1eSSascha Wildner }
1100e5412f1eSSascha Wildner 
1101e5412f1eSSascha Wildner /*******************************************************************************
1102e5412f1eSSascha Wildner  *
11030d02842fSSascha Wildner  * FUNCTION:    UtDoConstant
11040d02842fSSascha Wildner  *
1105cf6b3eb1SSascha Wildner  * PARAMETERS:  String              - Hex/Decimal/Octal
11060d02842fSSascha Wildner  *
11070d02842fSSascha Wildner  * RETURN:      Converted Integer
11080d02842fSSascha Wildner  *
1109cf6b3eb1SSascha Wildner  * DESCRIPTION: Convert a string to an integer, with overflow/error checking.
11100d02842fSSascha Wildner  *
11110d02842fSSascha Wildner  ******************************************************************************/
11120d02842fSSascha Wildner 
11130d02842fSSascha Wildner UINT64
UtDoConstant(char * String)11140d02842fSSascha Wildner UtDoConstant (
11150d02842fSSascha Wildner     char                    *String)
11160d02842fSSascha Wildner {
11170d02842fSSascha Wildner     ACPI_STATUS             Status;
1118cf6b3eb1SSascha Wildner     UINT64                  ConvertedInteger;
1119c5a52fd3SSascha Wildner     char                    ErrBuf[128];
1120c5a52fd3SSascha Wildner     const ACPI_EXCEPTION_INFO *ExceptionInfo;
11210d02842fSSascha Wildner 
11220d02842fSSascha Wildner 
1123cf6b3eb1SSascha Wildner     Status = AcpiUtStrtoul64 (String, &ConvertedInteger);
11240d02842fSSascha Wildner     if (ACPI_FAILURE (Status))
11250d02842fSSascha Wildner     {
1126c5a52fd3SSascha Wildner         ExceptionInfo = AcpiUtValidateException ((ACPI_STATUS) Status);
1127c5a52fd3SSascha Wildner         sprintf (ErrBuf, " %s while converting to 64-bit integer",
1128c5a52fd3SSascha Wildner             ExceptionInfo->Description);
1129cf6b3eb1SSascha Wildner 
1130806343b9SSascha Wildner         AslCommonError (ASL_ERROR, ASL_MSG_SYNTAX, AslGbl_CurrentLineNumber,
1131806343b9SSascha Wildner             AslGbl_LogicalLineNumber, AslGbl_CurrentLineOffset,
1132806343b9SSascha Wildner             AslGbl_CurrentColumn, AslGbl_Files[ASL_FILE_INPUT].Filename, ErrBuf);
11330d02842fSSascha Wildner     }
11340d02842fSSascha Wildner 
1135cf6b3eb1SSascha Wildner     return (ConvertedInteger);
11360d02842fSSascha Wildner }
1137e5412f1eSSascha Wildner 
1138e5412f1eSSascha Wildner 
1139e5412f1eSSascha Wildner /******************************************************************************
1140e5412f1eSSascha Wildner  *
1141e5412f1eSSascha Wildner  * FUNCTION:    AcpiUtStrdup
1142e5412f1eSSascha Wildner  *
1143e5412f1eSSascha Wildner  * PARAMETERS:  String1             - string to duplicate
1144e5412f1eSSascha Wildner  *
1145e5412f1eSSascha Wildner  * RETURN:      int that signifies string relationship. Zero means strings
1146e5412f1eSSascha Wildner  *              are equal.
1147e5412f1eSSascha Wildner  *
1148e5412f1eSSascha Wildner  * DESCRIPTION: Duplicate the string using UtCacheAlloc to avoid manual memory
1149e5412f1eSSascha Wildner  *              reclamation.
1150e5412f1eSSascha Wildner  *
1151e5412f1eSSascha Wildner  ******************************************************************************/
1152e5412f1eSSascha Wildner 
1153e5412f1eSSascha Wildner char *
AcpiUtStrdup(char * String)1154e5412f1eSSascha Wildner AcpiUtStrdup (
1155e5412f1eSSascha Wildner     char                    *String)
1156e5412f1eSSascha Wildner {
1157e5412f1eSSascha Wildner     char                    *NewString = (char *) UtLocalCalloc (strlen (String) + 1);
1158e5412f1eSSascha Wildner 
1159e5412f1eSSascha Wildner 
1160e5412f1eSSascha Wildner     strcpy (NewString, String);
1161e5412f1eSSascha Wildner     return (NewString);
1162e5412f1eSSascha Wildner }
1163e5412f1eSSascha Wildner 
1164e5412f1eSSascha Wildner 
1165e5412f1eSSascha Wildner /******************************************************************************
1166e5412f1eSSascha Wildner  *
1167e5412f1eSSascha Wildner  * FUNCTION:    AcpiUtStrcat
1168e5412f1eSSascha Wildner  *
1169e5412f1eSSascha Wildner  * PARAMETERS:  String1
1170e5412f1eSSascha Wildner  *              String2
1171e5412f1eSSascha Wildner  *
1172e5412f1eSSascha Wildner  * RETURN:      New string with String1 concatenated with String2
1173e5412f1eSSascha Wildner  *
1174e5412f1eSSascha Wildner  * DESCRIPTION: Concatenate string1 and string2
1175e5412f1eSSascha Wildner  *
1176e5412f1eSSascha Wildner  ******************************************************************************/
1177e5412f1eSSascha Wildner 
1178e5412f1eSSascha Wildner char *
AcpiUtStrcat(char * String1,char * String2)1179e5412f1eSSascha Wildner AcpiUtStrcat (
1180e5412f1eSSascha Wildner     char                    *String1,
1181e5412f1eSSascha Wildner     char                    *String2)
1182e5412f1eSSascha Wildner {
1183e5412f1eSSascha Wildner     UINT32                  String1Length = strlen (String1);
1184e5412f1eSSascha Wildner     char                    *NewString = (char *) UtLocalCalloc (strlen (String1) + strlen (String2) + 1);
1185e5412f1eSSascha Wildner 
1186e5412f1eSSascha Wildner     strcpy (NewString, String1);
1187e5412f1eSSascha Wildner     strcpy (NewString + String1Length, String2);
1188e5412f1eSSascha Wildner     return (NewString);
1189e5412f1eSSascha Wildner }
1190