From patchwork Mon Apr 8 14:51:51 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Colin Ian King X-Patchwork-Id: 1081110 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.ubuntu.com (client-ip=91.189.94.19; helo=huckleberry.canonical.com; envelope-from=fwts-devel-bounces@lists.ubuntu.com; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=canonical.com Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 44dD0N48z0z9sQy; Tue, 9 Apr 2019 00:52:03 +1000 (AEST) Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.86_2) (envelope-from ) id 1hDVcu-0003Tk-Mq; Mon, 08 Apr 2019 14:52:00 +0000 Received: from youngberry.canonical.com ([91.189.89.112]) by huckleberry.canonical.com with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:128) (Exim 4.86_2) (envelope-from ) id 1hDVco-0003TR-HX for fwts-devel@lists.ubuntu.com; Mon, 08 Apr 2019 14:51:54 +0000 Received: from 1.general.cking.uk.vpn ([10.172.193.212] helo=localhost) by youngberry.canonical.com with esmtpsa (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.76) (envelope-from ) id 1hDVcn-0001Xf-Vd; Mon, 08 Apr 2019 14:51:54 +0000 From: Colin King To: fwts-devel@lists.ubuntu.com Subject: [PATCH 1/3] ACPICA: Update to version 20190405 Date: Mon, 8 Apr 2019 15:51:51 +0100 Message-Id: <20190408145153.5485-1-colin.king@canonical.com> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 X-BeenThere: fwts-devel@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Firmware Test Suite Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: fwts-devel-bounces@lists.ubuntu.com Sender: "fwts-devel" From: Colin Ian King changes in this release of ACPICA are detailed at the following link on the ACPICA developer mailing list: https://lists.acpica.org/pipermail/devel/2019-April/001889.html This also required some rework with the fwts iasl interface because of changes to where error messages are now being written (stderr rather than stdout). Signed-off-by: Colin Ian King Acked-by: Ivan Hu Acked-by: Alex Hung --- src/acpi/syntaxcheck/syntaxcheck.c | 4 +- src/acpica/source/common/adisasm.c | 2 +- src/acpica/source/compiler/aslcodegen.c | 52 +--- src/acpica/source/compiler/aslcompile.c | 183 ++++++++++--- src/acpica/source/compiler/aslcompiler.h | 61 ++++- src/acpica/source/compiler/asldefine.h | 1 - src/acpica/source/compiler/aslerror.c | 26 +- src/acpica/source/compiler/aslfileio.c | 4 +- src/acpica/source/compiler/aslfiles.c | 253 +++++++++++++++++- src/acpica/source/compiler/aslglobal.h | 48 ++-- src/acpica/source/compiler/asllisting.c | 7 +- src/acpica/source/compiler/aslload.c | 1 + src/acpica/source/compiler/aslmain.c | 81 ++++-- src/acpica/source/compiler/aslmessages.c | 7 +- src/acpica/source/compiler/aslmessages.h | 5 +- src/acpica/source/compiler/asloperands.c | 25 ++ src/acpica/source/compiler/asloptions.c | 1 - src/acpica/source/compiler/aslstartup.c | 130 ++++----- src/acpica/source/compiler/aslsupport.l | 12 +- src/acpica/source/compiler/asltree.c | 70 ++++- src/acpica/source/compiler/asltypes.h | 62 +++-- src/acpica/source/compiler/aslutils.c | 156 +++++++++-- src/acpica/source/compiler/aslxref.c | 18 ++ src/acpica/source/compiler/dtcompile.c | 11 +- .../source/compiler/fwts_iasl_interface.c | 42 +-- src/acpica/source/compiler/prutils.c | 1 - src/acpica/source/components/events/evgpe.c | 8 + .../source/components/namespace/nsalloc.c | 5 + src/acpica/source/include/acpixf.h | 2 +- 29 files changed, 978 insertions(+), 300 deletions(-) diff --git a/src/acpi/syntaxcheck/syntaxcheck.c b/src/acpi/syntaxcheck/syntaxcheck.c index 5d1ea112..d1eb0798 100644 --- a/src/acpi/syntaxcheck/syntaxcheck.c +++ b/src/acpi/syntaxcheck/syntaxcheck.c @@ -488,9 +488,9 @@ static int syntaxcheck_single_table( fwts_log_info(fw, "Checking ACPI table %s (#%d)", info->name, n); fwts_log_nl(fw); - if (iasl_stdout) { + if (iasl_stderr) { /* Scan error text from assembly */ - fwts_list_foreach(item, iasl_stdout) { + fwts_list_foreach(item, iasl_stderr) { int num; char ch; char *line = fwts_text_list_text(item); diff --git a/src/acpica/source/common/adisasm.c b/src/acpica/source/common/adisasm.c index 518468b7..c73208f6 100644 --- a/src/acpica/source/common/adisasm.c +++ b/src/acpica/source/common/adisasm.c @@ -579,7 +579,7 @@ AdDisassembleOneTable ( if (AslGbl_MapfileFlag) { fprintf (stderr, "%14s %s - %u bytes\n", - AslGbl_Files[ASL_FILE_MAP_OUTPUT].ShortDescription, + AslGbl_FileDescs[ASL_FILE_MAP_OUTPUT].ShortDescription, AslGbl_Files[ASL_FILE_MAP_OUTPUT].Filename, FlGetFileSize (ASL_FILE_MAP_OUTPUT)); } diff --git a/src/acpica/source/compiler/aslcodegen.c b/src/acpica/source/compiler/aslcodegen.c index 8edcb668..88e34824 100644 --- a/src/acpica/source/compiler/aslcodegen.c +++ b/src/acpica/source/compiler/aslcodegen.c @@ -174,11 +174,11 @@ CgWriteTableHeader ( ACPI_PARSE_OBJECT *Op); static void -CgCloseTable ( - void); +CgWriteNode ( + ACPI_PARSE_OBJECT *Op); static void -CgWriteNode ( +CgUpdateHeader ( ACPI_PARSE_OBJECT *Op); @@ -202,15 +202,12 @@ CgGenerateAmlOutput ( /* Generate the AML output file */ - FlSeekFile (ASL_FILE_SOURCE_OUTPUT, 0); - AslGbl_SourceLine = 0; - AslGbl_NextError = AslGbl_ErrorLog; - - TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_DOWNWARD, + TrWalkParseTree (AslGbl_CurrentDB, + ASL_WALK_VISIT_DOWNWARD | ASL_WALK_VISIT_DB_SEPARATELY, CgAmlWriteWalk, NULL, NULL); DbgPrint (ASL_TREE_OUTPUT, ASL_PARSE_TREE_HEADER2); - CgCloseTable (); + CgUpdateHeader (AslGbl_CurrentDB); } @@ -708,38 +705,13 @@ CgUpdateHeader ( ACPI_OFFSET (ACPI_TABLE_HEADER, Checksum)); FlWriteFile (ASL_FILE_AML_OUTPUT, &Checksum, 1); -} - - -/******************************************************************************* - * - * FUNCTION: CgCloseTable - * - * PARAMETERS: None. - * - * RETURN: None. - * - * DESCRIPTION: Complete the ACPI table by calculating the checksum and - * re-writing each table header. This allows support for - * multiple definition blocks in a single source file. - * - ******************************************************************************/ - -static void -CgCloseTable ( - void) -{ - ACPI_PARSE_OBJECT *Op; - - /* Process all definition blocks */ - - Op = AslGbl_ParseTreeRoot->Asl.Child; - while (Op) - { - CgUpdateHeader (Op); - Op = Op->Asl.Next; - } + /* + * Seek to the end of the file. This is done to support multiple file + * compilation. Doing this simplifies other parts of the codebase because + * it eliminates the need to seek for a different starting place. + */ + FlSeekFile (ASL_FILE_AML_OUTPUT, Op->Asl.FinalAmlOffset + Length); } diff --git a/src/acpica/source/compiler/aslcompile.c b/src/acpica/source/compiler/aslcompile.c index c46b28da..845f15bc 100644 --- a/src/acpica/source/compiler/aslcompile.c +++ b/src/acpica/source/compiler/aslcompile.c @@ -178,6 +178,10 @@ static void CmDumpAllEvents ( void); +static void +CmFinishFiles( + BOOLEAN DeleteAmlFile); + /******************************************************************************* * @@ -191,13 +195,13 @@ CmDumpAllEvents ( * ******************************************************************************/ -int +ACPI_STATUS CmDoCompile ( void) { - ACPI_STATUS Status; UINT8 FullCompile; UINT8 Event; + ASL_GLOBAL_FILE_NODE *FileNode; FullCompile = UtBeginEvent ("*** Total Compile time ***"); @@ -221,7 +225,7 @@ CmDoCompile ( { UtEndEvent (Event); CmCleanupAndExit (); - return (0); + return (AE_OK); } } UtEndEvent (Event); @@ -239,6 +243,12 @@ CmDoCompile ( { fprintf (stderr, "Compiler aborting due to parser-detected syntax error(s)\n"); + + /* Flag this error in the FileNode for compilation summary */ + + FileNode = FlGetCurrentFileNode (); + FileNode->ParserErrorDetected = TRUE; + AslGbl_ParserErrorDetected = TRUE; LsDumpParseTree (); goto ErrorExit; } @@ -292,19 +302,35 @@ CmDoCompile ( OpcAmlOpcodeWalk, NULL); UtEndEvent (Event); - /* - * Now that the input is parsed, we can open the AML output file. - * Note: by default, the name of this file comes from the table - * descriptor within the input file. - */ - Event = UtBeginEvent ("Open AML output file"); - Status = FlOpenAmlOutputFile (AslGbl_OutputFilenamePrefix); - UtEndEvent (Event); - if (ACPI_FAILURE (Status)) - { - AePrintErrorLog (ASL_FILE_STDERR); - return (-1); - } + UtEndEvent (FullCompile); + return (AE_OK); + +ErrorExit: + UtEndEvent (FullCompile); + return (AE_ERROR); +} + + +/******************************************************************************* + * + * FUNCTION: CmDoAslMiddleAndBackEnd + * + * PARAMETERS: None + * + * RETURN: Status of middle-end and back-end + * + * DESCRIPTION: Perform compiler middle-end (type checking and semantic + * analysis) and back-end (code generation) + * + ******************************************************************************/ + +int +CmDoAslMiddleAndBackEnd ( + void) +{ + UINT8 Event; + ACPI_STATUS Status; + /* Interpret and generate all compile-time constants */ @@ -351,7 +377,6 @@ CmDoCompile ( AePrintErrorLog (ASL_FILE_STDOUT); UtDisplaySummary (ASL_FILE_STDOUT); } - UtEndEvent (FullCompile); return (0); } @@ -367,7 +392,7 @@ CmDoCompile ( UtEndEvent (Event); if (ACPI_FAILURE (Status)) { - goto ErrorExit; + return (-1); } /* Namespace cross-reference */ @@ -378,7 +403,7 @@ CmDoCompile ( Status = XfCrossReferenceNamespace (); if (ACPI_FAILURE (Status)) { - goto ErrorExit; + return (-1); } /* Namespace - Check for non-referenced objects */ @@ -486,22 +511,47 @@ CmDoCompile ( Event = UtBeginEvent ("Generate AML code and write output files"); DbgPrint (ASL_DEBUG_OUTPUT, "Writing AML byte code\n\n"); - CgGenerateAmlOutput (); + + AslGbl_CurrentDB = AslGbl_ParseTreeRoot->Asl.Child; + + while (AslGbl_CurrentDB) + { + switch (FlSwitchFileSet(AslGbl_CurrentDB->Asl.Filename)) + { + case SWITCH_TO_DIFFERENT_FILE: + /* + * Reset these parameters when definition blocks belong in + * different files. If they belong in the same file, there is + * no need to reset these parameters + */ + FlSeekFile (ASL_FILE_SOURCE_OUTPUT, 0); + AslGbl_SourceLine = 0; + AslGbl_NextError = AslGbl_ErrorLog; + + /* fall-through */ + + case SWITCH_TO_SAME_FILE: + + CgGenerateAmlOutput (); + CmDoOutputFiles (); + AslGbl_CurrentDB = AslGbl_CurrentDB->Asl.Next; + + break; + + default: /* FILE_NOT_FOUND */ + + /* The requested file could not be found. Get out of here */ + + AslGbl_CurrentDB = NULL; + break; + } + } UtEndEvent (Event); Event = UtBeginEvent ("Write optional output files"); - CmDoOutputFiles (); UtEndEvent (Event); - UtEndEvent (FullCompile); - AslCheckExpectedExceptions (); - CmCleanupAndExit (); return (0); - -ErrorExit: - UtEndEvent (FullCompile); - CmCleanupAndExit (); - return (-1); } @@ -808,10 +858,14 @@ void CmCleanupAndExit ( void) { - UINT32 i; BOOLEAN DeleteAmlFile = FALSE; + ASL_GLOBAL_FILE_NODE *CurrentFileNode = AslGbl_FilesList; + /* Check if any errors occurred during compile */ + + (void) AslCheckForErrorExit (); + AePrintErrorLog (ASL_FILE_STDERR); if (AslGbl_DebugFlag) { @@ -865,15 +919,63 @@ CmCleanupAndExit ( * We will delete the AML file if there are errors and the * force AML output option has not been used. */ - if ((AslGbl_ExceptionCount[ASL_ERROR] > 0) && + if (AslGbl_ParserErrorDetected || ((AslGbl_ExceptionCount[ASL_ERROR] > 0) && (!AslGbl_IgnoreErrors) && - AslGbl_Files[ASL_FILE_AML_OUTPUT].Handle) + AslGbl_Files[ASL_FILE_AML_OUTPUT].Handle)) { DeleteAmlFile = TRUE; } /* Close all open files */ + while (CurrentFileNode) + { + switch (FlSwitchFileSet (CurrentFileNode->Files[ASL_FILE_INPUT].Filename)) + { + case SWITCH_TO_SAME_FILE: + case SWITCH_TO_DIFFERENT_FILE: + + CmFinishFiles (DeleteAmlFile); + CurrentFileNode = CurrentFileNode->Next; + break; + + case FILE_NOT_FOUND: + default: + + CurrentFileNode = NULL; + break; + } + } + + /* Final cleanup after compiling one file */ + + if (!AslGbl_DoAslConversion) + { + UtDeleteLocalCaches (); + } +} + + +/******************************************************************************* + * + * FUNCTION: CmFinishFiles + * + * PARAMETERS: DeleteAmlFile + * + * RETURN: None. + * + * DESCRIPTION: Close all open files, delete AML files depending on the + * function parameter is true. + * + ******************************************************************************/ + +static void +CmFinishFiles( + BOOLEAN DeleteAmlFile) +{ + UINT32 i; + + /* * Take care with the preprocessor file (.pre), it might be the same * as the "input" file, depending on where the compiler has terminated @@ -890,7 +992,15 @@ CmCleanupAndExit ( for (i = ASL_FILE_INPUT; i < ASL_MAX_FILE_TYPE; i++) { - FlCloseFile (i); + /* + * Some files such as debug output files could be pointing to + * stderr or stdout. Leave these alone. + */ + if (AslGbl_Files[i].Handle != stderr && + AslGbl_Files[i].Handle != stdout) + { + FlCloseFile (i); + } } /* Delete AML file if there are errors */ @@ -923,11 +1033,4 @@ CmCleanupAndExit ( { FlDeleteFile (ASL_FILE_SOURCE_OUTPUT); } - - /* Final cleanup after compiling one file */ - - if (!AslGbl_DoAslConversion) - { - UtDeleteLocalCaches (); - } } diff --git a/src/acpica/source/compiler/aslcompiler.h b/src/acpica/source/compiler/aslcompiler.h index efcee77b..ad0e73f3 100644 --- a/src/acpica/source/compiler/aslcompiler.h +++ b/src/acpica/source/compiler/aslcompiler.h @@ -254,10 +254,14 @@ void AslCompilerFileHeader ( UINT32 FileId); -int +ACPI_STATUS CmDoCompile ( void); +int +CmDoAslMiddleAndBackEnd ( + void); + void CmDoOutputFiles ( void); @@ -266,6 +270,10 @@ void CmCleanupAndExit ( void); +ACPI_STATUS +AslDoDisassembly ( + void); + /* * aslallocate - memory allocation @@ -875,9 +883,10 @@ ExDoExternal ( /* Values for "Visitation" parameter above */ -#define ASL_WALK_VISIT_DOWNWARD 0x01 -#define ASL_WALK_VISIT_UPWARD 0x02 -#define ASL_WALK_VISIT_TWICE (ASL_WALK_VISIT_DOWNWARD | ASL_WALK_VISIT_UPWARD) +#define ASL_WALK_VISIT_DOWNWARD 0x01 +#define ASL_WALK_VISIT_UPWARD 0x02 +#define ASL_WALK_VISIT_DB_SEPARATELY 0x04 +#define ASL_WALK_VISIT_TWICE (ASL_WALK_VISIT_DOWNWARD | ASL_WALK_VISIT_UPWARD) /* @@ -1034,6 +1043,11 @@ FlSeekFile ( UINT32 FileId, long Offset); +void +FlSeekFileSet ( + UINT32 FileId, + long Offset); + void FlCloseFile ( UINT32 FileId); @@ -1068,6 +1082,34 @@ ACPI_STATUS FlOpenMiscOutputFiles ( char *InputFilename); +ACPI_STATUS +FlInitOneFile ( + char *InputFilename); + +ASL_FILE_SWITCH_STATUS +FlSwitchFileSet ( + char *InputFilename); + +FILE * +FlGetFileHandle ( + UINT32 OutFileId, + UINT32 InFileId, + char *Filename); + +ASL_GLOBAL_FILE_NODE * +FlGetFileNode ( + UINT32 FileId, + char *Filename); + +ASL_GLOBAL_FILE_NODE * +FlGetCurrentFileNode ( + void); + +BOOLEAN +FlInputFileExists ( + char *InputFilename); + + /* * aslhwmap - hardware map summary */ @@ -1083,7 +1125,6 @@ ACPI_STATUS LdLoadNamespace ( ACPI_PARSE_OBJECT *RootOp); - /* * asllookup - namespace lookup functions */ @@ -1091,6 +1132,7 @@ void LkFindUnreferencedObjects ( void); + /* * aslhelp - help screens */ @@ -1118,6 +1160,7 @@ void NsSetupNamespaceListing ( void *Handle); + /* * asloptions - command line processing */ @@ -1126,6 +1169,7 @@ AslCommandLine ( int argc, char **argv); + /* * aslxref - namespace cross reference */ @@ -1220,6 +1264,11 @@ void UtDisplaySummary ( UINT32 FileId); +void +UtDisplayOneSummary ( + UINT32 FileId, + BOOLEAN DisplayErrorSummary); + void UtConvertByteToHex ( UINT8 RawByte, @@ -1271,6 +1320,7 @@ AuConvertUuidToString ( char *UuIdBuffer, char *OutString); + /* * aslresource - Resource template generation utilities */ @@ -1478,6 +1528,7 @@ ASL_RESOURCE_NODE * RsDoPinGroupConfigDescriptor ( ASL_RESOURCE_INFO *Info); + /* * aslrestype2d - DWord address descriptors */ diff --git a/src/acpica/source/compiler/asldefine.h b/src/acpica/source/compiler/asldefine.h index 8089d0b9..cffb0af1 100644 --- a/src/acpica/source/compiler/asldefine.h +++ b/src/acpica/source/compiler/asldefine.h @@ -298,5 +298,4 @@ #define COMMENT_CAPTURE_ON AslGbl_CommentState.CaptureComments = TRUE; #define COMMENT_CAPTURE_OFF AslGbl_CommentState.CaptureComments = FALSE; - #endif /* ASLDEFINE.H */ diff --git a/src/acpica/source/compiler/aslerror.c b/src/acpica/source/compiler/aslerror.c index a2f9fcef..db6d871d 100644 --- a/src/acpica/source/compiler/aslerror.c +++ b/src/acpica/source/compiler/aslerror.c @@ -474,10 +474,12 @@ AePrintErrorSourceLine ( * Use the merged header/source file if present, otherwise * use input file */ - SourceFile = AslGbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle; + SourceFile = FlGetFileHandle (ASL_FILE_SOURCE_OUTPUT, + ASL_FILE_SOURCE_OUTPUT, Enode->SourceFilename); if (!SourceFile) { - SourceFile = AslGbl_Files[ASL_FILE_INPUT].Handle; + SourceFile = FlGetFileHandle (ASL_FILE_INPUT, + ASL_FILE_INPUT, Enode->Filename); } if (SourceFile) @@ -818,6 +820,7 @@ static void AslInitEnode ( ASL_ERROR_MSG *SubError) { ASL_ERROR_MSG *Enode; + ASL_GLOBAL_FILE_NODE *FileNode; *InputEnode = UtLocalCalloc (sizeof (ASL_ERROR_MSG)); @@ -859,6 +862,23 @@ static void AslInitEnode ( { Enode->FilenameLength = 6; } + + FileNode = FlGetCurrentFileNode (); + if (!FileNode) + { + return; + } + + if (!FlInputFileExists (Filename)) + { + /* + * This means that this file is an include file. Record the .src + * file as the error message source because this file is not in + * the global file list. + */ + Enode->SourceFilename = + FileNode->Files[ASL_FILE_SOURCE_OUTPUT].Filename; + } } } @@ -992,7 +1012,7 @@ AslLogNewError ( } AslGbl_ExceptionCount[ModifiedLevel]++; - if (AslGbl_ExceptionCount[ASL_ERROR] > ASL_MAX_ERROR_COUNT) + if (!AslGbl_IgnoreErrors && AslGbl_ExceptionCount[ASL_ERROR] > ASL_MAX_ERROR_COUNT) { printf ("\nMaximum error count (%u) exceeded\n", ASL_MAX_ERROR_COUNT); diff --git a/src/acpica/source/compiler/aslfileio.c b/src/acpica/source/compiler/aslfileio.c index 3243ab51..3db7b533 100644 --- a/src/acpica/source/compiler/aslfileio.c +++ b/src/acpica/source/compiler/aslfileio.c @@ -177,7 +177,7 @@ FlFileError ( { sprintf (AslGbl_MsgBuffer, "\"%s\" (%s) - %s", AslGbl_Files[FileId].Filename, - AslGbl_Files[FileId].Description, strerror (errno)); + AslGbl_FileDescs[FileId].Description, strerror (errno)); AslCommonError (ASL_ERROR, ErrorId, 0, 0, 0, 0, NULL, AslGbl_MsgBuffer); } @@ -500,7 +500,7 @@ FlDeleteFile ( if (remove (Info->Filename)) { printf ("%s (%s file) ", - Info->Filename, Info->Description); + Info->Filename, AslGbl_FileDescs[FileId].Description); perror ("Could not delete"); } diff --git a/src/acpica/source/compiler/aslfiles.c b/src/acpica/source/compiler/aslfiles.c index 0120af02..80a74e81 100644 --- a/src/acpica/source/compiler/aslfiles.c +++ b/src/acpica/source/compiler/aslfiles.c @@ -170,6 +170,257 @@ FlParseInputPathname ( #endif +/******************************************************************************* + * + * FUNCTION: FlInitOneFile + * + * PARAMETERS: InputFilename - The user-specified ASL source file to be + * compiled + * + * RETURN: Status + * + * DESCRIPTION: Initialize global file structure for one input file. This file + * structure contains references to input, output, debugging, and + * other miscellaneous files that are associated for a single + * input ASL file. + * + ******************************************************************************/ + +ACPI_STATUS +FlInitOneFile ( + char *InputFilename) +{ + UINT32 i; + ASL_GLOBAL_FILE_NODE *NewFileNode; + + + if (FlInputFileExists (InputFilename)) + { + AslError (ASL_ERROR, ASL_MSG_DUPLICATE_INPUT_FILE, NULL, InputFilename); + return (AE_ALREADY_EXISTS); + } + + NewFileNode = ACPI_CAST_PTR (ASL_GLOBAL_FILE_NODE, + UtLocalCacheCalloc (sizeof (ASL_GLOBAL_FILE_NODE))); + + if (!NewFileNode) + { + AslError (ASL_ERROR, ASL_MSG_MEMORY_ALLOCATION, NULL, NULL); + return (AE_NO_MEMORY); + } + + NewFileNode->ParserErrorDetected = FALSE; + NewFileNode->Next = AslGbl_FilesList; + + AslGbl_FilesList = NewFileNode; + AslGbl_Files = NewFileNode->Files; + + for (i = 0; i < ASL_NUM_FILES; i++) + { + AslGbl_Files[i].Handle = NULL; + AslGbl_Files[i].Filename = NULL; + } + + AslGbl_Files[ASL_FILE_STDOUT].Handle = stdout; + AslGbl_Files[ASL_FILE_STDOUT].Filename = "STDOUT"; + + if (AslGbl_VerboseErrors) + { + AslGbl_Files[ASL_FILE_STDERR].Handle = stderr; + } + else + { + AslGbl_Files[ASL_FILE_STDERR].Handle = stdout; + } + + AslGbl_Files[ASL_FILE_STDERR].Filename = "STDERR"; + return (AE_OK); +} + + +/******************************************************************************* + * + * FUNCTION: FlInputFileExists + * + * PARAMETERS: Filename - File name to be searched + * + * RETURN: Status + * + * DESCRIPTION: Returns true if the file name already exists. + * + ******************************************************************************/ + +BOOLEAN +FlInputFileExists ( + char *Filename) +{ + ASL_GLOBAL_FILE_NODE *Current = AslGbl_FilesList; + + + while (Current) + { + if (!strcmp (Filename, Current->Files[ASL_FILE_INPUT].Filename)) + { + return (TRUE); + } + + Current = Current->Next; + } + + return (FALSE); +} + + +/******************************************************************************* + * + * FUNCTION: FlSwitchFileSet + * + * PARAMETERS: Op - Parse node for the LINE asl statement + * + * RETURN: None. + * + * DESCRIPTION: Set the current line number + * + ******************************************************************************/ + +ASL_FILE_SWITCH_STATUS +FlSwitchFileSet ( + char *InputFilename) +{ + ASL_GLOBAL_FILE_NODE *Current = AslGbl_FilesList; + char *PrevFilename = Current->Files[ASL_FILE_INPUT].Filename; + + + while (Current) + { + if (!strcmp(Current->Files[ASL_FILE_INPUT].Filename, InputFilename)) + { + AslGbl_Files = Current->Files; + AslGbl_TableSignature = Current->TableSignature; + AslGbl_TableId = Current->TableId; + + if (!strcmp (InputFilename, PrevFilename)) + { + return (SWITCH_TO_SAME_FILE); + } + else + { + return (SWITCH_TO_DIFFERENT_FILE); + } + } + + Current = Current->Next; + } + + return (FILE_NOT_FOUND); +} + + +/******************************************************************************* + * + * FUNCTION: FlGetFileHandle + * + * PARAMETERS: OutFileId - denotes file type of output handle + * InFileId - denotes file type of the input Filename + * Filename + * + * RETURN: File handle + * + * DESCRIPTION: Get the file handle for a particular filename/FileId. This + * function also allows the caller to specify the file Id of the + * desired type. + * + ******************************************************************************/ + +FILE * +FlGetFileHandle ( + UINT32 OutFileId, + UINT32 InFileId, + char *Filename) +{ + ASL_GLOBAL_FILE_NODE *Current = AslGbl_FilesList; + + + if (!Filename) + { + return (NULL); + } + + while (Current) + { + if (!strcmp (Current->Files[InFileId].Filename, Filename)) + { + return (Current->Files[OutFileId].Handle); + } + + Current = Current->Next; + } + + return (NULL); +} + + +/******************************************************************************* + * + * FUNCTION: FlGetFileNode + * + * PARAMETERS: FileId - File type (ID) of the input Filename + * Filename - File to search for + * + * RETURN: A global file node + * + * DESCRIPTION: Get the file node for a particular filename/FileId. + * + ******************************************************************************/ + +ASL_GLOBAL_FILE_NODE * +FlGetFileNode ( + UINT32 FileId, + char *Filename) +{ + ASL_GLOBAL_FILE_NODE *Current = AslGbl_FilesList; + + + if (!Filename) + { + return (NULL); + } + + while (Current) + { + if (!strcmp (Current->Files[FileId].Filename, Filename)) + { + return (Current); + } + + Current = Current->Next; + } + + return (NULL); +} + + +/******************************************************************************* + * + * FUNCTION: FlGetCurrentFileNode + * + * PARAMETERS: None + * + * RETURN: Global file node + * + * DESCRIPTION: Get the current input file node + * + ******************************************************************************/ + +ASL_GLOBAL_FILE_NODE * +FlGetCurrentFileNode ( + void) +{ + return (FlGetFileNode ( + ASL_FILE_INPUT,AslGbl_Files[ASL_FILE_INPUT].Filename)); +} + + /******************************************************************************* * * FUNCTION: FlSetLineNumber @@ -426,8 +677,6 @@ FlOpenIncludeWithPrefix ( IncludeFile = fopen (Pathname, "r"); if (!IncludeFile) { - fprintf (stderr, "Could not open include file %s\n", Pathname); - ACPI_FREE (Pathname); return (NULL); } diff --git a/src/acpica/source/compiler/aslglobal.h b/src/acpica/source/compiler/aslglobal.h index bc7358cd..213c5408 100644 --- a/src/acpica/source/compiler/aslglobal.h +++ b/src/acpica/source/compiler/aslglobal.h @@ -172,28 +172,27 @@ UINT32 AslGbl_ExceptionCount[ASL_NUM_REPORT_LEVELS] = {0,0,0,0,0,0}; /* Table below must match ASL_FILE_TYPES in asltypes.h */ - -ASL_FILE_INFO AslGbl_Files [ASL_NUM_FILES] = +ASL_FILE_DESC AslGbl_FileDescs [ASL_NUM_FILES] = { - {NULL, NULL, "stdout: ", "Standard Output"}, - {NULL, NULL, "stderr: ", "Standard Error"}, - {NULL, NULL, "Table Input: ", "Source Input"}, - {NULL, NULL, "Binary Output:", "AML Output"}, - {NULL, NULL, "Source Output:", "Source Output"}, - {NULL, NULL, "Preprocessor: ", "Preprocessor Output"}, - {NULL, NULL, "Preprocessor: ", "Preprocessor Temp File"}, - {NULL, NULL, "Listing File: ", "Listing Output"}, - {NULL, NULL, "Hex Dump: ", "Hex Table Output"}, - {NULL, NULL, "Namespace: ", "Namespace Output"}, - {NULL, NULL, "Debug File: ", "Debug Output"}, - {NULL, NULL, "ASM Source: ", "Assembly Code Output"}, - {NULL, NULL, "C Source: ", "C Code Output"}, - {NULL, NULL, "ASM Include: ", "Assembly Header Output"}, - {NULL, NULL, "C Include: ", "C Header Output"}, - {NULL, NULL, "Offset Table: ", "C Offset Table Output"}, - {NULL, NULL, "Device Map: ", "Device Map Output"}, - {NULL, NULL, "Cross Ref: ", "Cross-reference Output"}, - {NULL, NULL, "Converter db :", "Converter debug Output"} + {"stdout: ", "Standard Output"}, + {"stderr: ", "Standard Error"}, + {"Table Input: ", "Source Input"}, + {"Binary Output:", "AML Output"}, + {"Source Output:", "Source Output"}, + {"Preprocessor: ", "Preprocessor Output"}, + {"Preprocessor: ", "Preprocessor Temp File"}, + {"Listing File: ", "Listing Output"}, + {"Hex Dump: ", "Hex Table Output"}, + {"Namespace: ", "Namespace Output"}, + {"Debug File: ", "Debug Output"}, + {"ASM Source: ", "Assembly Code Output"}, + {"C Source: ", "C Code Output"}, + {"ASM Include: ", "Assembly Header Output"}, + {"C Include: ", "C Header Output"}, + {"Offset Table: ", "C Offset Table Output"}, + {"Device Map: ", "Device Map Output"}, + {"Cross Ref: ", "Cross-reference Output"}, + {"Converter dbg:", "Converter debug Output"} }; /* Table below must match the defines with the same names in actypes.h */ @@ -225,8 +224,8 @@ const char *AslGbl_OpFlagNames[ACPI_NUM_OP_FLAGS] = }; #else +extern ASL_FILE_DESC AslGbl_FileDescs [ASL_NUM_FILES]; extern UINT32 AslGbl_ExceptionCount[ASL_NUM_REPORT_LEVELS]; -extern ASL_FILE_INFO AslGbl_Files [ASL_NUM_FILES]; extern const char *AslGbl_OpFlagNames[ACPI_NUM_OP_FLAGS]; #endif @@ -269,7 +268,6 @@ ASL_EXTERN UINT32 ASL_INIT_GLOBAL (AslGbl_CurrentColumn, 0); ASL_EXTERN UINT32 ASL_INIT_GLOBAL (AslGbl_CurrentLineNumber, 1); ASL_EXTERN UINT32 ASL_INIT_GLOBAL (AslGbl_LogicalLineNumber, 1); ASL_EXTERN UINT32 ASL_INIT_GLOBAL (AslGbl_CurrentLineOffset, 0); -ASL_EXTERN UINT32 ASL_INIT_GLOBAL (AslGbl_OriginalInputFileSize, 0); ASL_EXTERN UINT8 ASL_INIT_GLOBAL (AslGbl_SyntaxError, 0); /* Exception reporting */ @@ -300,6 +298,7 @@ ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_ListingFlag, FALSE); ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_IgnoreErrors, FALSE); ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_SourceOutputFlag, FALSE); ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_ParseOnlyFlag, FALSE); +ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_ParserErrorDetected, FALSE); ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_CompileTimesFlag, FALSE); ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_FoldConstants, TRUE); ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_VerboseErrors, TRUE); @@ -385,6 +384,7 @@ ASL_EXTERN UINT32 ASL_INIT_GLOBAL (AslGbl_SourceLine, 0); ASL_EXTERN UINT8 ASL_INIT_GLOBAL (AslGbl_FileType, 0); ASL_EXTERN char ASL_INIT_GLOBAL (*AslGbl_Signature, NULL); ASL_EXTERN ACPI_PARSE_OBJECT ASL_INIT_GLOBAL (*AslGbl_ParseTreeRoot, NULL); +ASL_EXTERN ACPI_PARSE_OBJECT ASL_INIT_GLOBAL (*AslGbl_CurrentDB, NULL); ASL_EXTERN ACPI_PARSE_OBJECT ASL_INIT_GLOBAL (*AslGbl_ExternalsListHead, NULL); ASL_EXTERN ASL_LISTING_NODE ASL_INIT_GLOBAL (*AslGbl_ListingNode, NULL); ASL_EXTERN ACPI_PARSE_OBJECT *AslGbl_FirstLevelInsertionNode; @@ -403,6 +403,8 @@ ASL_EXTERN UINT16 ASL_INIT_GLOBAL (AslGbl_PruneType, 0); ASL_EXTERN ASL_FILE_NODE ASL_INIT_GLOBAL (*AslGbl_IncludeFileStack, NULL); ASL_EXTERN char ASL_INIT_GLOBAL (*AslGbl_TableSignature, "NO_SIG"); ASL_EXTERN char ASL_INIT_GLOBAL (*AslGbl_TableId, "NO_ID"); +ASL_EXTERN ASL_FILE_INFO ASL_INIT_GLOBAL (*AslGbl_Files, NULL); +ASL_EXTERN ASL_GLOBAL_FILE_NODE ASL_INIT_GLOBAL (*AslGbl_FilesList, NULL); /* Specific to the -q option */ diff --git a/src/acpica/source/compiler/asllisting.c b/src/acpica/source/compiler/asllisting.c index df3b7587..7bc118bc 100644 --- a/src/acpica/source/compiler/asllisting.c +++ b/src/acpica/source/compiler/asllisting.c @@ -254,6 +254,7 @@ static void LsGenerateListing ( UINT32 FileId) { + UINT32 WalkMode = ASL_WALK_VISIT_DOWNWARD | ASL_WALK_VISIT_DB_SEPARATELY; /* Start at the beginning of both the source and AML files */ @@ -271,7 +272,7 @@ LsGenerateListing ( LsDoOffsetTableHeader (FileId); - TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_DOWNWARD, + TrWalkParseTree (AslGbl_CurrentDB, WalkMode, LsAmlOffsetWalk, NULL, (void *) ACPI_TO_POINTER (FileId)); LsDoOffsetTableFooter (FileId); return; @@ -279,7 +280,7 @@ LsGenerateListing ( /* Process all parse nodes */ - TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_DOWNWARD, + TrWalkParseTree (AslGbl_CurrentDB, WalkMode, LsAmlListingWalk, NULL, (void *) ACPI_TO_POINTER (FileId)); /* Final processing */ @@ -847,7 +848,7 @@ LsFinishSourceListing ( FlPrintFile (FileId, "\n\nSummary of errors and warnings\n\n"); AePrintErrorLog (FileId); FlPrintFile (FileId, "\n"); - UtDisplaySummary (FileId); + UtDisplayOneSummary (FileId, TRUE); FlPrintFile (FileId, "\n"); } } diff --git a/src/acpica/source/compiler/aslload.c b/src/acpica/source/compiler/aslload.c index dfbdf7ce..a055bab0 100644 --- a/src/acpica/source/compiler/aslload.c +++ b/src/acpica/source/compiler/aslload.c @@ -324,6 +324,7 @@ LdLoadFieldElements ( (Node->Flags & ANOBJ_IS_EXTERNAL)) { Node->Type = (UINT8) ACPI_TYPE_LOCAL_REGION_FIELD; + Node->Flags &= ~ANOBJ_IS_EXTERNAL; } else { diff --git a/src/acpica/source/compiler/aslmain.c b/src/acpica/source/compiler/aslmain.c index 26f4a0c4..81f634e6 100644 --- a/src/acpica/source/compiler/aslmain.c +++ b/src/acpica/source/compiler/aslmain.c @@ -255,6 +255,14 @@ main ( } } + /* ACPICA subsystem initialization */ + + Status = AdInitialize (); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + /* Process each pathname/filename in the list, with possible wildcards */ @@ -280,17 +288,71 @@ main ( Index2++; } + /* + * At this point, compilation of a data table or disassembly is complete. + */ + if (AslGbl_FileType == ASL_INPUT_TYPE_ASCII_DATA || AcpiGbl_DisasmFlag) + { + goto CleanupAndExit; + } + + CmDoAslMiddleAndBackEnd (); + + /* + * At this point, all semantic analysis has been completed. Check + * expected error messages before cleanup or conversion. + */ + AslCheckExpectedExceptions (); + + /* ASL-to-ASL+ conversion - Perform immediate disassembly */ + + if (AslGbl_DoAslConversion) + { + /* re-initialize ACPICA subsystem for disassembler */ + + Status = AdInitialize (); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + /* + * New input file is the output AML file from above. + * New output is from the input ASL file from above. + */ + AslGbl_OutputFilenamePrefix = AslGbl_Files[ASL_FILE_INPUT].Filename; + AslGbl_Files[ASL_FILE_INPUT].Filename = + AslGbl_Files[ASL_FILE_AML_OUTPUT].Filename; + + CvDbgPrint ("Output filename: %s\n", AslGbl_OutputFilenamePrefix); + fprintf (stderr, "\n"); + + AcpiGbl_DisasmFlag = TRUE; + AslDoDisassembly (); + AcpiGbl_DisasmFlag = FALSE; + + /* delete the AML file. This AML file should never be utilized by AML interpreters. */ + + FlDeleteFile (ASL_FILE_AML_OUTPUT); + } + + CleanupAndExit: UtFreeLineBuffers (); AslParserCleanup (); + AcpiDmClearExternalFileList(); + (void) AcpiTerminate (); + + /* CmCleanupAndExit is intended for the compiler only */ - if (AcpiGbl_ExternalFileList) + if (!AcpiGbl_DisasmFlag) { - AcpiDmClearExternalFileList(); + CmCleanupAndExit (); } + return (ReturnStatus); } @@ -372,9 +434,6 @@ static void AslInitialize ( void) { - UINT32 i; - - AcpiGbl_DmOpt_Verbose = FALSE; /* Default integer width is 32 bits */ @@ -382,16 +441,4 @@ AslInitialize ( AcpiGbl_IntegerBitWidth = 32; AcpiGbl_IntegerNybbleWidth = 8; AcpiGbl_IntegerByteWidth = 4; - - for (i = 0; i < ASL_NUM_FILES; i++) - { - AslGbl_Files[i].Handle = NULL; - AslGbl_Files[i].Filename = NULL; - } - - AslGbl_Files[ASL_FILE_STDOUT].Handle = stdout; - AslGbl_Files[ASL_FILE_STDOUT].Filename = "STDOUT"; - - AslGbl_Files[ASL_FILE_STDERR].Handle = stderr; - AslGbl_Files[ASL_FILE_STDERR].Filename = "STDERR"; } diff --git a/src/acpica/source/compiler/aslmessages.c b/src/acpica/source/compiler/aslmessages.c index 0f31c655..d7e2eb43 100644 --- a/src/acpica/source/compiler/aslmessages.c +++ b/src/acpica/source/compiler/aslmessages.c @@ -353,8 +353,8 @@ const char *AslCompilerMsgs [] = /* ASL_MSG_NULL_RESOURCE_TEMPLATE */ "Empty Resource Template (END_TAG only)", /* ASL_MSG_FOUND_HERE */ "Original name creation/declaration below: ", /* ASL_MSG_ILLEGAL_RECURSION */ "Illegal recursive call to method that creates named objects", -/* ASL_MSG_PLACE_HOLDER_00 */ "", /* TODO: fill in this slot with a new error message */ -/* ASL_MSG_PLACE_HOLDER_01 */ "", /* TODO: fill in this slot with a new error message */ +/* ASL_MSG_DUPLICATE_INPUT_FILE */ "Duplicate input files detected:", +/* ASL_MSG_WARNING_AS_ERROR */ "Warnings detected during compilation", /* ASL_MSG_OEM_TABLE_ID */ "Invalid OEM Table ID", /* ASL_MSG_OEM_ID */ "Invalid OEM ID", /* ASL_MSG_UNLOAD */ "Unload is not supported by all operating systems", @@ -363,7 +363,8 @@ const char *AslCompilerMsgs [] = /* ASL_MSG_PREFIX_NOT_EXIST */ "One or more prefix Scopes do not exist", /* ASL_MSG_NAMEPATH_NOT_EXIST */ "One or more objects within the Pathname do not exist", /* ASL_MSG_REGION_LENGTH */ "Operation Region declared with zero length", -/* ASL_MSG_TEMPORARY_OBJECT */ "Object is created temporarily in another method and cannot be accessed" +/* ASL_MSG_TEMPORARY_OBJECT */ "Object is created temporarily in another method and cannot be accessed", +/* ASL_MSG_UNDEFINED_EXTERNAL */ "Named object was declared external but the actual definition does not exist" }; /* Table compiler */ diff --git a/src/acpica/source/compiler/aslmessages.h b/src/acpica/source/compiler/aslmessages.h index 817e192e..a7cd1f31 100644 --- a/src/acpica/source/compiler/aslmessages.h +++ b/src/acpica/source/compiler/aslmessages.h @@ -355,8 +355,8 @@ typedef enum ASL_MSG_NULL_RESOURCE_TEMPLATE, ASL_MSG_FOUND_HERE, ASL_MSG_ILLEGAL_RECURSION, - ASL_MSG_PLACE_HOLDER_00, - ASL_MSG_PLACE_HOLDER_01, + ASL_MSG_DUPLICATE_INPUT_FILE, + ASL_MSG_WARNING_AS_ERROR, ASL_MSG_OEM_TABLE_ID, ASL_MSG_OEM_ID, ASL_MSG_UNLOAD, @@ -366,6 +366,7 @@ typedef enum ASL_MSG_NAMEPATH_NOT_EXIST, ASL_MSG_REGION_LENGTH, ASL_MSG_TEMPORARY_OBJECT, + ASL_MSG_UNDEFINED_EXTERNAL, /* These messages are used by the Data Table compiler only */ diff --git a/src/acpica/source/compiler/asloperands.c b/src/acpica/source/compiler/asloperands.c index 67e16fd5..4f4b636d 100644 --- a/src/acpica/source/compiler/asloperands.c +++ b/src/acpica/source/compiler/asloperands.c @@ -1045,6 +1045,7 @@ OpnDoDefinitionBlock ( ACPI_SIZE Length; UINT32 i; char *Filename; + ACPI_STATUS Status; /* @@ -1062,6 +1063,12 @@ OpnDoDefinitionBlock ( *Child->Asl.Value.Buffer && (AslGbl_UseDefaultAmlFilename)) { + /* + * The walk may traverse multiple definition blocks. Switch files + * to ensure that the correct files are manipulated. + */ + FlSwitchFileSet (Op->Asl.Filename); + /* * We will use the AML filename that is embedded in the source file * for the output filename. @@ -1076,6 +1083,22 @@ OpnDoDefinitionBlock ( AslGbl_OutputFilenamePrefix = Filename; UtConvertBackslashes (AslGbl_OutputFilenamePrefix); + + /* + * Use the definition block file parameter instead of the input + * filename. Since all files were opened previously, remove the + * existing file and open a new file with the name of this + * definiton block parameter. Since AML code generation has yet + * to happen, the previous file can be removed without any impacts. + */ + FlCloseFile (ASL_FILE_AML_OUTPUT); + FlDeleteFile (ASL_FILE_AML_OUTPUT); + Status = FlOpenAmlOutputFile (AslGbl_OutputFilenamePrefix); + if (ACPI_FAILURE (Status)) + { + AslError (ASL_ERROR, ASL_MSG_OUTPUT_FILE_OPEN, NULL, NULL); + return; + } } Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG; @@ -1086,6 +1109,7 @@ OpnDoDefinitionBlock ( Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG; if (Child->Asl.Value.String) { + AslGbl_FilesList->TableSignature = Child->Asl.Value.String; AslGbl_TableSignature = Child->Asl.Value.String; if (strlen (AslGbl_TableSignature) != ACPI_NAMESEG_SIZE) { @@ -1138,6 +1162,7 @@ OpnDoDefinitionBlock ( AslGbl_TableId = UtLocalCacheCalloc (Length + 1); strcpy (AslGbl_TableId, Child->Asl.Value.String); + AslGbl_FilesList->TableId = AslGbl_TableId; /* * Convert anything non-alphanumeric to an underscore. This diff --git a/src/acpica/source/compiler/asloptions.c b/src/acpica/source/compiler/asloptions.c index dc0b9079..dc00e1d2 100644 --- a/src/acpica/source/compiler/asloptions.c +++ b/src/acpica/source/compiler/asloptions.c @@ -896,7 +896,6 @@ AslDoOptions ( */ AslGbl_VerboseErrors = FALSE; AslGbl_DoSignon = FALSE; - AslGbl_Files[ASL_FILE_STDERR].Handle = stdout; break; case 'o': diff --git a/src/acpica/source/compiler/aslstartup.c b/src/acpica/source/compiler/aslstartup.c index c0f14c80..aee5ad60 100644 --- a/src/acpica/source/compiler/aslstartup.c +++ b/src/acpica/source/compiler/aslstartup.c @@ -165,10 +165,6 @@ static UINT8 AslDetectSourceFileType ( ASL_FILE_INFO *Info); -static ACPI_STATUS -AslDoDisassembly ( - void); - /* Globals */ @@ -227,12 +223,6 @@ AslInitializeGlobals ( AslGbl_ExceptionCount[i] = 0; } - for (i = ASL_FILE_INPUT; i <= ASL_MAX_FILE_TYPE; i++) - { - AslGbl_Files[i].Handle = NULL; - AslGbl_Files[i].Filename = NULL; - } - if (AcpiGbl_CaptureComments) { AslGbl_CommentState.SpacesBefore = 0; @@ -343,25 +333,19 @@ Cleanup: * RETURN: Status * * DESCRIPTION: Initiate AML file disassembly. Uses ACPICA subsystem to build - * namespace. + * namespace. This function assumes that the ACPI subsystem has + * been initialized. The caller of the initialization will also + * terminate the ACPI subsystem. * ******************************************************************************/ -static ACPI_STATUS +ACPI_STATUS AslDoDisassembly ( void) { ACPI_STATUS Status; - /* ACPICA subsystem initialization */ - - Status = AdInitialize (); - if (ACPI_FAILURE (Status)) - { - return (Status); - } - Status = AcpiAllocateRootTable (4); if (ACPI_FAILURE (Status)) { @@ -370,11 +354,6 @@ AslDoDisassembly ( return (Status); } - /* Handle additional output files for disassembler */ - - AslGbl_FileType = ASL_INPUT_TYPE_BINARY_ACPI_TABLE; - Status = FlOpenMiscOutputFiles (AslGbl_OutputFilenamePrefix); - /* This is where the disassembly happens */ AcpiGbl_DmOpt_Disasm = TRUE; @@ -390,10 +369,9 @@ AslDoDisassembly ( AcpiDmUnresolvedWarning (0); - /* Shutdown compiler and ACPICA subsystem */ + /* Clear Error log */ AeClearErrorLog (); - (void) AcpiTerminate (); /* * AslGbl_Files[ASL_FILE_INPUT].Filename was replaced with the @@ -406,11 +384,6 @@ AslDoDisassembly ( return (AE_CTRL_CONTINUE); } - /* No need to free the filename string */ - - AslGbl_Files[ASL_FILE_INPUT].Filename = NULL; - - UtDeleteLocalCaches (); return (AE_OK); } @@ -432,6 +405,8 @@ AslDoOneFile ( char *Filename) { ACPI_STATUS Status; + UINT8 Event; + ASL_GLOBAL_FILE_NODE *FileNode; /* Re-initialize "some" compiler/preprocessor globals */ @@ -450,6 +425,18 @@ AslDoOneFile ( return (Status); } + /* + * There was an input file detected at this point. Each input ASL file is + * associated with one global file node consisting of the input file and + * all output files associated with it. This is useful when compiling + * multiple files in one command. + */ + Status = FlInitOneFile(Filename); + if (ACPI_FAILURE (Status)) + { + return (AE_ERROR); + } + /* Take a copy of the input filename, convert any backslashes */ AslGbl_Files[ASL_FILE_INPUT].Filename = @@ -458,18 +445,6 @@ AslDoOneFile ( strcpy (AslGbl_Files[ASL_FILE_INPUT].Filename, Filename); UtConvertBackslashes (AslGbl_Files[ASL_FILE_INPUT].Filename); - /* - * AML Disassembly (Optional) - */ - if (AcpiGbl_DisasmFlag) - { - Status = AslDoDisassembly (); - if (Status != AE_CTRL_CONTINUE) - { - return (Status); - } - } - /* * Open the input file. Here, this should be an ASCII source file, * either an ASL file or a Data Table file @@ -481,7 +456,13 @@ AslDoOneFile ( return (AE_ERROR); } - AslGbl_OriginalInputFileSize = FlGetFileSize (ASL_FILE_INPUT); + FileNode = FlGetCurrentFileNode(); + if (!FileNode) + { + return (AE_ERROR); + } + + FileNode->OriginalInputFileSize = FlGetFileSize (ASL_FILE_INPUT); /* Determine input file type */ @@ -500,6 +481,22 @@ AslDoOneFile ( AslGbl_OutputFilenamePrefix = AslGbl_Files[ASL_FILE_INPUT].Filename; } + /* + * Open the output file. Note: by default, the name of this file comes from + * the table descriptor within the input file. + */ + if (AslGbl_FileType == ASL_INPUT_TYPE_ASCII_ASL) + { + Event = UtBeginEvent ("Open AML output file"); + Status = FlOpenAmlOutputFile (AslGbl_OutputFilenamePrefix); + UtEndEvent (Event); + if (ACPI_FAILURE (Status)) + { + AePrintErrorLog (ASL_FILE_STDERR); + return (AE_ERROR); + } + } + /* Open the optional output files (listings, etc.) */ Status = FlOpenMiscOutputFiles (AslGbl_OutputFilenamePrefix); @@ -550,20 +547,7 @@ AslDoOneFile ( */ case ASL_INPUT_TYPE_ASCII_ASL: - /* ACPICA subsystem initialization */ - - Status = AdInitialize (); - if (ACPI_FAILURE (Status)) - { - return (Status); - } - - (void) CmDoCompile (); - (void) AcpiTerminate (); - - /* Check if any errors occurred during compile */ - - Status = AslCheckForErrorExit (); + Status = CmDoCompile (); if (ACPI_FAILURE (Status)) { return (Status); @@ -574,27 +558,11 @@ AslDoOneFile ( AeClearErrorLog (); PrTerminatePreprocessor (); - /* ASL-to-ASL+ conversion - Perform immediate disassembly */ - - if (AslGbl_DoAslConversion) - { - /* - * New input file is the output AML file from above. - * New output is from the input ASL file from above. - */ - AslGbl_OutputFilenamePrefix = AslGbl_Files[ASL_FILE_INPUT].Filename; - CvDbgPrint ("OUTPUTFILENAME: %s\n", AslGbl_OutputFilenamePrefix); - AslGbl_Files[ASL_FILE_INPUT].Filename = - AslGbl_Files[ASL_FILE_AML_OUTPUT].Filename; - AcpiGbl_DisasmFlag = TRUE; - fprintf (stderr, "\n"); - AslDoDisassembly (); - - /* delete the AML file. This AML file should never be utilized by AML interpreters. */ - - FlDeleteFile (ASL_FILE_AML_OUTPUT); - } - + /* + * At this point, we know how many lines are in the input file. Save it + * to display for post-compilation summary. + */ + FileNode->TotalLineCount = AslGbl_CurrentLineNumber; return (AE_OK); /* @@ -661,6 +629,8 @@ AslCheckForErrorExit ( (AslGbl_ExceptionCount[ASL_WARNING2] > 0) || (AslGbl_ExceptionCount[ASL_WARNING3] > 0)) { + AslError (ASL_ERROR, ASL_MSG_WARNING_AS_ERROR, NULL, + "(reporting warnings as errors)"); return (AE_ERROR); } } diff --git a/src/acpica/source/compiler/aslsupport.l b/src/acpica/source/compiler/aslsupport.l index 5cac84dc..69c1399a 100644 --- a/src/acpica/source/compiler/aslsupport.l +++ b/src/acpica/source/compiler/aslsupport.l @@ -532,14 +532,18 @@ count ( { case 2: - AslGbl_TotalKeywords++; - AslGbl_TotalNamedObjects++; + ++AslGbl_TotalKeywords; + ++AslGbl_TotalNamedObjects; + ++AslGbl_FilesList->TotalKeywords; + ++AslGbl_FilesList->TotalNamedObjects; break; case 3: - AslGbl_TotalKeywords++; - AslGbl_TotalExecutableOpcodes++; + ++AslGbl_TotalKeywords; + ++AslGbl_TotalExecutableOpcodes; + ++AslGbl_FilesList->TotalKeywords; + ++AslGbl_FilesList->TotalExecutableOpcodes; break; default: diff --git a/src/acpica/source/compiler/asltree.c b/src/acpica/source/compiler/asltree.c index 6bb40888..62efc5fa 100644 --- a/src/acpica/source/compiler/asltree.c +++ b/src/acpica/source/compiler/asltree.c @@ -462,6 +462,7 @@ TrLinkOpChildren ( { ACPI_PARSE_OBJECT *Child; ACPI_PARSE_OBJECT *PrevChild; + ACPI_PARSE_OBJECT *LastSibling; va_list ap; UINT32 i; BOOLEAN FirstChild; @@ -480,8 +481,18 @@ TrLinkOpChildren ( { case PARSEOP_ASL_CODE: - AslGbl_ParseTreeRoot = Op; - Op->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG; + if (!AslGbl_ParseTreeRoot) + { + DbgPrint (ASL_PARSE_OUTPUT, "Creating first Definition Block\n"); + AslGbl_ParseTreeRoot = Op; + Op->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG; + } + else + { + DbgPrint (ASL_PARSE_OUTPUT, "Creating subsequent Definition Block\n"); + Op = AslGbl_ParseTreeRoot; + } + DbgPrint (ASL_PARSE_OUTPUT, "ASLCODE (Tree Completed)->"); break; @@ -560,7 +571,27 @@ TrLinkOpChildren ( if (FirstChild) { FirstChild = FALSE; - Op->Asl.Child = Child; + + /* + * In the case that multiple definition blocks are being compiled, + * append the definition block to the end of the child list as the + * last sibling. This is done to facilitate namespace cross- + * reference between multiple definition blocks. + */ + if (Op->Asl.Child && + (Op->Asl.Child->Asl.ParseOpcode == PARSEOP_DEFINITION_BLOCK)) + { + LastSibling = Op->Asl.Child; + while (LastSibling->Asl.Next) + { + LastSibling = LastSibling->Asl.Next; + } + LastSibling->Asl.Next = Child; + } + else + { + Op->Asl.Child = Child; + } } /* Point all children to parent */ @@ -825,6 +856,8 @@ TrWalkParseTree ( BOOLEAN OpPreviouslyVisited; ACPI_PARSE_OBJECT *StartOp = Op; ACPI_STATUS Status; + ACPI_PARSE_OBJECT *Restore = NULL; + BOOLEAN WalkOneDefinitionBlock = Visitation & ASL_WALK_VISIT_DB_SEPARATELY; if (!AslGbl_ParseTreeRoot) @@ -835,7 +868,13 @@ TrWalkParseTree ( Level = 0; OpPreviouslyVisited = FALSE; - switch (Visitation) + if (Op->Asl.ParseOpcode == PARSEOP_DEFINITION_BLOCK && + WalkOneDefinitionBlock) + { + Restore = Op->Asl.Next; + Op->Asl.Next = NULL; + } + switch (Visitation & ~ASL_WALK_VISIT_DB_SEPARATELY) { case ASL_WALK_VISIT_DOWNWARD: @@ -861,7 +900,7 @@ TrWalkParseTree ( { /* Exit immediately on any error */ - return (Status); + goto ErrorExit; } } @@ -907,7 +946,7 @@ TrWalkParseTree ( Status = AscendingCallback (Op, Level, Context); if (ACPI_FAILURE (Status)) { - return (Status); + goto ErrorExit; } } else @@ -956,7 +995,7 @@ TrWalkParseTree ( Status = AscendingCallback (Op, Level, Context); if (ACPI_FAILURE (Status)) { - return (Status); + goto ErrorExit; } } else @@ -979,7 +1018,7 @@ TrWalkParseTree ( { /* Exit immediately on any error */ - return (Status); + goto ErrorExit; } } @@ -1018,5 +1057,20 @@ TrWalkParseTree ( /* If we get here, the walk completed with no errors */ + if (Op->Asl.ParseOpcode == PARSEOP_DEFINITION_BLOCK && + WalkOneDefinitionBlock) + { + Op->Asl.Next = Restore; + } + return (AE_OK); + +ErrorExit: + + if (Op->Asl.ParseOpcode == PARSEOP_DEFINITION_BLOCK && + WalkOneDefinitionBlock) + { + Op->Asl.Next = Restore; + } + return (Status); } diff --git a/src/acpica/source/compiler/asltypes.h b/src/acpica/source/compiler/asltypes.h index 628b2d37..8a6a0750 100644 --- a/src/acpica/source/compiler/asltypes.h +++ b/src/acpica/source/compiler/asltypes.h @@ -221,10 +221,10 @@ typedef struct asl_analysis_walk_info typedef struct asl_mapping_entry { - UINT32 Value; - UINT32 AcpiBtype; /* Object type or return type */ - UINT16 AmlOpcode; - UINT8 Flags; + UINT32 Value; + UINT32 AcpiBtype; /* Object type or return type */ + UINT16 AmlOpcode; + UINT8 Flags; } ASL_MAPPING_ENTRY; @@ -233,8 +233,8 @@ typedef struct asl_mapping_entry typedef struct asl_walk_info { - ACPI_PARSE_OBJECT **NodePtr; - UINT32 *LevelPtr; + ACPI_PARSE_OBJECT **NodePtr; + UINT32 *LevelPtr; } ASL_WALK_INFO; @@ -243,10 +243,8 @@ typedef struct asl_walk_info typedef struct asl_file_info { - FILE *Handle; - char *Filename; - const char *ShortDescription; - const char *Description; + FILE *Handle; + char *Filename; } ASL_FILE_INFO; @@ -258,6 +256,11 @@ typedef struct asl_file_status } ASL_FILE_STATUS; +typedef UINT32 ASL_FILE_SWITCH_STATUS; /* File switch status */ +#define SWITCH_TO_DIFFERENT_FILE 0 +#define SWITCH_TO_SAME_FILE 1 +#define FILE_NOT_FOUND 2 + /* * File types. Note: Any changes to this table must also be reflected * in the Gbl_Files array. @@ -295,10 +298,17 @@ typedef enum } ASL_FILE_TYPES; - #define ASL_MAX_FILE_TYPE 18 #define ASL_NUM_FILES (ASL_MAX_FILE_TYPE + 1) +typedef struct asl_file_desc +{ + const char *ShortDescription; + const char *Description; + +} ASL_FILE_DESC; + + /* Name suffixes used to create filenames for output files */ #define FILE_SUFFIX_ASL_CODE "asl" @@ -325,16 +335,16 @@ typedef enum typedef struct asl_cache_info { - void *Next; - char Buffer[1]; + void *Next; + char Buffer[1]; } ASL_CACHE_INFO; typedef struct asl_include_dir { - char *Dir; - struct asl_include_dir *Next; + char *Dir; + struct asl_include_dir *Next; } ASL_INCLUDE_DIR; @@ -343,6 +353,11 @@ typedef struct asl_include_dir * An entry in the exception list, one for each error/warning * Note: SubError nodes would be treated with the same messageId and Level * as the parent error node. + * + * The source filename represents the name of the .src of where the error + * occurred. This is useful for errors that occur inside of include files. + * Since include files aren't recorded as a part of the global files list, + * this provides a way to get the included file. */ typedef struct asl_error_msg { @@ -355,6 +370,7 @@ typedef struct asl_error_msg struct asl_error_msg *SubError; char *Filename; char *SourceLine; + char *SourceFilename; UINT32 FilenameLength; UINT16 MessageId; UINT8 Level; @@ -362,6 +378,7 @@ typedef struct asl_error_msg } ASL_ERROR_MSG; /* An entry in the expected messages array */ + typedef struct asl_expected_message { UINT32 MessageId; @@ -479,4 +496,19 @@ typedef struct asl_file_node } ASL_FILE_NODE; +typedef struct asl_files_node +{ + struct asl_file_info Files[ASL_NUM_FILES]; + struct asl_files_node *Next; + char *TableSignature; + char *TableId; + UINT32 TotalLineCount; + UINT32 OriginalInputFileSize; + UINT32 TotalKeywords; + UINT32 TotalNamedObjects; + UINT32 TotalExecutableOpcodes; + BOOLEAN ParserErrorDetected; + +} ASL_GLOBAL_FILE_NODE; + #endif /* __ASLTYPES_H */ diff --git a/src/acpica/source/compiler/aslutils.c b/src/acpica/source/compiler/aslutils.c index 6b0d5eff..0b78f473 100644 --- a/src/acpica/source/compiler/aslutils.c +++ b/src/acpica/source/compiler/aslutils.c @@ -174,6 +174,10 @@ UtAttachNameseg ( ACPI_PARSE_OBJECT *Op, char *Name); +static void +UtDisplayErrorSummary ( + UINT32 FileId); + /******************************************************************************* * @@ -520,21 +524,23 @@ UtSetParseOpName ( /******************************************************************************* * - * FUNCTION: UtDisplaySummary + * FUNCTION: UtDisplayOneSummary * * PARAMETERS: FileID - ID of outpout file * * RETURN: None * - * DESCRIPTION: Display compilation statistics + * DESCRIPTION: Display compilation statistics for one input file * ******************************************************************************/ void -UtDisplaySummary ( - UINT32 FileId) +UtDisplayOneSummary ( + UINT32 FileId, + BOOLEAN DisplayErrorSummary) { UINT32 i; + ASL_GLOBAL_FILE_NODE *FileNode; if (FileId != ASL_FILE_STDOUT) @@ -565,25 +571,41 @@ UtDisplaySummary ( } else { - FlPrintFile (FileId, - "%-14s %s - %u lines, %u bytes, %u keywords\n", - "ASL Input:", - AslGbl_Files[ASL_FILE_INPUT].Filename, AslGbl_CurrentLineNumber, - AslGbl_OriginalInputFileSize, AslGbl_TotalKeywords); - - /* AML summary */ - - if ((AslGbl_ExceptionCount[ASL_ERROR] == 0) || (AslGbl_IgnoreErrors)) + FileNode = FlGetCurrentFileNode (); + if (!FileNode) { - if (AslGbl_Files[ASL_FILE_AML_OUTPUT].Handle) + fprintf (stderr, "Summary could not be generated"); + return; + } + if (FileNode->ParserErrorDetected) + { + FlPrintFile (FileId, + "%-14s %s - Compilation aborted due to parser-detected syntax error(s)\n", + "ASL Input:", AslGbl_Files[ASL_FILE_INPUT].Filename); + } + else + { + FlPrintFile (FileId, + "%-14s %s - %7u bytes %6u keywords %6u source lines\n", + "ASL Input:", + AslGbl_Files[ASL_FILE_INPUT].Filename, + FileNode->OriginalInputFileSize, + FileNode->TotalKeywords, + FileNode->TotalLineCount); + + /* AML summary */ + + if (!AslGbl_ParserErrorDetected && + ((AslGbl_ExceptionCount[ASL_ERROR] == 0) || AslGbl_IgnoreErrors) && + AslGbl_Files[ASL_FILE_AML_OUTPUT].Handle) { FlPrintFile (FileId, - "%-14s %s - %u bytes, %u named objects, " - "%u executable opcodes\n", + "%-14s %s - %7u bytes %6u opcodes %6u named objects\n", "AML Output:", AslGbl_Files[ASL_FILE_AML_OUTPUT].Filename, FlGetFileSize (ASL_FILE_AML_OUTPUT), - AslGbl_TotalNamedObjects, AslGbl_TotalExecutableOpcodes); + FileNode->TotalExecutableOpcodes, + FileNode->TotalNamedObjects); } } } @@ -612,14 +634,55 @@ UtDisplaySummary ( } FlPrintFile (FileId, "%14s %s - %u bytes\n", - AslGbl_Files[i].ShortDescription, + AslGbl_FileDescs[i].ShortDescription, AslGbl_Files[i].Filename, FlGetFileSize (i)); } - /* Error summary */ + + /* + * Optionally emit an error summary for a file. This is used to enhance the + * appearance of listing files. + */ + if (DisplayErrorSummary) + { + UtDisplayErrorSummary (FileId); + } +} + + +/******************************************************************************* + * + * FUNCTION: UtDisplayErrorSummary + * + * PARAMETERS: FileID - ID of outpout file + * + * RETURN: None + * + * DESCRIPTION: Display compilation statistics for all input files + * + ******************************************************************************/ + +static void +UtDisplayErrorSummary ( + UINT32 FileId) +{ + BOOLEAN ErrorDetected; + + + ErrorDetected = AslGbl_ParserErrorDetected || + ((AslGbl_ExceptionCount[ASL_ERROR] > 0) && !AslGbl_IgnoreErrors); + + if (ErrorDetected) + { + FlPrintFile (FileId, "\nCompilation failed. "); + } + else + { + FlPrintFile (FileId, "\nCompilation successful. "); + } FlPrintFile (FileId, - "\nCompilation complete. %u Errors, %u Warnings, %u Remarks", + "%u Errors, %u Warnings, %u Remarks", AslGbl_ExceptionCount[ASL_ERROR], AslGbl_ExceptionCount[ASL_WARNING] + AslGbl_ExceptionCount[ASL_WARNING2] + @@ -628,6 +691,19 @@ UtDisplaySummary ( if (AslGbl_FileType != ASL_INPUT_TYPE_ASCII_DATA) { + if (AslGbl_ParserErrorDetected) + { + FlPrintFile (FileId, + "\nNo AML files were generated due to syntax error(s)\n"); + return; + } + else if (ErrorDetected) + { + FlPrintFile (FileId, + "\nNo AML files were generated due to compiler error(s)\n"); + return; + } + FlPrintFile (FileId, ", %u Optimizations", AslGbl_ExceptionCount[ASL_OPTIMIZATION]); @@ -641,6 +717,46 @@ UtDisplaySummary ( } +/******************************************************************************* + * + * FUNCTION: UtDisplaySummary + * + * PARAMETERS: FileID - ID of outpout file + * + * RETURN: None + * + * DESCRIPTION: Display compilation statistics for all input files + * + ******************************************************************************/ + +void +UtDisplaySummary ( + UINT32 FileId) +{ + ASL_GLOBAL_FILE_NODE *Current = AslGbl_FilesList; + + + while (Current) + { + switch (FlSwitchFileSet(Current->Files[ASL_FILE_INPUT].Filename)) + { + case SWITCH_TO_SAME_FILE: + case SWITCH_TO_DIFFERENT_FILE: + + UtDisplayOneSummary (FileId, FALSE); + Current = Current->Next; + break; + + case FILE_NOT_FOUND: + default: + + Current = NULL; + break; + } + } + UtDisplayErrorSummary (FileId); +} + /******************************************************************************* * * FUNCTION: UtCheckIntegerRange diff --git a/src/acpica/source/compiler/aslxref.c b/src/acpica/source/compiler/aslxref.c index 99f6c4a0..9d6e5c0b 100644 --- a/src/acpica/source/compiler/aslxref.c +++ b/src/acpica/source/compiler/aslxref.c @@ -1185,6 +1185,24 @@ XfNamespaceLocateBegin ( } } + /* + * 5) Check for external resolution + * By this point, everything should be loaded in the namespace. If a + * namespace lookup results in a namespace node that is an external, it + * means that this named object was not defined in the input ASL. This + * causes issues because there are plenty of incidents where developers + * use the external keyword to suppress compiler errors about undefined + * objects. Note: this only applies when compiling multiple definition + * blocks. + */ + if (AslGbl_ParseTreeRoot->Asl.Child && AslGbl_ParseTreeRoot->Asl.Child->Asl.Next && + (Op->Asl.ParseOpcode != PARSEOP_EXTERNAL && + Op->Asl.Parent->Asl.ParseOpcode != PARSEOP_EXTERNAL) && + (Node->Flags & ANOBJ_IS_EXTERNAL)) + { + AslError (ASL_ERROR, ASL_MSG_UNDEFINED_EXTERNAL, Op, NULL); + } + /* 5) Check for a connection object */ #if 0 else if (Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_CONNECTION) diff --git a/src/acpica/source/compiler/dtcompile.c b/src/acpica/source/compiler/dtcompile.c index 95fcb2d4..09cb3e6c 100644 --- a/src/acpica/source/compiler/dtcompile.c +++ b/src/acpica/source/compiler/dtcompile.c @@ -240,8 +240,7 @@ DtDoCompile ( DtError (ASL_ERROR, ASL_MSG_SYNTAX, NULL, "Input file does not appear to be an ASL or data table source file"); - Status = AE_ERROR; - goto CleanupAndExit; + return (AE_ERROR); } Event = UtBeginEvent ("Compile parse tree"); @@ -259,7 +258,7 @@ DtDoCompile ( DtError (ASL_ERROR, ASL_MSG_SYNTAX, NULL, "Could not compile input file"); - goto CleanupAndExit; + return (Status); } /* Create/open the binary output file */ @@ -268,7 +267,7 @@ DtDoCompile ( Status = FlOpenAmlOutputFile (AslGbl_OutputFilenamePrefix); if (ACPI_FAILURE (Status)) { - goto CleanupAndExit; + return (Status); } /* Write the binary, then the optional hex file */ @@ -277,10 +276,6 @@ DtDoCompile ( HxDoHexOutput (); DtWriteTableToListing (); -CleanupAndExit: - - AcpiUtDeleteCaches (); - CmCleanupAndExit (); return (Status); } diff --git a/src/acpica/source/compiler/fwts_iasl_interface.c b/src/acpica/source/compiler/fwts_iasl_interface.c index 9679e272..1699eb6c 100644 --- a/src/acpica/source/compiler/fwts_iasl_interface.c +++ b/src/acpica/source/compiler/fwts_iasl_interface.c @@ -35,27 +35,17 @@ */ static void init_asl_core(void) { - int i; - AcpiOsInitialize(); ACPI_DEBUG_INITIALIZE(); AcpiGbl_ExternalFileList = NULL; AcpiDbgLevel = 0; PrInitializePreprocessor(); - AcpiGbl_DmOpt_Verbose = FALSE; - AcpiGbl_IntegerBitWidth = 64; - AcpiGbl_IntegerNybbleWidth = 16; - AcpiGbl_IntegerByteWidth = 8; - - for (i = 0; i < ASL_NUM_FILES; i++) { - AslGbl_Files[i].Handle = NULL; - AslGbl_Files[i].Filename = NULL; - } - AslGbl_Files[ASL_FILE_STDOUT].Handle = stdout; - AslGbl_Files[ASL_FILE_STDOUT].Filename = "STDOUT"; - AslGbl_Files[ASL_FILE_STDERR].Handle = stdout; - AslGbl_Files[ASL_FILE_STDERR].Filename = "STDOUT"; + /* From AslInitialize */ + AcpiGbl_DmOpt_Verbose = FALSE; + AcpiGbl_IntegerBitWidth = 32; + AcpiGbl_IntegerNybbleWidth = 8; + AcpiGbl_IntegerByteWidth = 4; AslGbl_LineBufferSize = 1024; AslGbl_CurrentLineBuffer = NULL; @@ -99,6 +89,7 @@ int fwts_iasl_disassemble_aml( AslGbl_UseDefaultAmlFilename = FALSE; AcpiGbl_CstyleDisassembly = FALSE; AcpiGbl_DmOpt_Verbose = FALSE; + AslGbl_ParserErrorDetected = FALSE; UtConvertBackslashes (AslGbl_OutputFilenamePrefix); /* Do we need to include external tables in? */ @@ -135,6 +126,7 @@ int fwts_iasl_disassemble_aml( (void)fclose(fpout); _exit(1); } + AdInitialize(); /* ...and do the ACPICA disassambly... */ AslDoOneFile((char *)tables[which]); @@ -231,14 +223,28 @@ int fwts_iasl_assemble_aml(const char *source, char **stdout_output, char **stde (void)close(stderr_fds[0]); /* Setup ACPICA compiler globals */ + AslGbl_WarningLevel = 0; + AslGbl_NoErrors = FALSE; AcpiGbl_DisasmFlag = FALSE; + AslGbl_DisplayRemarks = TRUE; + AslGbl_DisplayWarnings = TRUE; + AslGbl_DisplayOptimizations = TRUE; + /* AslGbl_CompileTimesFlag = TRUE; */ AslGbl_DoCompile = TRUE; AslGbl_PreprocessFlag = TRUE; AslGbl_UseDefaultAmlFilename = FALSE; AslGbl_OutputFilenamePrefix = (char*)source; - UtConvertBackslashes (AslGbl_OutputFilenamePrefix); + UtConvertBackslashes(AslGbl_OutputFilenamePrefix); - (void)AslDoOneFile((char *)source); + AdInitialize(); + status = AslDoOneFile((char *)source); + + AslCheckExpectedExceptions(); + UtFreeLineBuffers(); + AslParserCleanup(); + AcpiDmClearExternalFileList(); + AcpiTerminate(); + CmCleanupAndExit(); /* * We need to flush buffered I/O on IASL stdout @@ -246,7 +252,6 @@ int fwts_iasl_assemble_aml(const char *source, char **stdout_output, char **stde */ (void)fflush(stdout); (void)fflush(stderr); - _exit(0); break; default: @@ -261,6 +266,7 @@ int fwts_iasl_assemble_aml(const char *source, char **stdout_output, char **stde if (fwts_iasl_read_output(stderr_fds[0], stderr_output, &stderr_len, &stderr_eof) < 0) break; } + (void)waitpid(pid, &status, WUNTRACED | WCONTINUED); (void)close(stdout_fds[0]); (void)close(stderr_fds[0]); diff --git a/src/acpica/source/compiler/prutils.c b/src/acpica/source/compiler/prutils.c index b5ddfa9f..f3d615ad 100644 --- a/src/acpica/source/compiler/prutils.c +++ b/src/acpica/source/compiler/prutils.c @@ -455,7 +455,6 @@ PrOpenIncludeWithPrefix ( IncludeFile = fopen (Pathname, OpenMode); if (!IncludeFile) { - fprintf (stderr, "Could not open include file %s\n", Pathname); return (NULL); } diff --git a/src/acpica/source/components/events/evgpe.c b/src/acpica/source/components/events/evgpe.c index f5ea992a..7534f6d7 100644 --- a/src/acpica/source/components/events/evgpe.c +++ b/src/acpica/source/components/events/evgpe.c @@ -240,6 +240,14 @@ AcpiEvEnableGpe ( ACPI_FUNCTION_TRACE (EvEnableGpe); + /* Clear the GPE (of stale events) */ + + Status = AcpiHwClearGpe(GpeEventInfo); + if (ACPI_FAILURE(Status)) + { + return_ACPI_STATUS(Status); + } + /* Enable the requested GPE */ Status = AcpiHwLowSetGpe (GpeEventInfo, ACPI_GPE_ENABLE); diff --git a/src/acpica/source/components/namespace/nsalloc.c b/src/acpica/source/components/namespace/nsalloc.c index ff178d49..12772308 100644 --- a/src/acpica/source/components/namespace/nsalloc.c +++ b/src/acpica/source/components/namespace/nsalloc.c @@ -232,6 +232,11 @@ AcpiNsDeleteNode ( ACPI_FUNCTION_NAME (NsDeleteNode); + if (!Node) + { + return_VOID; + } + /* Detach an object if there is one */ AcpiNsDetachObject (Node); diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h index d3e4e7b5..be338bbe 100644 --- a/src/acpica/source/include/acpixf.h +++ b/src/acpica/source/include/acpixf.h @@ -154,7 +154,7 @@ /* Current ACPICA subsystem version in YYYYMMDD format */ -#define ACPI_CA_VERSION 0x20190329 +#define ACPI_CA_VERSION 0x20190405 #include "acconfig.h" #include "actypes.h"