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