1/******************************************************************************
2 *
3 * Module Name: aslmain - compiler main and utilities
4 *
5 *****************************************************************************/
6
7/*
8 * Copyright (C) 2000 - 2023, Intel Corp.
9 * All rights reserved.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 *    notice, this list of conditions, and the following disclaimer,
16 *    without modification.
17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18 *    substantially similar to the "NO WARRANTY" disclaimer below
19 *    ("Disclaimer") and any redistribution must be conditioned upon
20 *    including a substantially similar Disclaimer requirement for further
21 *    binary redistribution.
22 * 3. Neither the names of the above-listed copyright holders nor the names
23 *    of any contributors may be used to endorse or promote products derived
24 *    from this software without specific prior written permission.
25 *
26 * Alternatively, this software may be distributed under the terms of the
27 * GNU General Public License ("GPL") version 2 as published by the Free
28 * Software Foundation.
29 *
30 * NO WARRANTY
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 * POSSIBILITY OF SUCH DAMAGES.
42 */
43
44#define _DECLARE_GLOBALS
45
46#include "aslcompiler.h"
47#include "acapps.h"
48#include "acdisasm.h"
49#include <signal.h>
50
51#define _COMPONENT          ACPI_COMPILER
52        ACPI_MODULE_NAME    ("aslmain")
53
54/*
55 * Main routine for the iASL compiler.
56 *
57 * Portability note: The compiler depends upon the host for command-line
58 * wildcard support - it is not implemented locally. For example:
59 *
60 * Linux/Unix systems: Shell expands wildcards automatically.
61 *
62 * Windows: The setargv.obj module must be linked in to automatically
63 * expand wildcards.
64 */
65
66/* Local prototypes */
67
68static void ACPI_SYSTEM_XFACE
69AslSignalHandler (
70    int                     Sig);
71
72static void
73AslInitialize (
74    void);
75
76
77/*******************************************************************************
78 *
79 * FUNCTION:    main
80 *
81 * PARAMETERS:  Standard argc/argv
82 *
83 * RETURN:      Program termination code
84 *
85 * DESCRIPTION: C main routine for the iASL Compiler/Disassembler. Process
86 *  command line options and begin the compile/disassembly for each file on
87 *  the command line (wildcards supported).
88 *
89 ******************************************************************************/
90
91int ACPI_SYSTEM_XFACE
92main (
93    int                     argc,
94    char                    **argv)
95{
96    ACPI_STATUS             Status;
97    int                     Index1;
98    int                     Index2;
99    int                     ReturnStatus = 0;
100
101
102    signal (SIGINT, AslSignalHandler);
103
104    /*
105     * Big-endian machines are not currently supported. ACPI tables must
106     * be little-endian, and support for big-endian machines needs to
107     * be implemented.
108     */
109    if (UtIsBigEndianMachine ())
110    {
111        fprintf (stderr,
112            "iASL is not currently supported on big-endian machines.\n");
113        return (-1);
114    }
115
116    AcpiOsInitialize ();
117    ACPI_DEBUG_INITIALIZE (); /* For debug version only */
118
119    /* Initialize preprocessor and compiler before command line processing */
120
121    AcpiGbl_ExternalFileList = NULL;
122    AcpiDbgLevel = 0;
123    PrInitializePreprocessor ();
124    AslInitialize ();
125
126    Index1 = Index2 =
127        AslCommandLine (argc, argv);
128
129    /* Allocate the line buffer(s), must be after command line */
130
131    AslGbl_LineBufferSize /= 2;
132    UtExpandLineBuffers ();
133
134    /* Perform global actions first/only */
135
136    if (AslGbl_DisassembleAll)
137    {
138        while (argv[Index1])
139        {
140            Status = AcpiDmAddToExternalFileList (argv[Index1]);
141            if (ACPI_FAILURE (Status))
142            {
143                return (-1);
144            }
145
146            Index1++;
147        }
148    }
149
150    /* ACPICA subsystem initialization */
151
152    Status = AdInitialize ();
153    if (ACPI_FAILURE (Status))
154    {
155        return (Status);
156    }
157
158
159    /* Process each pathname/filename in the list, with possible wildcards */
160
161    while (argv[Index2])
162    {
163        /*
164         * If -p not specified, we will use the input filename as the
165         * output filename prefix
166         */
167        if (AslGbl_UseDefaultAmlFilename)
168        {
169            AslGbl_OutputFilenamePrefix = argv[Index2];
170            UtConvertBackslashes (AslGbl_OutputFilenamePrefix);
171        }
172
173        Status = AslDoOneFile (argv[Index2]);
174        if (ACPI_FAILURE (Status))
175        {
176            ReturnStatus = -1;
177        }
178
179        Index2++;
180    }
181
182    /*
183     * At this point, compilation of a data table or disassembly is complete.
184     * However, if there is a parse tree, perform compiler analysis and
185     * generate AML.
186     */
187    if (AslGbl_PreprocessOnly || AcpiGbl_DisasmFlag || !AslGbl_ParseTreeRoot)
188    {
189        goto CleanupAndExit;
190    }
191
192    CmDoAslMiddleAndBackEnd ();
193
194    /*
195     * At this point, all semantic analysis has been completed. Check
196     * expected error messages before cleanup or conversion.
197     */
198    AslCheckExpectedExceptions ();
199
200    /* ASL-to-ASL+ conversion - Perform immediate disassembly */
201
202    if (AslGbl_DoAslConversion)
203    {
204        /* re-initialize ACPICA subsystem for disassembler */
205
206        Status = AdInitialize ();
207        if (ACPI_FAILURE (Status))
208        {
209            return (Status);
210        }
211
212        /*
213         * New input file is the output AML file from above.
214         * New output is from the input ASL file from above.
215         */
216        AslGbl_OutputFilenamePrefix = AslGbl_Files[ASL_FILE_INPUT].Filename;
217        AslGbl_Files[ASL_FILE_INPUT].Filename =
218            AslGbl_Files[ASL_FILE_AML_OUTPUT].Filename;
219
220        CvDbgPrint ("Output filename: %s\n", AslGbl_OutputFilenamePrefix);
221        fprintf (stderr, "\n");
222
223        AcpiGbl_DisasmFlag = TRUE;
224        AslDoDisassembly ();
225        AcpiGbl_DisasmFlag = FALSE;
226
227        /* delete the AML file. This AML file should never be utilized by AML interpreters. */
228
229        FlDeleteFile (ASL_FILE_AML_OUTPUT);
230    }
231
232
233CleanupAndExit:
234
235    UtFreeLineBuffers ();
236    AslParserCleanup ();
237    AcpiDmClearExternalFileList();
238    (void) AcpiTerminate ();
239
240    /* CmCleanupAndExit is intended for the compiler only */
241
242    if (!AcpiGbl_DisasmFlag)
243    {
244        ReturnStatus = CmCleanupAndExit ();
245    }
246
247
248    return (ReturnStatus);
249}
250
251
252/******************************************************************************
253 *
254 * FUNCTION:    AslSignalHandler
255 *
256 * PARAMETERS:  Sig                 - Signal that invoked this handler
257 *
258 * RETURN:      None
259 *
260 * DESCRIPTION: Signal interrupt handler. Delete any intermediate files and
261 *              any output files that may be left in an indeterminate state.
262 *              Currently handles SIGINT (control-c).
263 *
264 *****************************************************************************/
265
266static void ACPI_SYSTEM_XFACE
267AslSignalHandler (
268    int                     Sig)
269{
270    UINT32                  i;
271
272
273    signal (Sig, SIG_IGN);
274    fflush (stdout);
275    fflush (stderr);
276
277    switch (Sig)
278    {
279    case SIGINT:
280
281        printf ("\n" ASL_PREFIX "<Control-C>\n");
282        break;
283
284    default:
285
286        printf (ASL_PREFIX "Unknown interrupt signal (%d)\n", Sig);
287        break;
288    }
289
290    /*
291     * Close all open files
292     * Note: the .pre file is the same as the input source file
293     */
294    if (AslGbl_Files)
295    {
296        AslGbl_Files[ASL_FILE_PREPROCESSOR].Handle = NULL;
297
298        for (i = ASL_FILE_INPUT; i < ASL_MAX_FILE_TYPE; i++)
299        {
300            FlCloseFile (i);
301        }
302
303        /* Delete any output files */
304
305        for (i = ASL_FILE_AML_OUTPUT; i < ASL_MAX_FILE_TYPE; i++)
306        {
307            FlDeleteFile (i);
308        }
309    }
310
311    printf (ASL_PREFIX "Terminating\n");
312    exit (0);
313}
314
315
316/*******************************************************************************
317 *
318 * FUNCTION:    AslInitialize
319 *
320 * PARAMETERS:  None
321 *
322 * RETURN:      None
323 *
324 * DESCRIPTION: Initialize compiler globals
325 *
326 ******************************************************************************/
327
328static void
329AslInitialize (
330    void)
331{
332    AcpiGbl_DmOpt_Verbose = FALSE;
333
334    /* Default integer width is 32 bits */
335
336    AcpiGbl_IntegerBitWidth = 32;
337    AcpiGbl_IntegerNybbleWidth = 8;
338    AcpiGbl_IntegerByteWidth = 4;
339}
340