Home | History | Annotate | Line # | Download | only in compiler
aslstartup.c revision 1.1.1.2.4.2
      1 
      2 /******************************************************************************
      3  *
      4  * Module Name: aslstartup - Compiler startup routines, called from main
      5  *
      6  *****************************************************************************/
      7 
      8 /*
      9  * Copyright (C) 2000 - 2011, Intel Corp.
     10  * All rights reserved.
     11  *
     12  * Redistribution and use in source and binary forms, with or without
     13  * modification, are permitted provided that the following conditions
     14  * are met:
     15  * 1. Redistributions of source code must retain the above copyright
     16  *    notice, this list of conditions, and the following disclaimer,
     17  *    without modification.
     18  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     19  *    substantially similar to the "NO WARRANTY" disclaimer below
     20  *    ("Disclaimer") and any redistribution must be conditioned upon
     21  *    including a substantially similar Disclaimer requirement for further
     22  *    binary redistribution.
     23  * 3. Neither the names of the above-listed copyright holders nor the names
     24  *    of any contributors may be used to endorse or promote products derived
     25  *    from this software without specific prior written permission.
     26  *
     27  * Alternatively, this software may be distributed under the terms of the
     28  * GNU General Public License ("GPL") version 2 as published by the Free
     29  * Software Foundation.
     30  *
     31  * NO WARRANTY
     32  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     33  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     34  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
     35  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     36  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     37  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     38  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     39  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     40  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     41  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     42  * POSSIBILITY OF SUCH DAMAGES.
     43  */
     44 
     45 
     46 #include "aslcompiler.h"
     47 #include "actables.h"
     48 #include "acapps.h"
     49 
     50 #define _COMPONENT          ACPI_COMPILER
     51         ACPI_MODULE_NAME    ("aslstartup")
     52 
     53 
     54 #define ASL_MAX_FILES   256
     55 static char             *FileList[ASL_MAX_FILES];
     56 static BOOLEAN          AslToFile = TRUE;
     57 
     58 
     59 /* Local prototypes */
     60 
     61 static char **
     62 AsDoWildcard (
     63     char                    *DirectoryPathname,
     64     char                    *FileSpecifier);
     65 
     66 static UINT8
     67 AslDetectSourceFileType (
     68     ASL_FILE_INFO           *Info);
     69 
     70 
     71 /*******************************************************************************
     72  *
     73  * FUNCTION:    AslInitializeGlobals
     74  *
     75  * PARAMETERS:  None
     76  *
     77  * RETURN:      None
     78  *
     79  * DESCRIPTION: Re-initialize globals needed to restart the compiler. This
     80  *              allows multiple files to be disassembled and/or compiled.
     81  *
     82  ******************************************************************************/
     83 
     84 void
     85 AslInitializeGlobals (
     86     void)
     87 {
     88     UINT32                  i;
     89 
     90 
     91     /* Init compiler globals */
     92 
     93     Gbl_CurrentColumn = 0;
     94     Gbl_CurrentLineNumber = 1;
     95     Gbl_LogicalLineNumber = 1;
     96     Gbl_CurrentLineOffset = 0;
     97     Gbl_InputFieldCount = 0;
     98     Gbl_LineBufPtr = Gbl_CurrentLineBuffer;
     99 
    100     Gbl_ErrorLog = NULL;
    101     Gbl_NextError = NULL;
    102     Gbl_Signature = NULL;
    103     Gbl_FileType = 0;
    104 
    105     AslGbl_NextEvent = 0;
    106     for (i = 0; i < ASL_NUM_REPORT_LEVELS; i++)
    107     {
    108         Gbl_ExceptionCount[i] = 0;
    109     }
    110 
    111     Gbl_Files[ASL_FILE_AML_OUTPUT].Filename = NULL;
    112     Gbl_Files[ASL_FILE_AML_OUTPUT].Handle = NULL;
    113 
    114     Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename = NULL;
    115     Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle = NULL;
    116 }
    117 
    118 
    119 /******************************************************************************
    120  *
    121  * FUNCTION:    AsDoWildcard
    122  *
    123  * PARAMETERS:  None
    124  *
    125  * RETURN:      None
    126  *
    127  * DESCRIPTION: Process files via wildcards. This function is for the Windows
    128  *              case only.
    129  *
    130  ******************************************************************************/
    131 
    132 static char **
    133 AsDoWildcard (
    134     char                    *DirectoryPathname,
    135     char                    *FileSpecifier)
    136 {
    137 #ifdef WIN32
    138     void                    *DirInfo;
    139     char                    *Filename;
    140     int                     FileCount;
    141 
    142 
    143     FileCount = 0;
    144 
    145     /* Open parent directory */
    146 
    147     DirInfo = AcpiOsOpenDirectory (DirectoryPathname, FileSpecifier, REQUEST_FILE_ONLY);
    148     if (!DirInfo)
    149     {
    150         /* Either the directory of file does not exist */
    151 
    152         Gbl_Files[ASL_FILE_INPUT].Filename = FileSpecifier;
    153         FlFileError (ASL_FILE_INPUT, ASL_MSG_OPEN);
    154         AslAbort ();
    155     }
    156 
    157     /* Process each file that matches the wildcard specification */
    158 
    159     while ((Filename = AcpiOsGetNextFilename (DirInfo)))
    160     {
    161         /* Add the filename to the file list */
    162 
    163         FileList[FileCount] = AcpiOsAllocate (strlen (Filename) + 1);
    164         strcpy (FileList[FileCount], Filename);
    165         FileCount++;
    166 
    167         if (FileCount >= ASL_MAX_FILES)
    168         {
    169             printf ("Max files reached\n");
    170             FileList[0] = NULL;
    171             return (FileList);
    172         }
    173     }
    174 
    175     /* Cleanup */
    176 
    177     AcpiOsCloseDirectory (DirInfo);
    178     FileList[FileCount] = NULL;
    179     return (FileList);
    180 
    181 #else
    182     /*
    183      * Linux/Unix cases - Wildcards are expanded by the shell automatically.
    184      * Just return the filename in a null terminated list
    185      */
    186     FileList[0] = AcpiOsAllocate (strlen (FileSpecifier) + 1);
    187     strcpy (FileList[0], FileSpecifier);
    188     FileList[1] = NULL;
    189 
    190     return (FileList);
    191 #endif
    192 }
    193 
    194 
    195 /*******************************************************************************
    196  *
    197  * FUNCTION:    AslDetectSourceFileType
    198  *
    199  * PARAMETERS:  Info            - Name/Handle for the file (must be open)
    200  *
    201  * RETURN:      File Type
    202  *
    203  * DESCRIPTION: Determine the type of the input file. Either binary (contains
    204  *              non-ASCII characters), ASL file, or an ACPI Data Table file.
    205  *
    206  ******************************************************************************/
    207 
    208 static UINT8
    209 AslDetectSourceFileType (
    210     ASL_FILE_INFO           *Info)
    211 {
    212     char                    *FileChar;
    213     UINT8                   Type;
    214     ACPI_STATUS             Status;
    215 
    216 
    217     /* Check for 100% ASCII source file (comments are ignored) */
    218 
    219     Status = FlCheckForAscii (Info);
    220     if (ACPI_FAILURE (Status))
    221     {
    222         printf ("Non-ascii input file - %s\n", Info->Filename);
    223         Type = ASL_INPUT_TYPE_BINARY;
    224         goto Cleanup;
    225     }
    226 
    227     /*
    228      * File is ASCII. Determine if this is an ASL file or an ACPI data
    229      * table file.
    230      */
    231     while (fgets (Gbl_CurrentLineBuffer, ASL_LINE_BUFFER_SIZE, Info->Handle))
    232     {
    233         /* Uppercase the buffer for caseless compare */
    234 
    235         FileChar = Gbl_CurrentLineBuffer;
    236         while (*FileChar)
    237         {
    238             *FileChar = (char) toupper ((int) *FileChar);
    239             FileChar++;
    240         }
    241 
    242         /* Presence of "DefinitionBlock" indicates actual ASL code */
    243 
    244         if (strstr (Gbl_CurrentLineBuffer, "DEFINITIONBLOCK"))
    245         {
    246             /* Appears to be an ASL file */
    247 
    248             Type = ASL_INPUT_TYPE_ASCII_ASL;
    249             goto Cleanup;
    250         }
    251     }
    252 
    253     /* Not an ASL source file, default to a data table source file */
    254 
    255     Type = ASL_INPUT_TYPE_ASCII_DATA;
    256 
    257 Cleanup:
    258 
    259     /* Must seek back to the start of the file */
    260 
    261     fseek (Info->Handle, 0, SEEK_SET);
    262     return (Type);
    263 }
    264 
    265 
    266 /*******************************************************************************
    267  *
    268  * FUNCTION:    AslDoOneFile
    269  *
    270  * PARAMETERS:  Filename        - Name of the file
    271  *
    272  * RETURN:      Status
    273  *
    274  * DESCRIPTION: Process a single file - either disassemble, compile, or both
    275  *
    276  ******************************************************************************/
    277 
    278 ACPI_STATUS
    279 AslDoOneFile (
    280     char                    *Filename)
    281 {
    282     ACPI_STATUS             Status;
    283 
    284 
    285     Gbl_Files[ASL_FILE_INPUT].Filename = Filename;
    286 
    287     /* Re-initialize "some" compiler globals */
    288 
    289     AslInitializeGlobals ();
    290 
    291     /*
    292      * AML Disassembly (Optional)
    293      */
    294     if (Gbl_DisasmFlag || Gbl_GetAllTables)
    295     {
    296         /* ACPICA subsystem initialization */
    297 
    298         Status = AdInitialize ();
    299         if (ACPI_FAILURE (Status))
    300         {
    301             return (Status);
    302         }
    303 
    304         Status = AcpiAllocateRootTable (4);
    305         if (ACPI_FAILURE (Status))
    306         {
    307             AcpiOsPrintf ("Could not initialize ACPI Table Manager, %s\n",
    308                 AcpiFormatException (Status));
    309             return (Status);
    310         }
    311 
    312         /* This is where the disassembly happens */
    313 
    314         AcpiGbl_DbOpt_disasm = TRUE;
    315         Status = AdAmlDisassemble (AslToFile,
    316                     Gbl_Files[ASL_FILE_INPUT].Filename,
    317                     Gbl_OutputFilenamePrefix,
    318                     &Gbl_Files[ASL_FILE_INPUT].Filename,
    319                     Gbl_GetAllTables);
    320         if (ACPI_FAILURE (Status))
    321         {
    322             return (Status);
    323         }
    324 
    325         /* Shutdown compiler and ACPICA subsystem */
    326 
    327         AeClearErrorLog ();
    328         (void) AcpiTerminate ();
    329 
    330         /*
    331          * Gbl_Files[ASL_FILE_INPUT].Filename was replaced with the
    332          * .DSL disassembly file, which can now be compiled if requested
    333          */
    334         if (Gbl_DoCompile)
    335         {
    336             AcpiOsPrintf ("\nCompiling \"%s\"\n",
    337                 Gbl_Files[ASL_FILE_INPUT].Filename);
    338         }
    339         else
    340         {
    341             Gbl_Files[ASL_FILE_INPUT].Filename = NULL;
    342             return (AE_OK);
    343         }
    344     }
    345 
    346     /*
    347      * Open the input file. Here, this should be an ASCII source file,
    348      * either an ASL file or a Data Table file
    349      */
    350     Status = FlOpenInputFile (Gbl_Files[ASL_FILE_INPUT].Filename);
    351     if (ACPI_FAILURE (Status))
    352     {
    353         AePrintErrorLog (ASL_FILE_STDERR);
    354         return (AE_ERROR);
    355     }
    356 
    357     /* Determine input file type */
    358 
    359     Gbl_FileType = AslDetectSourceFileType (&Gbl_Files[ASL_FILE_INPUT]);
    360     if (Gbl_FileType == ASL_INPUT_TYPE_BINARY)
    361     {
    362         return (AE_ERROR);
    363     }
    364 
    365     /*
    366      * If -p not specified, we will use the input filename as the
    367      * output filename prefix
    368      */
    369     if (Gbl_UseDefaultAmlFilename)
    370     {
    371         Gbl_OutputFilenamePrefix = Gbl_Files[ASL_FILE_INPUT].Filename;
    372     }
    373 
    374     /* Open the optional output files (listings, etc.) */
    375 
    376     Status = FlOpenMiscOutputFiles (Gbl_OutputFilenamePrefix);
    377     if (ACPI_FAILURE (Status))
    378     {
    379         AePrintErrorLog (ASL_FILE_STDERR);
    380         return (AE_ERROR);
    381     }
    382 
    383     /*
    384      * Compilation of ASL source versus DataTable source uses different
    385      * compiler subsystems
    386      */
    387     switch (Gbl_FileType)
    388     {
    389     /*
    390      * Data Table Compilation
    391      */
    392     case ASL_INPUT_TYPE_ASCII_DATA:
    393 
    394         Status = DtDoCompile ();
    395 
    396         if (Gbl_Signature)
    397         {
    398             ACPI_FREE (Gbl_Signature);
    399             Gbl_Signature = NULL;
    400         }
    401         AeClearErrorLog ();
    402         return (Status);
    403 
    404     /*
    405      * ASL Compilation (Optional)
    406      */
    407     case ASL_INPUT_TYPE_ASCII_ASL:
    408 
    409         /* ACPICA subsystem initialization */
    410 
    411         Status = AdInitialize ();
    412         if (ACPI_FAILURE (Status))
    413         {
    414             return (Status);
    415         }
    416 
    417         Status = CmDoCompile ();
    418         (void) AcpiTerminate ();
    419 
    420         /*
    421          * Return non-zero exit code if there have been errors, unless the
    422          * global ignore error flag has been set
    423          */
    424         if ((Gbl_ExceptionCount[ASL_ERROR] > 0) && (!Gbl_IgnoreErrors))
    425         {
    426             return (AE_ERROR);
    427         }
    428 
    429         AeClearErrorLog ();
    430         return (AE_OK);
    431 
    432     case ASL_INPUT_TYPE_BINARY:
    433 
    434         AePrintErrorLog (ASL_FILE_STDERR);
    435         return (AE_ERROR);
    436 
    437     default:
    438         printf ("Unknown file type %X\n", Gbl_FileType);
    439         return (AE_ERROR);
    440     }
    441 }
    442 
    443 
    444 /*******************************************************************************
    445  *
    446  * FUNCTION:    AslDoOnePathname
    447  *
    448  * PARAMETERS:  Pathname            - Full pathname, possibly with wildcards
    449  *
    450  * RETURN:      Status
    451  *
    452  * DESCRIPTION: Process one pathname, possible terminated with a wildcard
    453  *              specification. If a wildcard, it is expanded and the multiple
    454  *              files are processed.
    455  *
    456  ******************************************************************************/
    457 
    458 ACPI_STATUS
    459 AslDoOnePathname (
    460     char                    *Pathname,
    461     ASL_PATHNAME_CALLBACK   PathCallback)
    462 {
    463     ACPI_STATUS             Status = AE_OK;
    464     char                    **WildcardList;
    465     char                    *Filename;
    466     char                    *FullPathname;
    467 
    468 
    469     /* Split incoming path into a directory/filename combo */
    470 
    471     Status = FlSplitInputPathname (Pathname, &Gbl_DirectoryPath, &Filename);
    472     if (ACPI_FAILURE (Status))
    473     {
    474         return (Status);
    475     }
    476 
    477     /* Expand possible wildcard into a file list (Windows/DOS only) */
    478 
    479     WildcardList = AsDoWildcard (Gbl_DirectoryPath, Filename);
    480     while (*WildcardList)
    481     {
    482         FullPathname = ACPI_ALLOCATE (
    483             strlen (Gbl_DirectoryPath) + strlen (*WildcardList) + 1);
    484 
    485         /* Construct a full path to the file */
    486 
    487         strcpy (FullPathname, Gbl_DirectoryPath);
    488         strcat (FullPathname, *WildcardList);
    489 
    490         /*
    491          * If -p not specified, we will use the input filename as the
    492          * output filename prefix
    493          */
    494         if (Gbl_UseDefaultAmlFilename)
    495         {
    496             Gbl_OutputFilenamePrefix = FullPathname;
    497         }
    498 
    499         /* Save status from all compiles */
    500 
    501         Status |= (*PathCallback) (FullPathname);
    502 
    503         ACPI_FREE (FullPathname);
    504         ACPI_FREE (*WildcardList);
    505         *WildcardList = NULL;
    506         WildcardList++;
    507     }
    508 
    509     ACPI_FREE (Gbl_DirectoryPath);
    510     ACPI_FREE (Filename);
    511     return (Status);
    512 }
    513 
    514