aslstartup.c revision 281075
12061Sjkh/******************************************************************************
235427Sbde *
32061Sjkh * Module Name: aslstartup - Compiler startup routines, called from main
433611Sjb *
532427Sjb *****************************************************************************/
632427Sjb
733611Sjb/*
833611Sjb * Copyright (C) 2000 - 2015, Intel Corp.
932427Sjb * All rights reserved.
1032427Sjb *
112061Sjkh * Redistribution and use in source and binary forms, with or without
1215603Smarkm * modification, are permitted provided that the following conditions
1330169Sjkh * are met:
1420710Sasami * 1. Redistributions of source code must retain the above copyright
1520710Sasami *    notice, this list of conditions, and the following disclaimer,
163197Scsgr *    without modification.
172061Sjkh * 2. Redistributions in binary form must reproduce at minimum a disclaimer
1812483Speter *    substantially similar to the "NO WARRANTY" disclaimer below
1934509Sbde *    ("Disclaimer") and any redistribution must be conditioned upon
202160Scsgr *    including a substantially similar Disclaimer requirement for further
212834Swollman *    binary redistribution.
222061Sjkh * 3. Neither the names of the above-listed copyright holders nor the names
232061Sjkh *    of any contributors may be used to endorse or promote products derived
242160Scsgr *    from this software without specific prior written permission.
2517308Speter *
2619320Sadam * Alternatively, this software may be distributed under the terms of the
2727788Sasami * GNU General Public License ("GPL") version 2 as published by the Free
2830169Sjkh * Software Foundation.
2925980Sasami *
301594Srgrimes * NO WARRANTY
3117308Speter * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
3217308Speter * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3327910Sasami * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
3427910Sasami * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3527910Sasami * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
3617308Speter * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
3717308Speter * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
3817308Speter * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
3919175Sbde * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
4019175Sbde * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
4119175Sbde * POSSIBILITY OF SUCH DAMAGES.
4219175Sbde */
4317308Speter
4427910Sasami#include <contrib/dev/acpica/compiler/aslcompiler.h>
4534509Sbde#include <contrib/dev/acpica/include/actables.h>
4627910Sasami#include <contrib/dev/acpica/include/acdisasm.h>
4717308Speter#include <contrib/dev/acpica/include/acapps.h>
482061Sjkh
492061Sjkh#define _COMPONENT          ACPI_COMPILER
501594Srgrimes        ACPI_MODULE_NAME    ("aslstartup")
5130169Sjkh
5230169Sjkh
5330169Sjkh/* Local prototypes */
5430169Sjkh
5530169Sjkhstatic UINT8
5630169SjkhAslDetectSourceFileType (
5730169Sjkh    ASL_FILE_INFO           *Info);
5830169Sjkh
597407Srgrimesstatic ACPI_STATUS
607108SphkAslDoDisassembly (
617108Sphk    void);
627108Sphk
637407Srgrimes
647407Srgrimes/* Globals */
657407Srgrimes
667108Sphkstatic BOOLEAN          AslToFile = TRUE;
672061Sjkh
682061Sjkh
692061Sjkh/*******************************************************************************
7017308Speter *
712061Sjkh * FUNCTION:    AslInitializeGlobals
722061Sjkh *
732061Sjkh * PARAMETERS:  None
742061Sjkh *
752061Sjkh * RETURN:      None
7635427Sbde *
7735427Sbde * DESCRIPTION: Re-initialize globals needed to restart the compiler. This
7830169Sjkh *              allows multiple files to be disassembled and/or compiled.
792626Scsgr *
802061Sjkh ******************************************************************************/
812061Sjkh
822061Sjkhvoid
832061SjkhAslInitializeGlobals (
842061Sjkh    void)
852061Sjkh{
8619320Sadam    UINT32                  i;
872061Sjkh
882061Sjkh
892061Sjkh    /* Init compiler globals */
902061Sjkh
912061Sjkh    Gbl_SyntaxError = 0;
922061Sjkh    Gbl_CurrentColumn = 0;
932061Sjkh    Gbl_CurrentLineNumber = 1;
942061Sjkh    Gbl_LogicalLineNumber = 1;
952061Sjkh    Gbl_CurrentLineOffset = 0;
962061Sjkh    Gbl_InputFieldCount = 0;
972061Sjkh    Gbl_InputByteCount = 0;
982834Swollman    Gbl_NsLookupCount = 0;
992834Swollman    Gbl_LineBufPtr = Gbl_CurrentLineBuffer;
1002834Swollman
1012834Swollman    Gbl_ErrorLog = NULL;
1022834Swollman    Gbl_NextError = NULL;
1032834Swollman    Gbl_Signature = NULL;
1041594Srgrimes    Gbl_FileType = 0;
1054486Sphk
1064486Sphk    TotalExecutableOpcodes = 0;
1074486Sphk    TotalNamedObjects = 0;
1084486Sphk    TotalKeywords = 0;
1094486Sphk    TotalParseNodes = 0;
1102061Sjkh    TotalMethods = 0;
1112061Sjkh    TotalAllocations = 0;
11225979Sjkh    TotalAllocated = 0;
11325979Sjkh    TotalFolds = 0;
11425979Sjkh
11525979Sjkh    AslGbl_NextEvent = 0;
1162061Sjkh    for (i = 0; i < ASL_NUM_REPORT_LEVELS; i++)
11725979Sjkh    {
1182061Sjkh        Gbl_ExceptionCount[i] = 0;
1192061Sjkh    }
12017308Speter
1212061Sjkh    for (i = ASL_FILE_INPUT; i <= ASL_MAX_FILE_TYPE; i++)
1222061Sjkh    {
1232061Sjkh        Gbl_Files[i].Handle = NULL;
1242061Sjkh        Gbl_Files[i].Filename = NULL;
1252061Sjkh    }
12612483Speter}
12712483Speter
12812483Speter
12912483Speter/*******************************************************************************
1302061Sjkh *
1312061Sjkh * FUNCTION:    AslDetectSourceFileType
1328854Srgrimes *
1332061Sjkh * PARAMETERS:  Info            - Name/Handle for the file (must be open)
1342061Sjkh *
13512483Speter * RETURN:      File Type
1362061Sjkh *
13727910Sasami * DESCRIPTION: Determine the type of the input file. Either binary (contains
13827910Sasami *              non-ASCII characters), ASL file, or an ACPI Data Table file.
13918714Sache *
14017308Speter ******************************************************************************/
14134541Sbde
14234575Sbdestatic UINT8
14334575SbdeAslDetectSourceFileType (
14434575Sbde    ASL_FILE_INFO           *Info)
14534592Sbde{
14617308Speter    char                    *FileChar;
14734575Sbde    UINT8                   Type;
14835427Sbde    ACPI_STATUS             Status;
14934575Sbde
15035427Sbde
15134575Sbde    /* Check for a valid binary ACPI table */
15215603Smarkm
15317308Speter    Status = FlCheckForAcpiTable (Info->Handle);
15417308Speter    if (ACPI_SUCCESS (Status))
15517308Speter    {
15617308Speter        Type = ASL_INPUT_TYPE_ACPI_TABLE;
15717308Speter        goto Cleanup;
15817308Speter    }
15917308Speter
16017308Speter    /* Check for 100% ASCII source file (comments are ignored) */
16117308Speter
16218362Sjkh    Status = FlCheckForAscii (Info->Handle, Info->Filename, TRUE);
16319966Sache    if (ACPI_FAILURE (Status))
16418362Sjkh    {
16517308Speter        printf ("Non-ascii input file - %s\n", Info->Filename);
16627910Sasami
16717308Speter        if (!Gbl_IgnoreErrors)
16817308Speter        {
16917308Speter            Type = ASL_INPUT_TYPE_BINARY;
17028803Speter            goto Cleanup;
17127910Sasami        }
17228803Speter    }
17330113Sjkh
17427910Sasami    /*
17517308Speter     * File is ASCII. Determine if this is an ASL file or an ACPI data
1762061Sjkh     * table file.
17727910Sasami     */
1782061Sjkh    while (fgets (Gbl_CurrentLineBuffer, Gbl_LineBufferSize, Info->Handle))
17928803Speter    {
18027910Sasami        /* Uppercase the buffer for caseless compare */
1812061Sjkh
18217308Speter        FileChar = Gbl_CurrentLineBuffer;
18327910Sasami        while (*FileChar)
18417308Speter        {
18527910Sasami            *FileChar = (char) toupper ((int) *FileChar);
18627910Sasami            FileChar++;
18727910Sasami        }
18817308Speter
18927910Sasami        /* Presence of "DefinitionBlock" indicates actual ASL code */
19017308Speter
19127910Sasami        if (strstr (Gbl_CurrentLineBuffer, "DEFINITIONBLOCK"))
19227910Sasami        {
19327910Sasami            /* Appears to be an ASL file */
19427910Sasami
19527910Sasami            Type = ASL_INPUT_TYPE_ASCII_ASL;
19627910Sasami            goto Cleanup;
19727910Sasami        }
19827910Sasami    }
19927910Sasami
20027910Sasami    /* Not an ASL source file, default to a data table source file */
20127910Sasami
20227910Sasami    Type = ASL_INPUT_TYPE_ASCII_DATA;
20334509Sbde
20427910SasamiCleanup:
20527910Sasami
20627910Sasami    /* Must seek back to the start of the file */
20727910Sasami
20827910Sasami    fseek (Info->Handle, 0, SEEK_SET);
20927910Sasami    return (Type);
21027910Sasami}
21127910Sasami
21234688Sbde
21334688Sbde/*******************************************************************************
21427910Sasami *
21535427Sbde * FUNCTION:    AslDoDisassembly
21627910Sasami *
21735427Sbde * PARAMETERS:  None
21827910Sasami *
21935427Sbde * RETURN:      Status
22027910Sasami *
22127910Sasami * DESCRIPTION: Initiate AML file disassembly. Uses ACPICA subsystem to build
22227910Sasami *              namespace.
22327910Sasami *
22427910Sasami ******************************************************************************/
22527910Sasami
22627910Sasamistatic ACPI_STATUS
22727910SasamiAslDoDisassembly (
22827910Sasami    void)
22917308Speter{
23017308Speter    ACPI_STATUS             Status;
23127910Sasami
23217308Speter
23327910Sasami    /* ACPICA subsystem initialization */
23427910Sasami
23527910Sasami    Status = AdInitialize ();
23627910Sasami    if (ACPI_FAILURE (Status))
23733133Sadam    {
23817466Speter        return (Status);
23917308Speter    }
24027910Sasami
24117308Speter    Status = AcpiAllocateRootTable (4);
24234688Sbde    if (ACPI_FAILURE (Status))
24334688Sbde    {
24427910Sasami        AcpiOsPrintf ("Could not initialize ACPI Table Manager, %s\n",
24534688Sbde            AcpiFormatException (Status));
24630113Sjkh        return (Status);
24730277Sasami    }
24834688Sbde
24934688Sbde    /* This is where the disassembly happens */
25033133Sadam
25117308Speter    AcpiGbl_DbOpt_disasm = TRUE;
25217308Speter    Status = AdAmlDisassemble (AslToFile,
25327910Sasami        Gbl_Files[ASL_FILE_INPUT].Filename, Gbl_OutputFilenamePrefix,
25417308Speter        &Gbl_Files[ASL_FILE_INPUT].Filename);
25527910Sasami    if (ACPI_FAILURE (Status))
25627910Sasami    {
25717308Speter        return (Status);
25817308Speter    }
25927910Sasami
26017308Speter    /* Check if any control methods were unresolved */
26130113Sjkh
26227910Sasami    AcpiDmUnresolvedWarning (0);
26327910Sasami
26417308Speter#if 0
26517308Speter    /* TBD: Handle additional output files for disassembler */
26627910Sasami
26717308Speter    Status = FlOpenMiscOutputFiles (Gbl_OutputFilenamePrefix);
26834509Sbde    NsDisplayNamespace ();
26927910Sasami#endif
27033133Sadam
27117308Speter    /* Shutdown compiler and ACPICA subsystem */
27217308Speter
27327910Sasami    AeClearErrorLog ();
27417308Speter    (void) AcpiTerminate ();
27527910Sasami
27617308Speter    /*
27717308Speter     * Gbl_Files[ASL_FILE_INPUT].Filename was replaced with the
27827910Sasami     * .DSL disassembly file, which can now be compiled if requested
27917308Speter     */
28027910Sasami    if (Gbl_DoCompile)
28133133Sadam    {
28217308Speter        AcpiOsPrintf ("\nCompiling \"%s\"\n",
28317308Speter            Gbl_Files[ASL_FILE_INPUT].Filename);
28434509Sbde        return (AE_CTRL_CONTINUE);
28517308Speter    }
28629503Sbde
28733133Sadam    /* No need to free the filename string */
28817962Speter
28917962Speter    Gbl_Files[ASL_FILE_INPUT].Filename = NULL;
29035427Sbde
29117962Speter    CmDeleteCaches ();
29227910Sasami    return (AE_OK);
29333133Sadam}
29417962Speter
29517962Speter
29635427Sbde/*******************************************************************************
29717962Speter *
29835427Sbde * FUNCTION:    AslDoOneFile
29933133Sadam *
30017962Speter * PARAMETERS:  Filename        - Name of the file
30117962Speter *
30227910Sasami * RETURN:      Status
30317962Speter *
30427910Sasami * DESCRIPTION: Process a single file - either disassemble, compile, or both
30533133Sadam *
30617308Speter ******************************************************************************/
30717308Speter
30827910SasamiACPI_STATUS
30917308SpeterAslDoOneFile (
31030205Sbde    char                    *Filename)
31117308Speter{
31217308Speter    ACPI_STATUS             Status;
31335427Sbde
31435427Sbde
31535427Sbde    /* Re-initialize "some" compiler/preprocessor globals */
31635427Sbde
31735427Sbde    AslInitializeGlobals ();
31827910Sasami    PrInitializeGlobals ();
31917962Speter
32027910Sasami    /*
3212061Sjkh     * Extract the directory path. This path is used for possible include
32217308Speter     * files and the optional AML filename embedded in the input file
32327910Sasami     * DefinitionBlock declaration.
32427910Sasami     */
32527910Sasami    Status = FlSplitInputPathname (Filename, &Gbl_DirectoryPath, NULL);
32627910Sasami    if (ACPI_FAILURE (Status))
32727910Sasami    {
32827910Sasami        return (Status);
32927910Sasami    }
33027910Sasami
33117308Speter    /* Take a copy of the input filename, convert any backslashes */
33217308Speter
33317308Speter    Gbl_Files[ASL_FILE_INPUT].Filename =
33417308Speter        UtStringCacheCalloc (strlen (Filename) + 1);
33517308Speter
33617308Speter    strcpy (Gbl_Files[ASL_FILE_INPUT].Filename, Filename);
33717308Speter    UtConvertBackslashes (Gbl_Files[ASL_FILE_INPUT].Filename);
33812483Speter
33917308Speter    /*
34012483Speter     * AML Disassembly (Optional)
34117308Speter     */
34212483Speter    if (Gbl_DisasmFlag)
3432061Sjkh    {
34417962Speter        Status = AslDoDisassembly ();
34517962Speter        if (Status != AE_CTRL_CONTINUE)
34617308Speter        {
34717962Speter            return (Status);
34817962Speter        }
34933595Snate    }
35033595Snate
35133595Snate    /*
35233595Snate     * Open the input file. Here, this should be an ASCII source file,
35333595Snate     * either an ASL file or a Data Table file
35417962Speter     */
35517962Speter    Status = FlOpenInputFile (Gbl_Files[ASL_FILE_INPUT].Filename);
35617308Speter    if (ACPI_FAILURE (Status))
3572061Sjkh    {
35817308Speter        AePrintErrorLog (ASL_FILE_STDERR);
35917308Speter        return (AE_ERROR);
36017308Speter    }
36117308Speter
36217308Speter    /* Determine input file type */
36317308Speter
3642302Spaul    Gbl_FileType = AslDetectSourceFileType (&Gbl_Files[ASL_FILE_INPUT]);
3652302Spaul    if (Gbl_FileType == ASL_INPUT_TYPE_BINARY)
3662302Spaul    {
3672302Spaul        return (AE_ERROR);
3682302Spaul    }
36918714Sache
37010760Sache    /*
37118714Sache     * If -p not specified, we will use the input filename as the
3722302Spaul     * output filename prefix
37310760Sache     */
37418714Sache    if (Gbl_UseDefaultAmlFilename)
37510760Sache    {
37610760Sache        Gbl_OutputFilenamePrefix = Gbl_Files[ASL_FILE_INPUT].Filename;
3772302Spaul    }
3782302Spaul
3792302Spaul    /* Open the optional output files (listings, etc.) */
3802302Spaul
38130132Sfsmp    Status = FlOpenMiscOutputFiles (Gbl_OutputFilenamePrefix);
3822302Spaul    if (ACPI_FAILURE (Status))
3832302Spaul    {
38417308Speter        AePrintErrorLog (ASL_FILE_STDERR);
38517308Speter        return (AE_ERROR);
38617308Speter    }
38717308Speter
38817308Speter    /*
38917308Speter     * Compilation of ASL source versus DataTable source uses different
3902061Sjkh     * compiler subsystems
39117308Speter     */
3922061Sjkh    switch (Gbl_FileType)
39330205Sbde    {
39430205Sbde    /*
39530205Sbde     * Data Table Compilation
39630205Sbde     */
39730205Sbde    case ASL_INPUT_TYPE_ASCII_DATA:
39830205Sbde
39930205Sbde        Status = DtDoCompile ();
40030205Sbde        if (ACPI_FAILURE (Status))
40130169Sjkh        {
40230205Sbde            return (Status);
40317308Speter        }
40417308Speter
40530205Sbde        if (Gbl_Signature)
40617308Speter        {
4072061Sjkh            Gbl_Signature = NULL;
40817308Speter        }
40917308Speter
41017308Speter        /* Check if any errors occurred during compile */
41117308Speter
41217308Speter        Status = AslCheckForErrorExit ();
41317308Speter        if (ACPI_FAILURE (Status))
4143626Swollman        {
4153626Swollman            return (Status);
4163626Swollman        }
4173626Swollman
41830205Sbde        /* Cleanup (for next source file) and exit */
41930205Sbde
42030205Sbde        AeClearErrorLog ();
42130205Sbde        PrTerminatePreprocessor ();
42230205Sbde        return (Status);
42330205Sbde
42430205Sbde    /*
42530205Sbde     * ASL Compilation
42630169Sjkh     */
42730205Sbde    case ASL_INPUT_TYPE_ASCII_ASL:
4283626Swollman
4293626Swollman        /* ACPICA subsystem initialization */
43030205Sbde
4313626Swollman        Status = AdInitialize ();
4323626Swollman        if (ACPI_FAILURE (Status))
43317308Speter        {
43417308Speter            return (Status);
43517308Speter        }
43617308Speter
43717308Speter        (void) CmDoCompile ();
43817308Speter        (void) AcpiTerminate ();
43917308Speter
44017308Speter        /* Check if any errors occurred during compile */
44117308Speter
44217308Speter        Status = AslCheckForErrorExit ();
4433626Swollman        if (ACPI_FAILURE (Status))
44417308Speter        {
44517308Speter            return (Status);
44617308Speter        }
44717308Speter
44817308Speter        /* Cleanup (for next source file) and exit */
44917308Speter
45017308Speter        AeClearErrorLog ();
45117308Speter        PrTerminatePreprocessor ();
45217308Speter        return (AE_OK);
45317308Speter
45417308Speter    /*
45517308Speter     * Binary ACPI table was auto-detected, disassemble it
45627910Sasami     */
45727910Sasami    case ASL_INPUT_TYPE_ACPI_TABLE:
45827910Sasami
45927910Sasami        /* We have what appears to be an ACPI table, disassemble it */
46034575Sbde
46127910Sasami        FlCloseFile (ASL_FILE_INPUT);
46234509Sbde        Gbl_DoCompile = FALSE;
46330113Sjkh        Gbl_DisasmFlag = TRUE;
46430113Sjkh        Status = AslDoDisassembly ();
46534509Sbde        return (Status);
46630113Sjkh
46730113Sjkh    /* Unknown binary table */
46834509Sbde
46934509Sbde    case ASL_INPUT_TYPE_BINARY:
47030170Sjkh
47130113Sjkh        AePrintErrorLog (ASL_FILE_STDERR);
47229938Smckay        return (AE_ERROR);
47334509Sbde
47429938Smckay    default:
47517308Speter
47617308Speter        printf ("Unknown file type %X\n", Gbl_FileType);
47717308Speter        return (AE_ERROR);
47817308Speter    }
47917308Speter}
48027910Sasami
48127910Sasami
48227910Sasami/*******************************************************************************
48317308Speter *
48417308Speter * FUNCTION:    AslCheckForErrorExit
48534520Sbde *
48634520Sbde * PARAMETERS:  None. Examines global exception count array
48734509Sbde *
48830113Sjkh * RETURN:      Status
48930113Sjkh *
49034520Sbde * DESCRIPTION: Determine if compiler should abort with error status
49117308Speter *
49217308Speter ******************************************************************************/
49317308Speter
49417308SpeterACPI_STATUS
49514119SpeterAslCheckForErrorExit (
4962061Sjkh    void)
4977130Srgrimes{
4987130Srgrimes
4997130Srgrimes    /*
5002061Sjkh     * Return non-zero exit code if there have been errors, unless the
50130113Sjkh     * global ignore error flag has been set
50217308Speter     */
50330169Sjkh    if (!Gbl_IgnoreErrors)
50430169Sjkh    {
5052685Srgrimes        if (Gbl_ExceptionCount[ASL_ERROR] > 0)
5066927Snate        {
50727790Sasami            return (AE_ERROR);
50827790Sasami        }
50927790Sasami
51030169Sjkh        /* Optionally treat warnings as errors */
51130169Sjkh
51230169Sjkh        if (Gbl_WarningsAsErrors)
5133197Scsgr        {
51430169Sjkh            if ((Gbl_ExceptionCount[ASL_WARNING] > 0)  ||
51530169Sjkh                (Gbl_ExceptionCount[ASL_WARNING2] > 0) ||
51630169Sjkh                (Gbl_ExceptionCount[ASL_WARNING3] > 0))
51730169Sjkh            {
51830169Sjkh                return (AE_ERROR);
51930169Sjkh            }
52030169Sjkh        }
52130169Sjkh    }
52230169Sjkh
52330169Sjkh    return (AE_OK);
52432427Sjb}
52532427Sjb