xref: /freebsd/sys/contrib/dev/acpica/compiler/aslutils.c (revision 0d84335f991f528c6f038e79dd5cc0a7770532da)
153289f6aSNate Lawson /******************************************************************************
253289f6aSNate Lawson  *
353289f6aSNate Lawson  * Module Name: aslutils -- compiler utilities
453289f6aSNate Lawson  *
553289f6aSNate Lawson  *****************************************************************************/
653289f6aSNate Lawson 
7*0d84335fSJung-uk Kim /******************************************************************************
8*0d84335fSJung-uk Kim  *
9*0d84335fSJung-uk Kim  * 1. Copyright Notice
10*0d84335fSJung-uk Kim  *
11*0d84335fSJung-uk Kim  * Some or all of this work - Copyright (c) 1999 - 2017, Intel Corp.
1253289f6aSNate Lawson  * All rights reserved.
1353289f6aSNate Lawson  *
14*0d84335fSJung-uk Kim  * 2. License
15*0d84335fSJung-uk Kim  *
16*0d84335fSJung-uk Kim  * 2.1. This is your license from Intel Corp. under its intellectual property
17*0d84335fSJung-uk Kim  * rights. You may have additional license terms from the party that provided
18*0d84335fSJung-uk Kim  * you this software, covering your right to use that party's intellectual
19*0d84335fSJung-uk Kim  * property rights.
20*0d84335fSJung-uk Kim  *
21*0d84335fSJung-uk Kim  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22*0d84335fSJung-uk Kim  * copy of the source code appearing in this file ("Covered Code") an
23*0d84335fSJung-uk Kim  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24*0d84335fSJung-uk Kim  * base code distributed originally by Intel ("Original Intel Code") to copy,
25*0d84335fSJung-uk Kim  * make derivatives, distribute, use and display any portion of the Covered
26*0d84335fSJung-uk Kim  * Code in any form, with the right to sublicense such rights; and
27*0d84335fSJung-uk Kim  *
28*0d84335fSJung-uk Kim  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29*0d84335fSJung-uk Kim  * license (with the right to sublicense), under only those claims of Intel
30*0d84335fSJung-uk Kim  * patents that are infringed by the Original Intel Code, to make, use, sell,
31*0d84335fSJung-uk Kim  * offer to sell, and import the Covered Code and derivative works thereof
32*0d84335fSJung-uk Kim  * solely to the minimum extent necessary to exercise the above copyright
33*0d84335fSJung-uk Kim  * license, and in no event shall the patent license extend to any additions
34*0d84335fSJung-uk Kim  * to or modifications of the Original Intel Code. No other license or right
35*0d84335fSJung-uk Kim  * is granted directly or by implication, estoppel or otherwise;
36*0d84335fSJung-uk Kim  *
37*0d84335fSJung-uk Kim  * The above copyright and patent license is granted only if the following
38*0d84335fSJung-uk Kim  * conditions are met:
39*0d84335fSJung-uk Kim  *
40*0d84335fSJung-uk Kim  * 3. Conditions
41*0d84335fSJung-uk Kim  *
42*0d84335fSJung-uk Kim  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43*0d84335fSJung-uk Kim  * Redistribution of source code of any substantial portion of the Covered
44*0d84335fSJung-uk Kim  * Code or modification with rights to further distribute source must include
45*0d84335fSJung-uk Kim  * the above Copyright Notice, the above License, this list of Conditions,
46*0d84335fSJung-uk Kim  * and the following Disclaimer and Export Compliance provision. In addition,
47*0d84335fSJung-uk Kim  * Licensee must cause all Covered Code to which Licensee contributes to
48*0d84335fSJung-uk Kim  * contain a file documenting the changes Licensee made to create that Covered
49*0d84335fSJung-uk Kim  * Code and the date of any change. Licensee must include in that file the
50*0d84335fSJung-uk Kim  * documentation of any changes made by any predecessor Licensee. Licensee
51*0d84335fSJung-uk Kim  * must include a prominent statement that the modification is derived,
52*0d84335fSJung-uk Kim  * directly or indirectly, from Original Intel Code.
53*0d84335fSJung-uk Kim  *
54*0d84335fSJung-uk Kim  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55*0d84335fSJung-uk Kim  * Redistribution of source code of any substantial portion of the Covered
56*0d84335fSJung-uk Kim  * Code or modification without rights to further distribute source must
57*0d84335fSJung-uk Kim  * include the following Disclaimer and Export Compliance provision in the
58*0d84335fSJung-uk Kim  * documentation and/or other materials provided with distribution. In
59*0d84335fSJung-uk Kim  * addition, Licensee may not authorize further sublicense of source of any
60*0d84335fSJung-uk Kim  * portion of the Covered Code, and must include terms to the effect that the
61*0d84335fSJung-uk Kim  * license from Licensee to its licensee is limited to the intellectual
62*0d84335fSJung-uk Kim  * property embodied in the software Licensee provides to its licensee, and
63*0d84335fSJung-uk Kim  * not to intellectual property embodied in modifications its licensee may
64*0d84335fSJung-uk Kim  * make.
65*0d84335fSJung-uk Kim  *
66*0d84335fSJung-uk Kim  * 3.3. Redistribution of Executable. Redistribution in executable form of any
67*0d84335fSJung-uk Kim  * substantial portion of the Covered Code or modification must reproduce the
68*0d84335fSJung-uk Kim  * above Copyright Notice, and the following Disclaimer and Export Compliance
69*0d84335fSJung-uk Kim  * provision in the documentation and/or other materials provided with the
70*0d84335fSJung-uk Kim  * distribution.
71*0d84335fSJung-uk Kim  *
72*0d84335fSJung-uk Kim  * 3.4. Intel retains all right, title, and interest in and to the Original
73*0d84335fSJung-uk Kim  * Intel Code.
74*0d84335fSJung-uk Kim  *
75*0d84335fSJung-uk Kim  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76*0d84335fSJung-uk Kim  * Intel shall be used in advertising or otherwise to promote the sale, use or
77*0d84335fSJung-uk Kim  * other dealings in products derived from or relating to the Covered Code
78*0d84335fSJung-uk Kim  * without prior written authorization from Intel.
79*0d84335fSJung-uk Kim  *
80*0d84335fSJung-uk Kim  * 4. Disclaimer and Export Compliance
81*0d84335fSJung-uk Kim  *
82*0d84335fSJung-uk Kim  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83*0d84335fSJung-uk Kim  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84*0d84335fSJung-uk Kim  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85*0d84335fSJung-uk Kim  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86*0d84335fSJung-uk Kim  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87*0d84335fSJung-uk Kim  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88*0d84335fSJung-uk Kim  * PARTICULAR PURPOSE.
89*0d84335fSJung-uk Kim  *
90*0d84335fSJung-uk Kim  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91*0d84335fSJung-uk Kim  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92*0d84335fSJung-uk Kim  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93*0d84335fSJung-uk Kim  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94*0d84335fSJung-uk Kim  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95*0d84335fSJung-uk Kim  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96*0d84335fSJung-uk Kim  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97*0d84335fSJung-uk Kim  * LIMITED REMEDY.
98*0d84335fSJung-uk Kim  *
99*0d84335fSJung-uk Kim  * 4.3. Licensee shall not export, either directly or indirectly, any of this
100*0d84335fSJung-uk Kim  * software or system incorporating such software without first obtaining any
101*0d84335fSJung-uk Kim  * required license or other approval from the U. S. Department of Commerce or
102*0d84335fSJung-uk Kim  * any other agency or department of the United States Government. In the
103*0d84335fSJung-uk Kim  * event Licensee exports any such software from the United States or
104*0d84335fSJung-uk Kim  * re-exports any such software from a foreign destination, Licensee shall
105*0d84335fSJung-uk Kim  * ensure that the distribution and export/re-export of the software is in
106*0d84335fSJung-uk Kim  * compliance with all laws, regulations, orders, or other restrictions of the
107*0d84335fSJung-uk Kim  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108*0d84335fSJung-uk Kim  * any of its subsidiaries will export/re-export any technical data, process,
109*0d84335fSJung-uk Kim  * software, or service, directly or indirectly, to any country for which the
110*0d84335fSJung-uk Kim  * United States government or any agency thereof requires an export license,
111*0d84335fSJung-uk Kim  * other governmental approval, or letter of assurance, without first obtaining
112*0d84335fSJung-uk Kim  * such license, approval or letter.
113*0d84335fSJung-uk Kim  *
114*0d84335fSJung-uk Kim  *****************************************************************************
115*0d84335fSJung-uk Kim  *
116*0d84335fSJung-uk Kim  * Alternatively, you may choose to be licensed under the terms of the
117*0d84335fSJung-uk Kim  * following license:
118*0d84335fSJung-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  *
134*0d84335fSJung-uk Kim  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
135*0d84335fSJung-uk Kim  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
136*0d84335fSJung-uk Kim  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
137*0d84335fSJung-uk Kim  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
138*0d84335fSJung-uk Kim  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
139*0d84335fSJung-uk Kim  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
140*0d84335fSJung-uk Kim  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
141*0d84335fSJung-uk Kim  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
142*0d84335fSJung-uk Kim  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
143*0d84335fSJung-uk Kim  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
144*0d84335fSJung-uk Kim  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
145*0d84335fSJung-uk Kim  *
146*0d84335fSJung-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  *
150*0d84335fSJung-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 
17753289f6aSNate Lawson 
17853289f6aSNate Lawson /*******************************************************************************
17953289f6aSNate Lawson  *
180f8146b88SJung-uk Kim  * FUNCTION:    UtIsBigEndianMachine
181f8146b88SJung-uk Kim  *
182f8146b88SJung-uk Kim  * PARAMETERS:  None
183f8146b88SJung-uk Kim  *
184f8146b88SJung-uk Kim  * RETURN:      TRUE if machine is big endian
185f8146b88SJung-uk Kim  *              FALSE if machine is little endian
186f8146b88SJung-uk Kim  *
187f8146b88SJung-uk Kim  * DESCRIPTION: Detect whether machine is little endian or big endian.
188f8146b88SJung-uk Kim  *
189f8146b88SJung-uk Kim  ******************************************************************************/
190f8146b88SJung-uk Kim 
191f8146b88SJung-uk Kim UINT8
192f8146b88SJung-uk Kim UtIsBigEndianMachine (
193f8146b88SJung-uk Kim     void)
194f8146b88SJung-uk Kim {
195f8146b88SJung-uk Kim     union {
196f8146b88SJung-uk Kim         UINT32              Integer;
197f8146b88SJung-uk Kim         UINT8               Bytes[4];
198f8146b88SJung-uk Kim     } Overlay =                 {0xFF000000};
199f8146b88SJung-uk Kim 
200f8146b88SJung-uk Kim 
201f8146b88SJung-uk Kim     return (Overlay.Bytes[0]); /* Returns 0xFF (TRUE) for big endian */
202f8146b88SJung-uk Kim }
203f8146b88SJung-uk Kim 
204f8146b88SJung-uk Kim 
205f8146b88SJung-uk Kim /******************************************************************************
206f8146b88SJung-uk Kim  *
207f8146b88SJung-uk Kim  * FUNCTION:    UtQueryForOverwrite
208f8146b88SJung-uk Kim  *
209f8146b88SJung-uk Kim  * PARAMETERS:  Pathname            - Output filename
210f8146b88SJung-uk Kim  *
211f8146b88SJung-uk Kim  * RETURN:      TRUE if file does not exist or overwrite is authorized
212f8146b88SJung-uk Kim  *
213f8146b88SJung-uk Kim  * DESCRIPTION: Query for file overwrite if it already exists.
214f8146b88SJung-uk Kim  *
215f8146b88SJung-uk Kim  ******************************************************************************/
216f8146b88SJung-uk Kim 
217f8146b88SJung-uk Kim BOOLEAN
218f8146b88SJung-uk Kim UtQueryForOverwrite (
219f8146b88SJung-uk Kim     char                    *Pathname)
220f8146b88SJung-uk Kim {
221f8146b88SJung-uk Kim     struct stat             StatInfo;
222f8146b88SJung-uk Kim 
223f8146b88SJung-uk Kim 
224f8146b88SJung-uk Kim     if (!stat (Pathname, &StatInfo))
225f8146b88SJung-uk Kim     {
226f8146b88SJung-uk Kim         fprintf (stderr, "Target file \"%s\" already exists, overwrite? [y|n] ",
227f8146b88SJung-uk Kim             Pathname);
228f8146b88SJung-uk Kim 
229f8146b88SJung-uk Kim         if (getchar () != 'y')
230f8146b88SJung-uk Kim         {
231f8146b88SJung-uk Kim             return (FALSE);
232f8146b88SJung-uk Kim         }
233f8146b88SJung-uk Kim     }
234f8146b88SJung-uk Kim 
235f8146b88SJung-uk Kim     return (TRUE);
236f8146b88SJung-uk Kim }
237f8146b88SJung-uk Kim 
238f8146b88SJung-uk Kim 
239f8146b88SJung-uk Kim /*******************************************************************************
240f8146b88SJung-uk Kim  *
241a88e22b7SJung-uk Kim  * FUNCTION:    UtDisplaySupportedTables
242a88e22b7SJung-uk Kim  *
243a88e22b7SJung-uk Kim  * PARAMETERS:  None
244a88e22b7SJung-uk Kim  *
245a88e22b7SJung-uk Kim  * RETURN:      None
246a88e22b7SJung-uk Kim  *
247a88e22b7SJung-uk Kim  * DESCRIPTION: Print all supported ACPI table names.
248a88e22b7SJung-uk Kim  *
249a88e22b7SJung-uk Kim  ******************************************************************************/
250a88e22b7SJung-uk Kim 
251a88e22b7SJung-uk Kim void
252a88e22b7SJung-uk Kim UtDisplaySupportedTables (
253a88e22b7SJung-uk Kim     void)
254a88e22b7SJung-uk Kim {
255a371a5fdSJung-uk Kim     const AH_TABLE          *TableData;
2561df130f1SJung-uk Kim     UINT32                  i;
257a88e22b7SJung-uk Kim 
258a88e22b7SJung-uk Kim 
2591df130f1SJung-uk Kim     printf ("\nACPI tables supported by iASL version %8.8X:\n"
2601df130f1SJung-uk Kim         "  (Compiler, Disassembler, Template Generator)\n\n",
2611df130f1SJung-uk Kim         ACPI_CA_VERSION);
262a88e22b7SJung-uk Kim 
263a371a5fdSJung-uk Kim     /* All ACPI tables with the common table header */
264a88e22b7SJung-uk Kim 
265a371a5fdSJung-uk Kim     printf ("\n  Supported ACPI tables:\n");
26628482948SJung-uk Kim     for (TableData = Gbl_AcpiSupportedTables, i = 1;
267a371a5fdSJung-uk Kim          TableData->Signature; TableData++, i++)
268a88e22b7SJung-uk Kim     {
269a371a5fdSJung-uk Kim         printf ("%8u) %s    %s\n", i,
270a371a5fdSJung-uk Kim             TableData->Signature, TableData->Description);
271a88e22b7SJung-uk Kim     }
272a88e22b7SJung-uk Kim }
273a88e22b7SJung-uk Kim 
274a88e22b7SJung-uk Kim 
275a88e22b7SJung-uk Kim /*******************************************************************************
276a88e22b7SJung-uk Kim  *
277f38b0f21SJung-uk Kim  * FUNCTION:    UtDisplayConstantOpcodes
27853289f6aSNate Lawson  *
27953289f6aSNate Lawson  * PARAMETERS:  None
28053289f6aSNate Lawson  *
28153289f6aSNate Lawson  * RETURN:      None
28253289f6aSNate Lawson  *
28353289f6aSNate Lawson  * DESCRIPTION: Print AML opcodes that can be used in constant expressions.
28453289f6aSNate Lawson  *
28553289f6aSNate Lawson  ******************************************************************************/
28653289f6aSNate Lawson 
28753289f6aSNate Lawson void
28853289f6aSNate Lawson UtDisplayConstantOpcodes (
28953289f6aSNate Lawson     void)
29053289f6aSNate Lawson {
29153289f6aSNate Lawson     UINT32                  i;
29253289f6aSNate Lawson 
293fba7fc7eSJung-uk Kim 
29453289f6aSNate Lawson     printf ("Constant expression opcode information\n\n");
29553289f6aSNate Lawson 
29653289f6aSNate Lawson     for (i = 0; i < sizeof (AcpiGbl_AmlOpInfo) / sizeof (ACPI_OPCODE_INFO); i++)
29753289f6aSNate Lawson     {
29853289f6aSNate Lawson         if (AcpiGbl_AmlOpInfo[i].Flags & AML_CONSTANT)
29953289f6aSNate Lawson         {
30053289f6aSNate Lawson             printf ("%s\n", AcpiGbl_AmlOpInfo[i].Name);
30153289f6aSNate Lawson         }
30253289f6aSNate Lawson     }
30353289f6aSNate Lawson }
30453289f6aSNate Lawson 
30553289f6aSNate Lawson 
30653289f6aSNate Lawson /*******************************************************************************
30753289f6aSNate Lawson  *
30853289f6aSNate Lawson  * FUNCTION:    UtLocalCalloc
30953289f6aSNate Lawson  *
31053289f6aSNate Lawson  * PARAMETERS:  Size                - Bytes to be allocated
31153289f6aSNate Lawson  *
31253289f6aSNate Lawson  * RETURN:      Pointer to the allocated memory. Guaranteed to be valid.
31353289f6aSNate Lawson  *
31453289f6aSNate Lawson  * DESCRIPTION: Allocate zero-initialized memory. Aborts the compile on an
31553289f6aSNate Lawson  *              allocation failure, on the assumption that nothing more can be
31653289f6aSNate Lawson  *              accomplished.
31753289f6aSNate Lawson  *
31853289f6aSNate Lawson  ******************************************************************************/
31953289f6aSNate Lawson 
32053289f6aSNate Lawson void *
32153289f6aSNate Lawson UtLocalCalloc (
32253289f6aSNate Lawson     UINT32                  Size)
32353289f6aSNate Lawson {
32453289f6aSNate Lawson     void                    *Allocated;
32553289f6aSNate Lawson 
32653289f6aSNate Lawson 
3271a39cfb0SJung-uk Kim     Allocated = ACPI_ALLOCATE_ZEROED (Size);
32853289f6aSNate Lawson     if (!Allocated)
32953289f6aSNate Lawson     {
33053289f6aSNate Lawson         AslCommonError (ASL_ERROR, ASL_MSG_MEMORY_ALLOCATION,
33153289f6aSNate Lawson             Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
33253289f6aSNate Lawson             Gbl_InputByteCount, Gbl_CurrentColumn,
33353289f6aSNate Lawson             Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
334a88e22b7SJung-uk Kim 
335a88e22b7SJung-uk Kim         CmCleanupAndExit ();
33653289f6aSNate Lawson         exit (1);
33753289f6aSNate Lawson     }
33853289f6aSNate Lawson 
33953289f6aSNate Lawson     TotalAllocations++;
34053289f6aSNate Lawson     TotalAllocated += Size;
3411a39cfb0SJung-uk Kim     return (Allocated);
34253289f6aSNate Lawson }
34353289f6aSNate Lawson 
34453289f6aSNate Lawson 
34553289f6aSNate Lawson /*******************************************************************************
34653289f6aSNate Lawson  *
34753289f6aSNate Lawson  * FUNCTION:    UtBeginEvent
34853289f6aSNate Lawson  *
349fba7fc7eSJung-uk Kim  * PARAMETERS:  Name                - Ascii name of this event
35053289f6aSNate Lawson  *
351f38b0f21SJung-uk Kim  * RETURN:      Event number (integer index)
35253289f6aSNate Lawson  *
35353289f6aSNate Lawson  * DESCRIPTION: Saves the current time with this event
35453289f6aSNate Lawson  *
35553289f6aSNate Lawson  ******************************************************************************/
35653289f6aSNate Lawson 
357fba7fc7eSJung-uk Kim UINT8
35853289f6aSNate Lawson UtBeginEvent (
35953289f6aSNate Lawson     char                    *Name)
36053289f6aSNate Lawson {
36153289f6aSNate Lawson 
362fba7fc7eSJung-uk Kim     if (AslGbl_NextEvent >= ASL_NUM_EVENTS)
363fba7fc7eSJung-uk Kim     {
364fba7fc7eSJung-uk Kim         AcpiOsPrintf ("Ran out of compiler event structs!\n");
365fba7fc7eSJung-uk Kim         return (AslGbl_NextEvent);
366fba7fc7eSJung-uk Kim     }
367fba7fc7eSJung-uk Kim 
368fba7fc7eSJung-uk Kim     /* Init event with current (start) time */
369fba7fc7eSJung-uk Kim 
370fba7fc7eSJung-uk Kim     AslGbl_Events[AslGbl_NextEvent].StartTime = AcpiOsGetTimer ();
371fba7fc7eSJung-uk Kim     AslGbl_Events[AslGbl_NextEvent].EventName = Name;
372fba7fc7eSJung-uk Kim     AslGbl_Events[AslGbl_NextEvent].Valid = TRUE;
373fba7fc7eSJung-uk Kim     return (AslGbl_NextEvent++);
37453289f6aSNate Lawson }
37553289f6aSNate Lawson 
37653289f6aSNate Lawson 
37753289f6aSNate Lawson /*******************************************************************************
37853289f6aSNate Lawson  *
37953289f6aSNate Lawson  * FUNCTION:    UtEndEvent
38053289f6aSNate Lawson  *
38153289f6aSNate Lawson  * PARAMETERS:  Event               - Event number (integer index)
38253289f6aSNate Lawson  *
38353289f6aSNate Lawson  * RETURN:      None
38453289f6aSNate Lawson  *
38553289f6aSNate Lawson  * DESCRIPTION: Saves the current time (end time) with this event
38653289f6aSNate Lawson  *
38753289f6aSNate Lawson  ******************************************************************************/
38853289f6aSNate Lawson 
38953289f6aSNate Lawson void
39053289f6aSNate Lawson UtEndEvent (
391fba7fc7eSJung-uk Kim     UINT8                   Event)
39253289f6aSNate Lawson {
39353289f6aSNate Lawson 
394fba7fc7eSJung-uk Kim     if (Event >= ASL_NUM_EVENTS)
395fba7fc7eSJung-uk Kim     {
396fba7fc7eSJung-uk Kim         return;
397fba7fc7eSJung-uk Kim     }
398fba7fc7eSJung-uk Kim 
399fba7fc7eSJung-uk Kim     /* Insert end time for event */
400fba7fc7eSJung-uk Kim 
401fba7fc7eSJung-uk Kim     AslGbl_Events[Event].EndTime = AcpiOsGetTimer ();
40253289f6aSNate Lawson }
40353289f6aSNate Lawson 
40453289f6aSNate Lawson 
40553289f6aSNate Lawson /*******************************************************************************
40653289f6aSNate Lawson  *
40753289f6aSNate Lawson  * FUNCTION:    DbgPrint
40853289f6aSNate Lawson  *
409fba7fc7eSJung-uk Kim  * PARAMETERS:  Type                - Type of output
410fba7fc7eSJung-uk Kim  *              Fmt                 - Printf format string
41153289f6aSNate Lawson  *              ...                 - variable printf list
41253289f6aSNate Lawson  *
41353289f6aSNate Lawson  * RETURN:      None
41453289f6aSNate Lawson  *
41553289f6aSNate Lawson  * DESCRIPTION: Conditional print statement. Prints to stderr only if the
41653289f6aSNate Lawson  *              debug flag is set.
41753289f6aSNate Lawson  *
41853289f6aSNate Lawson  ******************************************************************************/
41953289f6aSNate Lawson 
42053289f6aSNate Lawson void
42153289f6aSNate Lawson DbgPrint (
42253289f6aSNate Lawson     UINT32                  Type,
42353289f6aSNate Lawson     char                    *Fmt,
42453289f6aSNate Lawson     ...)
42553289f6aSNate Lawson {
42653289f6aSNate Lawson     va_list                 Args;
42753289f6aSNate Lawson 
42853289f6aSNate Lawson 
42953289f6aSNate Lawson     if (!Gbl_DebugFlag)
43053289f6aSNate Lawson     {
43153289f6aSNate Lawson         return;
43253289f6aSNate Lawson     }
43353289f6aSNate Lawson 
43453289f6aSNate Lawson     if ((Type == ASL_PARSE_OUTPUT) &&
43553289f6aSNate Lawson         (!(AslCompilerdebug)))
43653289f6aSNate Lawson     {
43753289f6aSNate Lawson         return;
43853289f6aSNate Lawson     }
43953289f6aSNate Lawson 
4408d744e47SJung-uk Kim     va_start (Args, Fmt);
44153289f6aSNate Lawson     (void) vfprintf (stderr, Fmt, Args);
44253289f6aSNate Lawson     va_end (Args);
44353289f6aSNate Lawson     return;
44453289f6aSNate Lawson }
44553289f6aSNate Lawson 
44653289f6aSNate Lawson 
44753289f6aSNate Lawson /*******************************************************************************
44853289f6aSNate Lawson  *
44953289f6aSNate Lawson  * FUNCTION:    UtSetParseOpName
45053289f6aSNate Lawson  *
451f38b0f21SJung-uk Kim  * PARAMETERS:  Op                  - Parse op to be named.
45253289f6aSNate Lawson  *
45353289f6aSNate Lawson  * RETURN:      None
45453289f6aSNate Lawson  *
45553289f6aSNate Lawson  * DESCRIPTION: Insert the ascii name of the parse opcode
45653289f6aSNate Lawson  *
45753289f6aSNate Lawson  ******************************************************************************/
45853289f6aSNate Lawson 
45953289f6aSNate Lawson void
46053289f6aSNate Lawson UtSetParseOpName (
46153289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op)
46253289f6aSNate Lawson {
463fba7fc7eSJung-uk Kim 
4641a39cfb0SJung-uk Kim     strncpy (Op->Asl.ParseOpName, UtGetOpName (Op->Asl.ParseOpcode),
4651a39cfb0SJung-uk Kim         ACPI_MAX_PARSEOP_NAME);
46653289f6aSNate Lawson }
46753289f6aSNate Lawson 
46853289f6aSNate Lawson 
46953289f6aSNate Lawson /*******************************************************************************
47053289f6aSNate Lawson  *
47153289f6aSNate Lawson  * FUNCTION:    UtDisplaySummary
47253289f6aSNate Lawson  *
473fba7fc7eSJung-uk Kim  * PARAMETERS:  FileID              - ID of outpout file
47453289f6aSNate Lawson  *
47553289f6aSNate Lawson  * RETURN:      None
47653289f6aSNate Lawson  *
47753289f6aSNate Lawson  * DESCRIPTION: Display compilation statistics
47853289f6aSNate Lawson  *
47953289f6aSNate Lawson  ******************************************************************************/
48053289f6aSNate Lawson 
48153289f6aSNate Lawson void
48253289f6aSNate Lawson UtDisplaySummary (
48353289f6aSNate Lawson     UINT32                  FileId)
48453289f6aSNate Lawson {
4853f0275a0SJung-uk Kim     UINT32                  i;
4863f0275a0SJung-uk Kim 
48753289f6aSNate Lawson 
48853289f6aSNate Lawson     if (FileId != ASL_FILE_STDOUT)
48953289f6aSNate Lawson     {
49053289f6aSNate Lawson         /* Compiler name and version number */
49153289f6aSNate Lawson 
49261673a1fSJung-uk Kim         FlPrintFile (FileId, "%s version %X\n\n",
49361673a1fSJung-uk Kim             ASL_COMPILER_NAME, (UINT32) ACPI_CA_VERSION);
49453289f6aSNate Lawson     }
49553289f6aSNate Lawson 
4963f0275a0SJung-uk Kim     /* Summary of main input and output files */
4973f0275a0SJung-uk Kim 
498a88e22b7SJung-uk Kim     if (Gbl_FileType == ASL_INPUT_TYPE_ASCII_DATA)
499a88e22b7SJung-uk Kim     {
500a88e22b7SJung-uk Kim         FlPrintFile (FileId,
5013f0275a0SJung-uk Kim             "%-14s %s - %u lines, %u bytes, %u fields\n",
5023f0275a0SJung-uk Kim             "Table Input:",
503a88e22b7SJung-uk Kim             Gbl_Files[ASL_FILE_INPUT].Filename, Gbl_CurrentLineNumber,
504a88e22b7SJung-uk Kim             Gbl_InputByteCount, Gbl_InputFieldCount);
505a88e22b7SJung-uk Kim 
506a88e22b7SJung-uk Kim         if ((Gbl_ExceptionCount[ASL_ERROR] == 0) || (Gbl_IgnoreErrors))
507a88e22b7SJung-uk Kim         {
508a88e22b7SJung-uk Kim             FlPrintFile (FileId,
5093f0275a0SJung-uk Kim                 "%-14s %s - %u bytes\n",
5103f0275a0SJung-uk Kim                 "Binary Output:",
511a88e22b7SJung-uk Kim                 Gbl_Files[ASL_FILE_AML_OUTPUT].Filename, Gbl_TableLength);
512a88e22b7SJung-uk Kim         }
513a88e22b7SJung-uk Kim     }
514a88e22b7SJung-uk Kim     else
515a88e22b7SJung-uk Kim     {
51653289f6aSNate Lawson         FlPrintFile (FileId,
5173f0275a0SJung-uk Kim             "%-14s %s - %u lines, %u bytes, %u keywords\n",
5183f0275a0SJung-uk Kim             "ASL Input:",
51953289f6aSNate Lawson             Gbl_Files[ASL_FILE_INPUT].Filename, Gbl_CurrentLineNumber,
5205ef50723SJung-uk Kim             Gbl_OriginalInputFileSize, TotalKeywords);
52153289f6aSNate Lawson 
52253289f6aSNate Lawson         /* AML summary */
52353289f6aSNate Lawson 
52453289f6aSNate Lawson         if ((Gbl_ExceptionCount[ASL_ERROR] == 0) || (Gbl_IgnoreErrors))
52553289f6aSNate Lawson         {
5265ef50723SJung-uk Kim             if (Gbl_Files[ASL_FILE_AML_OUTPUT].Handle)
5275ef50723SJung-uk Kim             {
52853289f6aSNate Lawson                 FlPrintFile (FileId,
529f8146b88SJung-uk Kim                     "%-14s %s - %u bytes, %u named objects, "
530f8146b88SJung-uk Kim                     "%u executable opcodes\n",
5313f0275a0SJung-uk Kim                     "AML Output:",
532f8146b88SJung-uk Kim                     Gbl_Files[ASL_FILE_AML_OUTPUT].Filename,
533f8146b88SJung-uk Kim                     FlGetFileSize (ASL_FILE_AML_OUTPUT),
53453289f6aSNate Lawson                     TotalNamedObjects, TotalExecutableOpcodes);
53553289f6aSNate Lawson             }
536a88e22b7SJung-uk Kim         }
5375ef50723SJung-uk Kim     }
53853289f6aSNate Lawson 
5393f0275a0SJung-uk Kim     /* Display summary of any optional files */
5403f0275a0SJung-uk Kim 
5413f0275a0SJung-uk Kim     for (i = ASL_FILE_SOURCE_OUTPUT; i <= ASL_MAX_FILE_TYPE; i++)
5423f0275a0SJung-uk Kim     {
5433f0275a0SJung-uk Kim         if (!Gbl_Files[i].Filename || !Gbl_Files[i].Handle)
5443f0275a0SJung-uk Kim         {
5453f0275a0SJung-uk Kim             continue;
5463f0275a0SJung-uk Kim         }
5473f0275a0SJung-uk Kim 
5483f0275a0SJung-uk Kim         /* .SRC is a temp file unless specifically requested */
5493f0275a0SJung-uk Kim 
5503f0275a0SJung-uk Kim         if ((i == ASL_FILE_SOURCE_OUTPUT) && (!Gbl_SourceOutputFlag))
5513f0275a0SJung-uk Kim         {
5523f0275a0SJung-uk Kim             continue;
5533f0275a0SJung-uk Kim         }
5543f0275a0SJung-uk Kim 
5555ef50723SJung-uk Kim         /* .PRE is the preprocessor intermediate file */
5564c52cad2SJung-uk Kim 
5575ef50723SJung-uk Kim         if ((i == ASL_FILE_PREPROCESSOR)  && (!Gbl_KeepPreprocessorTempFile))
5584c52cad2SJung-uk Kim         {
5594c52cad2SJung-uk Kim             continue;
5604c52cad2SJung-uk Kim         }
5614c52cad2SJung-uk Kim 
5623f0275a0SJung-uk Kim         FlPrintFile (FileId, "%14s %s - %u bytes\n",
563042ff955SJung-uk Kim             Gbl_Files[i].ShortDescription,
5643f0275a0SJung-uk Kim             Gbl_Files[i].Filename, FlGetFileSize (i));
5653f0275a0SJung-uk Kim     }
5663f0275a0SJung-uk Kim 
56753289f6aSNate Lawson     /* Error summary */
56853289f6aSNate Lawson 
56953289f6aSNate Lawson     FlPrintFile (FileId,
5703f0275a0SJung-uk Kim         "\nCompilation complete. %u Errors, %u Warnings, %u Remarks",
57153289f6aSNate Lawson         Gbl_ExceptionCount[ASL_ERROR],
5721a39cfb0SJung-uk Kim         Gbl_ExceptionCount[ASL_WARNING] +
5731a39cfb0SJung-uk Kim             Gbl_ExceptionCount[ASL_WARNING2] +
5741a39cfb0SJung-uk Kim             Gbl_ExceptionCount[ASL_WARNING3],
575a88e22b7SJung-uk Kim         Gbl_ExceptionCount[ASL_REMARK]);
576a88e22b7SJung-uk Kim 
577a88e22b7SJung-uk Kim     if (Gbl_FileType != ASL_INPUT_TYPE_ASCII_DATA)
578a88e22b7SJung-uk Kim     {
5797cf3e94aSJung-uk Kim         FlPrintFile (FileId, ", %u Optimizations",
5807cf3e94aSJung-uk Kim             Gbl_ExceptionCount[ASL_OPTIMIZATION]);
5817cf3e94aSJung-uk Kim 
5827cf3e94aSJung-uk Kim         if (TotalFolds)
5837cf3e94aSJung-uk Kim         {
5847cf3e94aSJung-uk Kim             FlPrintFile (FileId, ", %u Constants Folded", TotalFolds);
5857cf3e94aSJung-uk Kim         }
586a88e22b7SJung-uk Kim     }
587a88e22b7SJung-uk Kim 
588a88e22b7SJung-uk Kim     FlPrintFile (FileId, "\n");
58953289f6aSNate Lawson }
59053289f6aSNate Lawson 
59153289f6aSNate Lawson 
59253289f6aSNate Lawson /*******************************************************************************
59353289f6aSNate Lawson  *
594f38b0f21SJung-uk Kim  * FUNCTION:    UtCheckIntegerRange
59553289f6aSNate Lawson  *
59653289f6aSNate Lawson  * PARAMETERS:  Op                  - Integer parse node
59753289f6aSNate Lawson  *              LowValue            - Smallest allowed value
59853289f6aSNate Lawson  *              HighValue           - Largest allowed value
59953289f6aSNate Lawson  *
60053289f6aSNate Lawson  * RETURN:      Op if OK, otherwise NULL
60153289f6aSNate Lawson  *
60253289f6aSNate Lawson  * DESCRIPTION: Check integer for an allowable range
60353289f6aSNate Lawson  *
60453289f6aSNate Lawson  ******************************************************************************/
60553289f6aSNate Lawson 
60653289f6aSNate Lawson ACPI_PARSE_OBJECT *
60753289f6aSNate Lawson UtCheckIntegerRange (
60853289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
60953289f6aSNate Lawson     UINT32                  LowValue,
61053289f6aSNate Lawson     UINT32                  HighValue)
61153289f6aSNate Lawson {
61253289f6aSNate Lawson 
61353289f6aSNate Lawson     if (!Op)
61453289f6aSNate Lawson     {
6158ef1a331SJung-uk Kim         return (NULL);
61653289f6aSNate Lawson     }
61753289f6aSNate Lawson 
6181df130f1SJung-uk Kim     if ((Op->Asl.Value.Integer < LowValue) ||
6191df130f1SJung-uk Kim         (Op->Asl.Value.Integer > HighValue))
62053289f6aSNate Lawson     {
6211df130f1SJung-uk Kim         sprintf (MsgBuffer, "0x%X, allowable: 0x%X-0x%X",
6221df130f1SJung-uk Kim             (UINT32) Op->Asl.Value.Integer, LowValue, HighValue);
6231df130f1SJung-uk Kim 
6241df130f1SJung-uk Kim         AslError (ASL_ERROR, ASL_MSG_RANGE, Op, MsgBuffer);
6251df130f1SJung-uk Kim         return (NULL);
62653289f6aSNate Lawson     }
62753289f6aSNate Lawson 
6281df130f1SJung-uk Kim     return (Op);
62953289f6aSNate Lawson }
63053289f6aSNate Lawson 
63153289f6aSNate Lawson 
63253289f6aSNate Lawson /*******************************************************************************
63353289f6aSNate Lawson  *
634313a0c13SJung-uk Kim  * FUNCTION:    UtStringCacheCalloc
63553289f6aSNate Lawson  *
63653289f6aSNate Lawson  * PARAMETERS:  Length              - Size of buffer requested
63753289f6aSNate Lawson  *
63853289f6aSNate Lawson  * RETURN:      Pointer to the buffer. Aborts on allocation failure
63953289f6aSNate Lawson  *
64053289f6aSNate Lawson  * DESCRIPTION: Allocate a string buffer. Bypass the local
64153289f6aSNate Lawson  *              dynamic memory manager for performance reasons (This has a
64253289f6aSNate Lawson  *              major impact on the speed of the compiler.)
64353289f6aSNate Lawson  *
64453289f6aSNate Lawson  ******************************************************************************/
64553289f6aSNate Lawson 
64653289f6aSNate Lawson char *
647313a0c13SJung-uk Kim UtStringCacheCalloc (
64853289f6aSNate Lawson     UINT32                  Length)
64953289f6aSNate Lawson {
65053289f6aSNate Lawson     char                    *Buffer;
651313a0c13SJung-uk Kim     ASL_CACHE_INFO          *Cache;
6521c0e1b6dSJung-uk Kim     UINT32                  CacheSize = ASL_STRING_CACHE_SIZE;
65353289f6aSNate Lawson 
65453289f6aSNate Lawson 
6551c0e1b6dSJung-uk Kim     if (Length > CacheSize)
656313a0c13SJung-uk Kim     {
6571c0e1b6dSJung-uk Kim         CacheSize = Length;
6581c0e1b6dSJung-uk Kim 
6591c0e1b6dSJung-uk Kim         if (Gbl_StringCacheList)
6601c0e1b6dSJung-uk Kim         {
6611c0e1b6dSJung-uk Kim             Cache = UtLocalCalloc (sizeof (Cache->Next) + CacheSize);
6621c0e1b6dSJung-uk Kim 
6631c0e1b6dSJung-uk Kim             /* Link new cache buffer just following head of list */
6641c0e1b6dSJung-uk Kim 
6651c0e1b6dSJung-uk Kim             Cache->Next = Gbl_StringCacheList->Next;
6661c0e1b6dSJung-uk Kim             Gbl_StringCacheList->Next = Cache;
6671c0e1b6dSJung-uk Kim 
6681c0e1b6dSJung-uk Kim             /* Leave cache management pointers alone as they pertain to head */
6691c0e1b6dSJung-uk Kim 
6701c0e1b6dSJung-uk Kim             Gbl_StringCount++;
6711c0e1b6dSJung-uk Kim             Gbl_StringSize += Length;
6721c0e1b6dSJung-uk Kim 
6731c0e1b6dSJung-uk Kim             return (Cache->Buffer);
6741c0e1b6dSJung-uk Kim         }
675313a0c13SJung-uk Kim     }
676313a0c13SJung-uk Kim 
67753289f6aSNate Lawson     if ((Gbl_StringCacheNext + Length) >= Gbl_StringCacheLast)
67853289f6aSNate Lawson     {
679313a0c13SJung-uk Kim         /* Allocate a new buffer */
680313a0c13SJung-uk Kim 
6811c0e1b6dSJung-uk Kim         Cache = UtLocalCalloc (sizeof (Cache->Next) + CacheSize);
682313a0c13SJung-uk Kim 
683313a0c13SJung-uk Kim         /* Link new cache buffer to head of list */
684313a0c13SJung-uk Kim 
685313a0c13SJung-uk Kim         Cache->Next = Gbl_StringCacheList;
686313a0c13SJung-uk Kim         Gbl_StringCacheList = Cache;
687313a0c13SJung-uk Kim 
688313a0c13SJung-uk Kim         /* Setup cache management pointers */
689313a0c13SJung-uk Kim 
690313a0c13SJung-uk Kim         Gbl_StringCacheNext = Cache->Buffer;
6911c0e1b6dSJung-uk Kim         Gbl_StringCacheLast = Gbl_StringCacheNext + CacheSize;
69253289f6aSNate Lawson     }
69353289f6aSNate Lawson 
694313a0c13SJung-uk Kim     Gbl_StringCount++;
695313a0c13SJung-uk Kim     Gbl_StringSize += Length;
696313a0c13SJung-uk Kim 
69753289f6aSNate Lawson     Buffer = Gbl_StringCacheNext;
69853289f6aSNate Lawson     Gbl_StringCacheNext += Length;
69953289f6aSNate Lawson     return (Buffer);
70053289f6aSNate Lawson }
70153289f6aSNate Lawson 
70253289f6aSNate Lawson 
703042ff955SJung-uk Kim /******************************************************************************
704042ff955SJung-uk Kim  *
705042ff955SJung-uk Kim  * FUNCTION:    UtExpandLineBuffers
706042ff955SJung-uk Kim  *
707042ff955SJung-uk Kim  * PARAMETERS:  None. Updates global line buffer pointers.
708042ff955SJung-uk Kim  *
709042ff955SJung-uk Kim  * RETURN:      None. Reallocates the global line buffers
710042ff955SJung-uk Kim  *
711042ff955SJung-uk Kim  * DESCRIPTION: Called if the current line buffer becomes filled. Reallocates
712042ff955SJung-uk Kim  *              all global line buffers and updates Gbl_LineBufferSize. NOTE:
713042ff955SJung-uk Kim  *              Also used for the initial allocation of the buffers, when
714042ff955SJung-uk Kim  *              all of the buffer pointers are NULL. Initial allocations are
715042ff955SJung-uk Kim  *              of size ASL_DEFAULT_LINE_BUFFER_SIZE
716042ff955SJung-uk Kim  *
717042ff955SJung-uk Kim  *****************************************************************************/
718042ff955SJung-uk Kim 
719042ff955SJung-uk Kim void
720042ff955SJung-uk Kim UtExpandLineBuffers (
721042ff955SJung-uk Kim     void)
722042ff955SJung-uk Kim {
723042ff955SJung-uk Kim     UINT32                  NewSize;
724042ff955SJung-uk Kim 
725042ff955SJung-uk Kim 
726042ff955SJung-uk Kim     /* Attempt to double the size of all line buffers */
727042ff955SJung-uk Kim 
728042ff955SJung-uk Kim     NewSize = Gbl_LineBufferSize * 2;
729042ff955SJung-uk Kim     if (Gbl_CurrentLineBuffer)
730042ff955SJung-uk Kim     {
731313a0c13SJung-uk Kim         DbgPrint (ASL_DEBUG_OUTPUT,
732313a0c13SJung-uk Kim             "Increasing line buffer size from %u to %u\n",
733042ff955SJung-uk Kim             Gbl_LineBufferSize, NewSize);
734042ff955SJung-uk Kim     }
735042ff955SJung-uk Kim 
736042ff955SJung-uk Kim     Gbl_CurrentLineBuffer = realloc (Gbl_CurrentLineBuffer, NewSize);
737042ff955SJung-uk Kim     Gbl_LineBufPtr = Gbl_CurrentLineBuffer;
738042ff955SJung-uk Kim     if (!Gbl_CurrentLineBuffer)
739042ff955SJung-uk Kim     {
740042ff955SJung-uk Kim         goto ErrorExit;
741042ff955SJung-uk Kim     }
742042ff955SJung-uk Kim 
743042ff955SJung-uk Kim     Gbl_MainTokenBuffer = realloc (Gbl_MainTokenBuffer, NewSize);
744042ff955SJung-uk Kim     if (!Gbl_MainTokenBuffer)
745042ff955SJung-uk Kim     {
746042ff955SJung-uk Kim         goto ErrorExit;
747042ff955SJung-uk Kim     }
748042ff955SJung-uk Kim 
749042ff955SJung-uk Kim     Gbl_MacroTokenBuffer = realloc (Gbl_MacroTokenBuffer, NewSize);
750042ff955SJung-uk Kim     if (!Gbl_MacroTokenBuffer)
751042ff955SJung-uk Kim     {
752042ff955SJung-uk Kim         goto ErrorExit;
753042ff955SJung-uk Kim     }
754042ff955SJung-uk Kim 
755042ff955SJung-uk Kim     Gbl_ExpressionTokenBuffer = realloc (Gbl_ExpressionTokenBuffer, NewSize);
756042ff955SJung-uk Kim     if (!Gbl_ExpressionTokenBuffer)
757042ff955SJung-uk Kim     {
758042ff955SJung-uk Kim         goto ErrorExit;
759042ff955SJung-uk Kim     }
760042ff955SJung-uk Kim 
761042ff955SJung-uk Kim     Gbl_LineBufferSize = NewSize;
762042ff955SJung-uk Kim     return;
763042ff955SJung-uk Kim 
764042ff955SJung-uk Kim 
765042ff955SJung-uk Kim     /* On error above, simply issue error messages and abort, cannot continue */
766042ff955SJung-uk Kim 
767042ff955SJung-uk Kim ErrorExit:
768042ff955SJung-uk Kim     printf ("Could not increase line buffer size from %u to %u\n",
769042ff955SJung-uk Kim         Gbl_LineBufferSize, Gbl_LineBufferSize * 2);
770042ff955SJung-uk Kim 
771042ff955SJung-uk Kim     AslError (ASL_ERROR, ASL_MSG_BUFFER_ALLOCATION,
772042ff955SJung-uk Kim         NULL, NULL);
773042ff955SJung-uk Kim     AslAbort ();
774042ff955SJung-uk Kim }
775042ff955SJung-uk Kim 
776042ff955SJung-uk Kim 
777313a0c13SJung-uk Kim /******************************************************************************
778313a0c13SJung-uk Kim  *
779313a0c13SJung-uk Kim  * FUNCTION:    UtFreeLineBuffers
780313a0c13SJung-uk Kim  *
781313a0c13SJung-uk Kim  * PARAMETERS:  None
782313a0c13SJung-uk Kim  *
783313a0c13SJung-uk Kim  * RETURN:      None
784313a0c13SJung-uk Kim  *
785313a0c13SJung-uk Kim  * DESCRIPTION: Free all line buffers
786313a0c13SJung-uk Kim  *
787313a0c13SJung-uk Kim  *****************************************************************************/
788313a0c13SJung-uk Kim 
789313a0c13SJung-uk Kim void
790313a0c13SJung-uk Kim UtFreeLineBuffers (
791313a0c13SJung-uk Kim     void)
792313a0c13SJung-uk Kim {
793313a0c13SJung-uk Kim 
794313a0c13SJung-uk Kim     free (Gbl_CurrentLineBuffer);
795313a0c13SJung-uk Kim     free (Gbl_MainTokenBuffer);
796313a0c13SJung-uk Kim     free (Gbl_MacroTokenBuffer);
797313a0c13SJung-uk Kim     free (Gbl_ExpressionTokenBuffer);
798313a0c13SJung-uk Kim }
799313a0c13SJung-uk Kim 
800313a0c13SJung-uk Kim 
80153289f6aSNate Lawson /*******************************************************************************
80253289f6aSNate Lawson  *
80353289f6aSNate Lawson  * FUNCTION:    UtInternalizeName
80453289f6aSNate Lawson  *
80553289f6aSNate Lawson  * PARAMETERS:  ExternalName        - Name to convert
80653289f6aSNate Lawson  *              ConvertedName       - Where the converted name is returned
80753289f6aSNate Lawson  *
80853289f6aSNate Lawson  * RETURN:      Status
80953289f6aSNate Lawson  *
81053289f6aSNate Lawson  * DESCRIPTION: Convert an external (ASL) name to an internal (AML) name
81153289f6aSNate Lawson  *
81253289f6aSNate Lawson  ******************************************************************************/
81353289f6aSNate Lawson 
81453289f6aSNate Lawson ACPI_STATUS
81553289f6aSNate Lawson UtInternalizeName (
81653289f6aSNate Lawson     char                    *ExternalName,
81753289f6aSNate Lawson     char                    **ConvertedName)
81853289f6aSNate Lawson {
81953289f6aSNate Lawson     ACPI_NAMESTRING_INFO    Info;
82053289f6aSNate Lawson     ACPI_STATUS             Status;
82153289f6aSNate Lawson 
82253289f6aSNate Lawson 
82353289f6aSNate Lawson     if (!ExternalName)
82453289f6aSNate Lawson     {
82553289f6aSNate Lawson         return (AE_OK);
82653289f6aSNate Lawson     }
82753289f6aSNate Lawson 
82853289f6aSNate Lawson     /* Get the length of the new internal name */
82953289f6aSNate Lawson 
83053289f6aSNate Lawson     Info.ExternalName = ExternalName;
83153289f6aSNate Lawson     AcpiNsGetInternalNameLength (&Info);
83253289f6aSNate Lawson 
83353289f6aSNate Lawson     /* We need a segment to store the internal name */
83453289f6aSNate Lawson 
835313a0c13SJung-uk Kim     Info.InternalName = UtStringCacheCalloc (Info.Length);
83653289f6aSNate Lawson     if (!Info.InternalName)
83753289f6aSNate Lawson     {
83853289f6aSNate Lawson         return (AE_NO_MEMORY);
83953289f6aSNate Lawson     }
84053289f6aSNate Lawson 
84153289f6aSNate Lawson     /* Build the name */
84253289f6aSNate Lawson 
84353289f6aSNate Lawson     Status = AcpiNsBuildInternalName (&Info);
84453289f6aSNate Lawson     if (ACPI_FAILURE (Status))
84553289f6aSNate Lawson     {
84653289f6aSNate Lawson         return (Status);
84753289f6aSNate Lawson     }
84853289f6aSNate Lawson 
84953289f6aSNate Lawson     *ConvertedName = Info.InternalName;
85053289f6aSNate Lawson     return (AE_OK);
85153289f6aSNate Lawson }
85253289f6aSNate Lawson 
85353289f6aSNate Lawson 
85453289f6aSNate Lawson /*******************************************************************************
85553289f6aSNate Lawson  *
85653289f6aSNate Lawson  * FUNCTION:    UtPadNameWithUnderscores
85753289f6aSNate Lawson  *
85853289f6aSNate Lawson  * PARAMETERS:  NameSeg             - Input nameseg
85953289f6aSNate Lawson  *              PaddedNameSeg       - Output padded nameseg
86053289f6aSNate Lawson  *
86153289f6aSNate Lawson  * RETURN:      Padded nameseg.
86253289f6aSNate Lawson  *
86353289f6aSNate Lawson  * DESCRIPTION: Pads a NameSeg with underscores if necessary to form a full
86453289f6aSNate Lawson  *              ACPI_NAME.
86553289f6aSNate Lawson  *
86653289f6aSNate Lawson  ******************************************************************************/
86753289f6aSNate Lawson 
868fba7fc7eSJung-uk Kim static void
86953289f6aSNate Lawson UtPadNameWithUnderscores (
87053289f6aSNate Lawson     char                    *NameSeg,
87153289f6aSNate Lawson     char                    *PaddedNameSeg)
87253289f6aSNate Lawson {
87353289f6aSNate Lawson     UINT32                  i;
87453289f6aSNate Lawson 
87553289f6aSNate Lawson 
87653289f6aSNate Lawson     for (i = 0; (i < ACPI_NAME_SIZE); i++)
87753289f6aSNate Lawson     {
87853289f6aSNate Lawson         if (*NameSeg)
87953289f6aSNate Lawson         {
88053289f6aSNate Lawson             *PaddedNameSeg = *NameSeg;
88153289f6aSNate Lawson             NameSeg++;
88253289f6aSNate Lawson         }
88353289f6aSNate Lawson         else
88453289f6aSNate Lawson         {
88553289f6aSNate Lawson             *PaddedNameSeg = '_';
88653289f6aSNate Lawson         }
887f8146b88SJung-uk Kim 
88853289f6aSNate Lawson         PaddedNameSeg++;
88953289f6aSNate Lawson     }
89053289f6aSNate Lawson }
89153289f6aSNate Lawson 
89253289f6aSNate Lawson 
89353289f6aSNate Lawson /*******************************************************************************
89453289f6aSNate Lawson  *
89553289f6aSNate Lawson  * FUNCTION:    UtAttachNameseg
89653289f6aSNate Lawson  *
89753289f6aSNate Lawson  * PARAMETERS:  Op                  - Parent parse node
89853289f6aSNate Lawson  *              Name                - Full ExternalName
89953289f6aSNate Lawson  *
900fba7fc7eSJung-uk Kim  * RETURN:      None; Sets the NameSeg field in parent node
90153289f6aSNate Lawson  *
90253289f6aSNate Lawson  * DESCRIPTION: Extract the last nameseg of the ExternalName and store it
90353289f6aSNate Lawson  *              in the NameSeg field of the Op.
90453289f6aSNate Lawson  *
90553289f6aSNate Lawson  ******************************************************************************/
90653289f6aSNate Lawson 
907fba7fc7eSJung-uk Kim static void
90853289f6aSNate Lawson UtAttachNameseg (
90953289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
91053289f6aSNate Lawson     char                    *Name)
91153289f6aSNate Lawson {
91253289f6aSNate Lawson     char                    *NameSeg;
91353289f6aSNate Lawson     char                    PaddedNameSeg[4];
91453289f6aSNate Lawson 
91553289f6aSNate Lawson 
91653289f6aSNate Lawson     if (!Name)
91753289f6aSNate Lawson     {
91853289f6aSNate Lawson         return;
91953289f6aSNate Lawson     }
92053289f6aSNate Lawson 
92153289f6aSNate Lawson     /* Look for the last dot in the namepath */
92253289f6aSNate Lawson 
92353289f6aSNate Lawson     NameSeg = strrchr (Name, '.');
92453289f6aSNate Lawson     if (NameSeg)
92553289f6aSNate Lawson     {
92653289f6aSNate Lawson         /* Found last dot, we have also found the final nameseg */
92753289f6aSNate Lawson 
92853289f6aSNate Lawson         NameSeg++;
92953289f6aSNate Lawson         UtPadNameWithUnderscores (NameSeg, PaddedNameSeg);
93053289f6aSNate Lawson     }
93153289f6aSNate Lawson     else
93253289f6aSNate Lawson     {
93353289f6aSNate Lawson         /* No dots in the namepath, there is only a single nameseg. */
93453289f6aSNate Lawson         /* Handle prefixes */
93553289f6aSNate Lawson 
936efcc2a30SJung-uk Kim         while (ACPI_IS_ROOT_PREFIX (*Name) ||
937efcc2a30SJung-uk Kim                ACPI_IS_PARENT_PREFIX (*Name))
93853289f6aSNate Lawson         {
93953289f6aSNate Lawson             Name++;
94053289f6aSNate Lawson         }
94153289f6aSNate Lawson 
9428ef1a331SJung-uk Kim         /* Remaining string should be one single nameseg */
94353289f6aSNate Lawson 
94453289f6aSNate Lawson         UtPadNameWithUnderscores (Name, PaddedNameSeg);
94553289f6aSNate Lawson     }
94653289f6aSNate Lawson 
9478ef1a331SJung-uk Kim     ACPI_MOVE_NAME (Op->Asl.NameSeg, PaddedNameSeg);
94853289f6aSNate Lawson }
94953289f6aSNate Lawson 
95053289f6aSNate Lawson 
95153289f6aSNate Lawson /*******************************************************************************
95253289f6aSNate Lawson  *
95353289f6aSNate Lawson  * FUNCTION:    UtAttachNamepathToOwner
95453289f6aSNate Lawson  *
95553289f6aSNate Lawson  * PARAMETERS:  Op                  - Parent parse node
95653289f6aSNate Lawson  *              NameOp              - Node that contains the name
95753289f6aSNate Lawson  *
95853289f6aSNate Lawson  * RETURN:      Sets the ExternalName and Namepath in the parent node
95953289f6aSNate Lawson  *
96053289f6aSNate Lawson  * DESCRIPTION: Store the name in two forms in the parent node: The original
96153289f6aSNate Lawson  *              (external) name, and the internalized name that is used within
96253289f6aSNate Lawson  *              the ACPI namespace manager.
96353289f6aSNate Lawson  *
96453289f6aSNate Lawson  ******************************************************************************/
96553289f6aSNate Lawson 
96653289f6aSNate Lawson void
96753289f6aSNate Lawson UtAttachNamepathToOwner (
96853289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
96953289f6aSNate Lawson     ACPI_PARSE_OBJECT       *NameOp)
97053289f6aSNate Lawson {
97153289f6aSNate Lawson     ACPI_STATUS             Status;
97253289f6aSNate Lawson 
97353289f6aSNate Lawson 
97453289f6aSNate Lawson     /* Full external path */
97553289f6aSNate Lawson 
97653289f6aSNate Lawson     Op->Asl.ExternalName = NameOp->Asl.Value.String;
97753289f6aSNate Lawson 
978fba7fc7eSJung-uk Kim     /* Save the NameOp for possible error reporting later */
979fba7fc7eSJung-uk Kim 
980fba7fc7eSJung-uk Kim     Op->Asl.ParentMethod = (void *) NameOp;
981fba7fc7eSJung-uk Kim 
98253289f6aSNate Lawson     /* Last nameseg of the path */
98353289f6aSNate Lawson 
98453289f6aSNate Lawson     UtAttachNameseg (Op, Op->Asl.ExternalName);
98553289f6aSNate Lawson 
98653289f6aSNate Lawson     /* Create internalized path */
98753289f6aSNate Lawson 
98853289f6aSNate Lawson     Status = UtInternalizeName (NameOp->Asl.Value.String, &Op->Asl.Namepath);
98953289f6aSNate Lawson     if (ACPI_FAILURE (Status))
99053289f6aSNate Lawson     {
99153289f6aSNate Lawson         /* TBD: abort on no memory */
99253289f6aSNate Lawson     }
99353289f6aSNate Lawson }
99453289f6aSNate Lawson 
99553289f6aSNate Lawson 
99653289f6aSNate Lawson /*******************************************************************************
99753289f6aSNate Lawson  *
99853289f6aSNate Lawson  * FUNCTION:    UtDoConstant
99953289f6aSNate Lawson  *
1000493deb39SJung-uk Kim  * PARAMETERS:  String              - Hexadecimal or decimal string
100153289f6aSNate Lawson  *
100253289f6aSNate Lawson  * RETURN:      Converted Integer
100353289f6aSNate Lawson  *
1004f38b0f21SJung-uk Kim  * DESCRIPTION: Convert a string to an integer, with error checking.
100553289f6aSNate Lawson  *
100653289f6aSNate Lawson  ******************************************************************************/
100753289f6aSNate Lawson 
10089a179dd8SJung-uk Kim UINT64
100953289f6aSNate Lawson UtDoConstant (
101053289f6aSNate Lawson     char                    *String)
101153289f6aSNate Lawson {
101253289f6aSNate Lawson     ACPI_STATUS             Status;
10139a179dd8SJung-uk Kim     UINT64                  Converted;
101453289f6aSNate Lawson     char                    ErrBuf[64];
101553289f6aSNate Lawson 
101653289f6aSNate Lawson 
1017493deb39SJung-uk Kim     Status = AcpiUtStrtoul64 (String, ACPI_STRTOUL_64BIT, &Converted);
101853289f6aSNate Lawson     if (ACPI_FAILURE (Status))
101953289f6aSNate Lawson     {
1020fba7fc7eSJung-uk Kim         sprintf (ErrBuf, "%s %s\n", "Conversion error:",
1021fba7fc7eSJung-uk Kim             AcpiFormatException (Status));
102253289f6aSNate Lawson         AslCompilererror (ErrBuf);
102353289f6aSNate Lawson     }
102453289f6aSNate Lawson 
102553289f6aSNate Lawson     return (Converted);
102653289f6aSNate Lawson }
1027