xref: /freebsd/sys/contrib/dev/acpica/compiler/aslutils.c (revision f15e9afb1f64d00403e702d41934dacc425582d7)
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  *
11f425b8beSJung-uk Kim  * Some or all of this work - Copyright (c) 1999 - 2020, 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
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 
209f8146b88SJung-uk Kim /******************************************************************************
210f8146b88SJung-uk Kim  *
211f8146b88SJung-uk Kim  * FUNCTION:    UtQueryForOverwrite
212f8146b88SJung-uk Kim  *
213f8146b88SJung-uk Kim  * PARAMETERS:  Pathname            - Output filename
214f8146b88SJung-uk Kim  *
215f8146b88SJung-uk Kim  * RETURN:      TRUE if file does not exist or overwrite is authorized
216f8146b88SJung-uk Kim  *
217f8146b88SJung-uk Kim  * DESCRIPTION: Query for file overwrite if it already exists.
218f8146b88SJung-uk Kim  *
219f8146b88SJung-uk Kim  ******************************************************************************/
220f8146b88SJung-uk Kim 
221f8146b88SJung-uk Kim BOOLEAN
222f8146b88SJung-uk Kim UtQueryForOverwrite (
223f8146b88SJung-uk Kim     char                    *Pathname)
224f8146b88SJung-uk Kim {
225f8146b88SJung-uk Kim     struct stat             StatInfo;
226a009b7dcSJung-uk Kim     int                     InChar;
227f8146b88SJung-uk Kim 
228f8146b88SJung-uk Kim 
229f8146b88SJung-uk Kim     if (!stat (Pathname, &StatInfo))
230f8146b88SJung-uk Kim     {
231f8146b88SJung-uk Kim         fprintf (stderr, "Target file \"%s\" already exists, overwrite? [y|n] ",
232f8146b88SJung-uk Kim             Pathname);
233f8146b88SJung-uk Kim 
234a009b7dcSJung-uk Kim         InChar = fgetc (stdin);
235a009b7dcSJung-uk Kim         if (InChar == '\n')
236a009b7dcSJung-uk Kim         {
237a009b7dcSJung-uk Kim             InChar = fgetc (stdin);
238a009b7dcSJung-uk Kim         }
239a009b7dcSJung-uk Kim 
240a009b7dcSJung-uk Kim         if ((InChar != 'y') && (InChar != 'Y'))
241f8146b88SJung-uk Kim         {
242f8146b88SJung-uk Kim             return (FALSE);
243f8146b88SJung-uk Kim         }
244f8146b88SJung-uk Kim     }
245f8146b88SJung-uk Kim 
246f8146b88SJung-uk Kim     return (TRUE);
247f8146b88SJung-uk Kim }
248f8146b88SJung-uk Kim 
249f8146b88SJung-uk Kim 
250f8146b88SJung-uk Kim /*******************************************************************************
251f8146b88SJung-uk Kim  *
252835b56bfSJung-uk Kim  * FUNCTION:    UtNodeIsDescendantOf
253835b56bfSJung-uk Kim  *
254835b56bfSJung-uk Kim  * PARAMETERS:  Node1                   - Child node
255835b56bfSJung-uk Kim  *              Node2                   - Possible parent node
256835b56bfSJung-uk Kim  *
257835b56bfSJung-uk Kim  * RETURN:      Boolean
258835b56bfSJung-uk Kim  *
259835b56bfSJung-uk Kim  * DESCRIPTION: Returns TRUE if Node1 is a descendant of Node2. Otherwise,
260835b56bfSJung-uk Kim  *              return FALSE. Note, we assume a NULL Node2 element to be the
261835b56bfSJung-uk Kim  *              topmost (root) scope. All nodes are descendants of the root.
262835b56bfSJung-uk Kim  *              Note: Nodes at the same level (siblings) are not considered
263835b56bfSJung-uk Kim  *              descendants.
264835b56bfSJung-uk Kim  *
265835b56bfSJung-uk Kim  ******************************************************************************/
266835b56bfSJung-uk Kim 
267835b56bfSJung-uk Kim BOOLEAN
268835b56bfSJung-uk Kim UtNodeIsDescendantOf (
269835b56bfSJung-uk Kim     ACPI_NAMESPACE_NODE     *Node1,
270835b56bfSJung-uk Kim     ACPI_NAMESPACE_NODE     *Node2)
271835b56bfSJung-uk Kim {
272835b56bfSJung-uk Kim 
273835b56bfSJung-uk Kim     if (Node1 == Node2)
274835b56bfSJung-uk Kim     {
275835b56bfSJung-uk Kim         return (FALSE);
276835b56bfSJung-uk Kim     }
277835b56bfSJung-uk Kim 
278835b56bfSJung-uk Kim     if (!Node2)
279835b56bfSJung-uk Kim     {
280835b56bfSJung-uk Kim         return (TRUE); /* All nodes descend from the root */
281835b56bfSJung-uk Kim     }
282835b56bfSJung-uk Kim 
283835b56bfSJung-uk Kim     /* Walk upward until the root is reached or parent is found */
284835b56bfSJung-uk Kim 
285835b56bfSJung-uk Kim     while (Node1)
286835b56bfSJung-uk Kim     {
287835b56bfSJung-uk Kim         if (Node1 == Node2)
288835b56bfSJung-uk Kim         {
289835b56bfSJung-uk Kim             return (TRUE);
290835b56bfSJung-uk Kim         }
291835b56bfSJung-uk Kim 
292835b56bfSJung-uk Kim         Node1 = Node1->Parent;
293835b56bfSJung-uk Kim     }
294835b56bfSJung-uk Kim 
295835b56bfSJung-uk Kim     return (FALSE);
296835b56bfSJung-uk Kim }
297835b56bfSJung-uk Kim 
298835b56bfSJung-uk Kim 
299835b56bfSJung-uk Kim /*******************************************************************************
300835b56bfSJung-uk Kim  *
301ec0234b4SJung-uk Kim  * FUNCTION:    UtGetParentMethodNode
302835b56bfSJung-uk Kim  *
303835b56bfSJung-uk Kim  * PARAMETERS:  Node                    - Namespace node for any object
304835b56bfSJung-uk Kim  *
305835b56bfSJung-uk Kim  * RETURN:      Namespace node for the parent method
306835b56bfSJung-uk Kim  *              NULL - object is not within a method
307835b56bfSJung-uk Kim  *
308835b56bfSJung-uk Kim  * DESCRIPTION: Find the parent (owning) method node for a namespace object
309835b56bfSJung-uk Kim  *
310835b56bfSJung-uk Kim  ******************************************************************************/
311835b56bfSJung-uk Kim 
312ec0234b4SJung-uk Kim ACPI_NAMESPACE_NODE *
313ec0234b4SJung-uk Kim UtGetParentMethodNode (
314835b56bfSJung-uk Kim     ACPI_NAMESPACE_NODE     *Node)
315835b56bfSJung-uk Kim {
316835b56bfSJung-uk Kim     ACPI_NAMESPACE_NODE     *ParentNode;
317835b56bfSJung-uk Kim 
318835b56bfSJung-uk Kim 
319835b56bfSJung-uk Kim     if (!Node)
320835b56bfSJung-uk Kim     {
321835b56bfSJung-uk Kim         return (NULL);
322835b56bfSJung-uk Kim     }
323835b56bfSJung-uk Kim 
324835b56bfSJung-uk Kim     /* Walk upward until a method is found, or the root is reached */
325835b56bfSJung-uk Kim 
326835b56bfSJung-uk Kim     ParentNode = Node->Parent;
327835b56bfSJung-uk Kim     while (ParentNode)
328835b56bfSJung-uk Kim     {
329835b56bfSJung-uk Kim         if (ParentNode->Type == ACPI_TYPE_METHOD)
330835b56bfSJung-uk Kim         {
331835b56bfSJung-uk Kim             return (ParentNode);
332835b56bfSJung-uk Kim         }
333835b56bfSJung-uk Kim 
334835b56bfSJung-uk Kim         ParentNode = ParentNode->Parent;
335835b56bfSJung-uk Kim     }
336835b56bfSJung-uk Kim 
337835b56bfSJung-uk Kim     return (NULL); /* Object is not within a control method */
338835b56bfSJung-uk Kim }
339835b56bfSJung-uk Kim 
340835b56bfSJung-uk Kim 
341835b56bfSJung-uk Kim /*******************************************************************************
342835b56bfSJung-uk Kim  *
343ec0234b4SJung-uk Kim  * FUNCTION:    UtGetParentMethodOp
344ec0234b4SJung-uk Kim  *
345ec0234b4SJung-uk Kim  * PARAMETERS:  Op                      - Parse Op to be checked
346ec0234b4SJung-uk Kim  *
347ec0234b4SJung-uk Kim  * RETURN:      Control method Op if found. NULL otherwise
348ec0234b4SJung-uk Kim  *
349ec0234b4SJung-uk Kim  * DESCRIPTION: Find the control method parent of a parse op. Returns NULL if
350ec0234b4SJung-uk Kim  *              the input Op is not within a control method.
351ec0234b4SJung-uk Kim  *
352ec0234b4SJung-uk Kim  ******************************************************************************/
353ec0234b4SJung-uk Kim 
354ec0234b4SJung-uk Kim ACPI_PARSE_OBJECT *
355ec0234b4SJung-uk Kim UtGetParentMethodOp (
356ec0234b4SJung-uk Kim     ACPI_PARSE_OBJECT       *Op)
357ec0234b4SJung-uk Kim {
358ec0234b4SJung-uk Kim     ACPI_PARSE_OBJECT       *NextOp;
359ec0234b4SJung-uk Kim 
360ec0234b4SJung-uk Kim 
361ec0234b4SJung-uk Kim     NextOp = Op->Asl.Parent;
362ec0234b4SJung-uk Kim     while (NextOp)
363ec0234b4SJung-uk Kim     {
364ec0234b4SJung-uk Kim         if (NextOp->Asl.AmlOpcode == AML_METHOD_OP)
365ec0234b4SJung-uk Kim         {
366ec0234b4SJung-uk Kim             return (NextOp);
367ec0234b4SJung-uk Kim         }
368ec0234b4SJung-uk Kim 
369ec0234b4SJung-uk Kim         NextOp = NextOp->Asl.Parent;
370ec0234b4SJung-uk Kim     }
371ec0234b4SJung-uk Kim 
372ec0234b4SJung-uk Kim     return (NULL); /* No parent method found */
373ec0234b4SJung-uk Kim }
374ec0234b4SJung-uk Kim 
375ec0234b4SJung-uk Kim 
376ec0234b4SJung-uk Kim /*******************************************************************************
377ec0234b4SJung-uk Kim  *
378a88e22b7SJung-uk Kim  * FUNCTION:    UtDisplaySupportedTables
379a88e22b7SJung-uk Kim  *
380a88e22b7SJung-uk Kim  * PARAMETERS:  None
381a88e22b7SJung-uk Kim  *
382a88e22b7SJung-uk Kim  * RETURN:      None
383a88e22b7SJung-uk Kim  *
384a88e22b7SJung-uk Kim  * DESCRIPTION: Print all supported ACPI table names.
385a88e22b7SJung-uk Kim  *
386a88e22b7SJung-uk Kim  ******************************************************************************/
387a88e22b7SJung-uk Kim 
388a88e22b7SJung-uk Kim void
389a88e22b7SJung-uk Kim UtDisplaySupportedTables (
390a88e22b7SJung-uk Kim     void)
391a88e22b7SJung-uk Kim {
392a371a5fdSJung-uk Kim     const AH_TABLE          *TableData;
3931df130f1SJung-uk Kim     UINT32                  i;
394a88e22b7SJung-uk Kim 
395a88e22b7SJung-uk Kim 
3961df130f1SJung-uk Kim     printf ("\nACPI tables supported by iASL version %8.8X:\n"
3971df130f1SJung-uk Kim         "  (Compiler, Disassembler, Template Generator)\n\n",
3981df130f1SJung-uk Kim         ACPI_CA_VERSION);
399a88e22b7SJung-uk Kim 
400a371a5fdSJung-uk Kim     /* All ACPI tables with the common table header */
401a88e22b7SJung-uk Kim 
402a371a5fdSJung-uk Kim     printf ("\n  Supported ACPI tables:\n");
4036f1f1a63SJung-uk Kim     for (TableData = AcpiGbl_SupportedTables, i = 1;
404a371a5fdSJung-uk Kim          TableData->Signature; TableData++, i++)
405a88e22b7SJung-uk Kim     {
406a371a5fdSJung-uk Kim         printf ("%8u) %s    %s\n", i,
407a371a5fdSJung-uk Kim             TableData->Signature, TableData->Description);
408a88e22b7SJung-uk Kim     }
409a88e22b7SJung-uk Kim }
410a88e22b7SJung-uk Kim 
411a88e22b7SJung-uk Kim 
412a88e22b7SJung-uk Kim /*******************************************************************************
413a88e22b7SJung-uk Kim  *
414f38b0f21SJung-uk Kim  * FUNCTION:    UtDisplayConstantOpcodes
41553289f6aSNate Lawson  *
41653289f6aSNate Lawson  * PARAMETERS:  None
41753289f6aSNate Lawson  *
41853289f6aSNate Lawson  * RETURN:      None
41953289f6aSNate Lawson  *
42053289f6aSNate Lawson  * DESCRIPTION: Print AML opcodes that can be used in constant expressions.
42153289f6aSNate Lawson  *
42253289f6aSNate Lawson  ******************************************************************************/
42353289f6aSNate Lawson 
42453289f6aSNate Lawson void
42553289f6aSNate Lawson UtDisplayConstantOpcodes (
42653289f6aSNate Lawson     void)
42753289f6aSNate Lawson {
42853289f6aSNate Lawson     UINT32                  i;
42953289f6aSNate Lawson 
430fba7fc7eSJung-uk Kim 
43153289f6aSNate Lawson     printf ("Constant expression opcode information\n\n");
43253289f6aSNate Lawson 
43353289f6aSNate Lawson     for (i = 0; i < sizeof (AcpiGbl_AmlOpInfo) / sizeof (ACPI_OPCODE_INFO); i++)
43453289f6aSNate Lawson     {
43553289f6aSNate Lawson         if (AcpiGbl_AmlOpInfo[i].Flags & AML_CONSTANT)
43653289f6aSNate Lawson         {
43753289f6aSNate Lawson             printf ("%s\n", AcpiGbl_AmlOpInfo[i].Name);
43853289f6aSNate Lawson         }
43953289f6aSNate Lawson     }
44053289f6aSNate Lawson }
44153289f6aSNate Lawson 
44253289f6aSNate Lawson 
44353289f6aSNate Lawson /*******************************************************************************
44453289f6aSNate Lawson  *
44553289f6aSNate Lawson  * FUNCTION:    UtBeginEvent
44653289f6aSNate Lawson  *
447fba7fc7eSJung-uk Kim  * PARAMETERS:  Name                - Ascii name of this event
44853289f6aSNate Lawson  *
449f38b0f21SJung-uk Kim  * RETURN:      Event number (integer index)
45053289f6aSNate Lawson  *
45153289f6aSNate Lawson  * DESCRIPTION: Saves the current time with this event
45253289f6aSNate Lawson  *
45353289f6aSNate Lawson  ******************************************************************************/
45453289f6aSNate Lawson 
455fba7fc7eSJung-uk Kim UINT8
45653289f6aSNate Lawson UtBeginEvent (
45753289f6aSNate Lawson     char                    *Name)
45853289f6aSNate Lawson {
45953289f6aSNate Lawson 
460fba7fc7eSJung-uk Kim     if (AslGbl_NextEvent >= ASL_NUM_EVENTS)
461fba7fc7eSJung-uk Kim     {
462fba7fc7eSJung-uk Kim         AcpiOsPrintf ("Ran out of compiler event structs!\n");
463fba7fc7eSJung-uk Kim         return (AslGbl_NextEvent);
464fba7fc7eSJung-uk Kim     }
465fba7fc7eSJung-uk Kim 
466fba7fc7eSJung-uk Kim     /* Init event with current (start) time */
467fba7fc7eSJung-uk Kim 
468fba7fc7eSJung-uk Kim     AslGbl_Events[AslGbl_NextEvent].StartTime = AcpiOsGetTimer ();
469fba7fc7eSJung-uk Kim     AslGbl_Events[AslGbl_NextEvent].EventName = Name;
470fba7fc7eSJung-uk Kim     AslGbl_Events[AslGbl_NextEvent].Valid = TRUE;
471fba7fc7eSJung-uk Kim     return (AslGbl_NextEvent++);
47253289f6aSNate Lawson }
47353289f6aSNate Lawson 
47453289f6aSNate Lawson 
47553289f6aSNate Lawson /*******************************************************************************
47653289f6aSNate Lawson  *
47753289f6aSNate Lawson  * FUNCTION:    UtEndEvent
47853289f6aSNate Lawson  *
47953289f6aSNate Lawson  * PARAMETERS:  Event               - Event number (integer index)
48053289f6aSNate Lawson  *
48153289f6aSNate Lawson  * RETURN:      None
48253289f6aSNate Lawson  *
48353289f6aSNate Lawson  * DESCRIPTION: Saves the current time (end time) with this event
48453289f6aSNate Lawson  *
48553289f6aSNate Lawson  ******************************************************************************/
48653289f6aSNate Lawson 
48753289f6aSNate Lawson void
48853289f6aSNate Lawson UtEndEvent (
489fba7fc7eSJung-uk Kim     UINT8                   Event)
49053289f6aSNate Lawson {
49153289f6aSNate Lawson 
492fba7fc7eSJung-uk Kim     if (Event >= ASL_NUM_EVENTS)
493fba7fc7eSJung-uk Kim     {
494fba7fc7eSJung-uk Kim         return;
495fba7fc7eSJung-uk Kim     }
496fba7fc7eSJung-uk Kim 
497fba7fc7eSJung-uk Kim     /* Insert end time for event */
498fba7fc7eSJung-uk Kim 
499fba7fc7eSJung-uk Kim     AslGbl_Events[Event].EndTime = AcpiOsGetTimer ();
50053289f6aSNate Lawson }
50153289f6aSNate Lawson 
50253289f6aSNate Lawson 
50353289f6aSNate Lawson /*******************************************************************************
50453289f6aSNate Lawson  *
50553289f6aSNate Lawson  * FUNCTION:    DbgPrint
50653289f6aSNate Lawson  *
507fba7fc7eSJung-uk Kim  * PARAMETERS:  Type                - Type of output
508fba7fc7eSJung-uk Kim  *              Fmt                 - Printf format string
50953289f6aSNate Lawson  *              ...                 - variable printf list
51053289f6aSNate Lawson  *
51153289f6aSNate Lawson  * RETURN:      None
51253289f6aSNate Lawson  *
51353289f6aSNate Lawson  * DESCRIPTION: Conditional print statement. Prints to stderr only if the
51453289f6aSNate Lawson  *              debug flag is set.
51553289f6aSNate Lawson  *
51653289f6aSNate Lawson  ******************************************************************************/
51753289f6aSNate Lawson 
51853289f6aSNate Lawson void
51953289f6aSNate Lawson DbgPrint (
52053289f6aSNate Lawson     UINT32                  Type,
52153289f6aSNate Lawson     char                    *Fmt,
52253289f6aSNate Lawson     ...)
52353289f6aSNate Lawson {
52453289f6aSNate Lawson     va_list                 Args;
52553289f6aSNate Lawson 
52653289f6aSNate Lawson 
5276f1f1a63SJung-uk Kim     if (!AslGbl_DebugFlag)
52853289f6aSNate Lawson     {
52953289f6aSNate Lawson         return;
53053289f6aSNate Lawson     }
53153289f6aSNate Lawson 
53253289f6aSNate Lawson     if ((Type == ASL_PARSE_OUTPUT) &&
53353289f6aSNate Lawson         (!(AslCompilerdebug)))
53453289f6aSNate Lawson     {
53553289f6aSNate Lawson         return;
53653289f6aSNate Lawson     }
53753289f6aSNate Lawson 
5388d744e47SJung-uk Kim     va_start (Args, Fmt);
53953289f6aSNate Lawson     (void) vfprintf (stderr, Fmt, Args);
54053289f6aSNate Lawson     va_end (Args);
54153289f6aSNate Lawson     return;
54253289f6aSNate Lawson }
54353289f6aSNate Lawson 
54453289f6aSNate Lawson 
54553289f6aSNate Lawson /*******************************************************************************
54653289f6aSNate Lawson  *
54753289f6aSNate Lawson  * FUNCTION:    UtSetParseOpName
54853289f6aSNate Lawson  *
549f38b0f21SJung-uk Kim  * PARAMETERS:  Op                  - Parse op to be named.
55053289f6aSNate Lawson  *
55153289f6aSNate Lawson  * RETURN:      None
55253289f6aSNate Lawson  *
55353289f6aSNate Lawson  * DESCRIPTION: Insert the ascii name of the parse opcode
55453289f6aSNate Lawson  *
55553289f6aSNate Lawson  ******************************************************************************/
55653289f6aSNate Lawson 
55753289f6aSNate Lawson void
55853289f6aSNate Lawson UtSetParseOpName (
55953289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op)
56053289f6aSNate Lawson {
561fba7fc7eSJung-uk Kim 
562f1db5ef7SJung-uk Kim     AcpiUtSafeStrncpy (Op->Asl.ParseOpName, UtGetOpName (Op->Asl.ParseOpcode),
5631a39cfb0SJung-uk Kim         ACPI_MAX_PARSEOP_NAME);
56453289f6aSNate Lawson }
56553289f6aSNate Lawson 
56653289f6aSNate Lawson 
56753289f6aSNate Lawson /*******************************************************************************
56853289f6aSNate Lawson  *
56944b0f624SJung-uk Kim  * FUNCTION:    UtDisplayOneSummary
57053289f6aSNate Lawson  *
571fba7fc7eSJung-uk Kim  * PARAMETERS:  FileID              - ID of outpout file
57253289f6aSNate Lawson  *
57353289f6aSNate Lawson  * RETURN:      None
57453289f6aSNate Lawson  *
57544b0f624SJung-uk Kim  * DESCRIPTION: Display compilation statistics for one input file
57653289f6aSNate Lawson  *
57753289f6aSNate Lawson  ******************************************************************************/
57853289f6aSNate Lawson 
57953289f6aSNate Lawson void
58044b0f624SJung-uk Kim UtDisplayOneSummary (
58144b0f624SJung-uk Kim     UINT32                  FileId,
58244b0f624SJung-uk Kim     BOOLEAN                 DisplayErrorSummary)
58353289f6aSNate Lawson {
5843f0275a0SJung-uk Kim     UINT32                  i;
58544b0f624SJung-uk Kim     ASL_GLOBAL_FILE_NODE    *FileNode;
5869ad8b64eSJung-uk Kim     BOOLEAN                 DisplayAMLSummary;
5873f0275a0SJung-uk Kim 
58853289f6aSNate Lawson 
5899ad8b64eSJung-uk Kim     DisplayAMLSummary =
5909ad8b64eSJung-uk Kim         !AslGbl_PreprocessOnly && !AslGbl_ParserErrorDetected &&
5919ad8b64eSJung-uk Kim         ((AslGbl_ExceptionCount[ASL_ERROR] == 0) || AslGbl_IgnoreErrors) &&
5929ad8b64eSJung-uk Kim         AslGbl_Files[ASL_FILE_AML_OUTPUT].Handle;
5939ad8b64eSJung-uk Kim 
59453289f6aSNate Lawson     if (FileId != ASL_FILE_STDOUT)
59553289f6aSNate Lawson     {
59653289f6aSNate Lawson         /* Compiler name and version number */
59753289f6aSNate Lawson 
59861673a1fSJung-uk Kim         FlPrintFile (FileId, "%s version %X\n\n",
59961673a1fSJung-uk Kim             ASL_COMPILER_NAME, (UINT32) ACPI_CA_VERSION);
60053289f6aSNate Lawson     }
60153289f6aSNate Lawson 
6023f0275a0SJung-uk Kim     /* Summary of main input and output files */
6033f0275a0SJung-uk Kim 
60444b0f624SJung-uk Kim     FileNode = FlGetCurrentFileNode ();
605a009b7dcSJung-uk Kim 
60644b0f624SJung-uk Kim     if (FileNode->ParserErrorDetected)
60744b0f624SJung-uk Kim     {
60853289f6aSNate Lawson         FlPrintFile (FileId,
60944b0f624SJung-uk Kim             "%-14s %s - Compilation aborted due to parser-detected syntax error(s)\n",
610a009b7dcSJung-uk Kim             "Input file:", AslGbl_Files[ASL_FILE_INPUT].Filename);
61144b0f624SJung-uk Kim     }
612a009b7dcSJung-uk Kim     else if (FileNode->FileType == ASL_INPUT_TYPE_ASCII_DATA)
613a009b7dcSJung-uk Kim     {
614a009b7dcSJung-uk Kim         FlPrintFile (FileId,
615a009b7dcSJung-uk Kim             "%-14s %s - %7u bytes %6u fields %8u source lines\n",
616a009b7dcSJung-uk Kim             "Table Input:",
617a009b7dcSJung-uk Kim             AslGbl_Files[ASL_FILE_INPUT].Filename,
618a009b7dcSJung-uk Kim             FileNode->OriginalInputFileSize, FileNode->TotalFields,
619a009b7dcSJung-uk Kim             FileNode->TotalLineCount);
620a009b7dcSJung-uk Kim 
621a009b7dcSJung-uk Kim         FlPrintFile (FileId,
622a009b7dcSJung-uk Kim             "%-14s %s - %7u bytes\n",
623a009b7dcSJung-uk Kim             "Binary Output:",
624a009b7dcSJung-uk Kim             AslGbl_Files[ASL_FILE_AML_OUTPUT].Filename, FileNode->OutputByteLength);
625a009b7dcSJung-uk Kim     }
626a009b7dcSJung-uk Kim     else if (FileNode->FileType == ASL_INPUT_TYPE_ASCII_ASL)
62744b0f624SJung-uk Kim     {
62844b0f624SJung-uk Kim         FlPrintFile (FileId,
62944b0f624SJung-uk Kim             "%-14s %s - %7u bytes %6u keywords %6u source lines\n",
6303f0275a0SJung-uk Kim             "ASL Input:",
63144b0f624SJung-uk Kim             AslGbl_Files[ASL_FILE_INPUT].Filename,
63244b0f624SJung-uk Kim             FileNode->OriginalInputFileSize,
63344b0f624SJung-uk Kim             FileNode->TotalKeywords,
63444b0f624SJung-uk Kim             FileNode->TotalLineCount);
63553289f6aSNate Lawson 
63653289f6aSNate Lawson         /* AML summary */
63753289f6aSNate Lawson 
6389ad8b64eSJung-uk Kim         if (DisplayAMLSummary)
6395ef50723SJung-uk Kim         {
64053289f6aSNate Lawson             FlPrintFile (FileId,
64144b0f624SJung-uk Kim                 "%-14s %s - %7u bytes %6u opcodes  %6u named objects\n",
6423f0275a0SJung-uk Kim                 "AML Output:",
6436f1f1a63SJung-uk Kim                 AslGbl_Files[ASL_FILE_AML_OUTPUT].Filename,
644f8146b88SJung-uk Kim                 FlGetFileSize (ASL_FILE_AML_OUTPUT),
64544b0f624SJung-uk Kim                 FileNode->TotalExecutableOpcodes,
64644b0f624SJung-uk Kim                 FileNode->TotalNamedObjects);
64753289f6aSNate Lawson         }
648a88e22b7SJung-uk Kim     }
64953289f6aSNate Lawson 
6503f0275a0SJung-uk Kim     /* Display summary of any optional files */
6513f0275a0SJung-uk Kim 
6523f0275a0SJung-uk Kim     for (i = ASL_FILE_SOURCE_OUTPUT; i <= ASL_MAX_FILE_TYPE; i++)
6533f0275a0SJung-uk Kim     {
6546f1f1a63SJung-uk Kim         if (!AslGbl_Files[i].Filename || !AslGbl_Files[i].Handle)
6553f0275a0SJung-uk Kim         {
6563f0275a0SJung-uk Kim             continue;
6573f0275a0SJung-uk Kim         }
6583f0275a0SJung-uk Kim 
6593f0275a0SJung-uk Kim         /* .SRC is a temp file unless specifically requested */
6603f0275a0SJung-uk Kim 
6616f1f1a63SJung-uk Kim         if ((i == ASL_FILE_SOURCE_OUTPUT) && (!AslGbl_SourceOutputFlag))
6623f0275a0SJung-uk Kim         {
6633f0275a0SJung-uk Kim             continue;
6643f0275a0SJung-uk Kim         }
6653f0275a0SJung-uk Kim 
6665ef50723SJung-uk Kim         /* .PRE is the preprocessor intermediate file */
6674c52cad2SJung-uk Kim 
6686f1f1a63SJung-uk Kim         if ((i == ASL_FILE_PREPROCESSOR)  && (!AslGbl_KeepPreprocessorTempFile))
6694c52cad2SJung-uk Kim         {
6704c52cad2SJung-uk Kim             continue;
6714c52cad2SJung-uk Kim         }
6724c52cad2SJung-uk Kim 
6739ad8b64eSJung-uk Kim         FlPrintFile (FileId, "%-14s %s - %7u bytes\n",
67444b0f624SJung-uk Kim             AslGbl_FileDescs[i].ShortDescription,
6756f1f1a63SJung-uk Kim             AslGbl_Files[i].Filename, FlGetFileSize (i));
6763f0275a0SJung-uk Kim     }
6773f0275a0SJung-uk Kim 
67844b0f624SJung-uk Kim 
67944b0f624SJung-uk Kim     /*
68044b0f624SJung-uk Kim      * Optionally emit an error summary for a file. This is used to enhance the
68144b0f624SJung-uk Kim      * appearance of listing files.
68244b0f624SJung-uk Kim      */
68344b0f624SJung-uk Kim     if (DisplayErrorSummary)
68444b0f624SJung-uk Kim     {
68544b0f624SJung-uk Kim         UtDisplayErrorSummary (FileId);
68644b0f624SJung-uk Kim     }
68744b0f624SJung-uk Kim }
68844b0f624SJung-uk Kim 
68944b0f624SJung-uk Kim 
69044b0f624SJung-uk Kim /*******************************************************************************
69144b0f624SJung-uk Kim  *
69244b0f624SJung-uk Kim  * FUNCTION:    UtDisplayErrorSummary
69344b0f624SJung-uk Kim  *
69444b0f624SJung-uk Kim  * PARAMETERS:  FileID              - ID of outpout file
69544b0f624SJung-uk Kim  *
69644b0f624SJung-uk Kim  * RETURN:      None
69744b0f624SJung-uk Kim  *
69844b0f624SJung-uk Kim  * DESCRIPTION: Display compilation statistics for all input files
69944b0f624SJung-uk Kim  *
70044b0f624SJung-uk Kim  ******************************************************************************/
70144b0f624SJung-uk Kim 
70244b0f624SJung-uk Kim static void
70344b0f624SJung-uk Kim UtDisplayErrorSummary (
70444b0f624SJung-uk Kim     UINT32                  FileId)
70544b0f624SJung-uk Kim {
70644b0f624SJung-uk Kim     BOOLEAN                 ErrorDetected;
70744b0f624SJung-uk Kim 
70844b0f624SJung-uk Kim 
70944b0f624SJung-uk Kim     ErrorDetected = AslGbl_ParserErrorDetected ||
71044b0f624SJung-uk Kim         ((AslGbl_ExceptionCount[ASL_ERROR] > 0) && !AslGbl_IgnoreErrors);
71144b0f624SJung-uk Kim 
71244b0f624SJung-uk Kim     if (ErrorDetected)
71344b0f624SJung-uk Kim     {
71444b0f624SJung-uk Kim         FlPrintFile (FileId, "\nCompilation failed. ");
71544b0f624SJung-uk Kim     }
71644b0f624SJung-uk Kim     else
71744b0f624SJung-uk Kim     {
71844b0f624SJung-uk Kim         FlPrintFile (FileId, "\nCompilation successful. ");
71944b0f624SJung-uk Kim     }
72053289f6aSNate Lawson 
72153289f6aSNate Lawson     FlPrintFile (FileId,
72244b0f624SJung-uk Kim         "%u Errors, %u Warnings, %u Remarks",
7236f1f1a63SJung-uk Kim         AslGbl_ExceptionCount[ASL_ERROR],
7246f1f1a63SJung-uk Kim         AslGbl_ExceptionCount[ASL_WARNING] +
7256f1f1a63SJung-uk Kim             AslGbl_ExceptionCount[ASL_WARNING2] +
7266f1f1a63SJung-uk Kim             AslGbl_ExceptionCount[ASL_WARNING3],
7276f1f1a63SJung-uk Kim         AslGbl_ExceptionCount[ASL_REMARK]);
728a88e22b7SJung-uk Kim 
7296f1f1a63SJung-uk Kim     if (AslGbl_FileType != ASL_INPUT_TYPE_ASCII_DATA)
730a88e22b7SJung-uk Kim     {
73144b0f624SJung-uk Kim         if (AslGbl_ParserErrorDetected)
73244b0f624SJung-uk Kim         {
73344b0f624SJung-uk Kim             FlPrintFile (FileId,
73444b0f624SJung-uk Kim                 "\nNo AML files were generated due to syntax error(s)\n");
73544b0f624SJung-uk Kim             return;
73644b0f624SJung-uk Kim         }
73744b0f624SJung-uk Kim         else if (ErrorDetected)
73844b0f624SJung-uk Kim         {
73944b0f624SJung-uk Kim             FlPrintFile (FileId,
74044b0f624SJung-uk Kim                 "\nNo AML files were generated due to compiler error(s)\n");
74144b0f624SJung-uk Kim             return;
74244b0f624SJung-uk Kim         }
74344b0f624SJung-uk Kim 
7447cf3e94aSJung-uk Kim         FlPrintFile (FileId, ", %u Optimizations",
7456f1f1a63SJung-uk Kim             AslGbl_ExceptionCount[ASL_OPTIMIZATION]);
7467cf3e94aSJung-uk Kim 
7476f1f1a63SJung-uk Kim         if (AslGbl_TotalFolds)
7487cf3e94aSJung-uk Kim         {
7496f1f1a63SJung-uk Kim             FlPrintFile (FileId, ", %u Constants Folded", AslGbl_TotalFolds);
7507cf3e94aSJung-uk Kim         }
751a88e22b7SJung-uk Kim     }
752a88e22b7SJung-uk Kim 
753a88e22b7SJung-uk Kim     FlPrintFile (FileId, "\n");
75453289f6aSNate Lawson }
75553289f6aSNate Lawson 
75653289f6aSNate Lawson 
75753289f6aSNate Lawson /*******************************************************************************
75853289f6aSNate Lawson  *
75944b0f624SJung-uk Kim  * FUNCTION:    UtDisplaySummary
76044b0f624SJung-uk Kim  *
76144b0f624SJung-uk Kim  * PARAMETERS:  FileID              - ID of outpout file
76244b0f624SJung-uk Kim  *
76344b0f624SJung-uk Kim  * RETURN:      None
76444b0f624SJung-uk Kim  *
76544b0f624SJung-uk Kim  * DESCRIPTION: Display compilation statistics for all input files
76644b0f624SJung-uk Kim  *
76744b0f624SJung-uk Kim  ******************************************************************************/
76844b0f624SJung-uk Kim 
76944b0f624SJung-uk Kim void
77044b0f624SJung-uk Kim UtDisplaySummary (
77144b0f624SJung-uk Kim     UINT32                  FileId)
77244b0f624SJung-uk Kim {
77344b0f624SJung-uk Kim     ASL_GLOBAL_FILE_NODE    *Current = AslGbl_FilesList;
77444b0f624SJung-uk Kim 
77544b0f624SJung-uk Kim 
77644b0f624SJung-uk Kim     while (Current)
77744b0f624SJung-uk Kim     {
77844b0f624SJung-uk Kim         switch  (FlSwitchFileSet(Current->Files[ASL_FILE_INPUT].Filename))
77944b0f624SJung-uk Kim         {
78044b0f624SJung-uk Kim             case SWITCH_TO_SAME_FILE:
78144b0f624SJung-uk Kim             case SWITCH_TO_DIFFERENT_FILE:
78244b0f624SJung-uk Kim 
78344b0f624SJung-uk Kim                 UtDisplayOneSummary (FileId, FALSE);
78444b0f624SJung-uk Kim                 Current = Current->Next;
78544b0f624SJung-uk Kim                 break;
78644b0f624SJung-uk Kim 
78744b0f624SJung-uk Kim             case FILE_NOT_FOUND:
78844b0f624SJung-uk Kim             default:
78944b0f624SJung-uk Kim 
79044b0f624SJung-uk Kim                 Current = NULL;
79144b0f624SJung-uk Kim                 break;
79244b0f624SJung-uk Kim         }
79344b0f624SJung-uk Kim     }
79444b0f624SJung-uk Kim     UtDisplayErrorSummary (FileId);
79544b0f624SJung-uk Kim }
79644b0f624SJung-uk Kim 
79744b0f624SJung-uk Kim /*******************************************************************************
79844b0f624SJung-uk Kim  *
799f38b0f21SJung-uk Kim  * FUNCTION:    UtCheckIntegerRange
80053289f6aSNate Lawson  *
80153289f6aSNate Lawson  * PARAMETERS:  Op                  - Integer parse node
80253289f6aSNate Lawson  *              LowValue            - Smallest allowed value
80353289f6aSNate Lawson  *              HighValue           - Largest allowed value
80453289f6aSNate Lawson  *
80553289f6aSNate Lawson  * RETURN:      Op if OK, otherwise NULL
80653289f6aSNate Lawson  *
80753289f6aSNate Lawson  * DESCRIPTION: Check integer for an allowable range
80853289f6aSNate Lawson  *
80953289f6aSNate Lawson  ******************************************************************************/
81053289f6aSNate Lawson 
81153289f6aSNate Lawson ACPI_PARSE_OBJECT *
81253289f6aSNate Lawson UtCheckIntegerRange (
81353289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
81453289f6aSNate Lawson     UINT32                  LowValue,
81553289f6aSNate Lawson     UINT32                  HighValue)
81653289f6aSNate Lawson {
81753289f6aSNate Lawson 
81853289f6aSNate Lawson     if (!Op)
81953289f6aSNate Lawson     {
8208ef1a331SJung-uk Kim         return (NULL);
82153289f6aSNate Lawson     }
82253289f6aSNate Lawson 
8231df130f1SJung-uk Kim     if ((Op->Asl.Value.Integer < LowValue) ||
8241df130f1SJung-uk Kim         (Op->Asl.Value.Integer > HighValue))
82553289f6aSNate Lawson     {
8266f1f1a63SJung-uk Kim         sprintf (AslGbl_MsgBuffer, "0x%X, allowable: 0x%X-0x%X",
8271df130f1SJung-uk Kim             (UINT32) Op->Asl.Value.Integer, LowValue, HighValue);
8281df130f1SJung-uk Kim 
8296f1f1a63SJung-uk Kim         AslError (ASL_ERROR, ASL_MSG_RANGE, Op, AslGbl_MsgBuffer);
8301df130f1SJung-uk Kim         return (NULL);
83153289f6aSNate Lawson     }
83253289f6aSNate Lawson 
8331df130f1SJung-uk Kim     return (Op);
83453289f6aSNate Lawson }
83553289f6aSNate Lawson 
83653289f6aSNate Lawson 
83753289f6aSNate Lawson /*******************************************************************************
83853289f6aSNate Lawson  *
83953289f6aSNate Lawson  * FUNCTION:    UtInternalizeName
84053289f6aSNate Lawson  *
84153289f6aSNate Lawson  * PARAMETERS:  ExternalName        - Name to convert
84253289f6aSNate Lawson  *              ConvertedName       - Where the converted name is returned
84353289f6aSNate Lawson  *
84453289f6aSNate Lawson  * RETURN:      Status
84553289f6aSNate Lawson  *
84653289f6aSNate Lawson  * DESCRIPTION: Convert an external (ASL) name to an internal (AML) name
84753289f6aSNate Lawson  *
84853289f6aSNate Lawson  ******************************************************************************/
84953289f6aSNate Lawson 
85053289f6aSNate Lawson ACPI_STATUS
85153289f6aSNate Lawson UtInternalizeName (
85253289f6aSNate Lawson     char                    *ExternalName,
85353289f6aSNate Lawson     char                    **ConvertedName)
85453289f6aSNate Lawson {
85553289f6aSNate Lawson     ACPI_NAMESTRING_INFO    Info;
85653289f6aSNate Lawson     ACPI_STATUS             Status;
85753289f6aSNate Lawson 
85853289f6aSNate Lawson 
85953289f6aSNate Lawson     if (!ExternalName)
86053289f6aSNate Lawson     {
86153289f6aSNate Lawson         return (AE_OK);
86253289f6aSNate Lawson     }
86353289f6aSNate Lawson 
86453289f6aSNate Lawson     /* Get the length of the new internal name */
86553289f6aSNate Lawson 
86653289f6aSNate Lawson     Info.ExternalName = ExternalName;
86753289f6aSNate Lawson     AcpiNsGetInternalNameLength (&Info);
86853289f6aSNate Lawson 
86953289f6aSNate Lawson     /* We need a segment to store the internal name */
87053289f6aSNate Lawson 
87167d9aa44SJung-uk Kim     Info.InternalName = UtLocalCacheCalloc (Info.Length);
87253289f6aSNate Lawson 
87353289f6aSNate Lawson     /* Build the name */
87453289f6aSNate Lawson 
87553289f6aSNate Lawson     Status = AcpiNsBuildInternalName (&Info);
87653289f6aSNate Lawson     if (ACPI_FAILURE (Status))
87753289f6aSNate Lawson     {
87853289f6aSNate Lawson         return (Status);
87953289f6aSNate Lawson     }
88053289f6aSNate Lawson 
88153289f6aSNate Lawson     *ConvertedName = Info.InternalName;
88253289f6aSNate Lawson     return (AE_OK);
88353289f6aSNate Lawson }
88453289f6aSNate Lawson 
88553289f6aSNate Lawson 
88653289f6aSNate Lawson /*******************************************************************************
88753289f6aSNate Lawson  *
88853289f6aSNate Lawson  * FUNCTION:    UtPadNameWithUnderscores
88953289f6aSNate Lawson  *
89053289f6aSNate Lawson  * PARAMETERS:  NameSeg             - Input nameseg
89153289f6aSNate Lawson  *              PaddedNameSeg       - Output padded nameseg
89253289f6aSNate Lawson  *
89353289f6aSNate Lawson  * RETURN:      Padded nameseg.
89453289f6aSNate Lawson  *
89553289f6aSNate Lawson  * DESCRIPTION: Pads a NameSeg with underscores if necessary to form a full
89653289f6aSNate Lawson  *              ACPI_NAME.
89753289f6aSNate Lawson  *
89853289f6aSNate Lawson  ******************************************************************************/
89953289f6aSNate Lawson 
900fba7fc7eSJung-uk Kim static void
90153289f6aSNate Lawson UtPadNameWithUnderscores (
90253289f6aSNate Lawson     char                    *NameSeg,
90353289f6aSNate Lawson     char                    *PaddedNameSeg)
90453289f6aSNate Lawson {
90553289f6aSNate Lawson     UINT32                  i;
90653289f6aSNate Lawson 
90753289f6aSNate Lawson 
908278f0de6SJung-uk Kim     for (i = 0; (i < ACPI_NAMESEG_SIZE); i++)
90953289f6aSNate Lawson     {
91053289f6aSNate Lawson         if (*NameSeg)
91153289f6aSNate Lawson         {
91253289f6aSNate Lawson             *PaddedNameSeg = *NameSeg;
91353289f6aSNate Lawson             NameSeg++;
91453289f6aSNate Lawson         }
91553289f6aSNate Lawson         else
91653289f6aSNate Lawson         {
91753289f6aSNate Lawson             *PaddedNameSeg = '_';
91853289f6aSNate Lawson         }
919f8146b88SJung-uk Kim 
92053289f6aSNate Lawson         PaddedNameSeg++;
92153289f6aSNate Lawson     }
92253289f6aSNate Lawson }
92353289f6aSNate Lawson 
92453289f6aSNate Lawson 
92553289f6aSNate Lawson /*******************************************************************************
92653289f6aSNate Lawson  *
92753289f6aSNate Lawson  * FUNCTION:    UtAttachNameseg
92853289f6aSNate Lawson  *
92953289f6aSNate Lawson  * PARAMETERS:  Op                  - Parent parse node
93053289f6aSNate Lawson  *              Name                - Full ExternalName
93153289f6aSNate Lawson  *
932fba7fc7eSJung-uk Kim  * RETURN:      None; Sets the NameSeg field in parent node
93353289f6aSNate Lawson  *
93453289f6aSNate Lawson  * DESCRIPTION: Extract the last nameseg of the ExternalName and store it
93553289f6aSNate Lawson  *              in the NameSeg field of the Op.
93653289f6aSNate Lawson  *
93753289f6aSNate Lawson  ******************************************************************************/
93853289f6aSNate Lawson 
939fba7fc7eSJung-uk Kim static void
94053289f6aSNate Lawson UtAttachNameseg (
94153289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
94253289f6aSNate Lawson     char                    *Name)
94353289f6aSNate Lawson {
94453289f6aSNate Lawson     char                    *NameSeg;
94553289f6aSNate Lawson     char                    PaddedNameSeg[4];
94653289f6aSNate Lawson 
94753289f6aSNate Lawson 
94853289f6aSNate Lawson     if (!Name)
94953289f6aSNate Lawson     {
95053289f6aSNate Lawson         return;
95153289f6aSNate Lawson     }
95253289f6aSNate Lawson 
95353289f6aSNate Lawson     /* Look for the last dot in the namepath */
95453289f6aSNate Lawson 
95553289f6aSNate Lawson     NameSeg = strrchr (Name, '.');
95653289f6aSNate Lawson     if (NameSeg)
95753289f6aSNate Lawson     {
95853289f6aSNate Lawson         /* Found last dot, we have also found the final nameseg */
95953289f6aSNate Lawson 
96053289f6aSNate Lawson         NameSeg++;
96153289f6aSNate Lawson         UtPadNameWithUnderscores (NameSeg, PaddedNameSeg);
96253289f6aSNate Lawson     }
96353289f6aSNate Lawson     else
96453289f6aSNate Lawson     {
96553289f6aSNate Lawson         /* No dots in the namepath, there is only a single nameseg. */
96653289f6aSNate Lawson         /* Handle prefixes */
96753289f6aSNate Lawson 
968efcc2a30SJung-uk Kim         while (ACPI_IS_ROOT_PREFIX (*Name) ||
969efcc2a30SJung-uk Kim                ACPI_IS_PARENT_PREFIX (*Name))
97053289f6aSNate Lawson         {
97153289f6aSNate Lawson             Name++;
97253289f6aSNate Lawson         }
97353289f6aSNate Lawson 
9748ef1a331SJung-uk Kim         /* Remaining string should be one single nameseg */
97553289f6aSNate Lawson 
97653289f6aSNate Lawson         UtPadNameWithUnderscores (Name, PaddedNameSeg);
97753289f6aSNate Lawson     }
97853289f6aSNate Lawson 
979278f0de6SJung-uk Kim     ACPI_COPY_NAMESEG (Op->Asl.NameSeg, PaddedNameSeg);
98053289f6aSNate Lawson }
98153289f6aSNate Lawson 
98253289f6aSNate Lawson 
98353289f6aSNate Lawson /*******************************************************************************
98453289f6aSNate Lawson  *
98553289f6aSNate Lawson  * FUNCTION:    UtAttachNamepathToOwner
98653289f6aSNate Lawson  *
98753289f6aSNate Lawson  * PARAMETERS:  Op                  - Parent parse node
98853289f6aSNate Lawson  *              NameOp              - Node that contains the name
98953289f6aSNate Lawson  *
99053289f6aSNate Lawson  * RETURN:      Sets the ExternalName and Namepath in the parent node
99153289f6aSNate Lawson  *
99253289f6aSNate Lawson  * DESCRIPTION: Store the name in two forms in the parent node: The original
99353289f6aSNate Lawson  *              (external) name, and the internalized name that is used within
99453289f6aSNate Lawson  *              the ACPI namespace manager.
99553289f6aSNate Lawson  *
99653289f6aSNate Lawson  ******************************************************************************/
99753289f6aSNate Lawson 
99853289f6aSNate Lawson void
99953289f6aSNate Lawson UtAttachNamepathToOwner (
100053289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
100153289f6aSNate Lawson     ACPI_PARSE_OBJECT       *NameOp)
100253289f6aSNate Lawson {
100353289f6aSNate Lawson     ACPI_STATUS             Status;
100453289f6aSNate Lawson 
100553289f6aSNate Lawson 
100653289f6aSNate Lawson     /* Full external path */
100753289f6aSNate Lawson 
100853289f6aSNate Lawson     Op->Asl.ExternalName = NameOp->Asl.Value.String;
100953289f6aSNate Lawson 
1010fba7fc7eSJung-uk Kim     /* Save the NameOp for possible error reporting later */
1011fba7fc7eSJung-uk Kim 
1012fba7fc7eSJung-uk Kim     Op->Asl.ParentMethod = (void *) NameOp;
1013fba7fc7eSJung-uk Kim 
101453289f6aSNate Lawson     /* Last nameseg of the path */
101553289f6aSNate Lawson 
101653289f6aSNate Lawson     UtAttachNameseg (Op, Op->Asl.ExternalName);
101753289f6aSNate Lawson 
101853289f6aSNate Lawson     /* Create internalized path */
101953289f6aSNate Lawson 
102053289f6aSNate Lawson     Status = UtInternalizeName (NameOp->Asl.Value.String, &Op->Asl.Namepath);
102153289f6aSNate Lawson     if (ACPI_FAILURE (Status))
102253289f6aSNate Lawson     {
102353289f6aSNate Lawson         /* TBD: abort on no memory */
102453289f6aSNate Lawson     }
102553289f6aSNate Lawson }
102653289f6aSNate Lawson 
102753289f6aSNate Lawson 
102853289f6aSNate Lawson /*******************************************************************************
102953289f6aSNate Lawson  *
1030a009b7dcSJung-uk Kim  * FUNCTION:    UtNameContainsAllPrefix
1031a009b7dcSJung-uk Kim  *
1032a009b7dcSJung-uk Kim  * PARAMETERS:  Op                  - Op containing NameString
1033a009b7dcSJung-uk Kim  *
1034a009b7dcSJung-uk Kim  * RETURN:      NameString consists of all ^ characters
1035a009b7dcSJung-uk Kim  *
1036a009b7dcSJung-uk Kim  * DESCRIPTION: Determine if this Op contains a name segment that consists of
1037a009b7dcSJung-uk Kim  *              all '^' characters.
1038a009b7dcSJung-uk Kim  *
1039a009b7dcSJung-uk Kim  ******************************************************************************/
1040a009b7dcSJung-uk Kim 
1041a009b7dcSJung-uk Kim BOOLEAN
1042a009b7dcSJung-uk Kim UtNameContainsAllPrefix (
1043a009b7dcSJung-uk Kim     ACPI_PARSE_OBJECT       *Op)
1044a009b7dcSJung-uk Kim {
1045a009b7dcSJung-uk Kim     UINT32                  Length = Op->Asl.AmlLength;
1046a009b7dcSJung-uk Kim     UINT32                  i;
1047a009b7dcSJung-uk Kim 
1048a009b7dcSJung-uk Kim     for (i = 0; i < Length; i++)
1049a009b7dcSJung-uk Kim     {
1050a009b7dcSJung-uk Kim         if (Op->Asl.Value.String[i] != '^')
1051a009b7dcSJung-uk Kim         {
1052a009b7dcSJung-uk Kim             return (FALSE);
1053a009b7dcSJung-uk Kim         }
1054a009b7dcSJung-uk Kim     }
1055a009b7dcSJung-uk Kim 
1056a009b7dcSJung-uk Kim     return (TRUE);
1057a009b7dcSJung-uk Kim }
1058a009b7dcSJung-uk Kim 
1059a009b7dcSJung-uk Kim /*******************************************************************************
1060a009b7dcSJung-uk Kim  *
106153289f6aSNate Lawson  * FUNCTION:    UtDoConstant
106253289f6aSNate Lawson  *
10632f6a1a81SJung-uk Kim  * PARAMETERS:  String              - Hex/Decimal/Octal
106453289f6aSNate Lawson  *
106553289f6aSNate Lawson  * RETURN:      Converted Integer
106653289f6aSNate Lawson  *
10672f6a1a81SJung-uk Kim  * DESCRIPTION: Convert a string to an integer, with overflow/error checking.
106853289f6aSNate Lawson  *
106953289f6aSNate Lawson  ******************************************************************************/
107053289f6aSNate Lawson 
10719a179dd8SJung-uk Kim UINT64
107253289f6aSNate Lawson UtDoConstant (
107353289f6aSNate Lawson     char                    *String)
107453289f6aSNate Lawson {
107553289f6aSNate Lawson     ACPI_STATUS             Status;
10762f6a1a81SJung-uk Kim     UINT64                  ConvertedInteger;
1077*f15e9afbSJung-uk Kim     char                    ErrBuf[128];
1078*f15e9afbSJung-uk Kim     const ACPI_EXCEPTION_INFO *ExceptionInfo;
107953289f6aSNate Lawson 
108053289f6aSNate Lawson 
10812f6a1a81SJung-uk Kim     Status = AcpiUtStrtoul64 (String, &ConvertedInteger);
108253289f6aSNate Lawson     if (ACPI_FAILURE (Status))
108353289f6aSNate Lawson     {
1084*f15e9afbSJung-uk Kim         ExceptionInfo = AcpiUtValidateException ((ACPI_STATUS) Status);
1085*f15e9afbSJung-uk Kim         sprintf (ErrBuf, " %s while converting to 64-bit integer",
1086*f15e9afbSJung-uk Kim             ExceptionInfo->Description);
10872f6a1a81SJung-uk Kim 
10886f1f1a63SJung-uk Kim         AslCommonError (ASL_ERROR, ASL_MSG_SYNTAX, AslGbl_CurrentLineNumber,
10896f1f1a63SJung-uk Kim             AslGbl_LogicalLineNumber, AslGbl_CurrentLineOffset,
10906f1f1a63SJung-uk Kim             AslGbl_CurrentColumn, AslGbl_Files[ASL_FILE_INPUT].Filename, ErrBuf);
109153289f6aSNate Lawson     }
109253289f6aSNate Lawson 
10932f6a1a81SJung-uk Kim     return (ConvertedInteger);
109453289f6aSNate Lawson }
1095a009b7dcSJung-uk Kim 
1096a009b7dcSJung-uk Kim 
1097a009b7dcSJung-uk Kim /******************************************************************************
1098a009b7dcSJung-uk Kim  *
1099a009b7dcSJung-uk Kim  * FUNCTION:    AcpiUtStrdup
1100a009b7dcSJung-uk Kim  *
1101a009b7dcSJung-uk Kim  * PARAMETERS:  String1             - string to duplicate
1102a009b7dcSJung-uk Kim  *
1103a009b7dcSJung-uk Kim  * RETURN:      int that signifies string relationship. Zero means strings
1104a009b7dcSJung-uk Kim  *              are equal.
1105a009b7dcSJung-uk Kim  *
1106a009b7dcSJung-uk Kim  * DESCRIPTION: Duplicate the string using UtCacheAlloc to avoid manual memory
1107a009b7dcSJung-uk Kim  *              reclamation.
1108a009b7dcSJung-uk Kim  *
1109a009b7dcSJung-uk Kim  ******************************************************************************/
1110a009b7dcSJung-uk Kim 
1111a009b7dcSJung-uk Kim char *
1112a009b7dcSJung-uk Kim AcpiUtStrdup (
1113a009b7dcSJung-uk Kim     char                    *String)
1114a009b7dcSJung-uk Kim {
1115a009b7dcSJung-uk Kim     char                    *NewString = (char *) UtLocalCalloc (strlen (String) + 1);
1116a009b7dcSJung-uk Kim 
1117a009b7dcSJung-uk Kim 
1118a009b7dcSJung-uk Kim     strcpy (NewString, String);
1119a009b7dcSJung-uk Kim     return (NewString);
1120a009b7dcSJung-uk Kim }
1121a009b7dcSJung-uk Kim 
1122a009b7dcSJung-uk Kim 
1123a009b7dcSJung-uk Kim /******************************************************************************
1124a009b7dcSJung-uk Kim  *
1125a009b7dcSJung-uk Kim  * FUNCTION:    AcpiUtStrcat
1126a009b7dcSJung-uk Kim  *
1127a009b7dcSJung-uk Kim  * PARAMETERS:  String1
1128a009b7dcSJung-uk Kim  *              String2
1129a009b7dcSJung-uk Kim  *
1130a009b7dcSJung-uk Kim  * RETURN:      New string with String1 concatenated with String2
1131a009b7dcSJung-uk Kim  *
1132a009b7dcSJung-uk Kim  * DESCRIPTION: Concatenate string1 and string2
1133a009b7dcSJung-uk Kim  *
1134a009b7dcSJung-uk Kim  ******************************************************************************/
1135a009b7dcSJung-uk Kim 
1136a009b7dcSJung-uk Kim char *
1137a009b7dcSJung-uk Kim AcpiUtStrcat (
1138a009b7dcSJung-uk Kim     char                    *String1,
1139a009b7dcSJung-uk Kim     char                    *String2)
1140a009b7dcSJung-uk Kim {
1141a009b7dcSJung-uk Kim     UINT32                  String1Length = strlen (String1);
1142a009b7dcSJung-uk Kim     char                    *NewString = (char *) UtLocalCalloc (strlen (String1) + strlen (String2) + 1);
1143a009b7dcSJung-uk Kim 
1144a009b7dcSJung-uk Kim     strcpy (NewString, String1);
1145a009b7dcSJung-uk Kim     strcpy (NewString + String1Length, String2);
1146a009b7dcSJung-uk Kim     return (NewString);
1147a009b7dcSJung-uk Kim }
1148