153289f6aSNate Lawson /******************************************************************************
253289f6aSNate Lawson *
353289f6aSNate Lawson * Module Name: aslutils -- compiler utilities
453289f6aSNate Lawson *
553289f6aSNate Lawson *****************************************************************************/
653289f6aSNate Lawson
70d84335fSJung-uk Kim /******************************************************************************
80d84335fSJung-uk Kim *
90d84335fSJung-uk Kim * 1. Copyright Notice
100d84335fSJung-uk Kim *
11*58308fadSJung-uk Kim * Some or all of this work - Copyright (c) 1999 - 2025, Intel Corp.
1253289f6aSNate Lawson * All rights reserved.
1353289f6aSNate Lawson *
140d84335fSJung-uk Kim * 2. License
150d84335fSJung-uk Kim *
160d84335fSJung-uk Kim * 2.1. This is your license from Intel Corp. under its intellectual property
170d84335fSJung-uk Kim * rights. You may have additional license terms from the party that provided
180d84335fSJung-uk Kim * you this software, covering your right to use that party's intellectual
190d84335fSJung-uk Kim * property rights.
200d84335fSJung-uk Kim *
210d84335fSJung-uk Kim * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
220d84335fSJung-uk Kim * copy of the source code appearing in this file ("Covered Code") an
230d84335fSJung-uk Kim * irrevocable, perpetual, worldwide license under Intel's copyrights in the
240d84335fSJung-uk Kim * base code distributed originally by Intel ("Original Intel Code") to copy,
250d84335fSJung-uk Kim * make derivatives, distribute, use and display any portion of the Covered
260d84335fSJung-uk Kim * Code in any form, with the right to sublicense such rights; and
270d84335fSJung-uk Kim *
280d84335fSJung-uk Kim * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
290d84335fSJung-uk Kim * license (with the right to sublicense), under only those claims of Intel
300d84335fSJung-uk Kim * patents that are infringed by the Original Intel Code, to make, use, sell,
310d84335fSJung-uk Kim * offer to sell, and import the Covered Code and derivative works thereof
320d84335fSJung-uk Kim * solely to the minimum extent necessary to exercise the above copyright
330d84335fSJung-uk Kim * license, and in no event shall the patent license extend to any additions
340d84335fSJung-uk Kim * to or modifications of the Original Intel Code. No other license or right
350d84335fSJung-uk Kim * is granted directly or by implication, estoppel or otherwise;
360d84335fSJung-uk Kim *
370d84335fSJung-uk Kim * The above copyright and patent license is granted only if the following
380d84335fSJung-uk Kim * conditions are met:
390d84335fSJung-uk Kim *
400d84335fSJung-uk Kim * 3. Conditions
410d84335fSJung-uk Kim *
420d84335fSJung-uk Kim * 3.1. Redistribution of Source with Rights to Further Distribute Source.
430d84335fSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered
440d84335fSJung-uk Kim * Code or modification with rights to further distribute source must include
450d84335fSJung-uk Kim * the above Copyright Notice, the above License, this list of Conditions,
460d84335fSJung-uk Kim * and the following Disclaimer and Export Compliance provision. In addition,
470d84335fSJung-uk Kim * Licensee must cause all Covered Code to which Licensee contributes to
480d84335fSJung-uk Kim * contain a file documenting the changes Licensee made to create that Covered
490d84335fSJung-uk Kim * Code and the date of any change. Licensee must include in that file the
500d84335fSJung-uk Kim * documentation of any changes made by any predecessor Licensee. Licensee
510d84335fSJung-uk Kim * must include a prominent statement that the modification is derived,
520d84335fSJung-uk Kim * directly or indirectly, from Original Intel Code.
530d84335fSJung-uk Kim *
540d84335fSJung-uk Kim * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
550d84335fSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered
560d84335fSJung-uk Kim * Code or modification without rights to further distribute source must
570d84335fSJung-uk Kim * include the following Disclaimer and Export Compliance provision in the
580d84335fSJung-uk Kim * documentation and/or other materials provided with distribution. In
590d84335fSJung-uk Kim * addition, Licensee may not authorize further sublicense of source of any
600d84335fSJung-uk Kim * portion of the Covered Code, and must include terms to the effect that the
610d84335fSJung-uk Kim * license from Licensee to its licensee is limited to the intellectual
620d84335fSJung-uk Kim * property embodied in the software Licensee provides to its licensee, and
630d84335fSJung-uk Kim * not to intellectual property embodied in modifications its licensee may
640d84335fSJung-uk Kim * make.
650d84335fSJung-uk Kim *
660d84335fSJung-uk Kim * 3.3. Redistribution of Executable. Redistribution in executable form of any
670d84335fSJung-uk Kim * substantial portion of the Covered Code or modification must reproduce the
680d84335fSJung-uk Kim * above Copyright Notice, and the following Disclaimer and Export Compliance
690d84335fSJung-uk Kim * provision in the documentation and/or other materials provided with the
700d84335fSJung-uk Kim * distribution.
710d84335fSJung-uk Kim *
720d84335fSJung-uk Kim * 3.4. Intel retains all right, title, and interest in and to the Original
730d84335fSJung-uk Kim * Intel Code.
740d84335fSJung-uk Kim *
750d84335fSJung-uk Kim * 3.5. Neither the name Intel nor any other trademark owned or controlled by
760d84335fSJung-uk Kim * Intel shall be used in advertising or otherwise to promote the sale, use or
770d84335fSJung-uk Kim * other dealings in products derived from or relating to the Covered Code
780d84335fSJung-uk Kim * without prior written authorization from Intel.
790d84335fSJung-uk Kim *
800d84335fSJung-uk Kim * 4. Disclaimer and Export Compliance
810d84335fSJung-uk Kim *
820d84335fSJung-uk Kim * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
830d84335fSJung-uk Kim * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
840d84335fSJung-uk Kim * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
850d84335fSJung-uk Kim * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
860d84335fSJung-uk Kim * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
870d84335fSJung-uk Kim * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
880d84335fSJung-uk Kim * PARTICULAR PURPOSE.
890d84335fSJung-uk Kim *
900d84335fSJung-uk Kim * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
910d84335fSJung-uk Kim * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
920d84335fSJung-uk Kim * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
930d84335fSJung-uk Kim * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
940d84335fSJung-uk Kim * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
950d84335fSJung-uk Kim * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
960d84335fSJung-uk Kim * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
970d84335fSJung-uk Kim * LIMITED REMEDY.
980d84335fSJung-uk Kim *
990d84335fSJung-uk Kim * 4.3. Licensee shall not export, either directly or indirectly, any of this
1000d84335fSJung-uk Kim * software or system incorporating such software without first obtaining any
1010d84335fSJung-uk Kim * required license or other approval from the U. S. Department of Commerce or
1020d84335fSJung-uk Kim * any other agency or department of the United States Government. In the
1030d84335fSJung-uk Kim * event Licensee exports any such software from the United States or
1040d84335fSJung-uk Kim * re-exports any such software from a foreign destination, Licensee shall
1050d84335fSJung-uk Kim * ensure that the distribution and export/re-export of the software is in
1060d84335fSJung-uk Kim * compliance with all laws, regulations, orders, or other restrictions of the
1070d84335fSJung-uk Kim * U.S. Export Administration Regulations. Licensee agrees that neither it nor
1080d84335fSJung-uk Kim * any of its subsidiaries will export/re-export any technical data, process,
1090d84335fSJung-uk Kim * software, or service, directly or indirectly, to any country for which the
1100d84335fSJung-uk Kim * United States government or any agency thereof requires an export license,
1110d84335fSJung-uk Kim * other governmental approval, or letter of assurance, without first obtaining
1120d84335fSJung-uk Kim * such license, approval or letter.
1130d84335fSJung-uk Kim *
1140d84335fSJung-uk Kim *****************************************************************************
1150d84335fSJung-uk Kim *
1160d84335fSJung-uk Kim * Alternatively, you may choose to be licensed under the terms of the
1170d84335fSJung-uk Kim * following license:
1180d84335fSJung-uk Kim *
119d244b227SJung-uk Kim * Redistribution and use in source and binary forms, with or without
120d244b227SJung-uk Kim * modification, are permitted provided that the following conditions
121d244b227SJung-uk Kim * are met:
122d244b227SJung-uk Kim * 1. Redistributions of source code must retain the above copyright
123d244b227SJung-uk Kim * notice, this list of conditions, and the following disclaimer,
124d244b227SJung-uk Kim * without modification.
125d244b227SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
126d244b227SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below
127d244b227SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon
128d244b227SJung-uk Kim * including a substantially similar Disclaimer requirement for further
129d244b227SJung-uk Kim * binary redistribution.
130d244b227SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names
131d244b227SJung-uk Kim * of any contributors may be used to endorse or promote products derived
132d244b227SJung-uk Kim * from this software without specific prior written permission.
13353289f6aSNate Lawson *
1340d84335fSJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1350d84335fSJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1360d84335fSJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1370d84335fSJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
1380d84335fSJung-uk Kim * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
1390d84335fSJung-uk Kim * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
1400d84335fSJung-uk Kim * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
1410d84335fSJung-uk Kim * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
1420d84335fSJung-uk Kim * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
1430d84335fSJung-uk Kim * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
1440d84335fSJung-uk Kim * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1450d84335fSJung-uk Kim *
1460d84335fSJung-uk Kim * Alternatively, you may choose to be licensed under the terms of the
147d244b227SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free
148d244b227SJung-uk Kim * Software Foundation.
14953289f6aSNate Lawson *
1500d84335fSJung-uk Kim *****************************************************************************/
15153289f6aSNate Lawson
152ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h>
15353289f6aSNate Lawson #include "aslcompiler.y.h"
154a88e22b7SJung-uk Kim #include <contrib/dev/acpica/include/acdisasm.h>
155ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h>
156ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/amlcode.h>
1573c1812acSJung-uk Kim #include <contrib/dev/acpica/include/acapps.h>
158f8146b88SJung-uk Kim #include <sys/stat.h>
159f8146b88SJung-uk Kim
16053289f6aSNate Lawson
16153289f6aSNate Lawson #define _COMPONENT ACPI_COMPILER
16253289f6aSNate Lawson ACPI_MODULE_NAME ("aslutils")
16353289f6aSNate Lawson
1643f0275a0SJung-uk Kim
165fba7fc7eSJung-uk Kim /* Local prototypes */
16653289f6aSNate Lawson
167fba7fc7eSJung-uk Kim static void
168fba7fc7eSJung-uk Kim UtPadNameWithUnderscores (
169fba7fc7eSJung-uk Kim char *NameSeg,
170fba7fc7eSJung-uk Kim char *PaddedNameSeg);
171fba7fc7eSJung-uk Kim
172fba7fc7eSJung-uk Kim static void
173fba7fc7eSJung-uk Kim UtAttachNameseg (
174fba7fc7eSJung-uk Kim ACPI_PARSE_OBJECT *Op,
175fba7fc7eSJung-uk Kim char *Name);
17653289f6aSNate Lawson
17744b0f624SJung-uk Kim static void
17844b0f624SJung-uk Kim UtDisplayErrorSummary (
17944b0f624SJung-uk Kim UINT32 FileId);
18044b0f624SJung-uk Kim
18153289f6aSNate Lawson
18253289f6aSNate Lawson /*******************************************************************************
18353289f6aSNate Lawson *
184f8146b88SJung-uk Kim * FUNCTION: UtIsBigEndianMachine
185f8146b88SJung-uk Kim *
186f8146b88SJung-uk Kim * PARAMETERS: None
187f8146b88SJung-uk Kim *
188f8146b88SJung-uk Kim * RETURN: TRUE if machine is big endian
189f8146b88SJung-uk Kim * FALSE if machine is little endian
190f8146b88SJung-uk Kim *
191f8146b88SJung-uk Kim * DESCRIPTION: Detect whether machine is little endian or big endian.
192f8146b88SJung-uk Kim *
193f8146b88SJung-uk Kim ******************************************************************************/
194f8146b88SJung-uk Kim
195f8146b88SJung-uk Kim UINT8
UtIsBigEndianMachine(void)196f8146b88SJung-uk Kim UtIsBigEndianMachine (
197f8146b88SJung-uk Kim void)
198f8146b88SJung-uk Kim {
199f8146b88SJung-uk Kim union {
200f8146b88SJung-uk Kim UINT32 Integer;
201f8146b88SJung-uk Kim UINT8 Bytes[4];
202f8146b88SJung-uk Kim } Overlay = {0xFF000000};
203f8146b88SJung-uk Kim
204f8146b88SJung-uk Kim
205f8146b88SJung-uk Kim return (Overlay.Bytes[0]); /* Returns 0xFF (TRUE) for big endian */
206f8146b88SJung-uk Kim }
207f8146b88SJung-uk Kim
208f8146b88SJung-uk Kim
2091970d693SJung-uk Kim /*******************************************************************************
2101970d693SJung-uk Kim *
2111970d693SJung-uk Kim * FUNCTION: UtIsIdInteger
2121970d693SJung-uk Kim *
2131970d693SJung-uk Kim * PARAMETERS: Pointer to an ACPI ID (HID, CID) string
2141970d693SJung-uk Kim *
2151970d693SJung-uk Kim * RETURN: TRUE if string is an integer
2161970d693SJung-uk Kim * FALSE if string is not an integer
2171970d693SJung-uk Kim *
2181970d693SJung-uk Kim * DESCRIPTION: Determine whether the input ACPI ID string can be converted to
2191970d693SJung-uk Kim * an integer value.
2201970d693SJung-uk Kim *
2211970d693SJung-uk Kim ******************************************************************************/
2221970d693SJung-uk Kim
2231970d693SJung-uk Kim BOOLEAN
UtIsIdInteger(UINT8 * Target)2241970d693SJung-uk Kim UtIsIdInteger (
2251970d693SJung-uk Kim UINT8 *Target)
2261970d693SJung-uk Kim {
2271970d693SJung-uk Kim UINT32 i;
2281970d693SJung-uk Kim
2291970d693SJung-uk Kim
2301970d693SJung-uk Kim /* The first three characters of the string must be alphabetic */
2311970d693SJung-uk Kim
2321970d693SJung-uk Kim for (i = 0; i < 3; i++)
2331970d693SJung-uk Kim {
2341970d693SJung-uk Kim if (!isalpha ((int) Target[i]))
2351970d693SJung-uk Kim {
2361970d693SJung-uk Kim break;
2371970d693SJung-uk Kim }
2381970d693SJung-uk Kim }
2391970d693SJung-uk Kim
2401970d693SJung-uk Kim if (i < 3)
2411970d693SJung-uk Kim {
2421970d693SJung-uk Kim return (TRUE);
2431970d693SJung-uk Kim }
2441970d693SJung-uk Kim
2451970d693SJung-uk Kim return (FALSE);
2461970d693SJung-uk Kim }
2471970d693SJung-uk Kim
2481970d693SJung-uk Kim
249f8146b88SJung-uk Kim /******************************************************************************
250f8146b88SJung-uk Kim *
251f8146b88SJung-uk Kim * FUNCTION: UtQueryForOverwrite
252f8146b88SJung-uk Kim *
253f8146b88SJung-uk Kim * PARAMETERS: Pathname - Output filename
254f8146b88SJung-uk Kim *
255f8146b88SJung-uk Kim * RETURN: TRUE if file does not exist or overwrite is authorized
256f8146b88SJung-uk Kim *
257f8146b88SJung-uk Kim * DESCRIPTION: Query for file overwrite if it already exists.
258f8146b88SJung-uk Kim *
259f8146b88SJung-uk Kim ******************************************************************************/
260f8146b88SJung-uk Kim
261f8146b88SJung-uk Kim BOOLEAN
UtQueryForOverwrite(char * Pathname)262f8146b88SJung-uk Kim UtQueryForOverwrite (
263f8146b88SJung-uk Kim char *Pathname)
264f8146b88SJung-uk Kim {
265f8146b88SJung-uk Kim struct stat StatInfo;
266a009b7dcSJung-uk Kim int InChar;
267f8146b88SJung-uk Kim
268f8146b88SJung-uk Kim
269f8146b88SJung-uk Kim if (!stat (Pathname, &StatInfo))
270f8146b88SJung-uk Kim {
271f8146b88SJung-uk Kim fprintf (stderr, "Target file \"%s\" already exists, overwrite? [y|n] ",
272f8146b88SJung-uk Kim Pathname);
273f8146b88SJung-uk Kim
274a009b7dcSJung-uk Kim InChar = fgetc (stdin);
275a009b7dcSJung-uk Kim if (InChar == '\n')
276a009b7dcSJung-uk Kim {
277a009b7dcSJung-uk Kim InChar = fgetc (stdin);
278a009b7dcSJung-uk Kim }
279a009b7dcSJung-uk Kim
280a009b7dcSJung-uk Kim if ((InChar != 'y') && (InChar != 'Y'))
281f8146b88SJung-uk Kim {
282f8146b88SJung-uk Kim return (FALSE);
283f8146b88SJung-uk Kim }
284f8146b88SJung-uk Kim }
285f8146b88SJung-uk Kim
286f8146b88SJung-uk Kim return (TRUE);
287f8146b88SJung-uk Kim }
288f8146b88SJung-uk Kim
289f8146b88SJung-uk Kim
290f8146b88SJung-uk Kim /*******************************************************************************
291f8146b88SJung-uk Kim *
292835b56bfSJung-uk Kim * FUNCTION: UtNodeIsDescendantOf
293835b56bfSJung-uk Kim *
294835b56bfSJung-uk Kim * PARAMETERS: Node1 - Child node
295835b56bfSJung-uk Kim * Node2 - Possible parent node
296835b56bfSJung-uk Kim *
297835b56bfSJung-uk Kim * RETURN: Boolean
298835b56bfSJung-uk Kim *
299835b56bfSJung-uk Kim * DESCRIPTION: Returns TRUE if Node1 is a descendant of Node2. Otherwise,
300835b56bfSJung-uk Kim * return FALSE. Note, we assume a NULL Node2 element to be the
301835b56bfSJung-uk Kim * topmost (root) scope. All nodes are descendants of the root.
302835b56bfSJung-uk Kim * Note: Nodes at the same level (siblings) are not considered
303835b56bfSJung-uk Kim * descendants.
304835b56bfSJung-uk Kim *
305835b56bfSJung-uk Kim ******************************************************************************/
306835b56bfSJung-uk Kim
307835b56bfSJung-uk Kim BOOLEAN
UtNodeIsDescendantOf(ACPI_NAMESPACE_NODE * Node1,ACPI_NAMESPACE_NODE * Node2)308835b56bfSJung-uk Kim UtNodeIsDescendantOf (
309835b56bfSJung-uk Kim ACPI_NAMESPACE_NODE *Node1,
310835b56bfSJung-uk Kim ACPI_NAMESPACE_NODE *Node2)
311835b56bfSJung-uk Kim {
312835b56bfSJung-uk Kim
313835b56bfSJung-uk Kim if (Node1 == Node2)
314835b56bfSJung-uk Kim {
315835b56bfSJung-uk Kim return (FALSE);
316835b56bfSJung-uk Kim }
317835b56bfSJung-uk Kim
318835b56bfSJung-uk Kim if (!Node2)
319835b56bfSJung-uk Kim {
320835b56bfSJung-uk Kim return (TRUE); /* All nodes descend from the root */
321835b56bfSJung-uk Kim }
322835b56bfSJung-uk Kim
323835b56bfSJung-uk Kim /* Walk upward until the root is reached or parent is found */
324835b56bfSJung-uk Kim
325835b56bfSJung-uk Kim while (Node1)
326835b56bfSJung-uk Kim {
327835b56bfSJung-uk Kim if (Node1 == Node2)
328835b56bfSJung-uk Kim {
329835b56bfSJung-uk Kim return (TRUE);
330835b56bfSJung-uk Kim }
331835b56bfSJung-uk Kim
332835b56bfSJung-uk Kim Node1 = Node1->Parent;
333835b56bfSJung-uk Kim }
334835b56bfSJung-uk Kim
335835b56bfSJung-uk Kim return (FALSE);
336835b56bfSJung-uk Kim }
337835b56bfSJung-uk Kim
338835b56bfSJung-uk Kim
339835b56bfSJung-uk Kim /*******************************************************************************
340835b56bfSJung-uk Kim *
341ec0234b4SJung-uk Kim * FUNCTION: UtGetParentMethodNode
342835b56bfSJung-uk Kim *
343835b56bfSJung-uk Kim * PARAMETERS: Node - Namespace node for any object
344835b56bfSJung-uk Kim *
345835b56bfSJung-uk Kim * RETURN: Namespace node for the parent method
346835b56bfSJung-uk Kim * NULL - object is not within a method
347835b56bfSJung-uk Kim *
348835b56bfSJung-uk Kim * DESCRIPTION: Find the parent (owning) method node for a namespace object
349835b56bfSJung-uk Kim *
350835b56bfSJung-uk Kim ******************************************************************************/
351835b56bfSJung-uk Kim
352ec0234b4SJung-uk Kim ACPI_NAMESPACE_NODE *
UtGetParentMethodNode(ACPI_NAMESPACE_NODE * Node)353ec0234b4SJung-uk Kim UtGetParentMethodNode (
354835b56bfSJung-uk Kim ACPI_NAMESPACE_NODE *Node)
355835b56bfSJung-uk Kim {
356835b56bfSJung-uk Kim ACPI_NAMESPACE_NODE *ParentNode;
357835b56bfSJung-uk Kim
358835b56bfSJung-uk Kim
359835b56bfSJung-uk Kim if (!Node)
360835b56bfSJung-uk Kim {
361835b56bfSJung-uk Kim return (NULL);
362835b56bfSJung-uk Kim }
363835b56bfSJung-uk Kim
364835b56bfSJung-uk Kim /* Walk upward until a method is found, or the root is reached */
365835b56bfSJung-uk Kim
366835b56bfSJung-uk Kim ParentNode = Node->Parent;
367835b56bfSJung-uk Kim while (ParentNode)
368835b56bfSJung-uk Kim {
369835b56bfSJung-uk Kim if (ParentNode->Type == ACPI_TYPE_METHOD)
370835b56bfSJung-uk Kim {
371835b56bfSJung-uk Kim return (ParentNode);
372835b56bfSJung-uk Kim }
373835b56bfSJung-uk Kim
374835b56bfSJung-uk Kim ParentNode = ParentNode->Parent;
375835b56bfSJung-uk Kim }
376835b56bfSJung-uk Kim
377835b56bfSJung-uk Kim return (NULL); /* Object is not within a control method */
378835b56bfSJung-uk Kim }
379835b56bfSJung-uk Kim
380835b56bfSJung-uk Kim
381835b56bfSJung-uk Kim /*******************************************************************************
382835b56bfSJung-uk Kim *
383ec0234b4SJung-uk Kim * FUNCTION: UtGetParentMethodOp
384ec0234b4SJung-uk Kim *
385ec0234b4SJung-uk Kim * PARAMETERS: Op - Parse Op to be checked
386ec0234b4SJung-uk Kim *
387ec0234b4SJung-uk Kim * RETURN: Control method Op if found. NULL otherwise
388ec0234b4SJung-uk Kim *
389ec0234b4SJung-uk Kim * DESCRIPTION: Find the control method parent of a parse op. Returns NULL if
390ec0234b4SJung-uk Kim * the input Op is not within a control method.
391ec0234b4SJung-uk Kim *
392ec0234b4SJung-uk Kim ******************************************************************************/
393ec0234b4SJung-uk Kim
394ec0234b4SJung-uk Kim ACPI_PARSE_OBJECT *
UtGetParentMethodOp(ACPI_PARSE_OBJECT * Op)395ec0234b4SJung-uk Kim UtGetParentMethodOp (
396ec0234b4SJung-uk Kim ACPI_PARSE_OBJECT *Op)
397ec0234b4SJung-uk Kim {
398ec0234b4SJung-uk Kim ACPI_PARSE_OBJECT *NextOp;
399ec0234b4SJung-uk Kim
400ec0234b4SJung-uk Kim
401ec0234b4SJung-uk Kim NextOp = Op->Asl.Parent;
402ec0234b4SJung-uk Kim while (NextOp)
403ec0234b4SJung-uk Kim {
404ec0234b4SJung-uk Kim if (NextOp->Asl.AmlOpcode == AML_METHOD_OP)
405ec0234b4SJung-uk Kim {
406ec0234b4SJung-uk Kim return (NextOp);
407ec0234b4SJung-uk Kim }
408ec0234b4SJung-uk Kim
409ec0234b4SJung-uk Kim NextOp = NextOp->Asl.Parent;
410ec0234b4SJung-uk Kim }
411ec0234b4SJung-uk Kim
412ec0234b4SJung-uk Kim return (NULL); /* No parent method found */
413ec0234b4SJung-uk Kim }
414ec0234b4SJung-uk Kim
415ec0234b4SJung-uk Kim
416ec0234b4SJung-uk Kim /*******************************************************************************
417ec0234b4SJung-uk Kim *
418a88e22b7SJung-uk Kim * FUNCTION: UtDisplaySupportedTables
419a88e22b7SJung-uk Kim *
420a88e22b7SJung-uk Kim * PARAMETERS: None
421a88e22b7SJung-uk Kim *
422a88e22b7SJung-uk Kim * RETURN: None
423a88e22b7SJung-uk Kim *
424a88e22b7SJung-uk Kim * DESCRIPTION: Print all supported ACPI table names.
425a88e22b7SJung-uk Kim *
426a88e22b7SJung-uk Kim ******************************************************************************/
427a88e22b7SJung-uk Kim
428a88e22b7SJung-uk Kim void
UtDisplaySupportedTables(void)429a88e22b7SJung-uk Kim UtDisplaySupportedTables (
430a88e22b7SJung-uk Kim void)
431a88e22b7SJung-uk Kim {
432a371a5fdSJung-uk Kim const AH_TABLE *TableData;
4331df130f1SJung-uk Kim UINT32 i;
434a88e22b7SJung-uk Kim
435a88e22b7SJung-uk Kim
4361df130f1SJung-uk Kim printf ("\nACPI tables supported by iASL version %8.8X:\n"
43797c0b5abSJung-uk Kim " (Compiler, Disassembler, Template Generator)\n",
4381df130f1SJung-uk Kim ACPI_CA_VERSION);
439a88e22b7SJung-uk Kim
440a371a5fdSJung-uk Kim /* All ACPI tables with the common table header */
441a88e22b7SJung-uk Kim
44297c0b5abSJung-uk Kim printf ("\nKnown/Supported ACPI tables:\n");
4436f1f1a63SJung-uk Kim for (TableData = AcpiGbl_SupportedTables, i = 1;
444a371a5fdSJung-uk Kim TableData->Signature; TableData++, i++)
445a88e22b7SJung-uk Kim {
446a371a5fdSJung-uk Kim printf ("%8u) %s %s\n", i,
447a371a5fdSJung-uk Kim TableData->Signature, TableData->Description);
448a88e22b7SJung-uk Kim }
44997c0b5abSJung-uk Kim
45097c0b5abSJung-uk Kim printf ("\nTotal %u ACPI tables\n\n", i-1);
451a88e22b7SJung-uk Kim }
452a88e22b7SJung-uk Kim
453a88e22b7SJung-uk Kim
454a88e22b7SJung-uk Kim /*******************************************************************************
455a88e22b7SJung-uk Kim *
456f38b0f21SJung-uk Kim * FUNCTION: UtDisplayConstantOpcodes
45753289f6aSNate Lawson *
45853289f6aSNate Lawson * PARAMETERS: None
45953289f6aSNate Lawson *
46053289f6aSNate Lawson * RETURN: None
46153289f6aSNate Lawson *
46253289f6aSNate Lawson * DESCRIPTION: Print AML opcodes that can be used in constant expressions.
46353289f6aSNate Lawson *
46453289f6aSNate Lawson ******************************************************************************/
46553289f6aSNate Lawson
46653289f6aSNate Lawson void
UtDisplayConstantOpcodes(void)46753289f6aSNate Lawson UtDisplayConstantOpcodes (
46853289f6aSNate Lawson void)
46953289f6aSNate Lawson {
47053289f6aSNate Lawson UINT32 i;
47153289f6aSNate Lawson
472fba7fc7eSJung-uk Kim
47353289f6aSNate Lawson printf ("Constant expression opcode information\n\n");
47453289f6aSNate Lawson
47553289f6aSNate Lawson for (i = 0; i < sizeof (AcpiGbl_AmlOpInfo) / sizeof (ACPI_OPCODE_INFO); i++)
47653289f6aSNate Lawson {
47753289f6aSNate Lawson if (AcpiGbl_AmlOpInfo[i].Flags & AML_CONSTANT)
47853289f6aSNate Lawson {
47953289f6aSNate Lawson printf ("%s\n", AcpiGbl_AmlOpInfo[i].Name);
48053289f6aSNate Lawson }
48153289f6aSNate Lawson }
48253289f6aSNate Lawson }
48353289f6aSNate Lawson
48453289f6aSNate Lawson
48553289f6aSNate Lawson /*******************************************************************************
48653289f6aSNate Lawson *
48753289f6aSNate Lawson * FUNCTION: UtBeginEvent
48853289f6aSNate Lawson *
489fba7fc7eSJung-uk Kim * PARAMETERS: Name - Ascii name of this event
49053289f6aSNate Lawson *
491f38b0f21SJung-uk Kim * RETURN: Event number (integer index)
49253289f6aSNate Lawson *
49353289f6aSNate Lawson * DESCRIPTION: Saves the current time with this event
49453289f6aSNate Lawson *
49553289f6aSNate Lawson ******************************************************************************/
49653289f6aSNate Lawson
497fba7fc7eSJung-uk Kim UINT8
UtBeginEvent(char * Name)49853289f6aSNate Lawson UtBeginEvent (
49953289f6aSNate Lawson char *Name)
50053289f6aSNate Lawson {
50153289f6aSNate Lawson
502fba7fc7eSJung-uk Kim if (AslGbl_NextEvent >= ASL_NUM_EVENTS)
503fba7fc7eSJung-uk Kim {
504fba7fc7eSJung-uk Kim AcpiOsPrintf ("Ran out of compiler event structs!\n");
505fba7fc7eSJung-uk Kim return (AslGbl_NextEvent);
506fba7fc7eSJung-uk Kim }
507fba7fc7eSJung-uk Kim
508fba7fc7eSJung-uk Kim /* Init event with current (start) time */
509fba7fc7eSJung-uk Kim
510fba7fc7eSJung-uk Kim AslGbl_Events[AslGbl_NextEvent].StartTime = AcpiOsGetTimer ();
511fba7fc7eSJung-uk Kim AslGbl_Events[AslGbl_NextEvent].EventName = Name;
512fba7fc7eSJung-uk Kim AslGbl_Events[AslGbl_NextEvent].Valid = TRUE;
513fba7fc7eSJung-uk Kim return (AslGbl_NextEvent++);
51453289f6aSNate Lawson }
51553289f6aSNate Lawson
51653289f6aSNate Lawson
51753289f6aSNate Lawson /*******************************************************************************
51853289f6aSNate Lawson *
51953289f6aSNate Lawson * FUNCTION: UtEndEvent
52053289f6aSNate Lawson *
52153289f6aSNate Lawson * PARAMETERS: Event - Event number (integer index)
52253289f6aSNate Lawson *
52353289f6aSNate Lawson * RETURN: None
52453289f6aSNate Lawson *
52553289f6aSNate Lawson * DESCRIPTION: Saves the current time (end time) with this event
52653289f6aSNate Lawson *
52753289f6aSNate Lawson ******************************************************************************/
52853289f6aSNate Lawson
52953289f6aSNate Lawson void
UtEndEvent(UINT8 Event)53053289f6aSNate Lawson UtEndEvent (
531fba7fc7eSJung-uk Kim UINT8 Event)
53253289f6aSNate Lawson {
53353289f6aSNate Lawson
534fba7fc7eSJung-uk Kim if (Event >= ASL_NUM_EVENTS)
535fba7fc7eSJung-uk Kim {
536fba7fc7eSJung-uk Kim return;
537fba7fc7eSJung-uk Kim }
538fba7fc7eSJung-uk Kim
539fba7fc7eSJung-uk Kim /* Insert end time for event */
540fba7fc7eSJung-uk Kim
541fba7fc7eSJung-uk Kim AslGbl_Events[Event].EndTime = AcpiOsGetTimer ();
54253289f6aSNate Lawson }
54353289f6aSNate Lawson
54453289f6aSNate Lawson
54553289f6aSNate Lawson /*******************************************************************************
54653289f6aSNate Lawson *
54753289f6aSNate Lawson * FUNCTION: DbgPrint
54853289f6aSNate Lawson *
549fba7fc7eSJung-uk Kim * PARAMETERS: Type - Type of output
550fba7fc7eSJung-uk Kim * Fmt - Printf format string
55153289f6aSNate Lawson * ... - variable printf list
55253289f6aSNate Lawson *
55353289f6aSNate Lawson * RETURN: None
55453289f6aSNate Lawson *
55553289f6aSNate Lawson * DESCRIPTION: Conditional print statement. Prints to stderr only if the
55653289f6aSNate Lawson * debug flag is set.
55753289f6aSNate Lawson *
55853289f6aSNate Lawson ******************************************************************************/
55953289f6aSNate Lawson
56053289f6aSNate Lawson void
DbgPrint(UINT32 Type,char * Fmt,...)56153289f6aSNate Lawson DbgPrint (
56253289f6aSNate Lawson UINT32 Type,
56353289f6aSNate Lawson char *Fmt,
56453289f6aSNate Lawson ...)
56553289f6aSNate Lawson {
56653289f6aSNate Lawson va_list Args;
56753289f6aSNate Lawson
56853289f6aSNate Lawson
5696f1f1a63SJung-uk Kim if (!AslGbl_DebugFlag)
57053289f6aSNate Lawson {
57153289f6aSNate Lawson return;
57253289f6aSNate Lawson }
57353289f6aSNate Lawson
57453289f6aSNate Lawson if ((Type == ASL_PARSE_OUTPUT) &&
57553289f6aSNate Lawson (!(AslCompilerdebug)))
57653289f6aSNate Lawson {
57753289f6aSNate Lawson return;
57853289f6aSNate Lawson }
57953289f6aSNate Lawson
5808d744e47SJung-uk Kim va_start (Args, Fmt);
58153289f6aSNate Lawson (void) vfprintf (stderr, Fmt, Args);
58253289f6aSNate Lawson va_end (Args);
58353289f6aSNate Lawson return;
58453289f6aSNate Lawson }
58553289f6aSNate Lawson
58653289f6aSNate Lawson
58753289f6aSNate Lawson /*******************************************************************************
58853289f6aSNate Lawson *
58953289f6aSNate Lawson * FUNCTION: UtSetParseOpName
59053289f6aSNate Lawson *
591f38b0f21SJung-uk Kim * PARAMETERS: Op - Parse op to be named.
59253289f6aSNate Lawson *
59353289f6aSNate Lawson * RETURN: None
59453289f6aSNate Lawson *
59553289f6aSNate Lawson * DESCRIPTION: Insert the ascii name of the parse opcode
59653289f6aSNate Lawson *
59753289f6aSNate Lawson ******************************************************************************/
59853289f6aSNate Lawson
59953289f6aSNate Lawson void
UtSetParseOpName(ACPI_PARSE_OBJECT * Op)60053289f6aSNate Lawson UtSetParseOpName (
60153289f6aSNate Lawson ACPI_PARSE_OBJECT *Op)
60253289f6aSNate Lawson {
603fba7fc7eSJung-uk Kim
604f1db5ef7SJung-uk Kim AcpiUtSafeStrncpy (Op->Asl.ParseOpName, UtGetOpName (Op->Asl.ParseOpcode),
6051a39cfb0SJung-uk Kim ACPI_MAX_PARSEOP_NAME);
60653289f6aSNate Lawson }
60753289f6aSNate Lawson
60853289f6aSNate Lawson
60953289f6aSNate Lawson /*******************************************************************************
61053289f6aSNate Lawson *
61144b0f624SJung-uk Kim * FUNCTION: UtDisplayOneSummary
61253289f6aSNate Lawson *
613722b1667SJung-uk Kim * PARAMETERS: FileID - ID of output file
61453289f6aSNate Lawson *
61553289f6aSNate Lawson * RETURN: None
61653289f6aSNate Lawson *
61744b0f624SJung-uk Kim * DESCRIPTION: Display compilation statistics for one input file
61853289f6aSNate Lawson *
61953289f6aSNate Lawson ******************************************************************************/
62053289f6aSNate Lawson
62153289f6aSNate Lawson void
UtDisplayOneSummary(UINT32 FileId,BOOLEAN DisplayErrorSummary)62244b0f624SJung-uk Kim UtDisplayOneSummary (
62344b0f624SJung-uk Kim UINT32 FileId,
62444b0f624SJung-uk Kim BOOLEAN DisplayErrorSummary)
62553289f6aSNate Lawson {
6263f0275a0SJung-uk Kim UINT32 i;
62744b0f624SJung-uk Kim ASL_GLOBAL_FILE_NODE *FileNode;
6289ad8b64eSJung-uk Kim BOOLEAN DisplayAMLSummary;
6293f0275a0SJung-uk Kim
63053289f6aSNate Lawson
6319ad8b64eSJung-uk Kim DisplayAMLSummary =
6329ad8b64eSJung-uk Kim !AslGbl_PreprocessOnly && !AslGbl_ParserErrorDetected &&
6339ad8b64eSJung-uk Kim ((AslGbl_ExceptionCount[ASL_ERROR] == 0) || AslGbl_IgnoreErrors) &&
6349ad8b64eSJung-uk Kim AslGbl_Files[ASL_FILE_AML_OUTPUT].Handle;
6359ad8b64eSJung-uk Kim
63653289f6aSNate Lawson if (FileId != ASL_FILE_STDOUT)
63753289f6aSNate Lawson {
63853289f6aSNate Lawson /* Compiler name and version number */
63953289f6aSNate Lawson
64061673a1fSJung-uk Kim FlPrintFile (FileId, "%s version %X\n\n",
64161673a1fSJung-uk Kim ASL_COMPILER_NAME, (UINT32) ACPI_CA_VERSION);
64253289f6aSNate Lawson }
64353289f6aSNate Lawson
6443f0275a0SJung-uk Kim /* Summary of main input and output files */
6453f0275a0SJung-uk Kim
64644b0f624SJung-uk Kim FileNode = FlGetCurrentFileNode ();
647a009b7dcSJung-uk Kim
64844b0f624SJung-uk Kim if (FileNode->ParserErrorDetected)
64944b0f624SJung-uk Kim {
65053289f6aSNate Lawson FlPrintFile (FileId,
65144b0f624SJung-uk Kim "%-14s %s - Compilation aborted due to parser-detected syntax error(s)\n",
652a009b7dcSJung-uk Kim "Input file:", AslGbl_Files[ASL_FILE_INPUT].Filename);
65344b0f624SJung-uk Kim }
654a009b7dcSJung-uk Kim else if (FileNode->FileType == ASL_INPUT_TYPE_ASCII_DATA)
655a009b7dcSJung-uk Kim {
656a009b7dcSJung-uk Kim FlPrintFile (FileId,
657a009b7dcSJung-uk Kim "%-14s %s - %7u bytes %6u fields %8u source lines\n",
658a009b7dcSJung-uk Kim "Table Input:",
659a009b7dcSJung-uk Kim AslGbl_Files[ASL_FILE_INPUT].Filename,
660a009b7dcSJung-uk Kim FileNode->OriginalInputFileSize, FileNode->TotalFields,
661a009b7dcSJung-uk Kim FileNode->TotalLineCount);
662a009b7dcSJung-uk Kim
663a009b7dcSJung-uk Kim FlPrintFile (FileId,
664a009b7dcSJung-uk Kim "%-14s %s - %7u bytes\n",
665a009b7dcSJung-uk Kim "Binary Output:",
666a009b7dcSJung-uk Kim AslGbl_Files[ASL_FILE_AML_OUTPUT].Filename, FileNode->OutputByteLength);
667a009b7dcSJung-uk Kim }
668a009b7dcSJung-uk Kim else if (FileNode->FileType == ASL_INPUT_TYPE_ASCII_ASL)
66944b0f624SJung-uk Kim {
67044b0f624SJung-uk Kim FlPrintFile (FileId,
67144b0f624SJung-uk Kim "%-14s %s - %7u bytes %6u keywords %6u source lines\n",
6723f0275a0SJung-uk Kim "ASL Input:",
67344b0f624SJung-uk Kim AslGbl_Files[ASL_FILE_INPUT].Filename,
67444b0f624SJung-uk Kim FileNode->OriginalInputFileSize,
67544b0f624SJung-uk Kim FileNode->TotalKeywords,
67644b0f624SJung-uk Kim FileNode->TotalLineCount);
67753289f6aSNate Lawson
67853289f6aSNate Lawson /* AML summary */
67953289f6aSNate Lawson
6809ad8b64eSJung-uk Kim if (DisplayAMLSummary)
6815ef50723SJung-uk Kim {
68253289f6aSNate Lawson FlPrintFile (FileId,
68344b0f624SJung-uk Kim "%-14s %s - %7u bytes %6u opcodes %6u named objects\n",
6843f0275a0SJung-uk Kim "AML Output:",
6856f1f1a63SJung-uk Kim AslGbl_Files[ASL_FILE_AML_OUTPUT].Filename,
686f8146b88SJung-uk Kim FlGetFileSize (ASL_FILE_AML_OUTPUT),
68744b0f624SJung-uk Kim FileNode->TotalExecutableOpcodes,
68844b0f624SJung-uk Kim FileNode->TotalNamedObjects);
68953289f6aSNate Lawson }
690a88e22b7SJung-uk Kim }
69153289f6aSNate Lawson
6923f0275a0SJung-uk Kim /* Display summary of any optional files */
6933f0275a0SJung-uk Kim
6943f0275a0SJung-uk Kim for (i = ASL_FILE_SOURCE_OUTPUT; i <= ASL_MAX_FILE_TYPE; i++)
6953f0275a0SJung-uk Kim {
6966f1f1a63SJung-uk Kim if (!AslGbl_Files[i].Filename || !AslGbl_Files[i].Handle)
6973f0275a0SJung-uk Kim {
6983f0275a0SJung-uk Kim continue;
6993f0275a0SJung-uk Kim }
7003f0275a0SJung-uk Kim
7013f0275a0SJung-uk Kim /* .SRC is a temp file unless specifically requested */
7023f0275a0SJung-uk Kim
7036f1f1a63SJung-uk Kim if ((i == ASL_FILE_SOURCE_OUTPUT) && (!AslGbl_SourceOutputFlag))
7043f0275a0SJung-uk Kim {
7053f0275a0SJung-uk Kim continue;
7063f0275a0SJung-uk Kim }
7073f0275a0SJung-uk Kim
7085ef50723SJung-uk Kim /* .PRE is the preprocessor intermediate file */
7094c52cad2SJung-uk Kim
7106f1f1a63SJung-uk Kim if ((i == ASL_FILE_PREPROCESSOR) && (!AslGbl_KeepPreprocessorTempFile))
7114c52cad2SJung-uk Kim {
7124c52cad2SJung-uk Kim continue;
7134c52cad2SJung-uk Kim }
7144c52cad2SJung-uk Kim
7159ad8b64eSJung-uk Kim FlPrintFile (FileId, "%-14s %s - %7u bytes\n",
71644b0f624SJung-uk Kim AslGbl_FileDescs[i].ShortDescription,
7176f1f1a63SJung-uk Kim AslGbl_Files[i].Filename, FlGetFileSize (i));
7183f0275a0SJung-uk Kim }
7193f0275a0SJung-uk Kim
72044b0f624SJung-uk Kim
72144b0f624SJung-uk Kim /*
72244b0f624SJung-uk Kim * Optionally emit an error summary for a file. This is used to enhance the
72344b0f624SJung-uk Kim * appearance of listing files.
72444b0f624SJung-uk Kim */
72544b0f624SJung-uk Kim if (DisplayErrorSummary)
72644b0f624SJung-uk Kim {
72744b0f624SJung-uk Kim UtDisplayErrorSummary (FileId);
72844b0f624SJung-uk Kim }
72944b0f624SJung-uk Kim }
73044b0f624SJung-uk Kim
73144b0f624SJung-uk Kim
73244b0f624SJung-uk Kim /*******************************************************************************
73344b0f624SJung-uk Kim *
73444b0f624SJung-uk Kim * FUNCTION: UtDisplayErrorSummary
73544b0f624SJung-uk Kim *
736722b1667SJung-uk Kim * PARAMETERS: FileID - ID of output file
73744b0f624SJung-uk Kim *
73844b0f624SJung-uk Kim * RETURN: None
73944b0f624SJung-uk Kim *
74044b0f624SJung-uk Kim * DESCRIPTION: Display compilation statistics for all input files
74144b0f624SJung-uk Kim *
74244b0f624SJung-uk Kim ******************************************************************************/
74344b0f624SJung-uk Kim
74444b0f624SJung-uk Kim static void
UtDisplayErrorSummary(UINT32 FileId)74544b0f624SJung-uk Kim UtDisplayErrorSummary (
74644b0f624SJung-uk Kim UINT32 FileId)
74744b0f624SJung-uk Kim {
74844b0f624SJung-uk Kim BOOLEAN ErrorDetected;
74944b0f624SJung-uk Kim
75044b0f624SJung-uk Kim
75144b0f624SJung-uk Kim ErrorDetected = AslGbl_ParserErrorDetected ||
75244b0f624SJung-uk Kim ((AslGbl_ExceptionCount[ASL_ERROR] > 0) && !AslGbl_IgnoreErrors);
75344b0f624SJung-uk Kim
75444b0f624SJung-uk Kim if (ErrorDetected)
75544b0f624SJung-uk Kim {
75644b0f624SJung-uk Kim FlPrintFile (FileId, "\nCompilation failed. ");
75744b0f624SJung-uk Kim }
75844b0f624SJung-uk Kim else
75944b0f624SJung-uk Kim {
76044b0f624SJung-uk Kim FlPrintFile (FileId, "\nCompilation successful. ");
76144b0f624SJung-uk Kim }
76253289f6aSNate Lawson
76353289f6aSNate Lawson FlPrintFile (FileId,
76444b0f624SJung-uk Kim "%u Errors, %u Warnings, %u Remarks",
7656f1f1a63SJung-uk Kim AslGbl_ExceptionCount[ASL_ERROR],
7666f1f1a63SJung-uk Kim AslGbl_ExceptionCount[ASL_WARNING] +
7676f1f1a63SJung-uk Kim AslGbl_ExceptionCount[ASL_WARNING2] +
7686f1f1a63SJung-uk Kim AslGbl_ExceptionCount[ASL_WARNING3],
7696f1f1a63SJung-uk Kim AslGbl_ExceptionCount[ASL_REMARK]);
770a88e22b7SJung-uk Kim
7716f1f1a63SJung-uk Kim if (AslGbl_FileType != ASL_INPUT_TYPE_ASCII_DATA)
772a88e22b7SJung-uk Kim {
77344b0f624SJung-uk Kim if (AslGbl_ParserErrorDetected)
77444b0f624SJung-uk Kim {
77544b0f624SJung-uk Kim FlPrintFile (FileId,
77644b0f624SJung-uk Kim "\nNo AML files were generated due to syntax error(s)\n");
77744b0f624SJung-uk Kim return;
77844b0f624SJung-uk Kim }
77944b0f624SJung-uk Kim else if (ErrorDetected)
78044b0f624SJung-uk Kim {
78144b0f624SJung-uk Kim FlPrintFile (FileId,
78244b0f624SJung-uk Kim "\nNo AML files were generated due to compiler error(s)\n");
78344b0f624SJung-uk Kim return;
78444b0f624SJung-uk Kim }
78544b0f624SJung-uk Kim
7867cf3e94aSJung-uk Kim FlPrintFile (FileId, ", %u Optimizations",
7876f1f1a63SJung-uk Kim AslGbl_ExceptionCount[ASL_OPTIMIZATION]);
7887cf3e94aSJung-uk Kim
7896f1f1a63SJung-uk Kim if (AslGbl_TotalFolds)
7907cf3e94aSJung-uk Kim {
7916f1f1a63SJung-uk Kim FlPrintFile (FileId, ", %u Constants Folded", AslGbl_TotalFolds);
7927cf3e94aSJung-uk Kim }
793a88e22b7SJung-uk Kim }
794a88e22b7SJung-uk Kim
795a88e22b7SJung-uk Kim FlPrintFile (FileId, "\n");
79653289f6aSNate Lawson }
79753289f6aSNate Lawson
79853289f6aSNate Lawson
79953289f6aSNate Lawson /*******************************************************************************
80053289f6aSNate Lawson *
80144b0f624SJung-uk Kim * FUNCTION: UtDisplaySummary
80244b0f624SJung-uk Kim *
803722b1667SJung-uk Kim * PARAMETERS: FileID - ID of output file
80444b0f624SJung-uk Kim *
80544b0f624SJung-uk Kim * RETURN: None
80644b0f624SJung-uk Kim *
80744b0f624SJung-uk Kim * DESCRIPTION: Display compilation statistics for all input files
80844b0f624SJung-uk Kim *
80944b0f624SJung-uk Kim ******************************************************************************/
81044b0f624SJung-uk Kim
81144b0f624SJung-uk Kim void
UtDisplaySummary(UINT32 FileId)81244b0f624SJung-uk Kim UtDisplaySummary (
81344b0f624SJung-uk Kim UINT32 FileId)
81444b0f624SJung-uk Kim {
81544b0f624SJung-uk Kim ASL_GLOBAL_FILE_NODE *Current = AslGbl_FilesList;
81644b0f624SJung-uk Kim
81744b0f624SJung-uk Kim
81844b0f624SJung-uk Kim while (Current)
81944b0f624SJung-uk Kim {
82044b0f624SJung-uk Kim switch (FlSwitchFileSet(Current->Files[ASL_FILE_INPUT].Filename))
82144b0f624SJung-uk Kim {
82244b0f624SJung-uk Kim case SWITCH_TO_SAME_FILE:
82344b0f624SJung-uk Kim case SWITCH_TO_DIFFERENT_FILE:
82444b0f624SJung-uk Kim
82544b0f624SJung-uk Kim UtDisplayOneSummary (FileId, FALSE);
82644b0f624SJung-uk Kim Current = Current->Next;
82744b0f624SJung-uk Kim break;
82844b0f624SJung-uk Kim
82944b0f624SJung-uk Kim case FILE_NOT_FOUND:
83044b0f624SJung-uk Kim default:
83144b0f624SJung-uk Kim
83244b0f624SJung-uk Kim Current = NULL;
83344b0f624SJung-uk Kim break;
83444b0f624SJung-uk Kim }
83544b0f624SJung-uk Kim }
83644b0f624SJung-uk Kim UtDisplayErrorSummary (FileId);
83744b0f624SJung-uk Kim }
83844b0f624SJung-uk Kim
83944b0f624SJung-uk Kim /*******************************************************************************
84044b0f624SJung-uk Kim *
841f38b0f21SJung-uk Kim * FUNCTION: UtCheckIntegerRange
84253289f6aSNate Lawson *
84353289f6aSNate Lawson * PARAMETERS: Op - Integer parse node
84453289f6aSNate Lawson * LowValue - Smallest allowed value
84553289f6aSNate Lawson * HighValue - Largest allowed value
84653289f6aSNate Lawson *
84753289f6aSNate Lawson * RETURN: Op if OK, otherwise NULL
84853289f6aSNate Lawson *
84953289f6aSNate Lawson * DESCRIPTION: Check integer for an allowable range
85053289f6aSNate Lawson *
85153289f6aSNate Lawson ******************************************************************************/
85253289f6aSNate Lawson
85353289f6aSNate Lawson ACPI_PARSE_OBJECT *
UtCheckIntegerRange(ACPI_PARSE_OBJECT * Op,UINT32 LowValue,UINT32 HighValue)85453289f6aSNate Lawson UtCheckIntegerRange (
85553289f6aSNate Lawson ACPI_PARSE_OBJECT *Op,
85653289f6aSNate Lawson UINT32 LowValue,
85753289f6aSNate Lawson UINT32 HighValue)
85853289f6aSNate Lawson {
85953289f6aSNate Lawson
86053289f6aSNate Lawson if (!Op)
86153289f6aSNate Lawson {
8628ef1a331SJung-uk Kim return (NULL);
86353289f6aSNate Lawson }
86453289f6aSNate Lawson
8651df130f1SJung-uk Kim if ((Op->Asl.Value.Integer < LowValue) ||
8661df130f1SJung-uk Kim (Op->Asl.Value.Integer > HighValue))
86753289f6aSNate Lawson {
8686f1f1a63SJung-uk Kim sprintf (AslGbl_MsgBuffer, "0x%X, allowable: 0x%X-0x%X",
8691df130f1SJung-uk Kim (UINT32) Op->Asl.Value.Integer, LowValue, HighValue);
8701df130f1SJung-uk Kim
8716f1f1a63SJung-uk Kim AslError (ASL_ERROR, ASL_MSG_RANGE, Op, AslGbl_MsgBuffer);
8721df130f1SJung-uk Kim return (NULL);
87353289f6aSNate Lawson }
87453289f6aSNate Lawson
8751df130f1SJung-uk Kim return (Op);
87653289f6aSNate Lawson }
87753289f6aSNate Lawson
87853289f6aSNate Lawson
87953289f6aSNate Lawson /*******************************************************************************
88053289f6aSNate Lawson *
88153289f6aSNate Lawson * FUNCTION: UtInternalizeName
88253289f6aSNate Lawson *
88353289f6aSNate Lawson * PARAMETERS: ExternalName - Name to convert
88453289f6aSNate Lawson * ConvertedName - Where the converted name is returned
88553289f6aSNate Lawson *
88653289f6aSNate Lawson * RETURN: Status
88753289f6aSNate Lawson *
88853289f6aSNate Lawson * DESCRIPTION: Convert an external (ASL) name to an internal (AML) name
88953289f6aSNate Lawson *
89053289f6aSNate Lawson ******************************************************************************/
89153289f6aSNate Lawson
89253289f6aSNate Lawson ACPI_STATUS
UtInternalizeName(char * ExternalName,char ** ConvertedName)89353289f6aSNate Lawson UtInternalizeName (
89453289f6aSNate Lawson char *ExternalName,
89553289f6aSNate Lawson char **ConvertedName)
89653289f6aSNate Lawson {
89753289f6aSNate Lawson ACPI_NAMESTRING_INFO Info;
89853289f6aSNate Lawson ACPI_STATUS Status;
89953289f6aSNate Lawson
90053289f6aSNate Lawson
90153289f6aSNate Lawson if (!ExternalName)
90253289f6aSNate Lawson {
90353289f6aSNate Lawson return (AE_OK);
90453289f6aSNate Lawson }
90553289f6aSNate Lawson
90653289f6aSNate Lawson /* Get the length of the new internal name */
90753289f6aSNate Lawson
90853289f6aSNate Lawson Info.ExternalName = ExternalName;
90953289f6aSNate Lawson AcpiNsGetInternalNameLength (&Info);
91053289f6aSNate Lawson
91153289f6aSNate Lawson /* We need a segment to store the internal name */
91253289f6aSNate Lawson
91367d9aa44SJung-uk Kim Info.InternalName = UtLocalCacheCalloc (Info.Length);
91453289f6aSNate Lawson
91553289f6aSNate Lawson /* Build the name */
91653289f6aSNate Lawson
91753289f6aSNate Lawson Status = AcpiNsBuildInternalName (&Info);
91853289f6aSNate Lawson if (ACPI_FAILURE (Status))
91953289f6aSNate Lawson {
92053289f6aSNate Lawson return (Status);
92153289f6aSNate Lawson }
92253289f6aSNate Lawson
92353289f6aSNate Lawson *ConvertedName = Info.InternalName;
92453289f6aSNate Lawson return (AE_OK);
92553289f6aSNate Lawson }
92653289f6aSNate Lawson
92753289f6aSNate Lawson
92853289f6aSNate Lawson /*******************************************************************************
92953289f6aSNate Lawson *
93053289f6aSNate Lawson * FUNCTION: UtPadNameWithUnderscores
93153289f6aSNate Lawson *
93253289f6aSNate Lawson * PARAMETERS: NameSeg - Input nameseg
93353289f6aSNate Lawson * PaddedNameSeg - Output padded nameseg
93453289f6aSNate Lawson *
93553289f6aSNate Lawson * RETURN: Padded nameseg.
93653289f6aSNate Lawson *
93753289f6aSNate Lawson * DESCRIPTION: Pads a NameSeg with underscores if necessary to form a full
93853289f6aSNate Lawson * ACPI_NAME.
93953289f6aSNate Lawson *
94053289f6aSNate Lawson ******************************************************************************/
94153289f6aSNate Lawson
942fba7fc7eSJung-uk Kim static void
UtPadNameWithUnderscores(char * NameSeg,char * PaddedNameSeg)94353289f6aSNate Lawson UtPadNameWithUnderscores (
94453289f6aSNate Lawson char *NameSeg,
94553289f6aSNate Lawson char *PaddedNameSeg)
94653289f6aSNate Lawson {
94753289f6aSNate Lawson UINT32 i;
94853289f6aSNate Lawson
94953289f6aSNate Lawson
950278f0de6SJung-uk Kim for (i = 0; (i < ACPI_NAMESEG_SIZE); i++)
95153289f6aSNate Lawson {
95253289f6aSNate Lawson if (*NameSeg)
95353289f6aSNate Lawson {
95453289f6aSNate Lawson *PaddedNameSeg = *NameSeg;
95553289f6aSNate Lawson NameSeg++;
95653289f6aSNate Lawson }
95753289f6aSNate Lawson else
95853289f6aSNate Lawson {
95953289f6aSNate Lawson *PaddedNameSeg = '_';
96053289f6aSNate Lawson }
961f8146b88SJung-uk Kim
96253289f6aSNate Lawson PaddedNameSeg++;
96353289f6aSNate Lawson }
96453289f6aSNate Lawson }
96553289f6aSNate Lawson
96653289f6aSNate Lawson
96753289f6aSNate Lawson /*******************************************************************************
96853289f6aSNate Lawson *
96953289f6aSNate Lawson * FUNCTION: UtAttachNameseg
97053289f6aSNate Lawson *
97153289f6aSNate Lawson * PARAMETERS: Op - Parent parse node
97253289f6aSNate Lawson * Name - Full ExternalName
97353289f6aSNate Lawson *
974fba7fc7eSJung-uk Kim * RETURN: None; Sets the NameSeg field in parent node
97553289f6aSNate Lawson *
97653289f6aSNate Lawson * DESCRIPTION: Extract the last nameseg of the ExternalName and store it
97753289f6aSNate Lawson * in the NameSeg field of the Op.
97853289f6aSNate Lawson *
97953289f6aSNate Lawson ******************************************************************************/
98053289f6aSNate Lawson
981fba7fc7eSJung-uk Kim static void
UtAttachNameseg(ACPI_PARSE_OBJECT * Op,char * Name)98253289f6aSNate Lawson UtAttachNameseg (
98353289f6aSNate Lawson ACPI_PARSE_OBJECT *Op,
98453289f6aSNate Lawson char *Name)
98553289f6aSNate Lawson {
98653289f6aSNate Lawson char *NameSeg;
98753289f6aSNate Lawson char PaddedNameSeg[4];
98853289f6aSNate Lawson
98953289f6aSNate Lawson
99053289f6aSNate Lawson if (!Name)
99153289f6aSNate Lawson {
99253289f6aSNate Lawson return;
99353289f6aSNate Lawson }
99453289f6aSNate Lawson
99553289f6aSNate Lawson /* Look for the last dot in the namepath */
99653289f6aSNate Lawson
99753289f6aSNate Lawson NameSeg = strrchr (Name, '.');
99853289f6aSNate Lawson if (NameSeg)
99953289f6aSNate Lawson {
100053289f6aSNate Lawson /* Found last dot, we have also found the final nameseg */
100153289f6aSNate Lawson
100253289f6aSNate Lawson NameSeg++;
100353289f6aSNate Lawson UtPadNameWithUnderscores (NameSeg, PaddedNameSeg);
100453289f6aSNate Lawson }
100553289f6aSNate Lawson else
100653289f6aSNate Lawson {
100753289f6aSNate Lawson /* No dots in the namepath, there is only a single nameseg. */
100853289f6aSNate Lawson /* Handle prefixes */
100953289f6aSNate Lawson
1010efcc2a30SJung-uk Kim while (ACPI_IS_ROOT_PREFIX (*Name) ||
1011efcc2a30SJung-uk Kim ACPI_IS_PARENT_PREFIX (*Name))
101253289f6aSNate Lawson {
101353289f6aSNate Lawson Name++;
101453289f6aSNate Lawson }
101553289f6aSNate Lawson
10168ef1a331SJung-uk Kim /* Remaining string should be one single nameseg */
101753289f6aSNate Lawson
101853289f6aSNate Lawson UtPadNameWithUnderscores (Name, PaddedNameSeg);
101953289f6aSNate Lawson }
102053289f6aSNate Lawson
1021278f0de6SJung-uk Kim ACPI_COPY_NAMESEG (Op->Asl.NameSeg, PaddedNameSeg);
102253289f6aSNate Lawson }
102353289f6aSNate Lawson
102453289f6aSNate Lawson
102553289f6aSNate Lawson /*******************************************************************************
102653289f6aSNate Lawson *
102753289f6aSNate Lawson * FUNCTION: UtAttachNamepathToOwner
102853289f6aSNate Lawson *
102953289f6aSNate Lawson * PARAMETERS: Op - Parent parse node
103053289f6aSNate Lawson * NameOp - Node that contains the name
103153289f6aSNate Lawson *
103253289f6aSNate Lawson * RETURN: Sets the ExternalName and Namepath in the parent node
103353289f6aSNate Lawson *
103453289f6aSNate Lawson * DESCRIPTION: Store the name in two forms in the parent node: The original
103553289f6aSNate Lawson * (external) name, and the internalized name that is used within
103653289f6aSNate Lawson * the ACPI namespace manager.
103753289f6aSNate Lawson *
103853289f6aSNate Lawson ******************************************************************************/
103953289f6aSNate Lawson
104053289f6aSNate Lawson void
UtAttachNamepathToOwner(ACPI_PARSE_OBJECT * Op,ACPI_PARSE_OBJECT * NameOp)104153289f6aSNate Lawson UtAttachNamepathToOwner (
104253289f6aSNate Lawson ACPI_PARSE_OBJECT *Op,
104353289f6aSNate Lawson ACPI_PARSE_OBJECT *NameOp)
104453289f6aSNate Lawson {
104553289f6aSNate Lawson ACPI_STATUS Status;
104653289f6aSNate Lawson
104753289f6aSNate Lawson
104853289f6aSNate Lawson /* Full external path */
104953289f6aSNate Lawson
105053289f6aSNate Lawson Op->Asl.ExternalName = NameOp->Asl.Value.String;
105153289f6aSNate Lawson
1052fba7fc7eSJung-uk Kim /* Save the NameOp for possible error reporting later */
1053fba7fc7eSJung-uk Kim
1054fba7fc7eSJung-uk Kim Op->Asl.ParentMethod = (void *) NameOp;
1055fba7fc7eSJung-uk Kim
105653289f6aSNate Lawson /* Last nameseg of the path */
105753289f6aSNate Lawson
105853289f6aSNate Lawson UtAttachNameseg (Op, Op->Asl.ExternalName);
105953289f6aSNate Lawson
106053289f6aSNate Lawson /* Create internalized path */
106153289f6aSNate Lawson
106253289f6aSNate Lawson Status = UtInternalizeName (NameOp->Asl.Value.String, &Op->Asl.Namepath);
106353289f6aSNate Lawson if (ACPI_FAILURE (Status))
106453289f6aSNate Lawson {
106553289f6aSNate Lawson /* TBD: abort on no memory */
106653289f6aSNate Lawson }
106753289f6aSNate Lawson }
106853289f6aSNate Lawson
106953289f6aSNate Lawson
107053289f6aSNate Lawson /*******************************************************************************
107153289f6aSNate Lawson *
1072a009b7dcSJung-uk Kim * FUNCTION: UtNameContainsAllPrefix
1073a009b7dcSJung-uk Kim *
1074a009b7dcSJung-uk Kim * PARAMETERS: Op - Op containing NameString
1075a009b7dcSJung-uk Kim *
1076a009b7dcSJung-uk Kim * RETURN: NameString consists of all ^ characters
1077a009b7dcSJung-uk Kim *
1078a009b7dcSJung-uk Kim * DESCRIPTION: Determine if this Op contains a name segment that consists of
1079a009b7dcSJung-uk Kim * all '^' characters.
1080a009b7dcSJung-uk Kim *
1081a009b7dcSJung-uk Kim ******************************************************************************/
1082a009b7dcSJung-uk Kim
1083a009b7dcSJung-uk Kim BOOLEAN
UtNameContainsAllPrefix(ACPI_PARSE_OBJECT * Op)1084a009b7dcSJung-uk Kim UtNameContainsAllPrefix (
1085a009b7dcSJung-uk Kim ACPI_PARSE_OBJECT *Op)
1086a009b7dcSJung-uk Kim {
1087a009b7dcSJung-uk Kim UINT32 Length = Op->Asl.AmlLength;
1088a009b7dcSJung-uk Kim UINT32 i;
1089a009b7dcSJung-uk Kim
1090a009b7dcSJung-uk Kim for (i = 0; i < Length; i++)
1091a009b7dcSJung-uk Kim {
1092a009b7dcSJung-uk Kim if (Op->Asl.Value.String[i] != '^')
1093a009b7dcSJung-uk Kim {
1094a009b7dcSJung-uk Kim return (FALSE);
1095a009b7dcSJung-uk Kim }
1096a009b7dcSJung-uk Kim }
1097a009b7dcSJung-uk Kim
1098a009b7dcSJung-uk Kim return (TRUE);
1099a009b7dcSJung-uk Kim }
1100a009b7dcSJung-uk Kim
1101a009b7dcSJung-uk Kim /*******************************************************************************
1102a009b7dcSJung-uk Kim *
110353289f6aSNate Lawson * FUNCTION: UtDoConstant
110453289f6aSNate Lawson *
11052f6a1a81SJung-uk Kim * PARAMETERS: String - Hex/Decimal/Octal
110653289f6aSNate Lawson *
110753289f6aSNate Lawson * RETURN: Converted Integer
110853289f6aSNate Lawson *
11092f6a1a81SJung-uk Kim * DESCRIPTION: Convert a string to an integer, with overflow/error checking.
111053289f6aSNate Lawson *
111153289f6aSNate Lawson ******************************************************************************/
111253289f6aSNate Lawson
11139a179dd8SJung-uk Kim UINT64
UtDoConstant(char * String)111453289f6aSNate Lawson UtDoConstant (
111553289f6aSNate Lawson char *String)
111653289f6aSNate Lawson {
111753289f6aSNate Lawson ACPI_STATUS Status;
11182f6a1a81SJung-uk Kim UINT64 ConvertedInteger;
1119f15e9afbSJung-uk Kim char ErrBuf[128];
1120f15e9afbSJung-uk Kim const ACPI_EXCEPTION_INFO *ExceptionInfo;
112153289f6aSNate Lawson
112253289f6aSNate Lawson
11232f6a1a81SJung-uk Kim Status = AcpiUtStrtoul64 (String, &ConvertedInteger);
112453289f6aSNate Lawson if (ACPI_FAILURE (Status))
112553289f6aSNate Lawson {
1126f15e9afbSJung-uk Kim ExceptionInfo = AcpiUtValidateException ((ACPI_STATUS) Status);
1127f15e9afbSJung-uk Kim sprintf (ErrBuf, " %s while converting to 64-bit integer",
1128f15e9afbSJung-uk Kim ExceptionInfo->Description);
11292f6a1a81SJung-uk Kim
11306f1f1a63SJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_SYNTAX, AslGbl_CurrentLineNumber,
11316f1f1a63SJung-uk Kim AslGbl_LogicalLineNumber, AslGbl_CurrentLineOffset,
11326f1f1a63SJung-uk Kim AslGbl_CurrentColumn, AslGbl_Files[ASL_FILE_INPUT].Filename, ErrBuf);
113353289f6aSNate Lawson }
113453289f6aSNate Lawson
11352f6a1a81SJung-uk Kim return (ConvertedInteger);
113653289f6aSNate Lawson }
1137a009b7dcSJung-uk Kim
1138a009b7dcSJung-uk Kim
1139a009b7dcSJung-uk Kim /******************************************************************************
1140a009b7dcSJung-uk Kim *
1141a009b7dcSJung-uk Kim * FUNCTION: AcpiUtStrdup
1142a009b7dcSJung-uk Kim *
1143a009b7dcSJung-uk Kim * PARAMETERS: String1 - string to duplicate
1144a009b7dcSJung-uk Kim *
1145a009b7dcSJung-uk Kim * RETURN: int that signifies string relationship. Zero means strings
1146a009b7dcSJung-uk Kim * are equal.
1147a009b7dcSJung-uk Kim *
1148a009b7dcSJung-uk Kim * DESCRIPTION: Duplicate the string using UtCacheAlloc to avoid manual memory
1149a009b7dcSJung-uk Kim * reclamation.
1150a009b7dcSJung-uk Kim *
1151a009b7dcSJung-uk Kim ******************************************************************************/
1152a009b7dcSJung-uk Kim
1153a009b7dcSJung-uk Kim char *
AcpiUtStrdup(char * String)1154a009b7dcSJung-uk Kim AcpiUtStrdup (
1155a009b7dcSJung-uk Kim char *String)
1156a009b7dcSJung-uk Kim {
1157a009b7dcSJung-uk Kim char *NewString = (char *) UtLocalCalloc (strlen (String) + 1);
1158a009b7dcSJung-uk Kim
1159a009b7dcSJung-uk Kim
1160a009b7dcSJung-uk Kim strcpy (NewString, String);
1161a009b7dcSJung-uk Kim return (NewString);
1162a009b7dcSJung-uk Kim }
1163a009b7dcSJung-uk Kim
1164a009b7dcSJung-uk Kim
1165a009b7dcSJung-uk Kim /******************************************************************************
1166a009b7dcSJung-uk Kim *
1167a009b7dcSJung-uk Kim * FUNCTION: AcpiUtStrcat
1168a009b7dcSJung-uk Kim *
1169a009b7dcSJung-uk Kim * PARAMETERS: String1
1170a009b7dcSJung-uk Kim * String2
1171a009b7dcSJung-uk Kim *
1172a009b7dcSJung-uk Kim * RETURN: New string with String1 concatenated with String2
1173a009b7dcSJung-uk Kim *
1174a009b7dcSJung-uk Kim * DESCRIPTION: Concatenate string1 and string2
1175a009b7dcSJung-uk Kim *
1176a009b7dcSJung-uk Kim ******************************************************************************/
1177a009b7dcSJung-uk Kim
1178a009b7dcSJung-uk Kim char *
AcpiUtStrcat(char * String1,char * String2)1179a009b7dcSJung-uk Kim AcpiUtStrcat (
1180a009b7dcSJung-uk Kim char *String1,
1181a009b7dcSJung-uk Kim char *String2)
1182a009b7dcSJung-uk Kim {
1183a009b7dcSJung-uk Kim UINT32 String1Length = strlen (String1);
1184a009b7dcSJung-uk Kim char *NewString = (char *) UtLocalCalloc (strlen (String1) + strlen (String2) + 1);
1185a009b7dcSJung-uk Kim
1186a009b7dcSJung-uk Kim strcpy (NewString, String1);
1187a009b7dcSJung-uk Kim strcpy (NewString + String1Length, String2);
1188a009b7dcSJung-uk Kim return (NewString);
1189a009b7dcSJung-uk Kim }
1190