Home | History | Annotate | Line # | Download | only in compiler
aslstartup.c revision 1.1.1.6
      1 /******************************************************************************
      2  *
      3  * Module Name: aslstartup - Compiler startup routines, called from main
      4  *
      5  *****************************************************************************/
      6 
      7 /*
      8  * Copyright (C) 2000 - 2015, 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 MERCHANTIBILITY 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 #include "aslcompiler.h"
     45 #include "actables.h"
     46 #include "acdisasm.h"
     47 #include "acapps.h"
     48 
     49 #define _COMPONENT          ACPI_COMPILER
     50         ACPI_MODULE_NAME    ("aslstartup")
     51 
     52 
     53 /* Local prototypes */
     54 
     55 static UINT8
     56 AslDetectSourceFileType (
     57     ASL_FILE_INFO           *Info);
     58 
     59 static ACPI_STATUS
     60 AslDoDisassembly (
     61     void);
     62 
     63 
     64 /* Globals */
     65 
     66 static BOOLEAN          AslToFile = TRUE;
     67 
     68 
     69 /*******************************************************************************
     70  *
     71  * FUNCTION:    AslInitializeGlobals
     72  *
     73  * PARAMETERS:  None
     74  *
     75  * RETURN:      None
     76  *
     77  * DESCRIPTION: Re-initialize globals needed to restart the compiler. This
     78  *              allows multiple files to be disassembled and/or compiled.
     79  *
     80  ******************************************************************************/
     81 
     82 void
     83 AslInitializeGlobals (
     84     void)
     85 {
     86     UINT32                  i;
     87 
     88 
     89     /* Init compiler globals */
     90 
     91     Gbl_SyntaxError = 0;
     92     Gbl_CurrentColumn = 0;
     93     Gbl_CurrentLineNumber = 1;
     94     Gbl_LogicalLineNumber = 1;
     95     Gbl_CurrentLineOffset = 0;
     96     Gbl_InputFieldCount = 0;
     97     Gbl_InputByteCount = 0;
     98     Gbl_NsLookupCount = 0;
     99     Gbl_LineBufPtr = Gbl_CurrentLineBuffer;
    100 
    101     Gbl_ErrorLog = NULL;
    102     Gbl_NextError = NULL;
    103     Gbl_Signature = NULL;
    104     Gbl_FileType = 0;
    105 
    106     TotalExecutableOpcodes = 0;
    107     TotalNamedObjects = 0;
    108     TotalKeywords = 0;
    109     TotalParseNodes = 0;
    110     TotalMethods = 0;
    111     TotalAllocations = 0;
    112     TotalAllocated = 0;
    113     TotalFolds = 0;
    114 
    115     AslGbl_NextEvent = 0;
    116     for (i = 0; i < ASL_NUM_REPORT_LEVELS; i++)
    117     {
    118         Gbl_ExceptionCount[i] = 0;
    119     }
    120 
    121     for (i = ASL_FILE_INPUT; i <= ASL_MAX_FILE_TYPE; i++)
    122     {
    123         Gbl_Files[i].Handle = NULL;
    124         Gbl_Files[i].Filename = NULL;
    125     }
    126 }
    127 
    128 
    129 /*******************************************************************************
    130  *
    131  * FUNCTION:    AslDetectSourceFileType
    132  *
    133  * PARAMETERS:  Info            - Name/Handle for the file (must be open)
    134  *
    135  * RETURN:      File Type
    136  *
    137  * DESCRIPTION: Determine the type of the input file. Either binary (contains
    138  *              non-ASCII characters), ASL file, or an ACPI Data Table file.
    139  *
    140  ******************************************************************************/
    141 
    142 static UINT8
    143 AslDetectSourceFileType (
    144     ASL_FILE_INFO           *Info)
    145 {
    146     char                    *FileChar;
    147     UINT8                   Type;
    148     ACPI_STATUS             Status;
    149 
    150 
    151     /* Check for a valid binary ACPI table */
    152 
    153     Status = FlCheckForAcpiTable (Info->Handle);
    154     if (ACPI_SUCCESS (Status))
    155     {
    156         Type = ASL_INPUT_TYPE_ACPI_TABLE;
    157         goto Cleanup;
    158     }
    159 
    160     /* Check for 100% ASCII source file (comments are ignored) */
    161 
    162     Status = FlCheckForAscii (Info->Filename, TRUE);
    163     if (ACPI_FAILURE (Status))
    164     {
    165         printf ("Invalid characters in input file - %s\n", Info->Filename);
    166 
    167         if (!Gbl_IgnoreErrors)
    168         {
    169             Type = ASL_INPUT_TYPE_BINARY;
    170             goto Cleanup;
    171         }
    172     }
    173 
    174     /*
    175      * File is ASCII. Determine if this is an ASL file or an ACPI data
    176      * table file.
    177      */
    178     while (fgets (Gbl_CurrentLineBuffer, Gbl_LineBufferSize, Info->Handle))
    179     {
    180         /* Uppercase the buffer for caseless compare */
    181 
    182         FileChar = Gbl_CurrentLineBuffer;
    183         while (*FileChar)
    184         {
    185             *FileChar = (char) toupper ((int) *FileChar);
    186             FileChar++;
    187         }
    188 
    189         /* Presence of "DefinitionBlock" indicates actual ASL code */
    190 
    191         if (strstr (Gbl_CurrentLineBuffer, "DEFINITIONBLOCK"))
    192         {
    193             /* Appears to be an ASL file */
    194 
    195             Type = ASL_INPUT_TYPE_ASCII_ASL;
    196             goto Cleanup;
    197         }
    198     }
    199 
    200     /* Not an ASL source file, default to a data table source file */
    201 
    202     Type = ASL_INPUT_TYPE_ASCII_DATA;
    203 
    204 Cleanup:
    205 
    206     /* Must seek back to the start of the file */
    207 
    208     fseek (Info->Handle, 0, SEEK_SET);
    209     return (Type);
    210 }
    211 
    212 
    213 /*******************************************************************************
    214  *
    215  * FUNCTION:    AslDoDisassembly
    216  *
    217  * PARAMETERS:  None
    218  *
    219  * RETURN:      Status
    220  *
    221  * DESCRIPTION: Initiate AML file disassembly. Uses ACPICA subsystem to build
    222  *              namespace.
    223  *
    224  ******************************************************************************/
    225 
    226 static ACPI_STATUS
    227 AslDoDisassembly (
    228     void)
    229 {
    230     ACPI_STATUS             Status;
    231 
    232 
    233     /* ACPICA subsystem initialization */
    234 
    235     Status = AdInitialize ();
    236     if (ACPI_FAILURE (Status))
    237     {
    238         return (Status);
    239     }
    240 
    241     Status = AcpiAllocateRootTable (4);
    242     if (ACPI_FAILURE (Status))
    243     {
    244         AcpiOsPrintf ("Could not initialize ACPI Table Manager, %s\n",
    245             AcpiFormatException (Status));
    246         return (Status);
    247     }
    248 
    249     /* Handle additional output files for disassembler */
    250 
    251     Gbl_FileType = ASL_INPUT_TYPE_ACPI_TABLE;
    252     Status = FlOpenMiscOutputFiles (Gbl_OutputFilenamePrefix);
    253 
    254     /* This is where the disassembly happens */
    255 
    256     AcpiGbl_DbOpt_Disasm = TRUE;
    257     Status = AdAmlDisassemble (AslToFile,
    258         Gbl_Files[ASL_FILE_INPUT].Filename, Gbl_OutputFilenamePrefix,
    259         &Gbl_Files[ASL_FILE_INPUT].Filename);
    260     if (ACPI_FAILURE (Status))
    261     {
    262         return (Status);
    263     }
    264 
    265     /* Check if any control methods were unresolved */
    266 
    267     AcpiDmUnresolvedWarning (0);
    268 
    269     /* Shutdown compiler and ACPICA subsystem */
    270 
    271     AeClearErrorLog ();
    272     (void) AcpiTerminate ();
    273 
    274     /*
    275      * Gbl_Files[ASL_FILE_INPUT].Filename was replaced with the
    276      * .DSL disassembly file, which can now be compiled if requested
    277      */
    278     if (Gbl_DoCompile)
    279     {
    280         AcpiOsPrintf ("\nCompiling \"%s\"\n",
    281             Gbl_Files[ASL_FILE_INPUT].Filename);
    282         return (AE_CTRL_CONTINUE);
    283     }
    284 
    285     /* No need to free the filename string */
    286 
    287     Gbl_Files[ASL_FILE_INPUT].Filename = NULL;
    288 
    289     CmDeleteCaches ();
    290     return (AE_OK);
    291 }
    292 
    293 
    294 /*******************************************************************************
    295  *
    296  * FUNCTION:    AslDoOneFile
    297  *
    298  * PARAMETERS:  Filename        - Name of the file
    299  *
    300  * RETURN:      Status
    301  *
    302  * DESCRIPTION: Process a single file - either disassemble, compile, or both
    303  *
    304  ******************************************************************************/
    305 
    306 ACPI_STATUS
    307 AslDoOneFile (
    308     char                    *Filename)
    309 {
    310     ACPI_STATUS             Status;
    311 
    312 
    313     /* Re-initialize "some" compiler/preprocessor globals */
    314 
    315     AslInitializeGlobals ();
    316     PrInitializeGlobals ();
    317 
    318     /*
    319      * Extract the directory path. This path is used for possible include
    320      * files and the optional AML filename embedded in the input file
    321      * DefinitionBlock declaration.
    322      */
    323     Status = FlSplitInputPathname (Filename, &Gbl_DirectoryPath, NULL);
    324     if (ACPI_FAILURE (Status))
    325     {
    326         return (Status);
    327     }
    328 
    329     /* Take a copy of the input filename, convert any backslashes */
    330 
    331     Gbl_Files[ASL_FILE_INPUT].Filename =
    332         UtStringCacheCalloc (strlen (Filename) + 1);
    333 
    334     strcpy (Gbl_Files[ASL_FILE_INPUT].Filename, Filename);
    335     UtConvertBackslashes (Gbl_Files[ASL_FILE_INPUT].Filename);
    336 
    337     /*
    338      * AML Disassembly (Optional)
    339      */
    340     if (Gbl_DisasmFlag)
    341     {
    342         Status = AslDoDisassembly ();
    343         if (Status != AE_CTRL_CONTINUE)
    344         {
    345             return (Status);
    346         }
    347     }
    348 
    349     /*
    350      * Open the input file. Here, this should be an ASCII source file,
    351      * either an ASL file or a Data Table file
    352      */
    353     Status = FlOpenInputFile (Gbl_Files[ASL_FILE_INPUT].Filename);
    354     if (ACPI_FAILURE (Status))
    355     {
    356         AePrintErrorLog (ASL_FILE_STDERR);
    357         return (AE_ERROR);
    358     }
    359 
    360     Gbl_OriginalInputFileSize = FlGetFileSize (ASL_FILE_INPUT);
    361 
    362     /* Determine input file type */
    363 
    364     Gbl_FileType = AslDetectSourceFileType (&Gbl_Files[ASL_FILE_INPUT]);
    365     if (Gbl_FileType == ASL_INPUT_TYPE_BINARY)
    366     {
    367         return (AE_ERROR);
    368     }
    369 
    370     /*
    371      * If -p not specified, we will use the input filename as the
    372      * output filename prefix
    373      */
    374     if (Gbl_UseDefaultAmlFilename)
    375     {
    376         Gbl_OutputFilenamePrefix = Gbl_Files[ASL_FILE_INPUT].Filename;
    377     }
    378 
    379     /* Open the optional output files (listings, etc.) */
    380 
    381     Status = FlOpenMiscOutputFiles (Gbl_OutputFilenamePrefix);
    382     if (ACPI_FAILURE (Status))
    383     {
    384         AePrintErrorLog (ASL_FILE_STDERR);
    385         return (AE_ERROR);
    386     }
    387 
    388     /*
    389      * Compilation of ASL source versus DataTable source uses different
    390      * compiler subsystems
    391      */
    392     switch (Gbl_FileType)
    393     {
    394     /*
    395      * Data Table Compilation
    396      */
    397     case ASL_INPUT_TYPE_ASCII_DATA:
    398 
    399         Status = DtDoCompile ();
    400         if (ACPI_FAILURE (Status))
    401         {
    402             return (Status);
    403         }
    404 
    405         if (Gbl_Signature)
    406         {
    407             Gbl_Signature = NULL;
    408         }
    409 
    410         /* Check if any errors occurred during compile */
    411 
    412         Status = AslCheckForErrorExit ();
    413         if (ACPI_FAILURE (Status))
    414         {
    415             return (Status);
    416         }
    417 
    418         /* Cleanup (for next source file) and exit */
    419 
    420         AeClearErrorLog ();
    421         PrTerminatePreprocessor ();
    422         return (Status);
    423 
    424     /*
    425      * ASL Compilation
    426      */
    427     case ASL_INPUT_TYPE_ASCII_ASL:
    428 
    429         /* ACPICA subsystem initialization */
    430 
    431         Status = AdInitialize ();
    432         if (ACPI_FAILURE (Status))
    433         {
    434             return (Status);
    435         }
    436 
    437         (void) CmDoCompile ();
    438         (void) AcpiTerminate ();
    439 
    440         /* Check if any errors occurred during compile */
    441 
    442         Status = AslCheckForErrorExit ();
    443         if (ACPI_FAILURE (Status))
    444         {
    445             return (Status);
    446         }
    447 
    448         /* Cleanup (for next source file) and exit */
    449 
    450         AeClearErrorLog ();
    451         PrTerminatePreprocessor ();
    452         return (AE_OK);
    453 
    454     /*
    455      * Binary ACPI table was auto-detected, disassemble it
    456      */
    457     case ASL_INPUT_TYPE_ACPI_TABLE:
    458 
    459         /* We have what appears to be an ACPI table, disassemble it */
    460 
    461         FlCloseFile (ASL_FILE_INPUT);
    462         Gbl_DoCompile = FALSE;
    463         Gbl_DisasmFlag = TRUE;
    464         Status = AslDoDisassembly ();
    465         return (Status);
    466 
    467     /* Unknown binary table */
    468 
    469     case ASL_INPUT_TYPE_BINARY:
    470 
    471         AePrintErrorLog (ASL_FILE_STDERR);
    472         return (AE_ERROR);
    473 
    474     default:
    475 
    476         printf ("Unknown file type %X\n", Gbl_FileType);
    477         return (AE_ERROR);
    478     }
    479 }
    480 
    481 
    482 /*******************************************************************************
    483  *
    484  * FUNCTION:    AslCheckForErrorExit
    485  *
    486  * PARAMETERS:  None. Examines global exception count array
    487  *
    488  * RETURN:      Status
    489  *
    490  * DESCRIPTION: Determine if compiler should abort with error status
    491  *
    492  ******************************************************************************/
    493 
    494 ACPI_STATUS
    495 AslCheckForErrorExit (
    496     void)
    497 {
    498 
    499     /*
    500      * Return non-zero exit code if there have been errors, unless the
    501      * global ignore error flag has been set
    502      */
    503     if (!Gbl_IgnoreErrors)
    504     {
    505         if (Gbl_ExceptionCount[ASL_ERROR] > 0)
    506         {
    507             return (AE_ERROR);
    508         }
    509 
    510         /* Optionally treat warnings as errors */
    511 
    512         if (Gbl_WarningsAsErrors)
    513         {
    514             if ((Gbl_ExceptionCount[ASL_WARNING] > 0)  ||
    515                 (Gbl_ExceptionCount[ASL_WARNING2] > 0) ||
    516                 (Gbl_ExceptionCount[ASL_WARNING3] > 0))
    517             {
    518                 return (AE_ERROR);
    519             }
    520         }
    521     }
    522 
    523     return (AE_OK);
    524 }
    525