1193267Sjkim/****************************************************************************** 2193267Sjkim * 3193267Sjkim * Module Name: aslstartup - Compiler startup routines, called from main 4193267Sjkim * 5193267Sjkim *****************************************************************************/ 6193267Sjkim 7217365Sjkim/* 8306536Sjkim * Copyright (C) 2000 - 2016, Intel Corp. 9193267Sjkim * All rights reserved. 10193267Sjkim * 11217365Sjkim * Redistribution and use in source and binary forms, with or without 12217365Sjkim * modification, are permitted provided that the following conditions 13217365Sjkim * are met: 14217365Sjkim * 1. Redistributions of source code must retain the above copyright 15217365Sjkim * notice, this list of conditions, and the following disclaimer, 16217365Sjkim * without modification. 17217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18217365Sjkim * substantially similar to the "NO WARRANTY" disclaimer below 19217365Sjkim * ("Disclaimer") and any redistribution must be conditioned upon 20217365Sjkim * including a substantially similar Disclaimer requirement for further 21217365Sjkim * binary redistribution. 22217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names 23217365Sjkim * of any contributors may be used to endorse or promote products derived 24217365Sjkim * from this software without specific prior written permission. 25193267Sjkim * 26217365Sjkim * Alternatively, this software may be distributed under the terms of the 27217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free 28217365Sjkim * Software Foundation. 29193267Sjkim * 30217365Sjkim * NO WARRANTY 31217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41217365Sjkim * POSSIBILITY OF SUCH DAMAGES. 42217365Sjkim */ 43193267Sjkim 44193341Sjkim#include <contrib/dev/acpica/compiler/aslcompiler.h> 45193341Sjkim#include <contrib/dev/acpica/include/actables.h> 46246849Sjkim#include <contrib/dev/acpica/include/acdisasm.h> 47193341Sjkim#include <contrib/dev/acpica/include/acapps.h> 48193267Sjkim 49193267Sjkim#define _COMPONENT ACPI_COMPILER 50193267Sjkim ACPI_MODULE_NAME ("aslstartup") 51193267Sjkim 52193267Sjkim 53193267Sjkim/* Local prototypes */ 54193267Sjkim 55212761Sjkimstatic UINT8 56209746SjkimAslDetectSourceFileType ( 57209746Sjkim ASL_FILE_INFO *Info); 58193267Sjkim 59246849Sjkimstatic ACPI_STATUS 60246849SjkimAslDoDisassembly ( 61246849Sjkim void); 62209746Sjkim 63246849Sjkim 64281075Sdim/* Globals */ 65281075Sdim 66281075Sdimstatic BOOLEAN AslToFile = TRUE; 67281075Sdim 68281075Sdim 69193267Sjkim/******************************************************************************* 70193267Sjkim * 71193267Sjkim * FUNCTION: AslInitializeGlobals 72193267Sjkim * 73193267Sjkim * PARAMETERS: None 74193267Sjkim * 75193267Sjkim * RETURN: None 76193267Sjkim * 77193267Sjkim * DESCRIPTION: Re-initialize globals needed to restart the compiler. This 78193267Sjkim * allows multiple files to be disassembled and/or compiled. 79193267Sjkim * 80193267Sjkim ******************************************************************************/ 81193267Sjkim 82209746Sjkimvoid 83193267SjkimAslInitializeGlobals ( 84193267Sjkim void) 85193267Sjkim{ 86193267Sjkim UINT32 i; 87193267Sjkim 88193267Sjkim 89193267Sjkim /* Init compiler globals */ 90193267Sjkim 91281075Sdim Gbl_SyntaxError = 0; 92193267Sjkim Gbl_CurrentColumn = 0; 93193267Sjkim Gbl_CurrentLineNumber = 1; 94193267Sjkim Gbl_LogicalLineNumber = 1; 95193267Sjkim Gbl_CurrentLineOffset = 0; 96209746Sjkim Gbl_InputFieldCount = 0; 97233250Sjkim Gbl_InputByteCount = 0; 98233250Sjkim Gbl_NsLookupCount = 0; 99193267Sjkim Gbl_LineBufPtr = Gbl_CurrentLineBuffer; 100193267Sjkim 101193267Sjkim Gbl_ErrorLog = NULL; 102193267Sjkim Gbl_NextError = NULL; 103209746Sjkim Gbl_Signature = NULL; 104209746Sjkim Gbl_FileType = 0; 105193267Sjkim 106233250Sjkim TotalExecutableOpcodes = 0; 107233250Sjkim TotalNamedObjects = 0; 108233250Sjkim TotalKeywords = 0; 109233250Sjkim TotalParseNodes = 0; 110233250Sjkim TotalMethods = 0; 111233250Sjkim TotalAllocations = 0; 112233250Sjkim TotalAllocated = 0; 113233250Sjkim TotalFolds = 0; 114233250Sjkim 115193267Sjkim AslGbl_NextEvent = 0; 116193267Sjkim for (i = 0; i < ASL_NUM_REPORT_LEVELS; i++) 117193267Sjkim { 118193267Sjkim Gbl_ExceptionCount[i] = 0; 119193267Sjkim } 120193267Sjkim 121233250Sjkim for (i = ASL_FILE_INPUT; i <= ASL_MAX_FILE_TYPE; i++) 122233250Sjkim { 123233250Sjkim Gbl_Files[i].Handle = NULL; 124233250Sjkim Gbl_Files[i].Filename = NULL; 125233250Sjkim } 126193267Sjkim} 127193267Sjkim 128193267Sjkim 129193267Sjkim/******************************************************************************* 130193267Sjkim * 131209746Sjkim * FUNCTION: AslDetectSourceFileType 132209746Sjkim * 133209746Sjkim * PARAMETERS: Info - Name/Handle for the file (must be open) 134209746Sjkim * 135209746Sjkim * RETURN: File Type 136209746Sjkim * 137209746Sjkim * DESCRIPTION: Determine the type of the input file. Either binary (contains 138209746Sjkim * non-ASCII characters), ASL file, or an ACPI Data Table file. 139209746Sjkim * 140209746Sjkim ******************************************************************************/ 141209746Sjkim 142212761Sjkimstatic UINT8 143209746SjkimAslDetectSourceFileType ( 144209746Sjkim ASL_FILE_INFO *Info) 145209746Sjkim{ 146209746Sjkim char *FileChar; 147306536Sjkim UINT8 Type = ASL_INPUT_TYPE_ASCII_DATA; /* default */ 148209746Sjkim ACPI_STATUS Status; 149209746Sjkim 150209746Sjkim 151306536Sjkim /* Check for 100% ASCII source file (comments are ignored) */ 152246849Sjkim 153306536Sjkim Status = FlIsFileAsciiSource (Info->Filename, FALSE); 154246849Sjkim if (ACPI_SUCCESS (Status)) 155246849Sjkim { 156306536Sjkim /* 157306536Sjkim * File contains ASCII source code. Determine if this is an ASL 158306536Sjkim * file or an ACPI data table file. 159306536Sjkim */ 160306536Sjkim while (fgets (Gbl_CurrentLineBuffer, Gbl_LineBufferSize, Info->Handle)) 161306536Sjkim { 162306536Sjkim /* Uppercase the buffer for caseless compare */ 163246849Sjkim 164306536Sjkim FileChar = Gbl_CurrentLineBuffer; 165306536Sjkim while (*FileChar) 166306536Sjkim { 167306536Sjkim *FileChar = (char) toupper ((int) *FileChar); 168306536Sjkim FileChar++; 169306536Sjkim } 170209746Sjkim 171306536Sjkim /* Presence of "DefinitionBlock" indicates actual ASL code */ 172241973Sjkim 173306536Sjkim if (strstr (Gbl_CurrentLineBuffer, "DEFINITIONBLOCK")) 174306536Sjkim { 175306536Sjkim /* Appears to be an ASL file */ 176306536Sjkim 177306536Sjkim Type = ASL_INPUT_TYPE_ASCII_ASL; 178306536Sjkim goto Cleanup; 179306536Sjkim } 180241973Sjkim } 181306536Sjkim 182306536Sjkim /* Appears to be an ASCII data table source file */ 183306536Sjkim 184306536Sjkim Type = ASL_INPUT_TYPE_ASCII_DATA; 185306536Sjkim goto Cleanup; 186209746Sjkim } 187209746Sjkim 188306536Sjkim /* We have some sort of binary table, check for valid ACPI table */ 189209746Sjkim 190306536Sjkim fseek (Info->Handle, 0, SEEK_SET); 191209746Sjkim 192306536Sjkim Status = AcValidateTableHeader (Info->Handle, 0); 193306536Sjkim if (ACPI_SUCCESS (Status)) 194306536Sjkim { 195306536Sjkim fprintf (stderr, 196306536Sjkim "Binary file appears to be a valid ACPI table, disassembling\n"); 197209746Sjkim 198306536Sjkim Type = ASL_INPUT_TYPE_BINARY_ACPI_TABLE; 199306536Sjkim goto Cleanup; 200209746Sjkim } 201209746Sjkim 202306536Sjkim Type = ASL_INPUT_TYPE_BINARY; 203209746Sjkim 204209746Sjkim 205209746SjkimCleanup: 206209746Sjkim 207209746Sjkim /* Must seek back to the start of the file */ 208209746Sjkim 209209746Sjkim fseek (Info->Handle, 0, SEEK_SET); 210209746Sjkim return (Type); 211209746Sjkim} 212209746Sjkim 213209746Sjkim 214209746Sjkim/******************************************************************************* 215209746Sjkim * 216246849Sjkim * FUNCTION: AslDoDisassembly 217246849Sjkim * 218246849Sjkim * PARAMETERS: None 219246849Sjkim * 220246849Sjkim * RETURN: Status 221246849Sjkim * 222246849Sjkim * DESCRIPTION: Initiate AML file disassembly. Uses ACPICA subsystem to build 223246849Sjkim * namespace. 224246849Sjkim * 225246849Sjkim ******************************************************************************/ 226246849Sjkim 227246849Sjkimstatic ACPI_STATUS 228246849SjkimAslDoDisassembly ( 229246849Sjkim void) 230246849Sjkim{ 231246849Sjkim ACPI_STATUS Status; 232246849Sjkim 233246849Sjkim 234246849Sjkim /* ACPICA subsystem initialization */ 235246849Sjkim 236246849Sjkim Status = AdInitialize (); 237246849Sjkim if (ACPI_FAILURE (Status)) 238246849Sjkim { 239246849Sjkim return (Status); 240246849Sjkim } 241246849Sjkim 242246849Sjkim Status = AcpiAllocateRootTable (4); 243246849Sjkim if (ACPI_FAILURE (Status)) 244246849Sjkim { 245246849Sjkim AcpiOsPrintf ("Could not initialize ACPI Table Manager, %s\n", 246246849Sjkim AcpiFormatException (Status)); 247246849Sjkim return (Status); 248246849Sjkim } 249246849Sjkim 250306536Sjkim /* Handle additional output files for disassembler */ 251306536Sjkim 252306536Sjkim Gbl_FileType = ASL_INPUT_TYPE_BINARY_ACPI_TABLE; 253306536Sjkim Status = FlOpenMiscOutputFiles (Gbl_OutputFilenamePrefix); 254306536Sjkim 255246849Sjkim /* This is where the disassembly happens */ 256246849Sjkim 257306536Sjkim AcpiGbl_DmOpt_Disasm = TRUE; 258246849Sjkim Status = AdAmlDisassemble (AslToFile, 259246849Sjkim Gbl_Files[ASL_FILE_INPUT].Filename, Gbl_OutputFilenamePrefix, 260281075Sdim &Gbl_Files[ASL_FILE_INPUT].Filename); 261246849Sjkim if (ACPI_FAILURE (Status)) 262246849Sjkim { 263246849Sjkim return (Status); 264246849Sjkim } 265246849Sjkim 266246849Sjkim /* Check if any control methods were unresolved */ 267246849Sjkim 268246849Sjkim AcpiDmUnresolvedWarning (0); 269246849Sjkim 270246849Sjkim /* Shutdown compiler and ACPICA subsystem */ 271246849Sjkim 272246849Sjkim AeClearErrorLog (); 273246849Sjkim (void) AcpiTerminate (); 274246849Sjkim 275246849Sjkim /* 276246849Sjkim * Gbl_Files[ASL_FILE_INPUT].Filename was replaced with the 277246849Sjkim * .DSL disassembly file, which can now be compiled if requested 278246849Sjkim */ 279246849Sjkim if (Gbl_DoCompile) 280246849Sjkim { 281246849Sjkim AcpiOsPrintf ("\nCompiling \"%s\"\n", 282246849Sjkim Gbl_Files[ASL_FILE_INPUT].Filename); 283246849Sjkim return (AE_CTRL_CONTINUE); 284246849Sjkim } 285246849Sjkim 286281075Sdim /* No need to free the filename string */ 287281075Sdim 288246849Sjkim Gbl_Files[ASL_FILE_INPUT].Filename = NULL; 289281075Sdim 290281075Sdim CmDeleteCaches (); 291246849Sjkim return (AE_OK); 292246849Sjkim} 293246849Sjkim 294246849Sjkim 295246849Sjkim/******************************************************************************* 296246849Sjkim * 297193267Sjkim * FUNCTION: AslDoOneFile 298193267Sjkim * 299193267Sjkim * PARAMETERS: Filename - Name of the file 300193267Sjkim * 301193267Sjkim * RETURN: Status 302193267Sjkim * 303193267Sjkim * DESCRIPTION: Process a single file - either disassemble, compile, or both 304193267Sjkim * 305193267Sjkim ******************************************************************************/ 306193267Sjkim 307193267SjkimACPI_STATUS 308193267SjkimAslDoOneFile ( 309193267Sjkim char *Filename) 310193267Sjkim{ 311193267Sjkim ACPI_STATUS Status; 312193267Sjkim 313193267Sjkim 314233250Sjkim /* Re-initialize "some" compiler/preprocessor globals */ 315193267Sjkim 316193267Sjkim AslInitializeGlobals (); 317233250Sjkim PrInitializeGlobals (); 318193267Sjkim 319281075Sdim /* 320281075Sdim * Extract the directory path. This path is used for possible include 321281075Sdim * files and the optional AML filename embedded in the input file 322281075Sdim * DefinitionBlock declaration. 323281075Sdim */ 324281075Sdim Status = FlSplitInputPathname (Filename, &Gbl_DirectoryPath, NULL); 325281075Sdim if (ACPI_FAILURE (Status)) 326281075Sdim { 327281075Sdim return (Status); 328281075Sdim } 329233250Sjkim 330281075Sdim /* Take a copy of the input filename, convert any backslashes */ 331281075Sdim 332281075Sdim Gbl_Files[ASL_FILE_INPUT].Filename = 333281075Sdim UtStringCacheCalloc (strlen (Filename) + 1); 334281075Sdim 335281075Sdim strcpy (Gbl_Files[ASL_FILE_INPUT].Filename, Filename); 336281075Sdim UtConvertBackslashes (Gbl_Files[ASL_FILE_INPUT].Filename); 337281075Sdim 338193267Sjkim /* 339193267Sjkim * AML Disassembly (Optional) 340193267Sjkim */ 341281075Sdim if (Gbl_DisasmFlag) 342193267Sjkim { 343246849Sjkim Status = AslDoDisassembly (); 344246849Sjkim if (Status != AE_CTRL_CONTINUE) 345193267Sjkim { 346193267Sjkim return (Status); 347193267Sjkim } 348193267Sjkim } 349193267Sjkim 350193267Sjkim /* 351209746Sjkim * Open the input file. Here, this should be an ASCII source file, 352209746Sjkim * either an ASL file or a Data Table file 353193267Sjkim */ 354209746Sjkim Status = FlOpenInputFile (Gbl_Files[ASL_FILE_INPUT].Filename); 355209746Sjkim if (ACPI_FAILURE (Status)) 356193267Sjkim { 357209746Sjkim AePrintErrorLog (ASL_FILE_STDERR); 358209746Sjkim return (AE_ERROR); 359209746Sjkim } 360209746Sjkim 361306536Sjkim Gbl_OriginalInputFileSize = FlGetFileSize (ASL_FILE_INPUT); 362306536Sjkim 363209746Sjkim /* Determine input file type */ 364209746Sjkim 365209746Sjkim Gbl_FileType = AslDetectSourceFileType (&Gbl_Files[ASL_FILE_INPUT]); 366209746Sjkim if (Gbl_FileType == ASL_INPUT_TYPE_BINARY) 367209746Sjkim { 368209746Sjkim return (AE_ERROR); 369209746Sjkim } 370209746Sjkim 371209746Sjkim /* 372209746Sjkim * If -p not specified, we will use the input filename as the 373209746Sjkim * output filename prefix 374209746Sjkim */ 375209746Sjkim if (Gbl_UseDefaultAmlFilename) 376209746Sjkim { 377209746Sjkim Gbl_OutputFilenamePrefix = Gbl_Files[ASL_FILE_INPUT].Filename; 378209746Sjkim } 379209746Sjkim 380209746Sjkim /* Open the optional output files (listings, etc.) */ 381209746Sjkim 382209746Sjkim Status = FlOpenMiscOutputFiles (Gbl_OutputFilenamePrefix); 383209746Sjkim if (ACPI_FAILURE (Status)) 384209746Sjkim { 385209746Sjkim AePrintErrorLog (ASL_FILE_STDERR); 386209746Sjkim return (AE_ERROR); 387209746Sjkim } 388209746Sjkim 389209746Sjkim /* 390209746Sjkim * Compilation of ASL source versus DataTable source uses different 391209746Sjkim * compiler subsystems 392209746Sjkim */ 393209746Sjkim switch (Gbl_FileType) 394209746Sjkim { 395209746Sjkim /* 396209746Sjkim * Data Table Compilation 397209746Sjkim */ 398209746Sjkim case ASL_INPUT_TYPE_ASCII_DATA: 399209746Sjkim 400209746Sjkim Status = DtDoCompile (); 401234623Sjkim if (ACPI_FAILURE (Status)) 402234623Sjkim { 403234623Sjkim return (Status); 404234623Sjkim } 405209746Sjkim 406209746Sjkim if (Gbl_Signature) 407193267Sjkim { 408209746Sjkim Gbl_Signature = NULL; 409193267Sjkim } 410234623Sjkim 411234623Sjkim /* Check if any errors occurred during compile */ 412234623Sjkim 413234623Sjkim Status = AslCheckForErrorExit (); 414234623Sjkim if (ACPI_FAILURE (Status)) 415234623Sjkim { 416234623Sjkim return (Status); 417234623Sjkim } 418234623Sjkim 419234623Sjkim /* Cleanup (for next source file) and exit */ 420234623Sjkim 421209746Sjkim AeClearErrorLog (); 422233250Sjkim PrTerminatePreprocessor (); 423209746Sjkim return (Status); 424193267Sjkim 425209746Sjkim /* 426234623Sjkim * ASL Compilation 427209746Sjkim */ 428209746Sjkim case ASL_INPUT_TYPE_ASCII_ASL: 429193267Sjkim 430209746Sjkim /* ACPICA subsystem initialization */ 431209746Sjkim 432193267Sjkim Status = AdInitialize (); 433193267Sjkim if (ACPI_FAILURE (Status)) 434193267Sjkim { 435193267Sjkim return (Status); 436193267Sjkim } 437193267Sjkim 438234623Sjkim (void) CmDoCompile (); 439212761Sjkim (void) AcpiTerminate (); 440193267Sjkim 441234623Sjkim /* Check if any errors occurred during compile */ 442234623Sjkim 443234623Sjkim Status = AslCheckForErrorExit (); 444234623Sjkim if (ACPI_FAILURE (Status)) 445193267Sjkim { 446234623Sjkim return (Status); 447193267Sjkim } 448193267Sjkim 449234623Sjkim /* Cleanup (for next source file) and exit */ 450234623Sjkim 451193267Sjkim AeClearErrorLog (); 452233250Sjkim PrTerminatePreprocessor (); 453209746Sjkim return (AE_OK); 454209746Sjkim 455246849Sjkim /* 456246849Sjkim * Binary ACPI table was auto-detected, disassemble it 457246849Sjkim */ 458306536Sjkim case ASL_INPUT_TYPE_BINARY_ACPI_TABLE: 459246849Sjkim 460246849Sjkim /* We have what appears to be an ACPI table, disassemble it */ 461246849Sjkim 462246849Sjkim FlCloseFile (ASL_FILE_INPUT); 463246849Sjkim Gbl_DoCompile = FALSE; 464246849Sjkim Gbl_DisasmFlag = TRUE; 465246849Sjkim Status = AslDoDisassembly (); 466246849Sjkim return (Status); 467246849Sjkim 468246849Sjkim /* Unknown binary table */ 469246849Sjkim 470209746Sjkim case ASL_INPUT_TYPE_BINARY: 471209746Sjkim 472209746Sjkim AePrintErrorLog (ASL_FILE_STDERR); 473209746Sjkim return (AE_ERROR); 474209746Sjkim 475209746Sjkim default: 476250838Sjkim 477209746Sjkim printf ("Unknown file type %X\n", Gbl_FileType); 478209746Sjkim return (AE_ERROR); 479193267Sjkim } 480193267Sjkim} 481193267Sjkim 482193267Sjkim 483193267Sjkim/******************************************************************************* 484193267Sjkim * 485234623Sjkim * FUNCTION: AslCheckForErrorExit 486234623Sjkim * 487234623Sjkim * PARAMETERS: None. Examines global exception count array 488234623Sjkim * 489234623Sjkim * RETURN: Status 490234623Sjkim * 491234623Sjkim * DESCRIPTION: Determine if compiler should abort with error status 492234623Sjkim * 493234623Sjkim ******************************************************************************/ 494234623Sjkim 495234623SjkimACPI_STATUS 496234623SjkimAslCheckForErrorExit ( 497234623Sjkim void) 498234623Sjkim{ 499234623Sjkim 500234623Sjkim /* 501234623Sjkim * Return non-zero exit code if there have been errors, unless the 502234623Sjkim * global ignore error flag has been set 503234623Sjkim */ 504234623Sjkim if (!Gbl_IgnoreErrors) 505234623Sjkim { 506234623Sjkim if (Gbl_ExceptionCount[ASL_ERROR] > 0) 507234623Sjkim { 508234623Sjkim return (AE_ERROR); 509234623Sjkim } 510234623Sjkim 511234623Sjkim /* Optionally treat warnings as errors */ 512234623Sjkim 513234623Sjkim if (Gbl_WarningsAsErrors) 514234623Sjkim { 515234623Sjkim if ((Gbl_ExceptionCount[ASL_WARNING] > 0) || 516234623Sjkim (Gbl_ExceptionCount[ASL_WARNING2] > 0) || 517234623Sjkim (Gbl_ExceptionCount[ASL_WARNING3] > 0)) 518234623Sjkim { 519234623Sjkim return (AE_ERROR); 520234623Sjkim } 521234623Sjkim } 522234623Sjkim } 523234623Sjkim 524234623Sjkim return (AE_OK); 525234623Sjkim} 526