aslstartup.c revision 193341
1
2/******************************************************************************
3 *
4 * Module Name: aslstartup - Compiler startup routines, called from main
5 *
6 *****************************************************************************/
7
8/******************************************************************************
9 *
10 * 1. Copyright Notice
11 *
12 * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp.
13 * All rights reserved.
14 *
15 * 2. License
16 *
17 * 2.1. This is your license from Intel Corp. under its intellectual property
18 * rights.  You may have additional license terms from the party that provided
19 * you this software, covering your right to use that party's intellectual
20 * property rights.
21 *
22 * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
23 * copy of the source code appearing in this file ("Covered Code") an
24 * irrevocable, perpetual, worldwide license under Intel's copyrights in the
25 * base code distributed originally by Intel ("Original Intel Code") to copy,
26 * make derivatives, distribute, use and display any portion of the Covered
27 * Code in any form, with the right to sublicense such rights; and
28 *
29 * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
30 * license (with the right to sublicense), under only those claims of Intel
31 * patents that are infringed by the Original Intel Code, to make, use, sell,
32 * offer to sell, and import the Covered Code and derivative works thereof
33 * solely to the minimum extent necessary to exercise the above copyright
34 * license, and in no event shall the patent license extend to any additions
35 * to or modifications of the Original Intel Code.  No other license or right
36 * is granted directly or by implication, estoppel or otherwise;
37 *
38 * The above copyright and patent license is granted only if the following
39 * conditions are met:
40 *
41 * 3. Conditions
42 *
43 * 3.1. Redistribution of Source with Rights to Further Distribute Source.
44 * Redistribution of source code of any substantial portion of the Covered
45 * Code or modification with rights to further distribute source must include
46 * the above Copyright Notice, the above License, this list of Conditions,
47 * and the following Disclaimer and Export Compliance provision.  In addition,
48 * Licensee must cause all Covered Code to which Licensee contributes to
49 * contain a file documenting the changes Licensee made to create that Covered
50 * Code and the date of any change.  Licensee must include in that file the
51 * documentation of any changes made by any predecessor Licensee.  Licensee
52 * must include a prominent statement that the modification is derived,
53 * directly or indirectly, from Original Intel Code.
54 *
55 * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
56 * Redistribution of source code of any substantial portion of the Covered
57 * Code or modification without rights to further distribute source must
58 * include the following Disclaimer and Export Compliance provision in the
59 * documentation and/or other materials provided with distribution.  In
60 * addition, Licensee may not authorize further sublicense of source of any
61 * portion of the Covered Code, and must include terms to the effect that the
62 * license from Licensee to its licensee is limited to the intellectual
63 * property embodied in the software Licensee provides to its licensee, and
64 * not to intellectual property embodied in modifications its licensee may
65 * make.
66 *
67 * 3.3. Redistribution of Executable. Redistribution in executable form of any
68 * substantial portion of the Covered Code or modification must reproduce the
69 * above Copyright Notice, and the following Disclaimer and Export Compliance
70 * provision in the documentation and/or other materials provided with the
71 * distribution.
72 *
73 * 3.4. Intel retains all right, title, and interest in and to the Original
74 * Intel Code.
75 *
76 * 3.5. Neither the name Intel nor any other trademark owned or controlled by
77 * Intel shall be used in advertising or otherwise to promote the sale, use or
78 * other dealings in products derived from or relating to the Covered Code
79 * without prior written authorization from Intel.
80 *
81 * 4. Disclaimer and Export Compliance
82 *
83 * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
84 * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
85 * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
86 * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
87 * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
88 * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
89 * PARTICULAR PURPOSE.
90 *
91 * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
92 * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
93 * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
94 * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
95 * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
96 * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
97 * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
98 * LIMITED REMEDY.
99 *
100 * 4.3. Licensee shall not export, either directly or indirectly, any of this
101 * software or system incorporating such software without first obtaining any
102 * required license or other approval from the U. S. Department of Commerce or
103 * any other agency or department of the United States Government.  In the
104 * event Licensee exports any such software from the United States or
105 * re-exports any such software from a foreign destination, Licensee shall
106 * ensure that the distribution and export/re-export of the software is in
107 * compliance with all laws, regulations, orders, or other restrictions of the
108 * U.S. Export Administration Regulations. Licensee agrees that neither it nor
109 * any of its subsidiaries will export/re-export any technical data, process,
110 * software, or service, directly or indirectly, to any country for which the
111 * United States government or any agency thereof requires an export license,
112 * other governmental approval, or letter of assurance, without first obtaining
113 * such license, approval or letter.
114 *
115 *****************************************************************************/
116
117
118#include <contrib/dev/acpica/compiler/aslcompiler.h>
119#include <contrib/dev/acpica/include/actables.h>
120#include <contrib/dev/acpica/include/acapps.h>
121
122#define _COMPONENT          ACPI_COMPILER
123        ACPI_MODULE_NAME    ("aslstartup")
124
125
126#define ASL_MAX_FILES   256
127char                    *FileList[ASL_MAX_FILES];
128int                     FileCount;
129BOOLEAN                 AslToFile = TRUE;
130
131
132/* Local prototypes */
133
134static void
135AslInitializeGlobals (
136    void);
137
138static char **
139AsDoWildcard (
140    char                    *DirectoryPathname,
141    char                    *FileSpecifier);
142
143
144/*******************************************************************************
145 *
146 * FUNCTION:    AslInitializeGlobals
147 *
148 * PARAMETERS:  None
149 *
150 * RETURN:      None
151 *
152 * DESCRIPTION: Re-initialize globals needed to restart the compiler. This
153 *              allows multiple files to be disassembled and/or compiled.
154 *
155 ******************************************************************************/
156
157static void
158AslInitializeGlobals (
159    void)
160{
161    UINT32                  i;
162
163
164    /* Init compiler globals */
165
166    Gbl_CurrentColumn = 0;
167    Gbl_CurrentLineNumber = 1;
168    Gbl_LogicalLineNumber = 1;
169    Gbl_CurrentLineOffset = 0;
170    Gbl_LineBufPtr = Gbl_CurrentLineBuffer;
171
172    Gbl_ErrorLog = NULL;
173    Gbl_NextError = NULL;
174
175    AslGbl_NextEvent = 0;
176    for (i = 0; i < ASL_NUM_REPORT_LEVELS; i++)
177    {
178        Gbl_ExceptionCount[i] = 0;
179    }
180
181    Gbl_Files[ASL_FILE_AML_OUTPUT].Filename = NULL;
182}
183
184
185/******************************************************************************
186 *
187 * FUNCTION:    AsDoWildcard
188 *
189 * PARAMETERS:  None
190 *
191 * RETURN:      None
192 *
193 * DESCRIPTION: Process files via wildcards. This function is for the Windows
194 *              case only.
195 *
196 ******************************************************************************/
197
198static char **
199AsDoWildcard (
200    char                    *DirectoryPathname,
201    char                    *FileSpecifier)
202{
203#ifdef WIN32
204    void                    *DirInfo;
205    char                    *Filename;
206
207
208    FileCount = 0;
209
210    /* Open parent directory */
211
212    DirInfo = AcpiOsOpenDirectory (DirectoryPathname, FileSpecifier, REQUEST_FILE_ONLY);
213    if (!DirInfo)
214    {
215        /* Either the directory of file does not exist */
216
217        Gbl_Files[ASL_FILE_INPUT].Filename = FileSpecifier;
218        FlFileError (ASL_FILE_INPUT, ASL_MSG_OPEN);
219        AslAbort ();
220    }
221
222    /* Process each file that matches the wildcard specification */
223
224    while ((Filename = AcpiOsGetNextFilename (DirInfo)))
225    {
226        /* Add the filename to the file list */
227
228        FileList[FileCount] = AcpiOsAllocate (strlen (Filename) + 1);
229        strcpy (FileList[FileCount], Filename);
230        FileCount++;
231
232        if (FileCount >= ASL_MAX_FILES)
233        {
234            printf ("Max files reached\n");
235            FileList[0] = NULL;
236            return (FileList);
237        }
238    }
239
240    /* Cleanup */
241
242    AcpiOsCloseDirectory (DirInfo);
243    FileList[FileCount] = NULL;
244    return (FileList);
245
246#else
247    /*
248     * Linux/Unix cases - Wildcards are expanded by the shell automatically.
249     * Just return the filename in a null terminated list
250     */
251    FileList[0] = AcpiOsAllocate (strlen (FileSpecifier) + 1);
252    strcpy (FileList[0], FileSpecifier);
253    FileList[1] = NULL;
254
255    return (FileList);
256#endif
257}
258
259
260/*******************************************************************************
261 *
262 * FUNCTION:    AslDoOneFile
263 *
264 * PARAMETERS:  Filename        - Name of the file
265 *
266 * RETURN:      Status
267 *
268 * DESCRIPTION: Process a single file - either disassemble, compile, or both
269 *
270 ******************************************************************************/
271
272ACPI_STATUS
273AslDoOneFile (
274    char                    *Filename)
275{
276    ACPI_STATUS             Status;
277
278
279    Gbl_Files[ASL_FILE_INPUT].Filename = Filename;
280
281    /* Re-initialize "some" compiler globals */
282
283    AslInitializeGlobals ();
284
285    /*
286     * AML Disassembly (Optional)
287     */
288    if (Gbl_DisasmFlag || Gbl_GetAllTables)
289    {
290        /* ACPI CA subsystem initialization */
291
292        Status = AdInitialize ();
293        if (ACPI_FAILURE (Status))
294        {
295            return (Status);
296        }
297
298        Status = AcpiAllocateRootTable (4);
299        if (ACPI_FAILURE (Status))
300        {
301            AcpiOsPrintf ("Could not initialize ACPI Table Manager, %s\n",
302                AcpiFormatException (Status));
303            return (Status);
304        }
305
306        /* This is where the disassembly happens */
307
308        AcpiGbl_DbOpt_disasm = TRUE;
309        Status = AdAmlDisassemble (AslToFile,
310                    Gbl_Files[ASL_FILE_INPUT].Filename,
311                    Gbl_OutputFilenamePrefix,
312                    &Gbl_Files[ASL_FILE_INPUT].Filename,
313                    Gbl_GetAllTables);
314        if (ACPI_FAILURE (Status))
315        {
316            return (Status);
317        }
318
319        /* Shutdown compiler and ACPICA subsystem */
320
321        AeClearErrorLog ();
322        AcpiTerminate ();
323
324        /*
325         * Gbl_Files[ASL_FILE_INPUT].Filename was replaced with the
326         * .DSL disassembly file, which can now be compiled if requested
327         */
328        if (Gbl_DoCompile)
329        {
330            AcpiOsPrintf ("\nCompiling \"%s\"\n",
331                Gbl_Files[ASL_FILE_INPUT].Filename);
332        }
333    }
334
335    /*
336     * ASL Compilation (Optional)
337     */
338    if (Gbl_DoCompile)
339    {
340        /*
341         * If -p not specified, we will use the input filename as the
342         * output filename prefix
343         */
344        if (Gbl_UseDefaultAmlFilename)
345        {
346            Gbl_OutputFilenamePrefix = Gbl_Files[ASL_FILE_INPUT].Filename;
347        }
348
349        /* ACPI CA subsystem initialization (Must be re-initialized) */
350
351        Status = AdInitialize ();
352        if (ACPI_FAILURE (Status))
353        {
354            return (Status);
355        }
356
357        Status = CmDoCompile ();
358        AcpiTerminate ();
359
360        /*
361         * Return non-zero exit code if there have been errors, unless the
362         * global ignore error flag has been set
363         */
364        if ((Gbl_ExceptionCount[ASL_ERROR] > 0) && (!Gbl_IgnoreErrors))
365        {
366            return (AE_ERROR);
367        }
368
369        AeClearErrorLog ();
370    }
371
372    return (AE_OK);
373}
374
375
376/*******************************************************************************
377 *
378 * FUNCTION:    AslDoOnePathname
379 *
380 * PARAMETERS:  Pathname            - Full pathname, possibly with wildcards
381 *
382 * RETURN:      Status
383 *
384 * DESCRIPTION: Process one pathname, possible terminated with a wildcard
385 *              specification. If a wildcard, it is expanded and the multiple
386 *              files are processed.
387 *
388 ******************************************************************************/
389
390ACPI_STATUS
391AslDoOnePathname (
392    char                    *Pathname)
393{
394    ACPI_STATUS             Status;
395    char                    **FileList;
396    char                    *Filename;
397    char                    *FullPathname;
398
399
400    /* Split incoming path into a directory/filename combo */
401
402    Status = FlSplitInputPathname (Pathname, &Gbl_DirectoryPath, &Filename);
403    if (ACPI_FAILURE (Status))
404    {
405        return (Status);
406    }
407
408    /* Expand possible wildcard into a file list (Windows/DOS only) */
409
410    FileList = AsDoWildcard (Gbl_DirectoryPath, Filename);
411    while (*FileList)
412    {
413        FullPathname = ACPI_ALLOCATE (
414            strlen (Gbl_DirectoryPath) + strlen (*FileList) + 1);
415
416        /* Construct a full path to the file */
417
418        strcpy (FullPathname, Gbl_DirectoryPath);
419        strcat (FullPathname, *FileList);
420
421        /*
422         * If -p not specified, we will use the input filename as the
423         * output filename prefix
424         */
425        if (Gbl_UseDefaultAmlFilename)
426        {
427            Gbl_OutputFilenamePrefix = FullPathname;
428        }
429
430        Status = AslDoOneFile (FullPathname);
431        if (ACPI_FAILURE (Status))
432        {
433            return (Status);
434        }
435
436        ACPI_FREE (FullPathname);
437        ACPI_FREE (*FileList);
438        *FileList = NULL;
439        FileList++;
440    }
441
442    ACPI_FREE (Gbl_DirectoryPath);
443    ACPI_FREE (Filename);
444    return (AE_OK);
445}
446
447