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