summaryrefslogtreecommitdiffstats
path: root/source/compiler
diff options
context:
space:
mode:
Diffstat (limited to 'source/compiler')
-rw-r--r--source/compiler/aslcompile.c40
-rw-r--r--source/compiler/aslcompiler.h8
-rw-r--r--source/compiler/aslerror.c47
-rw-r--r--source/compiler/aslfiles.c37
-rw-r--r--source/compiler/aslfold.c15
-rw-r--r--source/compiler/aslglobal.h65
-rw-r--r--source/compiler/aslmain.c77
-rw-r--r--source/compiler/aslmessages.h2
-rw-r--r--source/compiler/asloperands.c4
-rw-r--r--source/compiler/aslopt.c24
-rw-r--r--source/compiler/aslstartup.c2
-rw-r--r--source/compiler/aslsupport.l4
-rw-r--r--source/compiler/asltypes.h8
-rw-r--r--source/compiler/aslutils.c100
-rw-r--r--source/compiler/dtio.c37
-rwxr-xr-xsource/compiler/new_table.txt88
-rw-r--r--source/compiler/preprocess.h11
17 files changed, 358 insertions, 211 deletions
diff --git a/source/compiler/aslcompile.c b/source/compiler/aslcompile.c
index a6ffe1e..3ac3c24 100644
--- a/source/compiler/aslcompile.c
+++ b/source/compiler/aslcompile.c
@@ -800,6 +800,7 @@ CmCleanupAndExit (
void)
{
UINT32 i;
+ BOOLEAN DeleteAmlFile = FALSE;
AePrintErrorLog (ASL_FILE_STDERR);
@@ -851,6 +852,16 @@ CmCleanupAndExit (
UtDisplaySummary (ASL_FILE_STDOUT);
+ /*
+ * We will delete the AML file if there are errors and the
+ * force AML output option has not been used.
+ */
+ if ((Gbl_ExceptionCount[ASL_ERROR] > 0) && (!Gbl_IgnoreErrors) &&
+ Gbl_Files[ASL_FILE_AML_OUTPUT].Handle)
+ {
+ DeleteAmlFile = TRUE;
+ }
+
/* Close all open files */
Gbl_Files[ASL_FILE_PREPROCESSOR].Handle = NULL; /* the .i file is same as source file */
@@ -862,29 +873,17 @@ CmCleanupAndExit (
/* Delete AML file if there are errors */
- if ((Gbl_ExceptionCount[ASL_ERROR] > 0) && (!Gbl_IgnoreErrors) &&
- Gbl_Files[ASL_FILE_AML_OUTPUT].Handle)
+ if (DeleteAmlFile)
{
- if (remove (Gbl_Files[ASL_FILE_AML_OUTPUT].Filename))
- {
- printf ("%s: ",
- Gbl_Files[ASL_FILE_AML_OUTPUT].Filename);
- perror ("Could not delete AML file");
- }
+ FlDeleteFile (ASL_FILE_AML_OUTPUT);
}
/* Delete the preprocessor output file (.i) unless -li flag is set */
if (!Gbl_PreprocessorOutputFlag &&
- Gbl_PreprocessFlag &&
- Gbl_Files[ASL_FILE_PREPROCESSOR].Filename)
+ Gbl_PreprocessFlag)
{
- if (remove (Gbl_Files[ASL_FILE_PREPROCESSOR].Filename))
- {
- printf ("%s: ",
- Gbl_Files[ASL_FILE_PREPROCESSOR].Filename);
- perror ("Could not delete preprocessor .i file");
- }
+ FlDeleteFile (ASL_FILE_PREPROCESSOR);
}
/*
@@ -901,14 +900,9 @@ CmCleanupAndExit (
*
* TBD: SourceOutput should be .TMP, then rename if we want to keep it?
*/
- if (!Gbl_SourceOutputFlag && Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename)
+ if (!Gbl_SourceOutputFlag)
{
- if (remove (Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename))
- {
- printf ("%s: ",
- Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename);
- perror ("Could not delete SRC file");
- }
+ FlDeleteFile (ASL_FILE_SOURCE_OUTPUT);
}
}
diff --git a/source/compiler/aslcompiler.h b/source/compiler/aslcompiler.h
index 09b3f6c..c68fcb4 100644
--- a/source/compiler/aslcompiler.h
+++ b/source/compiler/aslcompiler.h
@@ -661,6 +661,10 @@ FlPrintFile (
...);
void
+FlDeleteFile (
+ UINT32 FileId);
+
+void
FlSetLineNumber (
UINT32 LineNumber);
@@ -779,6 +783,10 @@ char *
UtGetStringBuffer (
UINT32 Length);
+void
+UtExpandLineBuffers (
+ void);
+
ACPI_STATUS
UtInternalizeName (
char *ExternalName,
diff --git a/source/compiler/aslerror.c b/source/compiler/aslerror.c
index e00f5e4..c125dfc 100644
--- a/source/compiler/aslerror.c
+++ b/source/compiler/aslerror.c
@@ -183,6 +183,7 @@ AePrintException (
FILE *SourceFile = NULL;
long FileSize;
BOOLEAN PrematureEOF = FALSE;
+ UINT32 Total = 0;
if (Gbl_NoErrors)
@@ -300,11 +301,21 @@ AePrintException (
"[*** iASL: Read error on source code temp file %s ***]",
Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename);
}
-
- else while (RActual && SourceByte && (SourceByte != '\n'))
+ else
{
- fwrite (&SourceByte, 1, 1, OutputFile);
- RActual = fread (&SourceByte, 1, 1, SourceFile);
+ while (RActual && SourceByte && (SourceByte != '\n') && (Total < 256))
+ {
+ fwrite (&SourceByte, 1, 1, OutputFile);
+ RActual = fread (&SourceByte, 1, 1, SourceFile);
+ Total++;
+ }
+
+ if (Total >= 256)
+ {
+ fprintf (OutputFile,
+ "\n[*** iASL: Long input line, an error occurred at column %u ***]",
+ Enode->Column);
+ }
}
}
}
@@ -381,20 +392,28 @@ AePrintException (
if (Gbl_VerboseErrors && !PrematureEOF)
{
- SourceColumn = Enode->Column + Enode->FilenameLength + 6 + 2;
- ErrorColumn = ASL_ERROR_LEVEL_LENGTH + 5 + 2 + 1;
-
- if ((MsgLength + ErrorColumn) < (SourceColumn - 1))
+ if (Total >= 256)
{
- fprintf (OutputFile, "%*s%s",
- (int) ((SourceColumn - 1) - ErrorColumn),
- MainMessage, " ^ ");
+ fprintf (OutputFile, " %s",
+ MainMessage);
}
else
{
- fprintf (OutputFile, "%*s %s",
- (int) ((SourceColumn - ErrorColumn) + 1), "^",
- MainMessage);
+ SourceColumn = Enode->Column + Enode->FilenameLength + 6 + 2;
+ ErrorColumn = ASL_ERROR_LEVEL_LENGTH + 5 + 2 + 1;
+
+ if ((MsgLength + ErrorColumn) < (SourceColumn - 1))
+ {
+ fprintf (OutputFile, "%*s%s",
+ (int) ((SourceColumn - 1) - ErrorColumn),
+ MainMessage, " ^ ");
+ }
+ else
+ {
+ fprintf (OutputFile, "%*s %s",
+ (int) ((SourceColumn - ErrorColumn) + 1), "^",
+ MainMessage);
+ }
}
}
else
diff --git a/source/compiler/aslfiles.c b/source/compiler/aslfiles.c
index bc5b52d..7aa426c 100644
--- a/source/compiler/aslfiles.c
+++ b/source/compiler/aslfiles.c
@@ -63,6 +63,7 @@ FlParseInputPathname (
#endif
+
/*******************************************************************************
*
* FUNCTION: AslAbort
@@ -376,6 +377,42 @@ FlCloseFile (
/*******************************************************************************
*
+ * FUNCTION: FlDeleteFile
+ *
+ * PARAMETERS: FileId - Index into file info array
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Delete a file.
+ *
+ ******************************************************************************/
+
+void
+FlDeleteFile (
+ UINT32 FileId)
+{
+ ASL_FILE_INFO *Info = &Gbl_Files[FileId];
+
+
+ if (!Info->Filename)
+ {
+ return;
+ }
+
+ if (remove (Info->Filename))
+ {
+ printf ("%s (%s file) ",
+ Info->Filename, Info->Description);
+ perror ("Could not delete");
+ }
+
+ Info->Filename = NULL;
+ return;
+}
+
+
+/*******************************************************************************
+ *
* FUNCTION: FlSetLineNumber
*
* PARAMETERS: Op - Parse node for the LINE asl statement
diff --git a/source/compiler/aslfold.c b/source/compiler/aslfold.c
index 6c8cb37..425a328 100644
--- a/source/compiler/aslfold.c
+++ b/source/compiler/aslfold.c
@@ -200,6 +200,19 @@ OpcAmlCheckForConstant (
DbgPrint (ASL_PARSE_OUTPUT, "[%.4d] Opcode: %12.12s ",
Op->Asl.LogicalLineNumber, Op->Asl.ParseOpName);
+ /*
+ * These opcodes do not appear in the OpcodeInfo table, but
+ * they represent constants, so abort the constant walk now.
+ */
+ if ((WalkState->Opcode == AML_RAW_DATA_BYTE) ||
+ (WalkState->Opcode == AML_RAW_DATA_WORD) ||
+ (WalkState->Opcode == AML_RAW_DATA_DWORD) ||
+ (WalkState->Opcode == AML_RAW_DATA_QWORD))
+ {
+ WalkState->WalkType = ACPI_WALK_CONST_OPTIONAL;
+ return (AE_TYPE);
+ }
+
if (!(WalkState->OpInfo->Flags & AML_CONSTANT))
{
/* The opcode is not a Type 3/4/5 opcode */
@@ -254,8 +267,8 @@ OpcAmlCheckForConstant (
{
DbgPrint (ASL_PARSE_OUTPUT, " TERMARG");
}
- DbgPrint (ASL_PARSE_OUTPUT, "\n");
+ DbgPrint (ASL_PARSE_OUTPUT, "\n");
return (AE_OK);
}
diff --git a/source/compiler/aslglobal.h b/source/compiler/aslglobal.h
index 64cb76b..0451fec 100644
--- a/source/compiler/aslglobal.h
+++ b/source/compiler/aslglobal.h
@@ -63,6 +63,41 @@
#endif
+#ifdef _DECLARE_GLOBALS
+UINT32 Gbl_ExceptionCount[ASL_NUM_REPORT_LEVELS] = {0,0,0,0,0,0};
+char AslHexLookup[] =
+{
+ '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'
+};
+
+
+/* Table below must match ASL_FILE_TYPES in asltypes.h */
+
+ASL_FILE_INFO Gbl_Files [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, "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"}
+};
+
+#else
+extern UINT32 Gbl_ExceptionCount[ASL_NUM_REPORT_LEVELS];
+extern char AslHexLookup[];
+extern ASL_FILE_INFO Gbl_Files [ASL_NUM_FILES];
+#endif
+
+
/*
* Parser and other externals
*/
@@ -74,21 +109,22 @@ extern int PrParserdebug;
extern const ASL_MAPPING_ENTRY AslKeywordMapping[];
extern char *AslCompilertext;
-#define ASL_LINE_BUFFER_SIZE (4096 * 4) /* 16K */
-#define ASL_MSG_BUFFER_SIZE 4096
-#define HEX_TABLE_LINE_SIZE 8
-#define HEX_LISTING_LINE_SIZE 8
+#define ASL_DEFAULT_LINE_BUFFER_SIZE (1024 * 32) /* 32K */
+#define ASL_MSG_BUFFER_SIZE 4096
+#define HEX_TABLE_LINE_SIZE 8
+#define HEX_LISTING_LINE_SIZE 8
/* Source code buffers and pointers for error reporting */
-ASL_EXTERN char Gbl_CurrentLineBuffer[ASL_LINE_BUFFER_SIZE];
+ASL_EXTERN char ASL_INIT_GLOBAL (*Gbl_CurrentLineBuffer, NULL);
+ASL_EXTERN char ASL_INIT_GLOBAL (*Gbl_LineBufPtr, NULL);
+ASL_EXTERN UINT32 ASL_INIT_GLOBAL (Gbl_LineBufferSize, ASL_DEFAULT_LINE_BUFFER_SIZE);
ASL_EXTERN UINT32 ASL_INIT_GLOBAL (Gbl_CurrentColumn, 0);
ASL_EXTERN UINT32 ASL_INIT_GLOBAL (Gbl_PreviousLineNumber, 0);
ASL_EXTERN UINT32 ASL_INIT_GLOBAL (Gbl_CurrentLineNumber, 1);
ASL_EXTERN UINT32 ASL_INIT_GLOBAL (Gbl_LogicalLineNumber, 1);
ASL_EXTERN UINT32 ASL_INIT_GLOBAL (Gbl_CurrentLineOffset, 0);
-ASL_EXTERN char ASL_INIT_GLOBAL (*Gbl_LineBufPtr, Gbl_CurrentLineBuffer);
/* Exception reporting */
@@ -135,18 +171,16 @@ ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_DoTemplates, FALSE);
ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_CompileGeneric, FALSE);
-#define HEX_OUTPUT_NONE 0
-#define HEX_OUTPUT_C 1
-#define HEX_OUTPUT_ASM 2
-#define HEX_OUTPUT_ASL 3
+#define HEX_OUTPUT_NONE 0
+#define HEX_OUTPUT_C 1
+#define HEX_OUTPUT_ASM 2
+#define HEX_OUTPUT_ASL 3
ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_HexOutputFlag, HEX_OUTPUT_NONE);
/* Files */
-ASL_EXTERN ASL_FILE_INFO Gbl_Files [ASL_NUM_FILES];
-
ASL_EXTERN char *Gbl_DirectoryPath;
ASL_EXTERN char ASL_INIT_GLOBAL (*Gbl_IncludeFilename, NULL);
ASL_EXTERN char ASL_INIT_GLOBAL (*Gbl_OutputFilenamePrefix, NULL);
@@ -203,7 +237,6 @@ ASL_EXTERN FILE *AcpiGbl_DebugFile; /* Placeholder for oswin
ASL_EXTERN ASL_ANALYSIS_WALK_INFO AnalysisWalkInfo;
ASL_EXTERN ACPI_TABLE_HEADER TableHeader;
-extern char AslHexLookup[];
/* Event timing */
@@ -220,11 +253,5 @@ ASL_EXTERN char StringBuffer[ASL_MSG_BUFFER_SIZE];
ASL_EXTERN char StringBuffer2[ASL_MSG_BUFFER_SIZE];
-#ifdef _DECLARE_GLOBALS
-UINT32 Gbl_ExceptionCount[ASL_NUM_REPORT_LEVELS] = {0,0,0,0,0,0};
-#else
-extern UINT32 Gbl_ExceptionCount[ASL_NUM_REPORT_LEVELS];
-#endif
-
#endif /* __ASLGLOBAL_H */
diff --git a/source/compiler/aslmain.c b/source/compiler/aslmain.c
index 568f395..75262c7 100644
--- a/source/compiler/aslmain.c
+++ b/source/compiler/aslmain.c
@@ -48,6 +48,7 @@
#include "aslcompiler.h"
#include "acapps.h"
#include "acdisasm.h"
+#include <signal.h>
#ifdef _DEBUG
#include <crtdbg.h>
@@ -70,6 +71,10 @@ static void
Usage (
void);
+static void ACPI_SYSTEM_XFACE
+AslSignalHandler (
+ int Sig);
+
static void
AslInitialize (
void);
@@ -96,7 +101,7 @@ AslDoResponseFile (
#define ASL_TOKEN_SEPARATORS " \t\n"
-#define ASL_SUPPORTED_OPTIONS "@:2b|c|d^D:e:fgh^i|I:l^mno|p:P^r:s|t|T:G^v^w|x:z"
+#define ASL_SUPPORTED_OPTIONS "@:2b|c|d^D:e:fgh^i|I:l^m:no|p:P^r:s|t|T:G^v^w|x:z"
/*******************************************************************************
@@ -163,10 +168,10 @@ Options (
printf ("\nAML Disassembler:\n");
ACPI_OPTION ("-d [file]", "Disassemble or decode binary ACPI table to file (*.dsl)");
ACPI_OPTION ("-da [f1,f2]", "Disassemble multiple tables from single namespace");
+ ACPI_OPTION ("-db", "Do not translate Buffers to Resource Templates");
ACPI_OPTION ("-dc [file]", "Disassemble AML and immediately compile it");
ACPI_OPTION ("", "(Obtain DSDT from current system if no input file)");
ACPI_OPTION ("-e [f1,f2]", "Include ACPI table(s) for external symbol resolution");
- ACPI_OPTION ("-m", "Do not translate Buffers to Resource Templates");
ACPI_OPTION ("-2", "Emit ACPI 2.0 compatible ASL code");
ACPI_OPTION ("-g", "Get ACPI tables and write to files (*.dat)");
@@ -238,6 +243,49 @@ Usage (
}
+/******************************************************************************
+ *
+ * FUNCTION: AslSignalHandler
+ *
+ * PARAMETERS: Sig - Signal that invoked this handler
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Control-C handler. Delete any intermediate files and any
+ * output files that may be left in an indeterminate state.
+ *
+ *****************************************************************************/
+
+static void ACPI_SYSTEM_XFACE
+AslSignalHandler (
+ int Sig)
+{
+ UINT32 i;
+
+
+ signal (Sig, SIG_IGN);
+ printf ("Aborting\n\n");
+
+ /* Close all open files */
+
+ Gbl_Files[ASL_FILE_PREPROCESSOR].Handle = NULL; /* the .i file is same as source file */
+
+ for (i = ASL_FILE_INPUT; i < ASL_MAX_FILE_TYPE; i++)
+ {
+ FlCloseFile (i);
+ }
+
+ /* Delete any output files */
+
+ for (i = ASL_FILE_AML_OUTPUT; i < ASL_MAX_FILE_TYPE; i++)
+ {
+ FlDeleteFile (i);
+ }
+
+ exit (0);
+}
+
+
/*******************************************************************************
*
* FUNCTION: AslInitialize
@@ -261,7 +309,6 @@ AslInitialize (
_CrtSetDbgFlag (_CRTDBG_CHECK_ALWAYS_DF | _CrtSetDbgFlag(0));
#endif
- AcpiDbgLevel = 0;
for (i = 0; i < ASL_NUM_FILES; i++)
{
@@ -274,6 +321,11 @@ AslInitialize (
Gbl_Files[ASL_FILE_STDERR].Handle = stderr;
Gbl_Files[ASL_FILE_STDERR].Filename = "STDERR";
+
+ /* Allocate the line buffer(s) */
+
+ Gbl_LineBufferSize /= 2;
+ UtExpandLineBuffers ();
}
@@ -475,6 +527,10 @@ AslDoOptions (
Gbl_DisassembleAll = TRUE;
break;
+ case 'b': /* Do not convert buffers to resource descriptors */
+ AcpiGbl_NoResourceDisassembly = TRUE;
+ break;
+
case 'c':
break;
@@ -613,8 +669,13 @@ AslDoOptions (
break;
- case 'm': /* Do not convert buffers to resource descriptors */
- AcpiGbl_NoResourceDisassembly = TRUE;
+ case 'm': /* Set line buffer size */
+ Gbl_LineBufferSize = (UINT32) strtoul (AcpiGbl_Optarg, NULL, 0) * 1024;
+ if (Gbl_LineBufferSize < ASL_DEFAULT_LINE_BUFFER_SIZE)
+ {
+ Gbl_LineBufferSize = ASL_DEFAULT_LINE_BUFFER_SIZE;
+ }
+ printf ("Line Buffer Size: %u\n", Gbl_LineBufferSize);
break;
@@ -946,7 +1007,10 @@ main (
int Index2;
+ signal (SIGINT, AslSignalHandler);
+
AcpiGbl_ExternalFileList = NULL;
+ AcpiDbgLevel = 0;
#ifdef _DEBUG
_CrtSetDbgFlag (_CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_LEAK_CHECK_DF |
@@ -955,9 +1019,10 @@ main (
/* Init and command line */
+ Index1 = Index2 = AslCommandLine (argc, argv);
+
AslInitialize ();
PrInitializePreprocessor ();
- Index1 = Index2 = AslCommandLine (argc, argv);
/* Options that have no additional parameters or pathnames */
diff --git a/source/compiler/aslmessages.h b/source/compiler/aslmessages.h
index 4c4e79a..f2d86d0 100644
--- a/source/compiler/aslmessages.h
+++ b/source/compiler/aslmessages.h
@@ -198,6 +198,7 @@ typedef enum
ASL_MSG_VENDOR_LIST,
ASL_MSG_WRITE,
ASL_MSG_RANGE,
+ ASL_MSG_BUFFER_ALLOCATION,
/* These messages are used by the Preprocessor only */
@@ -373,6 +374,7 @@ char *AslMessages [] = {
/* ASL_MSG_VENDOR_LIST */ "Too many vendor data bytes (7 max)",
/* ASL_MSG_WRITE */ "Could not write file",
/* ASL_MSG_RANGE */ "Constant out of range",
+/* ASL_MSG_BUFFER_ALLOCATION */ "Could not allocate line buffer",
/* Preprocessor */
diff --git a/source/compiler/asloperands.c b/source/compiler/asloperands.c
index 37274e7..6d4433d 100644
--- a/source/compiler/asloperands.c
+++ b/source/compiler/asloperands.c
@@ -182,6 +182,10 @@ OpnDoMethod (
Next = Next->Asl.Next;
if (Next->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
{
+ /* This is a ByteConstExpr, so eval the constant now */
+
+ OpcAmlConstantWalk (Next, 0, NULL);
+
if (Next->Asl.Value.Integer > 15)
{
AslError (ASL_ERROR, ASL_MSG_SYNC_LEVEL, Next, NULL);
diff --git a/source/compiler/aslopt.c b/source/compiler/aslopt.c
index 6942f7b..b31c587 100644
--- a/source/compiler/aslopt.c
+++ b/source/compiler/aslopt.c
@@ -441,7 +441,6 @@ OptOptimizeNameDeclaration (
{
ACPI_STATUS Status;
char *NewPathExternal;
- ACPI_GENERIC_STATE ScopeInfo;
ACPI_NAMESPACE_NODE *Node;
@@ -473,9 +472,10 @@ OptOptimizeNameDeclaration (
* Check to make sure that the optimization finds the node we are
* looking for. This is simply a sanity check on the new
* path that has been created.
+ *
+ * We know that we are at the root, so NULL is used for the scope.
*/
- ScopeInfo.Scope.Node = CurrentNode;
- Status = AcpiNsLookup (&ScopeInfo, *NewPath,
+ Status = AcpiNsLookup (NULL, *NewPath,
ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
ACPI_NS_DONT_OPEN_SCOPE, WalkState, &(Node));
if (ACPI_SUCCESS (Status))
@@ -624,11 +624,21 @@ OptOptimizeNamePath (
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OPTIMIZATIONS, "NAME"));
/*
- * The node of interest is the parent of this node
- * (the containing scope)
+ * The node of interest is the parent of this node (the containing
+ * scope). The actual namespace node may be up more than one level
+ * of parse op or it may not exist at all (if we traverse back
+ * up to the root.)
*/
- CurrentNode = Op->Asl.Parent->Asl.Node;
- if (!CurrentNode)
+ NextOp = Op->Asl.Parent;
+ while (NextOp && (!NextOp->Asl.Node))
+ {
+ NextOp = NextOp->Asl.Parent;
+ }
+ if (NextOp && NextOp->Asl.Node)
+ {
+ CurrentNode = NextOp->Asl.Node;
+ }
+ else
{
CurrentNode = AcpiGbl_RootNode;
}
diff --git a/source/compiler/aslstartup.c b/source/compiler/aslstartup.c
index a302164..1f51c71 100644
--- a/source/compiler/aslstartup.c
+++ b/source/compiler/aslstartup.c
@@ -239,7 +239,7 @@ AslDetectSourceFileType (
* File is ASCII. Determine if this is an ASL file or an ACPI data
* table file.
*/
- while (fgets (Gbl_CurrentLineBuffer, ASL_LINE_BUFFER_SIZE, Info->Handle))
+ while (fgets (Gbl_CurrentLineBuffer, Gbl_LineBufferSize, Info->Handle))
{
/* Uppercase the buffer for caseless compare */
diff --git a/source/compiler/aslsupport.l b/source/compiler/aslsupport.l
index f63519c..eef9411 100644
--- a/source/compiler/aslsupport.l
+++ b/source/compiler/aslsupport.l
@@ -343,14 +343,14 @@ AslInsertLineBuffer (
*Gbl_LineBufPtr = (UINT8) SourceChar;
Gbl_LineBufPtr++;
- if (Gbl_LineBufPtr > (Gbl_CurrentLineBuffer + (ASL_LINE_BUFFER_SIZE - 1)))
+ if (Gbl_LineBufPtr > (Gbl_CurrentLineBuffer + (Gbl_LineBufferSize - 1)))
{
#if 0
/*
* Warning if we have split a long source line.
* <Probably overkill>
*/
- sprintf (MsgBuffer, "Max %u", ASL_LINE_BUFFER_SIZE);
+ sprintf (MsgBuffer, "Max %u", Gbl_LineBufferSize);
AslCommonError (ASL_WARNING, ASL_MSG_LONG_LINE,
Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
Gbl_CurrentLineOffset, Gbl_CurrentColumn,
diff --git a/source/compiler/asltypes.h b/source/compiler/asltypes.h
index 7e3bd0a..b9f4fbe 100644
--- a/source/compiler/asltypes.h
+++ b/source/compiler/asltypes.h
@@ -133,6 +133,8 @@ typedef struct asl_file_info
{
FILE *Handle;
char *Filename;
+ const char *ShortDescription;
+ const char *Description;
} ASL_FILE_INFO;
@@ -146,14 +148,14 @@ typedef struct asl_file_status
/*
* File types. Note: Any changes to this table must also be reflected
- * in the AslFileTypeNames array.
+ * in the Gbl_Files array.
*/
typedef enum
{
ASL_FILE_STDOUT = 0,
ASL_FILE_STDERR,
- ASL_FILE_INPUT, /* Don't move these first 3 file types */
- ASL_FILE_AML_OUTPUT,
+ ASL_FILE_INPUT,
+ ASL_FILE_AML_OUTPUT, /* Don't move these first 4 file types */
ASL_FILE_SOURCE_OUTPUT,
ASL_FILE_PREPROCESSOR,
ASL_FILE_LISTING_OUTPUT,
diff --git a/source/compiler/aslutils.c b/source/compiler/aslutils.c
index 771ba09..43bf823 100644
--- a/source/compiler/aslutils.c
+++ b/source/compiler/aslutils.c
@@ -54,31 +54,6 @@
ACPI_MODULE_NAME ("aslutils")
-char AslHexLookup[] =
-{
- '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'
-};
-
-/* Table below must match ASL_FILE_TYPES in asltypes.h */
-
-static const char *AslFileTypeNames [ASL_NUM_FILES] =
-{
- "stdout: ",
- "stderr: ",
- "Table Input: ",
- "Binary Output:",
- "Source Output:",
- "Preprocessor: ",
- "Listing File: ",
- "Hex Dump: ",
- "Namespace: ",
- "Debug File: ",
- "ASM Source: ",
- "C Source: ",
- "ASM Include: ",
- "C Include: "
-};
-
/* Local prototypes */
@@ -547,7 +522,7 @@ UtDisplaySummary (
}
FlPrintFile (FileId, "%14s %s - %u bytes\n",
- AslFileTypeNames [i],
+ Gbl_Files[i].ShortDescription,
Gbl_Files[i].Filename, FlGetFileSize (i));
}
@@ -646,6 +621,79 @@ UtGetStringBuffer (
}
+/******************************************************************************
+ *
+ * FUNCTION: UtExpandLineBuffers
+ *
+ * PARAMETERS: None. Updates global line buffer pointers.
+ *
+ * RETURN: None. Reallocates the global line buffers
+ *
+ * DESCRIPTION: Called if the current line buffer becomes filled. Reallocates
+ * all global line buffers and updates Gbl_LineBufferSize. NOTE:
+ * Also used for the initial allocation of the buffers, when
+ * all of the buffer pointers are NULL. Initial allocations are
+ * of size ASL_DEFAULT_LINE_BUFFER_SIZE
+ *
+ *****************************************************************************/
+
+void
+UtExpandLineBuffers (
+ void)
+{
+ UINT32 NewSize;
+
+
+ /* Attempt to double the size of all line buffers */
+
+ NewSize = Gbl_LineBufferSize * 2;
+ if (Gbl_CurrentLineBuffer)
+ {
+ DbgPrint (ASL_DEBUG_OUTPUT,"Increasing line buffer size from %u to %u\n",
+ Gbl_LineBufferSize, NewSize);
+ }
+
+ Gbl_CurrentLineBuffer = realloc (Gbl_CurrentLineBuffer, NewSize);
+ Gbl_LineBufPtr = Gbl_CurrentLineBuffer;
+ if (!Gbl_CurrentLineBuffer)
+ {
+ goto ErrorExit;
+ }
+
+ Gbl_MainTokenBuffer = realloc (Gbl_MainTokenBuffer, NewSize);
+ if (!Gbl_MainTokenBuffer)
+ {
+ goto ErrorExit;
+ }
+
+ Gbl_MacroTokenBuffer = realloc (Gbl_MacroTokenBuffer, NewSize);
+ if (!Gbl_MacroTokenBuffer)
+ {
+ goto ErrorExit;
+ }
+
+ Gbl_ExpressionTokenBuffer = realloc (Gbl_ExpressionTokenBuffer, NewSize);
+ if (!Gbl_ExpressionTokenBuffer)
+ {
+ goto ErrorExit;
+ }
+
+ Gbl_LineBufferSize = NewSize;
+ return;
+
+
+ /* On error above, simply issue error messages and abort, cannot continue */
+
+ErrorExit:
+ printf ("Could not increase line buffer size from %u to %u\n",
+ Gbl_LineBufferSize, Gbl_LineBufferSize * 2);
+
+ AslError (ASL_ERROR, ASL_MSG_BUFFER_ALLOCATION,
+ NULL, NULL);
+ AslAbort ();
+}
+
+
/*******************************************************************************
*
* FUNCTION: UtInternalizeName
diff --git a/source/compiler/dtio.c b/source/compiler/dtio.c
index 2b4e433..aa9cd7b 100644
--- a/source/compiler/dtio.c
+++ b/source/compiler/dtio.c
@@ -413,13 +413,21 @@ DtGetNextLine (
BOOLEAN LineNotAllBlanks = FALSE;
UINT32 State = DT_NORMAL_TEXT;
UINT32 CurrentLineOffset;
- UINT32 BeyondBufferCount;
UINT32 i;
char c;
- for (i = 0; i < ASL_LINE_BUFFER_SIZE;)
+ for (i = 0; ;)
{
+ /*
+ * If line is too long, expand the line buffers. Also increases
+ * Gbl_LineBufferSize.
+ */
+ if (i >= Gbl_LineBufferSize)
+ {
+ UtExpandLineBuffers ();
+ }
+
c = (char) getc (Handle);
if (c == EOF)
{
@@ -491,6 +499,11 @@ DtGetNextLine (
*/
if ((i != 0) && LineNotAllBlanks)
{
+ if ((i + 1) >= Gbl_LineBufferSize)
+ {
+ UtExpandLineBuffers ();
+ }
+
Gbl_CurrentLineBuffer[i+1] = 0; /* Terminate string */
return (CurrentLineOffset);
}
@@ -565,6 +578,11 @@ DtGetNextLine (
default: /* Not a comment */
i++; /* Save the preceeding slash */
+ if (i >= Gbl_LineBufferSize)
+ {
+ UtExpandLineBuffers ();
+ }
+
Gbl_CurrentLineBuffer[i] = c;
i++;
State = DT_NORMAL_TEXT;
@@ -668,21 +686,6 @@ DtGetNextLine (
return (ASL_EOF);
}
}
-
- /* Line is too long for internal buffer. Determine actual length */
-
- BeyondBufferCount = 1;
- c = (char) getc (Handle);
- while (c != '\n')
- {
- c = (char) getc (Handle);
- BeyondBufferCount++;
- }
-
- printf ("ERROR - At %u: Input line (%u bytes) is too long (max %u)\n",
- Gbl_CurrentLineNumber++, ASL_LINE_BUFFER_SIZE + BeyondBufferCount,
- ASL_LINE_BUFFER_SIZE);
- return (ASL_EOF);
}
diff --git a/source/compiler/new_table.txt b/source/compiler/new_table.txt
deleted file mode 100755
index 1e48d38..0000000
--- a/source/compiler/new_table.txt
+++ /dev/null
@@ -1,88 +0,0 @@
-How to add a new ACPI table to ACPICA and the iASL compiler.
-------------------------------------------------------------
-
-There are four main tasks that are needed to provide support for a
-new ACPI table:
- 1) Create a full definition of the table and any subtables
- in the ACPICA headers.
- 2) Add disassembler support for the new table
- 3) Add iASL table compiler support for the new table
- 4) Create a default template for the new table for iASL -T
- option.
-
-Notes for each of these tasks provided below.
-
-
-1) Header Support
------------------
-
-New tables should be added to the appropriate header:
- actbl2.h: Used for new tables that are not defined in the ACPI spec.
- actbl3.h: Used for new tables that are defined in the ACPI spec.
-
-Use ACPI_TABLE_HEADER for the common ACPI table header.
-Subtables should be defined separately from the main table.
-Don't add placeholder fields for subtables and other multiple data items.
- (Don't use xxxxx[1] for a field that can have multiple items.)
- The disassembler and data table compiler depends on this.
-For tables not defined in the ACPI spec, add a comment to indicate where
- the table came from.
-Use other table definitions for additional guidance.
-
-
-2) iASL Disassembler Support
-----------------------------
-
-Add definition of the table (and subtables) in common/dmtbinfo.c
-Add table access macro(s) of the form ACPI_xxxx_OFFSET
-Add ACPI_DMT_TERMINATOR at the end of every table/subtable definition
-
-Add externals for the table/subtable definitions in acdisasm.h
-Add an entry for the new table in the AcpiDmTableData in common/dmtable.c
-
-If there are no subtables, add the AcpiDmTableInfoXXXX name to the
- AcpiDmTableData and it will automatically be disassembled.
-
-If there are subtables, a dump routine must be written:
-Add an AcpiDmDumpXXXX function to dmtbdump.c -- note, code for another
- similar table can often be ported for the new table.
-Add an external for this function to acdisasm.h
-Add this function to the AcpiDmTableData entry for the new ACPI table
-
-Debug/Test: Either find an existing example of the new ACPI table, or
- create one using the "generic ACPI table support" included in the
- iASL data table compiler. Use the -G option to force a
- generic compile. It is often best to create the table from scratch,
- since this clearly exposes the dependencies (lengths, offsets, etc.)
- that the Table Compiler support will need to generate.
-
-
-3) iASL Table Compiler Support
-------------------------------
-
-Simple tables do not require a compile routine. The definition of the
- table in common/dmtbinfo.c (created in step 2 above) will suffice.
-
-Complex tables with subtables will require a compile routine with a name
- of the form DtCompileXXXX.
-Add a DtCompileXXXX function to the dttable.c module.
-Add an external for this function in dtcompiler.h
-Add this function to the AcpiDmTableData entry for the new ACPI table
- in common/dmtable.c
-
-
-4) Template Support (-T iASL option)
-------------------------------------
-
-Create an example of the new ACPI table. This example should create
- multiple subtables (if supported), and multiple instances of any
- variable length data.
-
-Compile the example file with the -sc option. This will create a C
- array that contains the table contents.
-
-Add this array to the dttemplate.h file. Name the array TemplateXXXX.
-Add this array name to the AcpiDmTableData entry for the new ACPI table
-
-Debug/Test: Create the template file. Compile the file. Disassemble the file.
- Compile the disassembly file.
diff --git a/source/compiler/preprocess.h b/source/compiler/preprocess.h
index 920c0b9..f97434f 100644
--- a/source/compiler/preprocess.h
+++ b/source/compiler/preprocess.h
@@ -128,10 +128,13 @@ typedef struct pr_file_node
/*
* Globals
*/
-PR_EXTERN char XXXEvalBuffer[ASL_LINE_BUFFER_SIZE];
-PR_EXTERN char Gbl_MainTokenBuffer[ASL_LINE_BUFFER_SIZE];
-PR_EXTERN char Gbl_MacroTokenBuffer[ASL_LINE_BUFFER_SIZE];
-PR_EXTERN char Gbl_ExpressionTokenBuffer[ASL_LINE_BUFFER_SIZE];
+#if 0 /* TBD for macros */
+PR_EXTERN char PR_INIT_GLOBAL (*XXXEvalBuffer, NULL); /* [ASL_LINE_BUFFER_SIZE]; */
+#endif
+
+PR_EXTERN char PR_INIT_GLOBAL (*Gbl_MainTokenBuffer, NULL); /* [ASL_LINE_BUFFER_SIZE]; */
+PR_EXTERN char PR_INIT_GLOBAL (*Gbl_MacroTokenBuffer, NULL); /* [ASL_LINE_BUFFER_SIZE]; */
+PR_EXTERN char PR_INIT_GLOBAL (*Gbl_ExpressionTokenBuffer, NULL); /* [ASL_LINE_BUFFER_SIZE]; */
PR_EXTERN PR_FILE_NODE *Gbl_InputFileList;
PR_EXTERN PR_DEFINE_INFO PR_INIT_GLOBAL (*Gbl_DefineList, NULL);
OpenPOWER on IntegriCloud