Import ACPICA 20120420.

This commit is contained in:
jkim 2012-04-20 23:39:48 +00:00
parent 1c3442fdc2
commit eb364ef2c9
38 changed files with 1786 additions and 1411 deletions

View File

@ -1,3 +1,70 @@
----------------------------------------
20 April 2012. Summary of changes for version 20120420:
This release is available at www.acpica.org/downloads.
The ACPI 5.0 specification is available at www.acpi.info.
1) ACPICA Core Subsystem:
Implemented support for multiple notify handlers. This change adds support to
allow multiple system and device notify handlers on Device, Thermal Zone, and
Processor objects. This can simplify the host OS notification implementation.
Also re-worked and restructured the entire notify support code to simplify
handler installation, handler removal, notify event queuing, and notify
dispatch to handler(s). Note: there can still only be two global notify
handlers - one for system notifies and one for device notifies. There are no
changes to the existing handler install/remove interfaces. Lin Ming, Bob
Moore, Rafael Wysocki.
Fixed a regression in the package repair code where the object reference
count was calculated incorrectly. Regression was introduced in the commit
"Support to add Package wrappers".
Fixed a couple possible memory leaks in the AML parser, in the error recovery
path. Jesper Juhl, Lin Ming.
Example Code and Data Size: These are the sizes for the OS-independent
acpica.lib produced by the Microsoft Visual C++ 9.0 32-bit compiler. The
debug version of the code includes the debug output trace mechanism and has a
much larger code and data size.
Previous Release:
Non-Debug Version: 92.9K Code, 25.0K Data, 117.9K Total
Debug Version: 172.5K Code, 73.2K Data, 245.7K Total
Current Release:
Non-Debug Version: 92.9K Code, 25.0K Data, 117.9K Total
Debug Version: 172.6K Code, 73.4K Data, 246.0K Total
2) iASL Compiler/Disassembler and Tools:
iASL: Fixed a problem with the resource descriptor support where the length
of the StartDependentFn and StartDependentFnNoPrio descriptors were not
included in cumulative descriptor offset, resulting in incorrect values for
resource tags within resource descriptors appearing after a StartDependent*
descriptor. Reported by Petr Vandrovec. ACPICA BZ 949.
iASL and Preprocessor: Implemented full support for the #line directive to
correctly track original source file line numbers through the .i preprocessor
output file - for error and warning messages.
iASL: Expand the allowable byte constants for address space IDs. Previously,
the allowable range was 0x80-0xFF (user-defined spaces), now the range is
0x0A-0xFF to allow for custom and new IDs without changing the compiler.
iASL: Add option to treat all warnings as errors (-we). ACPICA BZ 948.
iASL: Add option to completely disable the preprocessor (-Pn).
iASL: Now emit all error/warning messages to standard error (stderr) by
default (instead of the previous stdout).
ASL Test Suite (ASLTS): Reduce iASL warnings due to use of Switch(). Update
for resource descriptor offset fix above. Update/cleanup error output
routines. Enable and send iASL errors/warnings to an error logfile
(error.txt). Send all other iASL output to a logfile (compiler.txt). Fixed
several extraneous "unrecognized operator" messages.
----------------------------------------
20 March 2012. Summary of changes for version 20120320:

View File

@ -217,8 +217,8 @@ $(PROG) : $(INTERMEDIATES) $(MISC) $(OBJECTS)
#
# Parser and Lexer - intermediate C files
#
$(OBJDIR)/aslcompilerlex.c : $(ASL_COMPILER)/aslcompiler.l
${LEX} ${LFLAGS} -PAslCompiler -o$@ $?
$(OBJDIR)/aslcompilerlex.c : $(ASL_COMPILER)/aslcompiler.l $(ASL_COMPILER)/aslsupport.l
${LEX} ${LFLAGS} -PAslCompiler -o$@ $(ASL_COMPILER)/aslcompiler.l
$(OBJDIR)/aslcompilerparse.c $(OBJDIR)/aslcompilerparse.h : $(ASL_COMPILER)/aslcompiler.y
${YACC} ${YFLAGS} -pAslCompiler -o$@ $?

View File

@ -289,8 +289,8 @@ $(PROG) : $(INTERMEDIATES) $(MISC) $(OBJECTS)
#
# Parser and Lexer - intermediate C files
#
aslcompilerlex.c : $(ASL_COMPILER)/aslcompiler.l
${LEX} ${LFLAGS} -PAslCompiler -o$@ $?
aslcompilerlex.c : $(ASL_COMPILER)/aslcompiler.l $(ASL_COMPILER)/aslsupport.l
${LEX} ${LFLAGS} -PAslCompiler -o$@ $(ASL_COMPILER)/aslcompiler.l
aslcompilerparse.c aslcompilerparse.h : $(ASL_COMPILER)/aslcompiler.y
${YACC} ${YFLAGS} -pAslCompiler -o$@ $?

View File

@ -242,10 +242,10 @@ CmFlushSourceCode (
while (FlReadFile (ASL_FILE_INPUT, &Buffer, 1) != AE_ERROR)
{
InsertLineBuffer ((int) Buffer);
AslInsertLineBuffer ((int) Buffer);
}
ResetCurrentLineBuffer ();
AslResetCurrentLineBuffer ();
}
@ -457,16 +457,20 @@ CmDoCompile (
Event = UtBeginEvent ("Open input and output files");
UtEndEvent (Event);
/* Preprocessor */
Event = UtBeginEvent ("Preprocess input file");
PrDoPreprocess ();
UtEndEvent (Event);
if (Gbl_PreprocessOnly)
if (Gbl_PreprocessFlag)
{
CmCleanupAndExit ();
return 0;
/* Preprocessor */
PrDoPreprocess ();
if (Gbl_PreprocessOnly)
{
UtEndEvent (Event);
CmCleanupAndExit ();
return 0;
}
}
UtEndEvent (Event);
/* Build the parse tree */
@ -483,8 +487,17 @@ CmDoCompile (
if (!RootNode)
{
AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL,
NULL, "- Could not resolve parse tree root node");
/*
* If there are no errors, then we have some sort of
* internal problem.
*/
Status = AslCheckForErrorExit ();
if (Status == AE_OK)
{
AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL,
NULL, "- Could not resolve parse tree root node");
}
goto ErrorExit;
}
@ -553,14 +566,14 @@ CmDoCompile (
if (Gbl_ParseOnlyFlag)
{
AePrintErrorLog (ASL_FILE_STDOUT);
UtDisplaySummary (ASL_FILE_STDOUT);
AePrintErrorLog (ASL_FILE_STDERR);
UtDisplaySummary (ASL_FILE_STDERR);
if (Gbl_DebugFlag)
{
/* Print error summary to the debug file */
/* Print error summary to the stdout also */
AePrintErrorLog (ASL_FILE_STDERR);
UtDisplaySummary (ASL_FILE_STDERR);
AePrintErrorLog (ASL_FILE_STDOUT);
UtDisplaySummary (ASL_FILE_STDOUT);
}
UtEndEvent (FullCompile);
return 0;
@ -756,12 +769,12 @@ CmCleanupAndExit (
UINT32 i;
AePrintErrorLog (ASL_FILE_STDOUT);
AePrintErrorLog (ASL_FILE_STDERR);
if (Gbl_DebugFlag)
{
/* Print error summary to the debug file */
/* Print error summary to stdout also */
AePrintErrorLog (ASL_FILE_STDERR);
AePrintErrorLog (ASL_FILE_STDOUT);
}
DbgPrint (ASL_DEBUG_OUTPUT, "\n\nElapsed time for major events\n\n");
@ -837,7 +850,9 @@ CmCleanupAndExit (
/* Delete the preprocessor output file (.i) unless -li flag is set */
if (!Gbl_PreprocessorOutputFlag && Gbl_Files[ASL_FILE_PREPROCESSOR].Filename)
if (!Gbl_PreprocessorOutputFlag &&
Gbl_PreprocessFlag &&
Gbl_Files[ASL_FILE_PREPROCESSOR].Filename)
{
if (remove (Gbl_Files[ASL_FILE_PREPROCESSOR].Filename))
{

View File

@ -100,11 +100,11 @@ AslCompilerlex(
void);
void
ResetCurrentLineBuffer (
AslResetCurrentLineBuffer (
void);
void
InsertLineBuffer (
AslInsertLineBuffer (
int SourceChar);
int
@ -136,6 +136,11 @@ ACPI_STATUS
AslDoOneFile (
char *Filename);
ACPI_STATUS
AslCheckForErrorExit (
void);
/*
* aslcompile - compile mainline
*/
@ -645,7 +650,11 @@ FlPrintFile (
void
FlSetLineNumber (
ACPI_PARSE_OBJECT *Op);
UINT32 LineNumber);
void
FlSetFilename (
char *Filename);
ACPI_STATUS
FlOpenInputFile (

View File

@ -58,20 +58,26 @@ YYSTYPE AslCompilerlval;
*/
#define _COMPONENT ACPI_COMPILER
ACPI_MODULE_NAME ("aslscan")
ACPI_MODULE_NAME ("aslscanner")
/* Local prototypes */
char
comment (void);
char
comment2 (void);
void
static void
AslDoLineDirective (void);
static char
AslDoComment (void);
static char
AslDoCommentType2 (void);
static char
AslDoStringLiteral (void);
static void
count (int type);
char
literal (void);
void
copy (void);
/*! [Begin] no source code translation */
@ -104,10 +110,10 @@ NamePathTail [.]{NameSeg}
[ \t] { count (0); }
"/*" { if (!comment ()) yyterminate (); }
"//" { if (!comment2 ()) yyterminate (); }
"/*" { if (!AslDoComment ()) yyterminate (); }
"//" { if (!AslDoCommentType2 ()) yyterminate (); }
"\"" { if (literal ()) return (PARSEOP_STRING_LITERAL); else yyterminate (); }
"\"" { if (AslDoStringLiteral ()) return (PARSEOP_STRING_LITERAL); else yyterminate (); }
";" { count (0); return(';'); }
@ -116,10 +122,16 @@ NamePathTail [.]{NameSeg}
count (1); return (PARSEOP_INTEGER); }
"Include" { count (1); return (PARSEOP_INCLUDE); }
"#include" { count (1); return (PARSEOP_INCLUDE_CSTYLE); }
"#line" { count (1); return (PARSEOP_LINE_CSTYLE); }
"External" { count (1); return (PARSEOP_EXTERNAL); }
/*
* The #line directive is emitted by the preprocessor and handled
* here in the main iASL lexer - simply set the line number and
* optionally the current filename.
*/
"#line" { AslDoLineDirective ();}
/****************************************************************************
*
* Main ASL operators
@ -634,668 +646,7 @@ NamePathTail [.]{NameSeg}
/*! [End] no source code translation !*/
typedef struct asl_file_node
{
FILE *File;
UINT32 CurrentLineNumber;
YY_BUFFER_STATE State;
char *Filename;
struct asl_file_node *Next;
} ASL_FILE_NODE;
ASL_FILE_NODE *InputStack = NULL;
/*******************************************************************************
*
* FUNCTION: AslPopInputFileStack
*
* PARAMETERS: None
*
* RETURN: 0 if a node was popped, -1 otherwise
*
* DESCRIPTION: Pop the top of the input file stack and point the parser to
* the saved parse buffer contained in the fnode. Also, set the
* global line counters to the saved values. This function is
* called when an include file reaches EOF.
*
******************************************************************************/
int
AslPopInputFileStack (
void)
{
ASL_FILE_NODE *Fnode;
Fnode = InputStack;
DbgPrint (ASL_PARSE_OUTPUT, "\nPop InputFile Stack, Fnode %p\n\n", Fnode);
if (!Fnode)
{
return -1;
}
/* Close the current include file */
fclose (yyin);
/* Update the top-of-stack */
InputStack = Fnode->Next;
/* Reset global line counter and filename */
Gbl_Files[ASL_FILE_INPUT].Filename = Fnode->Filename;
Gbl_CurrentLineNumber = Fnode->CurrentLineNumber;
/* Point the parser to the popped file */
yy_delete_buffer (YY_CURRENT_BUFFER);
yy_switch_to_buffer (Fnode->State);
/* All done with this node */
ACPI_FREE (Fnode);
return 0;
}
/*******************************************************************************
*
* FUNCTION: AslPushInputFileStack
*
* PARAMETERS: InputFile - Open file pointer
* Filename - Name of the file
*
* RETURN: None
*
* DESCRIPTION: Push the InputFile onto the file stack, and point the parser
* to this file. Called when an include file is successfully
* opened.
*
******************************************************************************/
void
AslPushInputFileStack (
FILE *InputFile,
char *Filename)
{
ASL_FILE_NODE *Fnode;
YY_BUFFER_STATE State;
/* Save the current state in an Fnode */
Fnode = UtLocalCalloc (sizeof (ASL_FILE_NODE));
Fnode->File = yyin;
Fnode->Next = InputStack;
Fnode->State = YY_CURRENT_BUFFER;
Fnode->CurrentLineNumber = Gbl_CurrentLineNumber;
Fnode->Filename = Gbl_Files[ASL_FILE_INPUT].Filename;
/* Push it on the stack */
InputStack = Fnode;
/* Point the parser to this file */
State = yy_create_buffer (InputFile, YY_BUF_SIZE);
yy_switch_to_buffer (State);
DbgPrint (ASL_PARSE_OUTPUT, "\nPush InputFile Stack, returning %p\n\n", InputFile);
/* Reset the global line count and filename */
Gbl_Files[ASL_FILE_INPUT].Filename = Filename;
Gbl_CurrentLineNumber = 1;
yyin = InputFile;
}
/*******************************************************************************
*
* FUNCTION: ResetCurrentLineBuffer
*
* PARAMETERS: None
*
* RETURN: None
*
* DESCRIPTION: Reset the Line Buffer to zero, increment global line numbers.
*
******************************************************************************/
void
ResetCurrentLineBuffer (
void)
{
if (Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle)
{
FlWriteFile (ASL_FILE_SOURCE_OUTPUT, Gbl_CurrentLineBuffer,
Gbl_LineBufPtr - Gbl_CurrentLineBuffer);
}
Gbl_CurrentLineOffset += Gbl_CurrentColumn;
Gbl_CurrentColumn = 0;
Gbl_CurrentLineNumber++;
Gbl_LogicalLineNumber++;
Gbl_LineBufPtr = Gbl_CurrentLineBuffer;
}
/*******************************************************************************
*
* FUNCTION: InsertLineBuffer
*
* PARAMETERS: SourceChar - One char from the input ASL source file
*
* RETURN: None
*
* DESCRIPTION: Put one character of the source file into the temp line buffer
*
******************************************************************************/
#define ASL_SPACES_PER_TAB 4
void
InsertLineBuffer (
int SourceChar)
{
UINT32 i;
UINT32 Count = 1;
if (SourceChar == EOF)
{
return;
}
Gbl_InputByteCount++;
/* Handle tabs. Convert to spaces */
if (SourceChar == '\t')
{
SourceChar = ' ';
Count = ASL_SPACES_PER_TAB -
(Gbl_CurrentColumn & (ASL_SPACES_PER_TAB-1));
}
for (i = 0; i < Count; i++)
{
Gbl_CurrentColumn++;
/* Insert the character into the line buffer */
*Gbl_LineBufPtr = (UINT8) SourceChar;
Gbl_LineBufPtr++;
if (Gbl_LineBufPtr > (Gbl_CurrentLineBuffer + (ASL_LINE_BUFFER_SIZE - 1)))
{
#if 0
/*
* Warning if we have split a long source line.
* <Probably overkill>
*/
sprintf (MsgBuffer, "Max %u", ASL_LINE_BUFFER_SIZE);
AslCommonError (ASL_WARNING, ASL_MSG_LONG_LINE,
Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
Gbl_CurrentLineOffset, Gbl_CurrentColumn,
Gbl_Files[ASL_FILE_INPUT].Filename, MsgBuffer);
#endif
ResetCurrentLineBuffer ();
}
else if (SourceChar == '\n')
{
/* End of line */
ResetCurrentLineBuffer ();
}
}
}
/*******************************************************************************
*
* FUNCTION: count
*
* PARAMETERS: yytext - Contains the matched keyword.
* Type - Keyword/Character type:
* 0 = anything except a keyword
* 1 = pseudo-keywords
* 2 = non-executable ASL keywords
* 3 = executable ASL keywords
*
* RETURN: None
*
* DESCRIPTION: Count keywords and put them into the line buffer
*
******************************************************************************/
void
count (
int Type)
{
int i;
switch (Type)
{
case 2:
TotalKeywords++;
TotalNamedObjects++;
break;
case 3:
TotalKeywords++;
TotalExecutableOpcodes++;
break;
}
for (i = 0; (yytext[i] != 0) && (yytext[i] != EOF); i++)
{
InsertLineBuffer (yytext[i]);
*Gbl_LineBufPtr = 0;
}
}
/*******************************************************************************
*
* FUNCTION: comment
*
* PARAMETERS: none
*
* RETURN: none
*
* DESCRIPTION: Process a standard comment.
*
******************************************************************************/
char
comment (void)
{
char c;
char c1 = 0;
InsertLineBuffer ('/');
InsertLineBuffer ('*');
loop:
/* Eat chars until end-of-comment */
while ((c = (char) input()) != '*' && c != EOF)
{
InsertLineBuffer (c);
c1 = c;
}
if (c == EOF)
{
goto EarlyEOF;
}
/*
* Check for nested comment -- can help catch cases where a previous
* comment was accidently left unterminated
*/
if ((c1 == '/') && (c == '*'))
{
AslCommonError (ASL_WARNING, ASL_MSG_NESTED_COMMENT,
Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
Gbl_InputByteCount, Gbl_CurrentColumn,
Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
}
/* Comment is closed only if the NEXT character is a slash */
InsertLineBuffer (c);
if ((c1 = (char) input()) != '/' && c1 != EOF)
{
unput(c1);
goto loop;
}
if (c1 == EOF)
{
goto EarlyEOF;
}
InsertLineBuffer (c1);
return TRUE;
EarlyEOF:
/*
* Premature End-Of-File
*/
AslCommonError (ASL_ERROR, ASL_MSG_EARLY_EOF,
Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
Gbl_CurrentLineOffset, Gbl_CurrentColumn,
Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
return (FALSE);
}
/*******************************************************************************
*
* FUNCTION: comment
*
* PARAMETERS: none
*
* RETURN: none
*
* DESCRIPTION: Process a new "//" comment.
*
******************************************************************************/
char
comment2 (void)
{
char c;
InsertLineBuffer ('/');
InsertLineBuffer ('/');
while ((c = (char) input()) != '\n' && c != EOF)
{
InsertLineBuffer (c);
}
if (c == EOF)
{
/* End of file is OK, change to newline. Let parser detect EOF later */
c = '\n';
}
InsertLineBuffer (c);
return (TRUE);
}
/*******************************************************************************
*
* FUNCTION: literal
*
* PARAMETERS: none
*
* RETURN: none
*
* DESCRIPTION: Process a string literal (surrounded by quotes)
*
******************************************************************************/
#define ASL_NORMAL_CHAR 0
#define ASL_ESCAPE_SEQUENCE 1
#define ASL_OCTAL_CONSTANT 2
#define ASL_HEX_CONSTANT 3
char
literal (void)
{
char *StringBuffer = MsgBuffer;
char *EndBuffer = MsgBuffer + ASL_MSG_BUFFER_SIZE;
char *CleanString;
char StringChar;
UINT32 State = ASL_NORMAL_CHAR;
UINT32 i = 0;
UINT8 Digit;
char ConvertBuffer[4];
/*
* Eat chars until end-of-literal.
* NOTE: Put back the original surrounding quotes into the
* source line buffer.
*/
InsertLineBuffer ('\"');
while ((StringChar = (char) input()) != EOF)
{
InsertLineBuffer (StringChar);
DoCharacter:
switch (State)
{
case ASL_NORMAL_CHAR:
switch (StringChar)
{
case '\\':
/*
* Special handling for backslash-escape sequence. We will
* toss the backslash and translate the escape char(s).
*/
State = ASL_ESCAPE_SEQUENCE;
continue;
case '\"':
/* String terminator */
goto CompletedString;
}
break;
case ASL_ESCAPE_SEQUENCE:
State = ASL_NORMAL_CHAR;
switch (StringChar)
{
case 'a':
StringChar = 0x07; /* BELL */
break;
case 'b':
StringChar = 0x08; /* BACKSPACE */
break;
case 'f':
StringChar = 0x0C; /* FORMFEED */
break;
case 'n':
StringChar = 0x0A; /* LINEFEED */
break;
case 'r':
StringChar = 0x0D; /* CARRIAGE RETURN*/
break;
case 't':
StringChar = 0x09; /* HORIZONTAL TAB */
break;
case 'v':
StringChar = 0x0B; /* VERTICAL TAB */
break;
case 'x':
State = ASL_HEX_CONSTANT;
i = 0;
continue;
case '\'': /* Single Quote */
case '\"': /* Double Quote */
case '\\': /* Backslash */
break;
default:
/* Check for an octal digit (0-7) */
if (ACPI_IS_OCTAL_DIGIT (StringChar))
{
State = ASL_OCTAL_CONSTANT;
ConvertBuffer[0] = StringChar;
i = 1;
continue;
}
/* Unknown escape sequence issue warning, but use the character */
AslCommonError (ASL_WARNING, ASL_MSG_INVALID_ESCAPE,
Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
Gbl_CurrentLineOffset, Gbl_CurrentColumn,
Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
break;
}
break;
case ASL_OCTAL_CONSTANT:
/* Up to three octal digits allowed */
if (!ACPI_IS_OCTAL_DIGIT (StringChar) ||
(i > 2))
{
/*
* Reached end of the constant. Convert the assembled ASCII
* string and resume processing of the next character
*/
ConvertBuffer[i] = 0;
Digit = (UINT8) ACPI_STRTOUL (ConvertBuffer, NULL, 8);
/* Check for NULL or non-ascii character (ignore if so) */
if ((Digit == 0) || (Digit > ACPI_ASCII_MAX))
{
AslCommonError (ASL_WARNING, ASL_MSG_INVALID_STRING,
Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
Gbl_CurrentLineOffset, Gbl_CurrentColumn,
Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
}
else
{
*StringBuffer = (char) Digit;
StringBuffer++;
if (StringBuffer >= EndBuffer)
{
goto BufferOverflow;
}
}
State = ASL_NORMAL_CHAR;
goto DoCharacter;
break;
}
/* Append another digit of the constant */
ConvertBuffer[i] = StringChar;
i++;
continue;
case ASL_HEX_CONSTANT:
/* Up to two hex digits allowed */
if (!ACPI_IS_XDIGIT (StringChar) ||
(i > 1))
{
/*
* Reached end of the constant. Convert the assembled ASCII
* string and resume processing of the next character
*/
ConvertBuffer[i] = 0;
Digit = (UINT8) ACPI_STRTOUL (ConvertBuffer, NULL, 16);
/* Check for NULL or non-ascii character (ignore if so) */
if ((Digit == 0) || (Digit > ACPI_ASCII_MAX))
{
AslCommonError (ASL_WARNING, ASL_MSG_INVALID_STRING,
Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
Gbl_CurrentLineOffset, Gbl_CurrentColumn,
Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
}
else
{
*StringBuffer = (char) Digit;
StringBuffer++;
if (StringBuffer >= EndBuffer)
{
goto BufferOverflow;
}
}
State = ASL_NORMAL_CHAR;
goto DoCharacter;
break;
}
/* Append another digit of the constant */
ConvertBuffer[i] = StringChar;
i++;
continue;
}
/* Save the finished character */
*StringBuffer = StringChar;
StringBuffer++;
if (StringBuffer >= EndBuffer)
{
goto BufferOverflow;
}
}
/*
* Premature End-Of-File
*/
AslCommonError (ASL_ERROR, ASL_MSG_EARLY_EOF,
Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
Gbl_CurrentLineOffset, Gbl_CurrentColumn,
Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
return (FALSE);
CompletedString:
/*
* Null terminate the input string and copy string to a new buffer
*/
*StringBuffer = 0;
CleanString = UtGetStringBuffer (strlen (MsgBuffer) + 1);
if (!CleanString)
{
AslCommonError (ASL_ERROR, ASL_MSG_MEMORY_ALLOCATION,
Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
Gbl_CurrentLineOffset, Gbl_CurrentColumn,
Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
return (FALSE);
}
ACPI_STRCPY (CleanString, MsgBuffer);
AslCompilerlval.s = CleanString;
return (TRUE);
BufferOverflow:
/* Literal was too long */
AslCommonError (ASL_ERROR, ASL_MSG_STRING_LENGTH,
Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
Gbl_CurrentLineOffset, Gbl_CurrentColumn,
Gbl_Files[ASL_FILE_INPUT].Filename, "Max length 4096");
return (FALSE);
}
/*
* Bring in the scanner support routines
*/
#include "aslsupport.l"

View File

@ -236,7 +236,6 @@ void * AslLocalAllocate (unsigned int Size);
%token <i> PARSEOP_I2C_SERIALBUS
%token <i> PARSEOP_IF
%token <i> PARSEOP_INCLUDE
%token <i> PARSEOP_INCLUDE_CSTYLE
%token <i> PARSEOP_INCLUDE_END
%token <i> PARSEOP_INCREMENT
%token <i> PARSEOP_INDEX
@ -261,7 +260,6 @@ void * AslLocalAllocate (unsigned int Size);
%token <i> PARSEOP_LEQUAL
%token <i> PARSEOP_LGREATER
%token <i> PARSEOP_LGREATEREQUAL
%token <i> PARSEOP_LINE_CSTYLE
%token <i> PARSEOP_LLESS
%token <i> PARSEOP_LLESSEQUAL
%token <i> PARSEOP_LNOT
@ -504,9 +502,7 @@ void * AslLocalAllocate (unsigned int Size);
%type <n> FieldUnit
%type <n> FieldUnitEntry
%type <n> FieldUnitList
%type <n> IncludeCStyleTerm
%type <n> IncludeTerm
%type <n> LineTerm
%type <n> OffsetTerm
%type <n> OptionalAccessAttribTerm
@ -805,14 +801,18 @@ void * AslLocalAllocate (unsigned int Size);
/*
* Blocks, Data, and Opcodes
* Root rule. Allow multiple #line directives before the definition block
* to handle output from preprocessors
*/
ASLCode
: DefinitionBlockTerm
| error {YYABORT; $$ = NULL;}
;
/*
* Blocks, Data, and Opcodes
*/
/*
* Note concerning support for "module-level code".
*
@ -829,7 +829,7 @@ ASLCode
* of Type1 and Type2 opcodes at module level.
*/
DefinitionBlockTerm
: PARSEOP_DEFINITIONBLOCK '(' {$<n>$ = TrCreateLeafNode (PARSEOP_DEFINITIONBLOCK);}
: PARSEOP_DEFINITIONBLOCK '(' {$<n>$ = TrCreateLeafNode (PARSEOP_DEFINITIONBLOCK);}
String ','
String ','
ByteConst ','
@ -863,8 +863,6 @@ Term
CompilerDirective
: IncludeTerm {}
| IncludeCStyleTerm {$$ = NULL;}
| LineTerm {$$ = NULL;}
| ExternalTerm {}
;
@ -1148,26 +1146,16 @@ Type6Opcode
;
IncludeTerm
: PARSEOP_INCLUDE '(' {$<n>$ = TrCreateLeafNode (PARSEOP_INCLUDE);}
: PARSEOP_INCLUDE '(' {$<n>$ = TrCreateLeafNode (PARSEOP_INCLUDE);}
String ')' {TrLinkChildren ($<n>3,1,$4);FlOpenIncludeFile ($4);}
TermList
IncludeEndTerm {$$ = TrLinkPeerNodes (3,$<n>3,$7,$8);}
;
IncludeEndTerm
: PARSEOP_INCLUDE_END {$$ = TrCreateLeafNode (PARSEOP_INCLUDE_END);}
: PARSEOP_INCLUDE_END {$$ = TrCreateLeafNode (PARSEOP_INCLUDE_END);}
;
IncludeCStyleTerm
: PARSEOP_INCLUDE_CSTYLE
String {FlOpenIncludeFile ($2);}
;
LineTerm
: PARSEOP_LINE_CSTYLE
Integer {FlSetLineNumber ($2);}
;
ExternalTerm
: PARSEOP_EXTERNAL '('
NameString
@ -1184,7 +1172,7 @@ ExternalTerm
BankFieldTerm
: PARSEOP_BANKFIELD '(' {$<n>$ = TrCreateLeafNode (PARSEOP_BANKFIELD);}
: PARSEOP_BANKFIELD '(' {$<n>$ = TrCreateLeafNode (PARSEOP_BANKFIELD);}
NameString
NameStringItem
TermArgItem
@ -1251,7 +1239,7 @@ ConnectionTerm
;
CreateBitFieldTerm
: PARSEOP_CREATEBITFIELD '(' {$<n>$ = TrCreateLeafNode (PARSEOP_CREATEBITFIELD);}
: PARSEOP_CREATEBITFIELD '(' {$<n>$ = TrCreateLeafNode (PARSEOP_CREATEBITFIELD);}
TermArg
TermArgItem
NameStringItem
@ -1261,7 +1249,7 @@ CreateBitFieldTerm
;
CreateByteFieldTerm
: PARSEOP_CREATEBYTEFIELD '(' {$<n>$ = TrCreateLeafNode (PARSEOP_CREATEBYTEFIELD);}
: PARSEOP_CREATEBYTEFIELD '(' {$<n>$ = TrCreateLeafNode (PARSEOP_CREATEBYTEFIELD);}
TermArg
TermArgItem
NameStringItem
@ -1271,7 +1259,7 @@ CreateByteFieldTerm
;
CreateDWordFieldTerm
: PARSEOP_CREATEDWORDFIELD '(' {$<n>$ = TrCreateLeafNode (PARSEOP_CREATEDWORDFIELD);}
: PARSEOP_CREATEDWORDFIELD '(' {$<n>$ = TrCreateLeafNode (PARSEOP_CREATEDWORDFIELD);}
TermArg
TermArgItem
NameStringItem
@ -1281,7 +1269,7 @@ CreateDWordFieldTerm
;
CreateFieldTerm
: PARSEOP_CREATEFIELD '(' {$<n>$ = TrCreateLeafNode (PARSEOP_CREATEFIELD);}
: PARSEOP_CREATEFIELD '(' {$<n>$ = TrCreateLeafNode (PARSEOP_CREATEFIELD);}
TermArg
TermArgItem
TermArgItem
@ -1292,7 +1280,7 @@ CreateFieldTerm
;
CreateQWordFieldTerm
: PARSEOP_CREATEQWORDFIELD '(' {$<n>$ = TrCreateLeafNode (PARSEOP_CREATEQWORDFIELD);}
: PARSEOP_CREATEQWORDFIELD '(' {$<n>$ = TrCreateLeafNode (PARSEOP_CREATEQWORDFIELD);}
TermArg
TermArgItem
NameStringItem
@ -1302,7 +1290,7 @@ CreateQWordFieldTerm
;
CreateWordFieldTerm
: PARSEOP_CREATEWORDFIELD '(' {$<n>$ = TrCreateLeafNode (PARSEOP_CREATEWORDFIELD);}
: PARSEOP_CREATEWORDFIELD '(' {$<n>$ = TrCreateLeafNode (PARSEOP_CREATEWORDFIELD);}
TermArg
TermArgItem
NameStringItem
@ -1312,7 +1300,7 @@ CreateWordFieldTerm
;
DataRegionTerm
: PARSEOP_DATATABLEREGION '(' {$<n>$ = TrCreateLeafNode (PARSEOP_DATATABLEREGION);}
: PARSEOP_DATATABLEREGION '(' {$<n>$ = TrCreateLeafNode (PARSEOP_DATATABLEREGION);}
NameString
TermArgItem
TermArgItem
@ -1323,7 +1311,7 @@ DataRegionTerm
;
DeviceTerm
: PARSEOP_DEVICE '(' {$<n>$ = TrCreateLeafNode (PARSEOP_DEVICE);}
: PARSEOP_DEVICE '(' {$<n>$ = TrCreateLeafNode (PARSEOP_DEVICE);}
NameString
')' '{'
ObjectList '}' {$$ = TrLinkChildren ($<n>3,2,TrSetNodeFlags ($4, NODE_IS_NAME_DECLARATION),$7);}
@ -1332,7 +1320,7 @@ DeviceTerm
;
EventTerm
: PARSEOP_EVENT '(' {$<n>$ = TrCreateLeafNode (PARSEOP_EVENT);}
: PARSEOP_EVENT '(' {$<n>$ = TrCreateLeafNode (PARSEOP_EVENT);}
NameString
')' {$$ = TrLinkChildren ($<n>3,1,TrSetNodeFlags ($4, NODE_IS_NAME_DECLARATION));}
| PARSEOP_EVENT '('
@ -1340,7 +1328,7 @@ EventTerm
;
FieldTerm
: PARSEOP_FIELD '(' {$<n>$ = TrCreateLeafNode (PARSEOP_FIELD);}
: PARSEOP_FIELD '(' {$<n>$ = TrCreateLeafNode (PARSEOP_FIELD);}
NameString
',' AccessTypeKeyword
',' LockRuleKeyword
@ -1352,7 +1340,7 @@ FieldTerm
;
FunctionTerm
: PARSEOP_FUNCTION '(' {$<n>$ = TrCreateLeafNode (PARSEOP_METHOD);}
: PARSEOP_FUNCTION '(' {$<n>$ = TrCreateLeafNode (PARSEOP_METHOD);}
NameString
OptionalParameterTypePackage
OptionalParameterTypesPackage
@ -1366,7 +1354,7 @@ FunctionTerm
;
IndexFieldTerm
: PARSEOP_INDEXFIELD '(' {$<n>$ = TrCreateLeafNode (PARSEOP_INDEXFIELD);}
: PARSEOP_INDEXFIELD '(' {$<n>$ = TrCreateLeafNode (PARSEOP_INDEXFIELD);}
NameString
NameStringItem
',' AccessTypeKeyword
@ -1379,7 +1367,7 @@ IndexFieldTerm
;
MethodTerm
: PARSEOP_METHOD '(' {$<n>$ = TrCreateLeafNode (PARSEOP_METHOD);}
: PARSEOP_METHOD '(' {$<n>$ = TrCreateLeafNode (PARSEOP_METHOD);}
NameString
OptionalByteConstExpr {UtCheckIntegerRange ($5, 0, 7);}
OptionalSerializeRuleKeyword
@ -1393,7 +1381,7 @@ MethodTerm
;
MutexTerm
: PARSEOP_MUTEX '(' {$<n>$ = TrCreateLeafNode (PARSEOP_MUTEX);}
: PARSEOP_MUTEX '(' {$<n>$ = TrCreateLeafNode (PARSEOP_MUTEX);}
NameString
',' ByteConstExpr
')' {$$ = TrLinkChildren ($<n>3,2,TrSetNodeFlags ($4, NODE_IS_NAME_DECLARATION),$6);}
@ -1402,7 +1390,7 @@ MutexTerm
;
OpRegionTerm
: PARSEOP_OPERATIONREGION '(' {$<n>$ = TrCreateLeafNode (PARSEOP_OPERATIONREGION);}
: PARSEOP_OPERATIONREGION '(' {$<n>$ = TrCreateLeafNode (PARSEOP_OPERATIONREGION);}
NameString
',' OpRegionSpaceIdTerm
TermArgItem
@ -1418,7 +1406,7 @@ OpRegionSpaceIdTerm
;
PowerResTerm
: PARSEOP_POWERRESOURCE '(' {$<n>$ = TrCreateLeafNode (PARSEOP_POWERRESOURCE);}
: PARSEOP_POWERRESOURCE '(' {$<n>$ = TrCreateLeafNode (PARSEOP_POWERRESOURCE);}
NameString
',' ByteConstExpr
',' WordConstExpr
@ -1429,7 +1417,7 @@ PowerResTerm
;
ProcessorTerm
: PARSEOP_PROCESSOR '(' {$<n>$ = TrCreateLeafNode (PARSEOP_PROCESSOR);}
: PARSEOP_PROCESSOR '(' {$<n>$ = TrCreateLeafNode (PARSEOP_PROCESSOR);}
NameString
',' ByteConstExpr
OptionalDWordConstExpr
@ -1441,7 +1429,7 @@ ProcessorTerm
;
ThermalZoneTerm
: PARSEOP_THERMALZONE '(' {$<n>$ = TrCreateLeafNode (PARSEOP_THERMALZONE);}
: PARSEOP_THERMALZONE '(' {$<n>$ = TrCreateLeafNode (PARSEOP_THERMALZONE);}
NameString
')' '{'
ObjectList '}' {$$ = TrLinkChildren ($<n>3,2,TrSetNodeFlags ($4, NODE_IS_NAME_DECLARATION),$7);}
@ -1454,7 +1442,7 @@ ThermalZoneTerm
AliasTerm
: PARSEOP_ALIAS '(' {$<n>$ = TrCreateLeafNode (PARSEOP_ALIAS);}
: PARSEOP_ALIAS '(' {$<n>$ = TrCreateLeafNode (PARSEOP_ALIAS);}
NameString
NameStringItem
')' {$$ = TrLinkChildren ($<n>3,2,$4,TrSetNodeFlags ($5, NODE_IS_NAME_DECLARATION));}
@ -1463,7 +1451,7 @@ AliasTerm
;
NameTerm
: PARSEOP_NAME '(' {$<n>$ = TrCreateLeafNode (PARSEOP_NAME);}
: PARSEOP_NAME '(' {$<n>$ = TrCreateLeafNode (PARSEOP_NAME);}
NameString
',' DataObject
')' {$$ = TrLinkChildren ($<n>3,2,TrSetNodeFlags ($4, NODE_IS_NAME_DECLARATION),$6);}
@ -1472,7 +1460,7 @@ NameTerm
;
ScopeTerm
: PARSEOP_SCOPE '(' {$<n>$ = TrCreateLeafNode (PARSEOP_SCOPE);}
: PARSEOP_SCOPE '(' {$<n>$ = TrCreateLeafNode (PARSEOP_SCOPE);}
NameString
')' '{'
ObjectList '}' {$$ = TrLinkChildren ($<n>3,2,TrSetNodeFlags ($4, NODE_IS_NAME_DECLARATION),$7);}
@ -1485,19 +1473,19 @@ ScopeTerm
BreakTerm
: PARSEOP_BREAK {$$ = TrCreateNode (PARSEOP_BREAK, 0);}
: PARSEOP_BREAK {$$ = TrCreateNode (PARSEOP_BREAK, 0);}
;
BreakPointTerm
: PARSEOP_BREAKPOINT {$$ = TrCreateNode (PARSEOP_BREAKPOINT, 0);}
: PARSEOP_BREAKPOINT {$$ = TrCreateNode (PARSEOP_BREAKPOINT, 0);}
;
ContinueTerm
: PARSEOP_CONTINUE {$$ = TrCreateNode (PARSEOP_CONTINUE, 0);}
: PARSEOP_CONTINUE {$$ = TrCreateNode (PARSEOP_CONTINUE, 0);}
;
FatalTerm
: PARSEOP_FATAL '(' {$<n>$ = TrCreateLeafNode (PARSEOP_FATAL);}
: PARSEOP_FATAL '(' {$<n>$ = TrCreateLeafNode (PARSEOP_FATAL);}
ByteConstExpr
',' DWordConstExpr
TermArgItem
@ -1511,7 +1499,7 @@ IfElseTerm
;
IfTerm
: PARSEOP_IF '(' {$<n>$ = TrCreateLeafNode (PARSEOP_IF);}
: PARSEOP_IF '(' {$<n>$ = TrCreateLeafNode (PARSEOP_IF);}
TermArg
')' '{'
TermList '}' {$$ = TrLinkChildren ($<n>3,2,$4,$7);}
@ -1522,7 +1510,7 @@ IfTerm
ElseTerm
: {$$ = NULL;}
| PARSEOP_ELSE '{' {$<n>$ = TrCreateLeafNode (PARSEOP_ELSE);}
| PARSEOP_ELSE '{' {$<n>$ = TrCreateLeafNode (PARSEOP_ELSE);}
TermList '}' {$$ = TrLinkChildren ($<n>3,1,$4);}
| PARSEOP_ELSE '{'
@ -1531,10 +1519,10 @@ ElseTerm
| PARSEOP_ELSE
error {$$ = AslDoError(); yyclearin;}
| PARSEOP_ELSEIF '(' {$<n>$ = TrCreateLeafNode (PARSEOP_ELSE);}
TermArg {$<n>$ = TrCreateLeafNode (PARSEOP_IF);}
| PARSEOP_ELSEIF '(' {$<n>$ = TrCreateLeafNode (PARSEOP_ELSE);}
TermArg {$<n>$ = TrCreateLeafNode (PARSEOP_IF);}
')' '{'
TermList '}' {TrLinkChildren ($<n>5,2,$4,$8);}
TermList '}' {TrLinkChildren ($<n>5,2,$4,$8);}
ElseTerm {TrLinkPeerNode ($<n>5,$11);}
{$$ = TrLinkChildren ($<n>3,1,$<n>5);}
@ -1546,7 +1534,7 @@ ElseTerm
;
LoadTerm
: PARSEOP_LOAD '(' {$<n>$ = TrCreateLeafNode (PARSEOP_LOAD);}
: PARSEOP_LOAD '(' {$<n>$ = TrCreateLeafNode (PARSEOP_LOAD);}
NameString
RequiredTarget
')' {$$ = TrLinkChildren ($<n>3,2,$4,$5);}
@ -1555,11 +1543,11 @@ LoadTerm
;
NoOpTerm
: PARSEOP_NOOP {$$ = TrCreateNode (PARSEOP_NOOP, 0);}
: PARSEOP_NOOP {$$ = TrCreateNode (PARSEOP_NOOP, 0);}
;
NotifyTerm
: PARSEOP_NOTIFY '(' {$<n>$ = TrCreateLeafNode (PARSEOP_NOTIFY);}
: PARSEOP_NOTIFY '(' {$<n>$ = TrCreateLeafNode (PARSEOP_NOTIFY);}
SuperName
TermArgItem
')' {$$ = TrLinkChildren ($<n>3,2,$4,$5);}
@ -1568,7 +1556,7 @@ NotifyTerm
;
ReleaseTerm
: PARSEOP_RELEASE '(' {$<n>$ = TrCreateLeafNode (PARSEOP_RELEASE);}
: PARSEOP_RELEASE '(' {$<n>$ = TrCreateLeafNode (PARSEOP_RELEASE);}
SuperName
')' {$$ = TrLinkChildren ($<n>3,1,$4);}
| PARSEOP_RELEASE '('
@ -1576,7 +1564,7 @@ ReleaseTerm
;
ResetTerm
: PARSEOP_RESET '(' {$<n>$ = TrCreateLeafNode (PARSEOP_RESET);}
: PARSEOP_RESET '(' {$<n>$ = TrCreateLeafNode (PARSEOP_RESET);}
SuperName
')' {$$ = TrLinkChildren ($<n>3,1,$4);}
| PARSEOP_RESET '('
@ -1584,16 +1572,16 @@ ResetTerm
;
ReturnTerm
: PARSEOP_RETURN '(' {$<n>$ = TrCreateLeafNode (PARSEOP_RETURN);}
: PARSEOP_RETURN '(' {$<n>$ = TrCreateLeafNode (PARSEOP_RETURN);}
OptionalReturnArg
')' {$$ = TrLinkChildren ($<n>3,1,$4);}
| PARSEOP_RETURN {$$ = TrLinkChildren (TrCreateLeafNode (PARSEOP_RETURN),1,TrSetNodeFlags (TrCreateLeafNode (PARSEOP_ZERO), NODE_IS_NULL_RETURN));}
| PARSEOP_RETURN {$$ = TrLinkChildren (TrCreateLeafNode (PARSEOP_RETURN),1,TrSetNodeFlags (TrCreateLeafNode (PARSEOP_ZERO), NODE_IS_NULL_RETURN));}
| PARSEOP_RETURN '('
error ')' {$$ = AslDoError(); yyclearin;}
;
SignalTerm
: PARSEOP_SIGNAL '(' {$<n>$ = TrCreateLeafNode (PARSEOP_SIGNAL);}
: PARSEOP_SIGNAL '(' {$<n>$ = TrCreateLeafNode (PARSEOP_SIGNAL);}
SuperName
')' {$$ = TrLinkChildren ($<n>3,1,$4);}
| PARSEOP_SIGNAL '('
@ -1601,7 +1589,7 @@ SignalTerm
;
SleepTerm
: PARSEOP_SLEEP '(' {$<n>$ = TrCreateLeafNode (PARSEOP_SLEEP);}
: PARSEOP_SLEEP '(' {$<n>$ = TrCreateLeafNode (PARSEOP_SLEEP);}
TermArg
')' {$$ = TrLinkChildren ($<n>3,1,$4);}
| PARSEOP_SLEEP '('
@ -1609,7 +1597,7 @@ SleepTerm
;
StallTerm
: PARSEOP_STALL '(' {$<n>$ = TrCreateLeafNode (PARSEOP_STALL);}
: PARSEOP_STALL '(' {$<n>$ = TrCreateLeafNode (PARSEOP_STALL);}
TermArg
')' {$$ = TrLinkChildren ($<n>3,1,$4);}
| PARSEOP_STALL '('
@ -1617,7 +1605,7 @@ StallTerm
;
SwitchTerm
: PARSEOP_SWITCH '(' {$<n>$ = TrCreateLeafNode (PARSEOP_SWITCH);}
: PARSEOP_SWITCH '(' {$<n>$ = TrCreateLeafNode (PARSEOP_SWITCH);}
TermArg
')' '{'
CaseDefaultTermList '}'
@ -1660,7 +1648,7 @@ CaseTermList
*/
CaseTerm
: PARSEOP_CASE '(' {$<n>$ = TrCreateLeafNode (PARSEOP_CASE);}
: PARSEOP_CASE '(' {$<n>$ = TrCreateLeafNode (PARSEOP_CASE);}
DataObject
')' '{'
TermList '}' {$$ = TrLinkChildren ($<n>3,2,$4,$7);}
@ -1669,14 +1657,14 @@ CaseTerm
;
DefaultTerm
: PARSEOP_DEFAULT '{' {$<n>$ = TrCreateLeafNode (PARSEOP_DEFAULT);}
: PARSEOP_DEFAULT '{' {$<n>$ = TrCreateLeafNode (PARSEOP_DEFAULT);}
TermList '}' {$$ = TrLinkChildren ($<n>3,1,$4);}
| PARSEOP_DEFAULT '{'
error '}' {$$ = AslDoError(); yyclearin;}
;
UnloadTerm
: PARSEOP_UNLOAD '(' {$<n>$ = TrCreateLeafNode (PARSEOP_UNLOAD);}
: PARSEOP_UNLOAD '(' {$<n>$ = TrCreateLeafNode (PARSEOP_UNLOAD);}
SuperName
')' {$$ = TrLinkChildren ($<n>3,1,$4);}
| PARSEOP_UNLOAD '('
@ -1684,7 +1672,7 @@ UnloadTerm
;
WhileTerm
: PARSEOP_WHILE '(' {$<n>$ = TrCreateLeafNode (PARSEOP_WHILE);}
: PARSEOP_WHILE '(' {$<n>$ = TrCreateLeafNode (PARSEOP_WHILE);}
TermArg
')' '{' TermList '}'
{$$ = TrLinkChildren ($<n>3,2,$4,$7);}
@ -1696,7 +1684,7 @@ WhileTerm
/******* Type 2 opcodes *******************************************************/
AcquireTerm
: PARSEOP_ACQUIRE '(' {$<n>$ = TrCreateLeafNode (PARSEOP_ACQUIRE);}
: PARSEOP_ACQUIRE '(' {$<n>$ = TrCreateLeafNode (PARSEOP_ACQUIRE);}
SuperName
',' WordConstExpr
')' {$$ = TrLinkChildren ($<n>3,2,$4,$6);}
@ -1705,7 +1693,7 @@ AcquireTerm
;
AddTerm
: PARSEOP_ADD '(' {$<n>$ = TrCreateLeafNode (PARSEOP_ADD);}
: PARSEOP_ADD '(' {$<n>$ = TrCreateLeafNode (PARSEOP_ADD);}
TermArg
TermArgItem
Target
@ -1715,7 +1703,7 @@ AddTerm
;
AndTerm
: PARSEOP_AND '(' {$<n>$ = TrCreateLeafNode (PARSEOP_AND);}
: PARSEOP_AND '(' {$<n>$ = TrCreateLeafNode (PARSEOP_AND);}
TermArg
TermArgItem
Target
@ -1725,7 +1713,7 @@ AndTerm
;
ConcatTerm
: PARSEOP_CONCATENATE '(' {$<n>$ = TrCreateLeafNode (PARSEOP_CONCATENATE);}
: PARSEOP_CONCATENATE '(' {$<n>$ = TrCreateLeafNode (PARSEOP_CONCATENATE);}
TermArg
TermArgItem
Target
@ -1745,7 +1733,7 @@ ConcatResTerm
;
CondRefOfTerm
: PARSEOP_CONDREFOF '(' {$<n>$ = TrCreateLeafNode (PARSEOP_CONDREFOF);}
: PARSEOP_CONDREFOF '(' {$<n>$ = TrCreateLeafNode (PARSEOP_CONDREFOF);}
SuperName
Target
')' {$$ = TrLinkChildren ($<n>3,2,$4,$5);}
@ -1754,7 +1742,7 @@ CondRefOfTerm
;
CopyObjectTerm
: PARSEOP_COPYOBJECT '(' {$<n>$ = TrCreateLeafNode (PARSEOP_COPYOBJECT);}
: PARSEOP_COPYOBJECT '(' {$<n>$ = TrCreateLeafNode (PARSEOP_COPYOBJECT);}
TermArg
',' SimpleTarget
')' {$$ = TrLinkChildren ($<n>3,2,$4,TrSetNodeFlags ($6, NODE_IS_TARGET));}
@ -1763,7 +1751,7 @@ CopyObjectTerm
;
DecTerm
: PARSEOP_DECREMENT '(' {$<n>$ = TrCreateLeafNode (PARSEOP_DECREMENT);}
: PARSEOP_DECREMENT '(' {$<n>$ = TrCreateLeafNode (PARSEOP_DECREMENT);}
SuperName
')' {$$ = TrLinkChildren ($<n>3,1,$4);}
| PARSEOP_DECREMENT '('
@ -1771,7 +1759,7 @@ DecTerm
;
DerefOfTerm
: PARSEOP_DEREFOF '(' {$<n>$ = TrCreateLeafNode (PARSEOP_DEREFOF);}
: PARSEOP_DEREFOF '(' {$<n>$ = TrCreateLeafNode (PARSEOP_DEREFOF);}
TermArg
')' {$$ = TrLinkChildren ($<n>3,1,$4);}
| PARSEOP_DEREFOF '('
@ -1779,7 +1767,7 @@ DerefOfTerm
;
DivideTerm
: PARSEOP_DIVIDE '(' {$<n>$ = TrCreateLeafNode (PARSEOP_DIVIDE);}
: PARSEOP_DIVIDE '(' {$<n>$ = TrCreateLeafNode (PARSEOP_DIVIDE);}
TermArg
TermArgItem
Target
@ -1790,7 +1778,7 @@ DivideTerm
;
FindSetLeftBitTerm
: PARSEOP_FINDSETLEFTBIT '(' {$<n>$ = TrCreateLeafNode (PARSEOP_FINDSETLEFTBIT);}
: PARSEOP_FINDSETLEFTBIT '(' {$<n>$ = TrCreateLeafNode (PARSEOP_FINDSETLEFTBIT);}
TermArg
Target
')' {$$ = TrLinkChildren ($<n>3,2,$4,$5);}
@ -1799,7 +1787,7 @@ FindSetLeftBitTerm
;
FindSetRightBitTerm
: PARSEOP_FINDSETRIGHTBIT '(' {$<n>$ = TrCreateLeafNode (PARSEOP_FINDSETRIGHTBIT);}
: PARSEOP_FINDSETRIGHTBIT '(' {$<n>$ = TrCreateLeafNode (PARSEOP_FINDSETRIGHTBIT);}
TermArg
Target
')' {$$ = TrLinkChildren ($<n>3,2,$4,$5);}
@ -1808,7 +1796,7 @@ FindSetRightBitTerm
;
FromBCDTerm
: PARSEOP_FROMBCD '(' {$<n>$ = TrCreateLeafNode (PARSEOP_FROMBCD);}
: PARSEOP_FROMBCD '(' {$<n>$ = TrCreateLeafNode (PARSEOP_FROMBCD);}
TermArg
Target
')' {$$ = TrLinkChildren ($<n>3,2,$4,$5);}
@ -1817,7 +1805,7 @@ FromBCDTerm
;
IncTerm
: PARSEOP_INCREMENT '(' {$<n>$ = TrCreateLeafNode (PARSEOP_INCREMENT);}
: PARSEOP_INCREMENT '(' {$<n>$ = TrCreateLeafNode (PARSEOP_INCREMENT);}
SuperName
')' {$$ = TrLinkChildren ($<n>3,1,$4);}
| PARSEOP_INCREMENT '('
@ -1825,7 +1813,7 @@ IncTerm
;
IndexTerm
: PARSEOP_INDEX '(' {$<n>$ = TrCreateLeafNode (PARSEOP_INDEX);}
: PARSEOP_INDEX '(' {$<n>$ = TrCreateLeafNode (PARSEOP_INDEX);}
TermArg
TermArgItem
Target
@ -1835,7 +1823,7 @@ IndexTerm
;
LAndTerm
: PARSEOP_LAND '(' {$<n>$ = TrCreateLeafNode (PARSEOP_LAND);}
: PARSEOP_LAND '(' {$<n>$ = TrCreateLeafNode (PARSEOP_LAND);}
TermArg
TermArgItem
')' {$$ = TrLinkChildren ($<n>3,2,$4,$5);}
@ -1844,7 +1832,7 @@ LAndTerm
;
LEqualTerm
: PARSEOP_LEQUAL '(' {$<n>$ = TrCreateLeafNode (PARSEOP_LEQUAL);}
: PARSEOP_LEQUAL '(' {$<n>$ = TrCreateLeafNode (PARSEOP_LEQUAL);}
TermArg
TermArgItem
')' {$$ = TrLinkChildren ($<n>3,2,$4,$5);}
@ -1853,7 +1841,7 @@ LEqualTerm
;
LGreaterTerm
: PARSEOP_LGREATER '(' {$<n>$ = TrCreateLeafNode (PARSEOP_LGREATER);}
: PARSEOP_LGREATER '(' {$<n>$ = TrCreateLeafNode (PARSEOP_LGREATER);}
TermArg
TermArgItem
')' {$$ = TrLinkChildren ($<n>3,2,$4,$5);}
@ -1862,7 +1850,7 @@ LGreaterTerm
;
LGreaterEqualTerm
: PARSEOP_LGREATEREQUAL '(' {$<n>$ = TrCreateLeafNode (PARSEOP_LLESS);}
: PARSEOP_LGREATEREQUAL '(' {$<n>$ = TrCreateLeafNode (PARSEOP_LLESS);}
TermArg
TermArgItem
')' {$$ = TrCreateNode (PARSEOP_LNOT, 1, TrLinkChildren ($<n>3,2,$4,$5));}
@ -1871,7 +1859,7 @@ LGreaterEqualTerm
;
LLessTerm
: PARSEOP_LLESS '(' {$<n>$ = TrCreateLeafNode (PARSEOP_LLESS);}
: PARSEOP_LLESS '(' {$<n>$ = TrCreateLeafNode (PARSEOP_LLESS);}
TermArg
TermArgItem
')' {$$ = TrLinkChildren ($<n>3,2,$4,$5);}
@ -1880,7 +1868,7 @@ LLessTerm
;
LLessEqualTerm
: PARSEOP_LLESSEQUAL '(' {$<n>$ = TrCreateLeafNode (PARSEOP_LGREATER);}
: PARSEOP_LLESSEQUAL '(' {$<n>$ = TrCreateLeafNode (PARSEOP_LGREATER);}
TermArg
TermArgItem
')' {$$ = TrCreateNode (PARSEOP_LNOT, 1, TrLinkChildren ($<n>3,2,$4,$5));}
@ -1889,7 +1877,7 @@ LLessEqualTerm
;
LNotTerm
: PARSEOP_LNOT '(' {$<n>$ = TrCreateLeafNode (PARSEOP_LNOT);}
: PARSEOP_LNOT '(' {$<n>$ = TrCreateLeafNode (PARSEOP_LNOT);}
TermArg
')' {$$ = TrLinkChildren ($<n>3,1,$4);}
| PARSEOP_LNOT '('
@ -1897,7 +1885,7 @@ LNotTerm
;
LNotEqualTerm
: PARSEOP_LNOTEQUAL '(' {$<n>$ = TrCreateLeafNode (PARSEOP_LEQUAL);}
: PARSEOP_LNOTEQUAL '(' {$<n>$ = TrCreateLeafNode (PARSEOP_LEQUAL);}
TermArg
TermArgItem
')' {$$ = TrCreateNode (PARSEOP_LNOT, 1, TrLinkChildren ($<n>3,2,$4,$5));}
@ -1906,7 +1894,7 @@ LNotEqualTerm
;
LoadTableTerm
: PARSEOP_LOADTABLE '(' {$<n>$ = TrCreateLeafNode (PARSEOP_LOADTABLE);}
: PARSEOP_LOADTABLE '(' {$<n>$ = TrCreateLeafNode (PARSEOP_LOADTABLE);}
TermArg
TermArgItem
TermArgItem
@ -1919,7 +1907,7 @@ LoadTableTerm
;
LOrTerm
: PARSEOP_LOR '(' {$<n>$ = TrCreateLeafNode (PARSEOP_LOR);}
: PARSEOP_LOR '(' {$<n>$ = TrCreateLeafNode (PARSEOP_LOR);}
TermArg
TermArgItem
')' {$$ = TrLinkChildren ($<n>3,2,$4,$5);}
@ -1928,7 +1916,7 @@ LOrTerm
;
MatchTerm
: PARSEOP_MATCH '(' {$<n>$ = TrCreateLeafNode (PARSEOP_MATCH);}
: PARSEOP_MATCH '(' {$<n>$ = TrCreateLeafNode (PARSEOP_MATCH);}
TermArg
',' MatchOpKeyword
TermArgItem
@ -1941,7 +1929,7 @@ MatchTerm
;
MidTerm
: PARSEOP_MID '(' {$<n>$ = TrCreateLeafNode (PARSEOP_MID);}
: PARSEOP_MID '(' {$<n>$ = TrCreateLeafNode (PARSEOP_MID);}
TermArg
TermArgItem
TermArgItem
@ -1952,7 +1940,7 @@ MidTerm
;
ModTerm
: PARSEOP_MOD '(' {$<n>$ = TrCreateLeafNode (PARSEOP_MOD);}
: PARSEOP_MOD '(' {$<n>$ = TrCreateLeafNode (PARSEOP_MOD);}
TermArg
TermArgItem
Target
@ -1962,7 +1950,7 @@ ModTerm
;
MultiplyTerm
: PARSEOP_MULTIPLY '(' {$<n>$ = TrCreateLeafNode (PARSEOP_MULTIPLY);}
: PARSEOP_MULTIPLY '(' {$<n>$ = TrCreateLeafNode (PARSEOP_MULTIPLY);}
TermArg
TermArgItem
Target
@ -1972,7 +1960,7 @@ MultiplyTerm
;
NAndTerm
: PARSEOP_NAND '(' {$<n>$ = TrCreateLeafNode (PARSEOP_NAND);}
: PARSEOP_NAND '(' {$<n>$ = TrCreateLeafNode (PARSEOP_NAND);}
TermArg
TermArgItem
Target
@ -1982,7 +1970,7 @@ NAndTerm
;
NOrTerm
: PARSEOP_NOR '(' {$<n>$ = TrCreateLeafNode (PARSEOP_NOR);}
: PARSEOP_NOR '(' {$<n>$ = TrCreateLeafNode (PARSEOP_NOR);}
TermArg
TermArgItem
Target
@ -1992,7 +1980,7 @@ NOrTerm
;
NotTerm
: PARSEOP_NOT '(' {$<n>$ = TrCreateLeafNode (PARSEOP_NOT);}
: PARSEOP_NOT '(' {$<n>$ = TrCreateLeafNode (PARSEOP_NOT);}
TermArg
Target
')' {$$ = TrLinkChildren ($<n>3,2,$4,$5);}
@ -2001,7 +1989,7 @@ NotTerm
;
ObjectTypeTerm
: PARSEOP_OBJECTTYPE '(' {$<n>$ = TrCreateLeafNode (PARSEOP_OBJECTTYPE);}
: PARSEOP_OBJECTTYPE '(' {$<n>$ = TrCreateLeafNode (PARSEOP_OBJECTTYPE);}
SuperName
')' {$$ = TrLinkChildren ($<n>3,1,$4);}
| PARSEOP_OBJECTTYPE '('
@ -2009,7 +1997,7 @@ ObjectTypeTerm
;
OrTerm
: PARSEOP_OR '(' {$<n>$ = TrCreateLeafNode (PARSEOP_OR);}
: PARSEOP_OR '(' {$<n>$ = TrCreateLeafNode (PARSEOP_OR);}
TermArg
TermArgItem
Target
@ -2023,7 +2011,7 @@ OrTerm
* we've taken a pointer to it. (hard to tell if a local becomes initialized this way.)
*/
RefOfTerm
: PARSEOP_REFOF '(' {$<n>$ = TrCreateLeafNode (PARSEOP_REFOF);}
: PARSEOP_REFOF '(' {$<n>$ = TrCreateLeafNode (PARSEOP_REFOF);}
SuperName
')' {$$ = TrLinkChildren ($<n>3,1,TrSetNodeFlags ($4, NODE_IS_TARGET));}
| PARSEOP_REFOF '('
@ -2031,7 +2019,7 @@ RefOfTerm
;
ShiftLeftTerm
: PARSEOP_SHIFTLEFT '(' {$<n>$ = TrCreateLeafNode (PARSEOP_SHIFTLEFT);}
: PARSEOP_SHIFTLEFT '(' {$<n>$ = TrCreateLeafNode (PARSEOP_SHIFTLEFT);}
TermArg
TermArgItem
Target
@ -2041,7 +2029,7 @@ ShiftLeftTerm
;
ShiftRightTerm
: PARSEOP_SHIFTRIGHT '(' {$<n>$ = TrCreateLeafNode (PARSEOP_SHIFTRIGHT);}
: PARSEOP_SHIFTRIGHT '(' {$<n>$ = TrCreateLeafNode (PARSEOP_SHIFTRIGHT);}
TermArg
TermArgItem
Target
@ -2051,7 +2039,7 @@ ShiftRightTerm
;
SizeOfTerm
: PARSEOP_SIZEOF '(' {$<n>$ = TrCreateLeafNode (PARSEOP_SIZEOF);}
: PARSEOP_SIZEOF '(' {$<n>$ = TrCreateLeafNode (PARSEOP_SIZEOF);}
SuperName
')' {$$ = TrLinkChildren ($<n>3,1,$4);}
| PARSEOP_SIZEOF '('
@ -2059,7 +2047,7 @@ SizeOfTerm
;
StoreTerm
: PARSEOP_STORE '(' {$<n>$ = TrCreateLeafNode (PARSEOP_STORE);}
: PARSEOP_STORE '(' {$<n>$ = TrCreateLeafNode (PARSEOP_STORE);}
TermArg
',' SuperName
')' {$$ = TrLinkChildren ($<n>3,2,$4,TrSetNodeFlags ($6, NODE_IS_TARGET));}
@ -2068,7 +2056,7 @@ StoreTerm
;
SubtractTerm
: PARSEOP_SUBTRACT '(' {$<n>$ = TrCreateLeafNode (PARSEOP_SUBTRACT);}
: PARSEOP_SUBTRACT '(' {$<n>$ = TrCreateLeafNode (PARSEOP_SUBTRACT);}
TermArg
TermArgItem
Target
@ -2078,15 +2066,15 @@ SubtractTerm
;
TimerTerm
: PARSEOP_TIMER '(' {$<n>$ = TrCreateLeafNode (PARSEOP_TIMER);}
: PARSEOP_TIMER '(' {$<n>$ = TrCreateLeafNode (PARSEOP_TIMER);}
')' {$$ = TrLinkChildren ($<n>3,0);}
| PARSEOP_TIMER {$$ = TrLinkChildren (TrCreateLeafNode (PARSEOP_TIMER),0);}
| PARSEOP_TIMER {$$ = TrLinkChildren (TrCreateLeafNode (PARSEOP_TIMER),0);}
| PARSEOP_TIMER '('
error ')' {$$ = AslDoError(); yyclearin;}
;
ToBCDTerm
: PARSEOP_TOBCD '(' {$<n>$ = TrCreateLeafNode (PARSEOP_TOBCD);}
: PARSEOP_TOBCD '(' {$<n>$ = TrCreateLeafNode (PARSEOP_TOBCD);}
TermArg
Target
')' {$$ = TrLinkChildren ($<n>3,2,$4,$5);}
@ -2095,7 +2083,7 @@ ToBCDTerm
;
ToBufferTerm
: PARSEOP_TOBUFFER '(' {$<n>$ = TrCreateLeafNode (PARSEOP_TOBUFFER);}
: PARSEOP_TOBUFFER '(' {$<n>$ = TrCreateLeafNode (PARSEOP_TOBUFFER);}
TermArg
Target
')' {$$ = TrLinkChildren ($<n>3,2,$4,$5);}
@ -2104,7 +2092,7 @@ ToBufferTerm
;
ToDecimalStringTerm
: PARSEOP_TODECIMALSTRING '(' {$<n>$ = TrCreateLeafNode (PARSEOP_TODECIMALSTRING);}
: PARSEOP_TODECIMALSTRING '(' {$<n>$ = TrCreateLeafNode (PARSEOP_TODECIMALSTRING);}
TermArg
Target
')' {$$ = TrLinkChildren ($<n>3,2,$4,$5);}
@ -2113,7 +2101,7 @@ ToDecimalStringTerm
;
ToHexStringTerm
: PARSEOP_TOHEXSTRING '(' {$<n>$ = TrCreateLeafNode (PARSEOP_TOHEXSTRING);}
: PARSEOP_TOHEXSTRING '(' {$<n>$ = TrCreateLeafNode (PARSEOP_TOHEXSTRING);}
TermArg
Target
')' {$$ = TrLinkChildren ($<n>3,2,$4,$5);}
@ -2122,7 +2110,7 @@ ToHexStringTerm
;
ToIntegerTerm
: PARSEOP_TOINTEGER '(' {$<n>$ = TrCreateLeafNode (PARSEOP_TOINTEGER);}
: PARSEOP_TOINTEGER '(' {$<n>$ = TrCreateLeafNode (PARSEOP_TOINTEGER);}
TermArg
Target
')' {$$ = TrLinkChildren ($<n>3,2,$4,$5);}
@ -2131,7 +2119,7 @@ ToIntegerTerm
;
ToStringTerm
: PARSEOP_TOSTRING '(' {$<n>$ = TrCreateLeafNode (PARSEOP_TOSTRING);}
: PARSEOP_TOSTRING '(' {$<n>$ = TrCreateLeafNode (PARSEOP_TOSTRING);}
TermArg
OptionalCount
Target
@ -2148,7 +2136,7 @@ ToUUIDTerm
;
WaitTerm
: PARSEOP_WAIT '(' {$<n>$ = TrCreateLeafNode (PARSEOP_WAIT);}
: PARSEOP_WAIT '(' {$<n>$ = TrCreateLeafNode (PARSEOP_WAIT);}
SuperName
TermArgItem
')' {$$ = TrLinkChildren ($<n>3,2,$4,$5);}
@ -2157,7 +2145,7 @@ WaitTerm
;
XOrTerm
: PARSEOP_XOR '(' {$<n>$ = TrCreateLeafNode (PARSEOP_XOR);}
: PARSEOP_XOR '(' {$<n>$ = TrCreateLeafNode (PARSEOP_XOR);}
TermArg
TermArgItem
Target
@ -2211,8 +2199,8 @@ AddressKeyword
;
AddressSpaceKeyword
: ByteConst {$$ = UtCheckIntegerRange ($1, 0x80, 0xFF);}
| RegionSpaceKeyword {}
: ByteConst {$$ = UtCheckIntegerRange ($1, 0x0A, 0xFF);}
| RegionSpaceKeyword {}
;
BitsPerByteKeyword

View File

@ -259,7 +259,7 @@ AePrintException (
{
if (Gbl_VerboseErrors)
{
fprintf (OutputFile, "%6s", Enode->Filename);
fprintf (OutputFile, "%-8s", Enode->Filename);
if (Enode->LineNumber)
{
@ -270,12 +270,7 @@ AePrintException (
}
else
{
if (Gbl_FileType == ASL_INPUT_TYPE_ASCII_ASL)
fprintf (OutputFile, " %6u: ",
PrGetLineNumber (Enode->LineNumber));
else
fprintf (OutputFile, " %6u: ",
Enode->LineNumber);
fprintf (OutputFile, " %6u: ", Enode->LineNumber);
/*
* If not at EOF, get the corresponding source code line and
@ -324,16 +319,8 @@ AePrintException (
if (Enode->LineNumber)
{
if (Gbl_FileType == ASL_INPUT_TYPE_ASCII_ASL)
{
fprintf (OutputFile, "(%u) i:%6u : ",
PrGetLineNumber (Enode->LineNumber), Enode->LineNumber);
}
else
{
fprintf (OutputFile, "(%u) i:%6u : ",
Enode->LineNumber, Enode->LineNumber);
}
fprintf (OutputFile, "(%u) i:%6u : ",
Enode->LineNumber, Enode->LineNumber);
}
}
}

View File

@ -81,12 +81,12 @@ AslAbort (
void)
{
AePrintErrorLog (ASL_FILE_STDOUT);
AePrintErrorLog (ASL_FILE_STDERR);
if (Gbl_DebugFlag)
{
/* Print error summary to the debug file */
/* Print error summary to stdout also */
AePrintErrorLog (ASL_FILE_STDERR);
AePrintErrorLog (ASL_FILE_STDOUT);
}
exit (1);
@ -388,11 +388,38 @@ FlCloseFile (
void
FlSetLineNumber (
ACPI_PARSE_OBJECT *Op)
UINT32 LineNumber)
{
Gbl_CurrentLineNumber = (UINT32) Op->Asl.Value.Integer;
Gbl_LogicalLineNumber = (UINT32) Op->Asl.Value.Integer;
DbgPrint (ASL_PARSE_OUTPUT, "\n#line: New line number %u (old %u)\n",
LineNumber, Gbl_LogicalLineNumber);
Gbl_CurrentLineNumber = LineNumber;
Gbl_LogicalLineNumber = LineNumber;
}
/*******************************************************************************
*
* FUNCTION: FlSetFilename
*
* PARAMETERS: Op - Parse node for the LINE asl statement
*
* RETURN: None.
*
* DESCRIPTION: Set the current filename
*
******************************************************************************/
void
FlSetFilename (
char *Filename)
{
DbgPrint (ASL_PARSE_OUTPUT, "\n#line: New filename %s (old %s)\n",
Filename, Gbl_Files[ASL_FILE_INPUT].Filename);
Gbl_Files[ASL_FILE_INPUT].Filename = Filename;
}
@ -548,7 +575,7 @@ FlOpenIncludeFile (
* Flush out the "include ()" statement on this line, start
* the actual include file on the next line
*/
ResetCurrentLineBuffer ();
AslResetCurrentLineBuffer ();
FlPrintFile (ASL_FILE_SOURCE_OUTPUT, "\n");
Gbl_CurrentLineOffset++;
@ -770,17 +797,20 @@ FlOpenMiscOutputFiles (
AslCompilerFileHeader (ASL_FILE_LISTING_OUTPUT);
}
/* Create the preprocessor output file */
/* Create the preprocessor output file if preprocessor enabled */
Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_PREPROCESSOR);
if (!Filename)
if (Gbl_PreprocessFlag)
{
AslCommonError (ASL_ERROR, ASL_MSG_PREPROCESSOR_FILENAME,
0, 0, 0, 0, NULL, NULL);
return (AE_ERROR);
}
Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_PREPROCESSOR);
if (!Filename)
{
AslCommonError (ASL_ERROR, ASL_MSG_PREPROCESSOR_FILENAME,
0, 0, 0, 0, NULL, NULL);
return (AE_ERROR);
}
FlOpenFile (ASL_FILE_PREPROCESSOR, Filename, "w+b");
FlOpenFile (ASL_FILE_PREPROCESSOR, Filename, "w+b");
}
/* All done for data table compiler */

View File

@ -74,7 +74,7 @@ extern int PrParserdebug;
extern const ASL_MAPPING_ENTRY AslKeywordMapping[];
extern char *AslCompilertext;
#define ASL_LINE_BUFFER_SIZE 4096
#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
@ -84,6 +84,7 @@ extern char *AslCompilertext;
ASL_EXTERN char Gbl_CurrentLineBuffer[ASL_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);
@ -99,6 +100,7 @@ ASL_EXTERN ASL_ERROR_MSG ASL_INIT_GLOBAL (*Gbl_NextError,NULL);
ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_DoCompile, TRUE);
ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_DoSignon, TRUE);
ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_PreprocessOnly, FALSE);
ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_PreprocessFlag, TRUE);
ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_DisassembleAll, FALSE);
ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_Acpi2, FALSE);
@ -118,6 +120,7 @@ ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_CompileTimesFlag, FALSE
ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_FoldConstants, TRUE);
ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_VerboseErrors, TRUE);
ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_NoErrors, FALSE);
ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_WarningsAsErrors, FALSE);
ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_NoResourceChecking, FALSE);
ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_DisasmFlag, FALSE);
ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_GetAllTables, FALSE);

View File

@ -96,7 +96,7 @@ AslDoResponseFile (
#define ASL_TOKEN_SEPARATORS " \t\n"
#define ASL_SUPPORTED_OPTIONS "@:2b|c|d^D:e:fgh^i|I:l^mno|p:Pr:s|t|T:G^v|w|x:z"
#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"
/*******************************************************************************
@ -124,6 +124,7 @@ Options (
ACPI_OPTION ("-D <symbol>", "Define symbol for preprocessor use");
ACPI_OPTION ("-li", "Create preprocessed output file (*.i)");
ACPI_OPTION ("-P", "Preprocess only and create preprocessor output file (*.i)");
ACPI_OPTION ("-Pn", "Disable preprocessor");
printf ("\nGeneral Output:\n");
ACPI_OPTION ("-p <prefix>", "Specify path/filename prefix for all output files");
@ -133,6 +134,7 @@ Options (
ACPI_OPTION ("-vr", "Disable remarks");
ACPI_OPTION ("-vs", "Disable signon");
ACPI_OPTION ("-w1 -w2 -w3", "Set warning reporting level");
ACPI_OPTION ("-we", "Report warnings as errors");
printf ("\nAML Output Files:\n");
ACPI_OPTION ("-sa -sc", "Create AML in assembler or C source file (*.asm or *.c)");
@ -671,9 +673,22 @@ AslDoOptions (
break;
case 'P': /* Preprocess (plus .i file) only */
Gbl_PreprocessOnly = TRUE;
Gbl_PreprocessorOutputFlag = TRUE;
case 'P': /* Preprocessor options */
switch (AcpiGbl_Optarg[0])
{
case '^': /* Proprocess only, emit (.i) file */
Gbl_PreprocessOnly = TRUE;
Gbl_PreprocessorOutputFlag = TRUE;
break;
case 'n': /* Disable preprocessor */
Gbl_PreprocessFlag = FALSE;
break;
default:
printf ("Unknown option: -P%s\n", AcpiGbl_Optarg);
return (-1);
}
break;
@ -793,6 +808,10 @@ AslDoOptions (
Gbl_WarningLevel = ASL_WARNING3;
break;
case 'e':
Gbl_WarningsAsErrors = TRUE;
break;
default:
printf ("Unknown option: -w%s\n", AcpiGbl_Optarg);
return (-1);

View File

@ -240,7 +240,6 @@ const ASL_MAPPING_ENTRY AslKeywordMapping [] =
/* I2CSERIALBUS */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0),
/* IF */ OP_TABLE_ENTRY (AML_IF_OP, 0, NODE_AML_PACKAGE, 0),
/* INCLUDE */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0),
/* INCLUDE_CSTYLE */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0),
/* INCLUDE_END */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0),
/* INCREMENT */ OP_TABLE_ENTRY (AML_INCREMENT_OP, 0, 0, ACPI_BTYPE_INTEGER),
/* INDEX */ OP_TABLE_ENTRY (AML_INDEX_OP, 0, 0, ACPI_BTYPE_REFERENCE),
@ -265,7 +264,6 @@ const ASL_MAPPING_ENTRY AslKeywordMapping [] =
/* LEQUAL */ OP_TABLE_ENTRY (AML_LEQUAL_OP, 0, 0, ACPI_BTYPE_INTEGER),
/* LGREATER */ OP_TABLE_ENTRY (AML_LGREATER_OP, 0, 0, ACPI_BTYPE_INTEGER),
/* LGREATEREQUAL */ OP_TABLE_ENTRY (AML_LGREATEREQUAL_OP, 0, 0, ACPI_BTYPE_INTEGER),
/* LINE */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0),
/* LLESS */ OP_TABLE_ENTRY (AML_LLESS_OP, 0, 0, ACPI_BTYPE_INTEGER),
/* LLESSEQUAL */ OP_TABLE_ENTRY (AML_LLESSEQUAL_OP, 0, 0, ACPI_BTYPE_INTEGER),
/* LNOT */ OP_TABLE_ENTRY (AML_LNOT_OP, 0, 0, ACPI_BTYPE_INTEGER),

View File

@ -453,6 +453,10 @@ RsDoStartDependentDescriptor (
PreviousRnode = Rnode;
Descriptor = Rnode->Buffer;
/* Increment offset past StartDependent descriptor */
CurrentByteOffset += sizeof (AML_RESOURCE_START_DEPENDENT);
/* Descriptor has priority byte */
Descriptor->StartDpf.DescriptorType = ACPI_RESOURCE_NAME_START_DEPENDENT |
@ -545,6 +549,10 @@ RsDoStartDependentNoPriDescriptor (
ASL_RDESC_ST_DEPEND_SIZE;
PreviousRnode = Rnode;
/* Increment offset past StartDependentNoPri descriptor */
CurrentByteOffset += sizeof (AML_RESOURCE_START_DEPENDENT_NOPRIO);
/* Process all child initialization nodes */
State = ACPI_RSTATE_START_DEPENDENT;

View File

@ -404,18 +404,33 @@ AslDoOneFile (
case ASL_INPUT_TYPE_ASCII_DATA:
Status = DtDoCompile ();
if (ACPI_FAILURE (Status))
{
return (Status);
}
if (Gbl_Signature)
{
ACPI_FREE (Gbl_Signature);
Gbl_Signature = NULL;
}
/* Check if any errors occurred during compile */
Status = AslCheckForErrorExit ();
if (ACPI_FAILURE (Status))
{
return (Status);
}
/* Cleanup (for next source file) and exit */
AeClearErrorLog ();
PrTerminatePreprocessor ();
return (Status);
/*
* ASL Compilation (Optional)
* ASL Compilation
*/
case ASL_INPUT_TYPE_ASCII_ASL:
@ -427,18 +442,19 @@ AslDoOneFile (
return (Status);
}
Status = CmDoCompile ();
(void) CmDoCompile ();
(void) AcpiTerminate ();
/*
* Return non-zero exit code if there have been errors, unless the
* global ignore error flag has been set
*/
if ((Gbl_ExceptionCount[ASL_ERROR] > 0) && (!Gbl_IgnoreErrors))
/* Check if any errors occurred during compile */
Status = AslCheckForErrorExit ();
if (ACPI_FAILURE (Status))
{
return (AE_ERROR);
return (Status);
}
/* Cleanup (for next source file) and exit */
AeClearErrorLog ();
PrTerminatePreprocessor ();
return (AE_OK);
@ -525,3 +541,47 @@ AslDoOnePathname (
return (Status);
}
/*******************************************************************************
*
* FUNCTION: AslCheckForErrorExit
*
* PARAMETERS: None. Examines global exception count array
*
* RETURN: Status
*
* DESCRIPTION: Determine if compiler should abort with error status
*
******************************************************************************/
ACPI_STATUS
AslCheckForErrorExit (
void)
{
/*
* Return non-zero exit code if there have been errors, unless the
* global ignore error flag has been set
*/
if (!Gbl_IgnoreErrors)
{
if (Gbl_ExceptionCount[ASL_ERROR] > 0)
{
return (AE_ERROR);
}
/* Optionally treat warnings as errors */
if (Gbl_WarningsAsErrors)
{
if ((Gbl_ExceptionCount[ASL_WARNING] > 0) ||
(Gbl_ExceptionCount[ASL_WARNING2] > 0) ||
(Gbl_ExceptionCount[ASL_WARNING3] > 0))
{
return (AE_ERROR);
}
}
}
return (AE_OK);
}

View File

@ -0,0 +1,782 @@
/******************************************************************************
*
* Module Name: aslsupport.l - Flex/lex scanner C support routines.
* NOTE: Included into aslcompile.l, not compiled by itself.
*
*****************************************************************************/
/*
* Copyright (C) 2000 - 2012, Intel Corp.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions, and the following disclaimer,
* without modification.
* 2. Redistributions in binary form must reproduce at minimum a disclaimer
* substantially similar to the "NO WARRANTY" disclaimer below
* ("Disclaimer") and any redistribution must be conditioned upon
* including a substantially similar Disclaimer requirement for further
* binary redistribution.
* 3. Neither the names of the above-listed copyright holders nor the names
* of any contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* Alternatively, this software may be distributed under the terms of the
* GNU General Public License ("GPL") version 2 as published by the Free
* Software Foundation.
*
* NO WARRANTY
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
*/
/* Configuration */
#define ASL_SPACES_PER_TAB 4
#define ASL_NORMAL_CHAR 0
#define ASL_ESCAPE_SEQUENCE 1
#define ASL_OCTAL_CONSTANT 2
#define ASL_HEX_CONSTANT 3
/* File node - used for "Include" operator file stack */
typedef struct asl_file_node
{
FILE *File;
UINT32 CurrentLineNumber;
YY_BUFFER_STATE State;
char *Filename;
struct asl_file_node *Next;
} ASL_FILE_NODE;
/* File stack for the "Include" operator (NOT #include operator) */
ASL_FILE_NODE *Gbl_IncludeFileStack = NULL;
/*******************************************************************************
*
* FUNCTION: AslDoLineDirective
*
* PARAMETERS: None. Uses input() to access current source code line
*
* RETURN: Updates global line number and filename
*
* DESCRIPTION: Handle #line directives emitted by the preprocessor.
*
* The #line directive is emitted by the preprocesser, and is used to
* pass through line numbers from the original source code file to the
* preprocessor output file (.i). This allows any compiler-generated
* error messages to be displayed with the correct line number.
*
******************************************************************************/
static void
AslDoLineDirective (
void)
{
char c;
char *Token;
UINT32 LineNumber;
char *Filename;
/* Eat the entire line that contains the #line directive */
while ((c = (char) input()) != '\n' && c != EOF)
{
AslInsertLineBuffer (c);
}
AslInsertLineBuffer (0);
/* First argument is the actual line number */
Token = strtok (Gbl_CurrentLineBuffer, " ");
if (!Token)
{
goto ResetAndExit;
}
/* Convert line number. Subtract one to handle _this_ line */
LineNumber = (UINT32) UtDoConstant (Token);
FlSetLineNumber (LineNumber - 1);
/* Second argument is the optional filename (in double quotes) */
Token = strtok (NULL, " \"");
if (Token)
{
Filename = ACPI_ALLOCATE_ZEROED (strlen (Token) + 1);
strcpy (Filename, Token);
FlSetFilename (Filename);
}
/* Third argument is not supported at this time */
ResetAndExit:
AslResetCurrentLineBuffer ();
}
/*******************************************************************************
*
* FUNCTION: AslPopInputFileStack
*
* PARAMETERS: None
*
* RETURN: 0 if a node was popped, -1 otherwise
*
* DESCRIPTION: Pop the top of the input file stack and point the parser to
* the saved parse buffer contained in the fnode. Also, set the
* global line counters to the saved values. This function is
* called when an include file reaches EOF.
*
******************************************************************************/
int
AslPopInputFileStack (
void)
{
ASL_FILE_NODE *Fnode;
Fnode = Gbl_IncludeFileStack;
DbgPrint (ASL_PARSE_OUTPUT, "\nPop InputFile Stack, Fnode %p\n\n", Fnode);
if (!Fnode)
{
return (-1);
}
/* Close the current include file */
fclose (yyin);
/* Update the top-of-stack */
Gbl_IncludeFileStack = Fnode->Next;
/* Reset global line counter and filename */
Gbl_Files[ASL_FILE_INPUT].Filename = Fnode->Filename;
Gbl_CurrentLineNumber = Fnode->CurrentLineNumber;
/* Point the parser to the popped file */
yy_delete_buffer (YY_CURRENT_BUFFER);
yy_switch_to_buffer (Fnode->State);
/* All done with this node */
ACPI_FREE (Fnode);
return (0);
}
/*******************************************************************************
*
* FUNCTION: AslPushInputFileStack
*
* PARAMETERS: InputFile - Open file pointer
* Filename - Name of the file
*
* RETURN: None
*
* DESCRIPTION: Push the InputFile onto the file stack, and point the parser
* to this file. Called when an include file is successfully
* opened.
*
******************************************************************************/
void
AslPushInputFileStack (
FILE *InputFile,
char *Filename)
{
ASL_FILE_NODE *Fnode;
YY_BUFFER_STATE State;
/* Save the current state in an Fnode */
Fnode = UtLocalCalloc (sizeof (ASL_FILE_NODE));
Fnode->File = yyin;
Fnode->Next = Gbl_IncludeFileStack;
Fnode->State = YY_CURRENT_BUFFER;
Fnode->CurrentLineNumber = Gbl_CurrentLineNumber;
Fnode->Filename = Gbl_Files[ASL_FILE_INPUT].Filename;
/* Push it on the stack */
Gbl_IncludeFileStack = Fnode;
/* Point the parser to this file */
State = yy_create_buffer (InputFile, YY_BUF_SIZE);
yy_switch_to_buffer (State);
DbgPrint (ASL_PARSE_OUTPUT, "\nPush InputFile Stack, returning %p\n\n", InputFile);
/* Reset the global line count and filename */
Gbl_Files[ASL_FILE_INPUT].Filename = Filename;
Gbl_CurrentLineNumber = 1;
yyin = InputFile;
}
/*******************************************************************************
*
* FUNCTION: AslResetCurrentLineBuffer
*
* PARAMETERS: None
*
* RETURN: None
*
* DESCRIPTION: Reset the Line Buffer to zero, increment global line numbers.
*
******************************************************************************/
void
AslResetCurrentLineBuffer (
void)
{
if (Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle)
{
FlWriteFile (ASL_FILE_SOURCE_OUTPUT, Gbl_CurrentLineBuffer,
Gbl_LineBufPtr - Gbl_CurrentLineBuffer);
}
Gbl_CurrentLineOffset += Gbl_CurrentColumn;
Gbl_CurrentColumn = 0;
Gbl_CurrentLineNumber++;
Gbl_LogicalLineNumber++;
Gbl_LineBufPtr = Gbl_CurrentLineBuffer;
}
/*******************************************************************************
*
* FUNCTION: AslInsertLineBuffer
*
* PARAMETERS: SourceChar - One char from the input ASL source file
*
* RETURN: None
*
* DESCRIPTION: Put one character of the source file into the temp line buffer
*
******************************************************************************/
void
AslInsertLineBuffer (
int SourceChar)
{
UINT32 i;
UINT32 Count = 1;
if (SourceChar == EOF)
{
return;
}
Gbl_InputByteCount++;
/* Handle tabs. Convert to spaces */
if (SourceChar == '\t')
{
SourceChar = ' ';
Count = ASL_SPACES_PER_TAB -
(Gbl_CurrentColumn & (ASL_SPACES_PER_TAB-1));
}
for (i = 0; i < Count; i++)
{
Gbl_CurrentColumn++;
/* Insert the character into the line buffer */
*Gbl_LineBufPtr = (UINT8) SourceChar;
Gbl_LineBufPtr++;
if (Gbl_LineBufPtr > (Gbl_CurrentLineBuffer + (ASL_LINE_BUFFER_SIZE - 1)))
{
#if 0
/*
* Warning if we have split a long source line.
* <Probably overkill>
*/
sprintf (MsgBuffer, "Max %u", ASL_LINE_BUFFER_SIZE);
AslCommonError (ASL_WARNING, ASL_MSG_LONG_LINE,
Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
Gbl_CurrentLineOffset, Gbl_CurrentColumn,
Gbl_Files[ASL_FILE_INPUT].Filename, MsgBuffer);
#endif
AslResetCurrentLineBuffer ();
}
else if (SourceChar == '\n')
{
/* End of line */
AslResetCurrentLineBuffer ();
}
}
}
/*******************************************************************************
*
* FUNCTION: count
*
* PARAMETERS: yytext - Contains the matched keyword.
* Type - Keyword/Character type:
* 0 = anything except a keyword
* 1 = pseudo-keywords
* 2 = non-executable ASL keywords
* 3 = executable ASL keywords
*
* RETURN: None
*
* DESCRIPTION: Count keywords and put them into the line buffer
*
******************************************************************************/
static void
count (
int Type)
{
int i;
switch (Type)
{
case 2:
TotalKeywords++;
TotalNamedObjects++;
break;
case 3:
TotalKeywords++;
TotalExecutableOpcodes++;
break;
}
for (i = 0; (yytext[i] != 0) && (yytext[i] != EOF); i++)
{
AslInsertLineBuffer (yytext[i]);
*Gbl_LineBufPtr = 0;
}
}
/*******************************************************************************
*
* FUNCTION: AslDoComment
*
* PARAMETERS: none
*
* RETURN: none
*
* DESCRIPTION: Process a standard comment.
*
******************************************************************************/
static char
AslDoComment (
void)
{
char c;
char c1 = 0;
AslInsertLineBuffer ('/');
AslInsertLineBuffer ('*');
loop:
/* Eat chars until end-of-comment */
while ((c = (char) input()) != '*' && c != EOF)
{
AslInsertLineBuffer (c);
c1 = c;
}
if (c == EOF)
{
goto EarlyEOF;
}
/*
* Check for nested comment -- can help catch cases where a previous
* comment was accidently left unterminated
*/
if ((c1 == '/') && (c == '*'))
{
AslCommonError (ASL_WARNING, ASL_MSG_NESTED_COMMENT,
Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
Gbl_InputByteCount, Gbl_CurrentColumn,
Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
}
/* Comment is closed only if the NEXT character is a slash */
AslInsertLineBuffer (c);
if ((c1 = (char) input()) != '/' && c1 != EOF)
{
unput(c1);
goto loop;
}
if (c1 == EOF)
{
goto EarlyEOF;
}
AslInsertLineBuffer (c1);
return (TRUE);
EarlyEOF:
/*
* Premature End-Of-File
*/
AslCommonError (ASL_ERROR, ASL_MSG_EARLY_EOF,
Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
Gbl_CurrentLineOffset, Gbl_CurrentColumn,
Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
return (FALSE);
}
/*******************************************************************************
*
* FUNCTION: AslDoCommentType2
*
* PARAMETERS: none
*
* RETURN: none
*
* DESCRIPTION: Process a new "//" comment.
*
******************************************************************************/
static char
AslDoCommentType2 (
void)
{
char c;
AslInsertLineBuffer ('/');
AslInsertLineBuffer ('/');
while ((c = (char) input()) != '\n' && c != EOF)
{
AslInsertLineBuffer (c);
}
if (c == EOF)
{
/* End of file is OK, change to newline. Let parser detect EOF later */
c = '\n';
}
AslInsertLineBuffer (c);
return (TRUE);
}
/*******************************************************************************
*
* FUNCTION: AslDoStringLiteral
*
* PARAMETERS: none
*
* RETURN: none
*
* DESCRIPTION: Process a string literal (surrounded by quotes)
*
******************************************************************************/
static char
AslDoStringLiteral (
void)
{
char *StringBuffer = MsgBuffer;
char *EndBuffer = MsgBuffer + ASL_MSG_BUFFER_SIZE;
char *CleanString;
char StringChar;
UINT32 State = ASL_NORMAL_CHAR;
UINT32 i = 0;
UINT8 Digit;
char ConvertBuffer[4];
/*
* Eat chars until end-of-literal.
* NOTE: Put back the original surrounding quotes into the
* source line buffer.
*/
AslInsertLineBuffer ('\"');
while ((StringChar = (char) input()) != EOF)
{
AslInsertLineBuffer (StringChar);
DoCharacter:
switch (State)
{
case ASL_NORMAL_CHAR:
switch (StringChar)
{
case '\\':
/*
* Special handling for backslash-escape sequence. We will
* toss the backslash and translate the escape char(s).
*/
State = ASL_ESCAPE_SEQUENCE;
continue;
case '\"':
/* String terminator */
goto CompletedString;
}
break;
case ASL_ESCAPE_SEQUENCE:
State = ASL_NORMAL_CHAR;
switch (StringChar)
{
case 'a':
StringChar = 0x07; /* BELL */
break;
case 'b':
StringChar = 0x08; /* BACKSPACE */
break;
case 'f':
StringChar = 0x0C; /* FORMFEED */
break;
case 'n':
StringChar = 0x0A; /* LINEFEED */
break;
case 'r':
StringChar = 0x0D; /* CARRIAGE RETURN*/
break;
case 't':
StringChar = 0x09; /* HORIZONTAL TAB */
break;
case 'v':
StringChar = 0x0B; /* VERTICAL TAB */
break;
case 'x':
State = ASL_HEX_CONSTANT;
i = 0;
continue;
case '\'': /* Single Quote */
case '\"': /* Double Quote */
case '\\': /* Backslash */
break;
default:
/* Check for an octal digit (0-7) */
if (ACPI_IS_OCTAL_DIGIT (StringChar))
{
State = ASL_OCTAL_CONSTANT;
ConvertBuffer[0] = StringChar;
i = 1;
continue;
}
/* Unknown escape sequence issue warning, but use the character */
AslCommonError (ASL_WARNING, ASL_MSG_INVALID_ESCAPE,
Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
Gbl_CurrentLineOffset, Gbl_CurrentColumn,
Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
break;
}
break;
case ASL_OCTAL_CONSTANT:
/* Up to three octal digits allowed */
if (!ACPI_IS_OCTAL_DIGIT (StringChar) ||
(i > 2))
{
/*
* Reached end of the constant. Convert the assembled ASCII
* string and resume processing of the next character
*/
ConvertBuffer[i] = 0;
Digit = (UINT8) ACPI_STRTOUL (ConvertBuffer, NULL, 8);
/* Check for NULL or non-ascii character (ignore if so) */
if ((Digit == 0) || (Digit > ACPI_ASCII_MAX))
{
AslCommonError (ASL_WARNING, ASL_MSG_INVALID_STRING,
Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
Gbl_CurrentLineOffset, Gbl_CurrentColumn,
Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
}
else
{
*StringBuffer = (char) Digit;
StringBuffer++;
if (StringBuffer >= EndBuffer)
{
goto BufferOverflow;
}
}
State = ASL_NORMAL_CHAR;
goto DoCharacter;
break;
}
/* Append another digit of the constant */
ConvertBuffer[i] = StringChar;
i++;
continue;
case ASL_HEX_CONSTANT:
/* Up to two hex digits allowed */
if (!ACPI_IS_XDIGIT (StringChar) ||
(i > 1))
{
/*
* Reached end of the constant. Convert the assembled ASCII
* string and resume processing of the next character
*/
ConvertBuffer[i] = 0;
Digit = (UINT8) ACPI_STRTOUL (ConvertBuffer, NULL, 16);
/* Check for NULL or non-ascii character (ignore if so) */
if ((Digit == 0) || (Digit > ACPI_ASCII_MAX))
{
AslCommonError (ASL_WARNING, ASL_MSG_INVALID_STRING,
Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
Gbl_CurrentLineOffset, Gbl_CurrentColumn,
Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
}
else
{
*StringBuffer = (char) Digit;
StringBuffer++;
if (StringBuffer >= EndBuffer)
{
goto BufferOverflow;
}
}
State = ASL_NORMAL_CHAR;
goto DoCharacter;
break;
}
/* Append another digit of the constant */
ConvertBuffer[i] = StringChar;
i++;
continue;
}
/* Save the finished character */
*StringBuffer = StringChar;
StringBuffer++;
if (StringBuffer >= EndBuffer)
{
goto BufferOverflow;
}
}
/*
* Premature End-Of-File
*/
AslCommonError (ASL_ERROR, ASL_MSG_EARLY_EOF,
Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
Gbl_CurrentLineOffset, Gbl_CurrentColumn,
Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
return (FALSE);
CompletedString:
/*
* Null terminate the input string and copy string to a new buffer
*/
*StringBuffer = 0;
CleanString = UtGetStringBuffer (strlen (MsgBuffer) + 1);
if (!CleanString)
{
AslCommonError (ASL_ERROR, ASL_MSG_MEMORY_ALLOCATION,
Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
Gbl_CurrentLineOffset, Gbl_CurrentColumn,
Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
return (FALSE);
}
ACPI_STRCPY (CleanString, MsgBuffer);
AslCompilerlval.s = CleanString;
return (TRUE);
BufferOverflow:
/* Literal was too long */
AslCommonError (ASL_ERROR, ASL_MSG_STRING_LENGTH,
Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
Gbl_CurrentLineOffset, Gbl_CurrentColumn,
Gbl_Files[ASL_FILE_INPUT].Filename, "Max length 4096");
return (FALSE);
}

View File

@ -89,6 +89,7 @@ DtDumpBuffer (
#define DT_SLASH_SLASH_COMMENT 4
#define DT_END_COMMENT 5
#define DT_MERGE_LINES 6
#define DT_ESCAPE_SEQUENCE 7
static UINT32 Gbl_NextLineOffset;
@ -412,6 +413,7 @@ DtGetNextLine (
BOOLEAN LineNotAllBlanks = FALSE;
UINT32 State = DT_NORMAL_TEXT;
UINT32 CurrentLineOffset;
UINT32 BeyondBufferCount;
UINT32 i;
char c;
@ -503,12 +505,36 @@ DtGetNextLine (
Gbl_CurrentLineBuffer[i] = c;
i++;
if (c == '"')
switch (c)
{
case '"':
State = DT_NORMAL_TEXT;
break;
case '\\':
State = DT_ESCAPE_SEQUENCE;
break;
case '\n':
AcpiOsPrintf ("ERROR at line %u: Unterminated quoted string\n",
Gbl_CurrentLineNumber++);
State = DT_NORMAL_TEXT;
break;
default: /* Get next character */
break;
}
break;
case DT_ESCAPE_SEQUENCE:
/* Just copy the escaped character. TBD: sufficient for table compiler? */
Gbl_CurrentLineBuffer[i] = c;
i++;
State = DT_START_QUOTED_STRING;
break;
case DT_START_COMMENT:
/* Open comment if this character is an asterisk or slash */
@ -629,7 +655,19 @@ DtGetNextLine (
}
}
printf ("ERROR - Input line is too long (max %u)\n", ASL_LINE_BUFFER_SIZE);
/* 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);
}

View File

@ -124,13 +124,6 @@ typedef struct pr_file_node
} PR_FILE_NODE;
typedef struct pr_line_mapping
{
UINT32 *Map;
struct pr_line_mapping *Next;
} PR_LINE_MAPPING;
/*
* Globals
@ -140,7 +133,6 @@ 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];
PR_EXTERN PR_LINE_MAPPING *Gbl_MapBlockHead;
PR_EXTERN PR_FILE_NODE *Gbl_InputFileList;
PR_EXTERN PR_DEFINE_INFO PR_INIT_GLOBAL (*Gbl_DefineList, NULL);
PR_EXTERN UINT32 Gbl_PreprocessorLineNumber;
@ -167,10 +159,6 @@ BOOLEAN
PrDoPreprocess (
void);
UINT32
PrGetLineNumber (
UINT32 PreprocessorLineNumber);
UINT64
PrIsDefined (
char *Identifier);
@ -251,11 +239,6 @@ PrGetNextToken (
char *MatchString,
char **Next);
void
PrSetLineNumber (
UINT32 OriginalLineNumber,
UINT32 NewLineNumber);
void
PrError (
UINT8 Level,

View File

@ -161,9 +161,6 @@ PrInitializeGlobals (
Gbl_CurrentLineNumber = 0;
Gbl_PreprocessorLineNumber = 1;
Gbl_PreprocessorError = FALSE;
Gbl_MapBlockHead = UtLocalCalloc (sizeof (PR_LINE_MAPPING));
Gbl_MapBlockHead->Map = UtLocalCalloc (PR_LINES_PER_BLOCK * sizeof (UINT32));
}
@ -186,7 +183,6 @@ PrTerminatePreprocessor (
void)
{
PR_DEFINE_INFO *DefineInfo;
PR_LINE_MAPPING *MapInfo;
/*
@ -202,17 +198,6 @@ PrTerminatePreprocessor (
ACPI_FREE (DefineInfo->Identifier);
ACPI_FREE (DefineInfo);
}
/* Clear the line number mappings */
while (Gbl_MapBlockHead)
{
MapInfo = Gbl_MapBlockHead;
Gbl_MapBlockHead = MapInfo->Next;
ACPI_FREE (MapInfo->Map);
ACPI_FREE (MapInfo);
}
}
@ -393,8 +378,6 @@ PrPreprocessInputFile (
Token = PrGetNextToken (NULL, PR_TOKEN_SEPARATORS, &Next);
}
/* Write the possibly modified line to the .i file*/
#if 0
/* Line prefix */
FlPrintFile (ASL_FILE_PREPROCESSOR, "/* %14s %.5u i:%.5u */ ",
@ -402,11 +385,27 @@ PrPreprocessInputFile (
Gbl_CurrentLineNumber, Gbl_PreprocessorLineNumber);
#endif
/*
* Emit a #line directive if necessary, to keep the line numbers in
* the (.i) file synchronized with the original source code file, so
* that the correct line number appears in any error messages
* generated by the actual compiler.
*/
if (Gbl_CurrentLineNumber > (Gbl_PreviousLineNumber + 1))
{
FlPrintFile (ASL_FILE_PREPROCESSOR, "#line %u\n",
Gbl_CurrentLineNumber);
}
Gbl_PreviousLineNumber = Gbl_CurrentLineNumber;
Gbl_PreprocessorLineNumber++;
/*
* Now we can write the possibly modified source line to the
* preprocessor (.i) file
*/
FlWriteFile (ASL_FILE_PREPROCESSOR, Gbl_CurrentLineBuffer,
strlen (Gbl_CurrentLineBuffer));
PrSetLineNumber (Gbl_CurrentLineNumber, Gbl_PreprocessorLineNumber);
Gbl_PreprocessorLineNumber++;
}
}
@ -546,8 +545,9 @@ PrDoDirective (
if (*(&Gbl_CurrentLineBuffer[TokenOffset]) == '(')
{
#ifndef MACROS_SUPPORTED
AcpiOsPrintf ("#define macros not supported\n");
goto SyntaxError;
AcpiOsPrintf ("%s ERROR - line %u: #define macros are not supported yet\n",
Gbl_CurrentLineBuffer, Gbl_CurrentLineNumber);
exit(1);
#else
PrAddMacro (Token, Next);
#endif
@ -660,6 +660,31 @@ PrDoDirective (
PrOpenIncludeFile (Token);
break;
case PR_DIRECTIVE_LINE:
TokenOffset = Token - Gbl_MainTokenBuffer;
Status = PrResolveIntegerExpression (
&Gbl_CurrentLineBuffer[TokenOffset-1], &Value);
if (ACPI_FAILURE (Status))
{
return;
}
DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID
"User #line invocation %s\n", Gbl_CurrentLineNumber,
Token);
/* Update local line numbers */
Gbl_CurrentLineNumber = (UINT32) Value;
Gbl_PreviousLineNumber = 0;
/* Emit #line into the preprocessor file */
FlPrintFile (ASL_FILE_PREPROCESSOR, "#line %u \"%s\"\n",
Gbl_CurrentLineNumber, Gbl_Files[ASL_FILE_INPUT].Filename);
break;
case PR_DIRECTIVE_PRAGMA:
/* Only "#pragma message" supported at this time */
@ -692,8 +717,6 @@ PrDoDirective (
THIS_TOKEN_OFFSET (Token));
break;
case PR_DIRECTIVE_LINE:
/* TBD: set line number -- or, do this in main compiler */
default:
/* Should never get here */
DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID

View File

@ -49,100 +49,6 @@
ACPI_MODULE_NAME ("prutils")
/*******************************************************************************
*
* FUNCTION: PrSetLineNumber
*
* PARAMETERS: OriginalLineNumber - Line number in original source file,
* or include file
* PreprocessorLineNumber - Line number in the preprocessed file
*
* RETURN: None
*
* DESCRIPTION: Insert this mapping into the mapping data structure, for use
* in possible error/warning messages.
*
* Line number mapping functions.
* For error messages, we need to keep track of the line number in the
* original file, versus the preprocessed (.i) file.
*
******************************************************************************/
void
PrSetLineNumber (
UINT32 OriginalLineNumber,
UINT32 PreprocessorLineNumber)
{
UINT32 Entry;
PR_LINE_MAPPING *Block;
UINT32 Index;
UINT32 i;
Entry = PreprocessorLineNumber / PR_LINES_PER_BLOCK;
Index = PreprocessorLineNumber % PR_LINES_PER_BLOCK;
Block = Gbl_MapBlockHead;
for (i = 0; i < Entry; i++)
{
/* Allocate new mapping blocks as necessary */
if (!Block->Next)
{
Block->Next = UtLocalCalloc (sizeof (PR_LINE_MAPPING));
Block->Next->Map = UtLocalCalloc (PR_LINES_PER_BLOCK * sizeof (UINT32));
}
Block = Block->Next;
}
Block->Map[Index] = OriginalLineNumber;
}
/*******************************************************************************
*
* FUNCTION: PrGetLineNumber
*
* PARAMETERS: PreprocessorLineNumber - Line number in the preprocessed file
* (or, the "logical line number)
*
* RETURN: The line number in the original source file or include file.
*
* DESCRIPTION: Return the mapped value of a line number in the preprocessed
* source file to the actual line number in the original source
* file.
*
******************************************************************************/
UINT32
PrGetLineNumber (
UINT32 PreprocessorLineNumber)
{
UINT32 Entry;
PR_LINE_MAPPING *Block;
UINT32 Index;
UINT32 i;
Entry = PreprocessorLineNumber / PR_LINES_PER_BLOCK;
Index = PreprocessorLineNumber % PR_LINES_PER_BLOCK;
Block = Gbl_MapBlockHead;
for (i = 0; i < Entry; i++)
{
Block = Block->Next;
if (!Block)
{
/* Bad error, should not happen */
return (0);
}
}
return (Block->Map[Index]);
}
/******************************************************************************
*
* FUNCTION: PrGetNextToken
@ -486,14 +392,20 @@ PrPushInputFileStack (
Gbl_InputFileList = Fnode;
DbgPrint (ASL_PARSE_OUTPUT, PR_PREFIX_ID
"Push InputFile Stack, returning %p\n\n",
"Push InputFile Stack: handle %p\n\n",
Gbl_CurrentLineNumber, InputFile);
/* Reset the global line count and filename */
Gbl_Files[ASL_FILE_INPUT].Filename = Filename;
Gbl_Files[ASL_FILE_INPUT].Handle = InputFile;
Gbl_CurrentLineNumber = 1;
Gbl_PreviousLineNumber = 0;
Gbl_CurrentLineNumber = 0;
/* Emit a new #line directive for the include file */
FlPrintFile (ASL_FILE_PREPROCESSOR, "#line %u \"%s\"\n",
1, Filename);
}
@ -542,6 +454,12 @@ PrPopInputFileStack (
Gbl_Files[ASL_FILE_INPUT].Filename = Fnode->Filename;
Gbl_Files[ASL_FILE_INPUT].Handle = Fnode->File;
Gbl_CurrentLineNumber = Fnode->CurrentLineNumber;
Gbl_PreviousLineNumber = 0;
/* Emit a new #line directive after the include file */
FlPrintFile (ASL_FILE_PREPROCESSOR, "#line %u \"%s\"\n",
Gbl_CurrentLineNumber + 1, Fnode->Filename);
/* All done with this node */

View File

@ -373,25 +373,20 @@ AcpiDbSendNotify (
return;
}
/* Decode Named object type */
/* Dispatch the notify if legal */
switch (Node->Type)
if (AcpiEvIsNotifyObject (Node))
{
case ACPI_TYPE_DEVICE:
case ACPI_TYPE_THERMAL:
/* Send the notify */
Status = AcpiEvQueueNotifyRequest (Node, Value);
if (ACPI_FAILURE (Status))
{
AcpiOsPrintf ("Could not queue notify\n");
}
break;
default:
AcpiOsPrintf ("Named object is not a device or a thermal object\n");
break;
}
else
{
AcpiOsPrintf ("Named object [%4.4s] Type %s, must be Device/Thermal/Processor type\n",
AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Node->Type));
}
}

View File

@ -107,8 +107,8 @@ typedef struct acpi_handler_info
static ACPI_HANDLER_INFO AcpiGbl_HandlerList[] =
{
{&AcpiGbl_SystemNotify.Handler, "System Notifications"},
{&AcpiGbl_DeviceNotify.Handler, "Device Notifications"},
{&AcpiGbl_GlobalNotify[0].Handler, "System Notifications"},
{&AcpiGbl_GlobalNotify[1].Handler, "Device Notifications"},
{&AcpiGbl_TableHandler, "ACPI Table Events"},
{&AcpiGbl_ExceptionHandler, "Control Method Exceptions"},
{&AcpiGbl_InterfaceHandler, "OSI Invocations"}

View File

@ -227,8 +227,8 @@ AcpiDbEnumerateObject (
case ACPI_TYPE_DEVICE:
AcpiDbEnumerateObject (ObjDesc->Device.SystemNotify);
AcpiDbEnumerateObject (ObjDesc->Device.DeviceNotify);
AcpiDbEnumerateObject (ObjDesc->Device.NotifyList[0]);
AcpiDbEnumerateObject (ObjDesc->Device.NotifyList[1]);
AcpiDbEnumerateObject (ObjDesc->Device.Handler);
break;
@ -248,21 +248,21 @@ AcpiDbEnumerateObject (
case ACPI_TYPE_POWER:
AcpiDbEnumerateObject (ObjDesc->PowerResource.SystemNotify);
AcpiDbEnumerateObject (ObjDesc->PowerResource.DeviceNotify);
AcpiDbEnumerateObject (ObjDesc->PowerResource.NotifyList[0]);
AcpiDbEnumerateObject (ObjDesc->PowerResource.NotifyList[1]);
break;
case ACPI_TYPE_PROCESSOR:
AcpiDbEnumerateObject (ObjDesc->Processor.SystemNotify);
AcpiDbEnumerateObject (ObjDesc->Processor.DeviceNotify);
AcpiDbEnumerateObject (ObjDesc->Processor.NotifyList[0]);
AcpiDbEnumerateObject (ObjDesc->Processor.NotifyList[1]);
AcpiDbEnumerateObject (ObjDesc->Processor.Handler);
break;
case ACPI_TYPE_THERMAL:
AcpiDbEnumerateObject (ObjDesc->ThermalZone.SystemNotify);
AcpiDbEnumerateObject (ObjDesc->ThermalZone.DeviceNotify);
AcpiDbEnumerateObject (ObjDesc->ThermalZone.NotifyList[0]);
AcpiDbEnumerateObject (ObjDesc->ThermalZone.NotifyList[1]);
AcpiDbEnumerateObject (ObjDesc->ThermalZone.Handler);
break;
@ -522,6 +522,18 @@ AcpiDbDisplayStatistics (
AcpiOsPrintf ("NamespaceNode %3d\n", sizeof (ACPI_NAMESPACE_NODE));
AcpiOsPrintf ("AcpiObject %3d\n", sizeof (ACPI_OBJECT));
AcpiOsPrintf ("\n");
AcpiOsPrintf ("Generic State %3d\n", sizeof (ACPI_GENERIC_STATE));
AcpiOsPrintf ("Common State %3d\n", sizeof (ACPI_COMMON_STATE));
AcpiOsPrintf ("Control State %3d\n", sizeof (ACPI_CONTROL_STATE));
AcpiOsPrintf ("Update State %3d\n", sizeof (ACPI_UPDATE_STATE));
AcpiOsPrintf ("Scope State %3d\n", sizeof (ACPI_SCOPE_STATE));
AcpiOsPrintf ("Parse Scope %3d\n", sizeof (ACPI_PSCOPE_STATE));
AcpiOsPrintf ("Package State %3d\n", sizeof (ACPI_PKG_STATE));
AcpiOsPrintf ("Thread State %3d\n", sizeof (ACPI_THREAD_STATE));
AcpiOsPrintf ("Result Values %3d\n", sizeof (ACPI_RESULT_VALUES));
AcpiOsPrintf ("Notify Info %3d\n", sizeof (ACPI_NOTIFY_INFO));
break;

View File

@ -190,10 +190,7 @@ AcpiDbDumpExternalObject (
case ACPI_TYPE_STRING:
AcpiOsPrintf ("[String] Length %.2X = ", ObjDesc->String.Length);
for (i = 0; i < ObjDesc->String.Length; i++)
{
AcpiOsPrintf ("%c", ObjDesc->String.Pointer[i]);
}
AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX);
AcpiOsPrintf ("\n");
break;

View File

@ -111,107 +111,82 @@ AcpiEvQueueNotifyRequest (
UINT32 NotifyValue)
{
ACPI_OPERAND_OBJECT *ObjDesc;
ACPI_OPERAND_OBJECT *HandlerObj = NULL;
ACPI_GENERIC_STATE *NotifyInfo;
ACPI_OPERAND_OBJECT *HandlerListHead = NULL;
ACPI_GENERIC_STATE *Info;
UINT8 HandlerListId = 0;
ACPI_STATUS Status = AE_OK;
ACPI_FUNCTION_NAME (EvQueueNotifyRequest);
/* Are Notifies allowed on this object? */
if (!AcpiEvIsNotifyObject (Node))
{
return (AE_TYPE);
}
/* Get the correct notify list type (System or Device) */
if (NotifyValue <= ACPI_MAX_SYS_NOTIFY)
{
HandlerListId = ACPI_SYSTEM_HANDLER_LIST;
}
else
{
HandlerListId = ACPI_DEVICE_HANDLER_LIST;
}
/* Get the notify object attached to the namespace Node */
ObjDesc = AcpiNsGetAttachedObject (Node);
if (ObjDesc)
{
/* We have an attached object, Get the correct handler list */
HandlerListHead = ObjDesc->CommonNotify.NotifyList[HandlerListId];
}
/*
* For value 0x03 (Ejection Request), may need to run a device method.
* For value 0x02 (Device Wake), if _PRW exists, may need to run
* the _PS0 method.
* For value 0x80 (Status Change) on the power button or sleep button,
* initiate soft-off or sleep operation.
*
* For all cases, simply dispatch the notify to the handler.
* If there is no notify handler (Global or Local)
* for this object, just ignore the notify
*/
if (!AcpiGbl_GlobalNotify[HandlerListId].Handler && !HandlerListHead)
{
ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
"No notify handler for Notify, ignoring (%4.4s, %X) node %p\n",
AcpiUtGetNodeName (Node), NotifyValue, Node));
return (AE_OK);
}
/* Setup notify info and schedule the notify dispatcher */
Info = AcpiUtCreateGenericState ();
if (!Info)
{
return (AE_NO_MEMORY);
}
Info->Common.DescriptorType = ACPI_DESC_TYPE_STATE_NOTIFY;
Info->Notify.Node = Node;
Info->Notify.Value = (UINT16) NotifyValue;
Info->Notify.HandlerListId = HandlerListId;
Info->Notify.HandlerListHead = HandlerListHead;
Info->Notify.Global = &AcpiGbl_GlobalNotify[HandlerListId];
ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
"Dispatching Notify on [%4.4s] (%s) Value 0x%2.2X (%s) Node %p\n",
AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Node->Type),
NotifyValue, AcpiUtGetNotifyName (NotifyValue), Node));
/* Get the notify object attached to the NS Node */
ObjDesc = AcpiNsGetAttachedObject (Node);
if (ObjDesc)
Status = AcpiOsExecute (OSL_NOTIFY_HANDLER, AcpiEvNotifyDispatch,
Info);
if (ACPI_FAILURE (Status))
{
/* We have the notify object, Get the correct handler */
switch (Node->Type)
{
/* Notify is allowed only on these types */
case ACPI_TYPE_DEVICE:
case ACPI_TYPE_THERMAL:
case ACPI_TYPE_PROCESSOR:
if (NotifyValue <= ACPI_MAX_SYS_NOTIFY)
{
HandlerObj = ObjDesc->CommonNotify.SystemNotify;
}
else
{
HandlerObj = ObjDesc->CommonNotify.DeviceNotify;
}
break;
default:
/* All other types are not supported */
return (AE_TYPE);
}
}
/*
* If there is a handler to run, schedule the dispatcher.
* Check for:
* 1) Global system notify handler
* 2) Global device notify handler
* 3) Per-device notify handler
*/
if ((AcpiGbl_SystemNotify.Handler &&
(NotifyValue <= ACPI_MAX_SYS_NOTIFY)) ||
(AcpiGbl_DeviceNotify.Handler &&
(NotifyValue > ACPI_MAX_SYS_NOTIFY)) ||
HandlerObj)
{
NotifyInfo = AcpiUtCreateGenericState ();
if (!NotifyInfo)
{
return (AE_NO_MEMORY);
}
if (!HandlerObj)
{
ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
"Executing system notify handler for Notify (%4.4s, %X) "
"node %p\n",
AcpiUtGetNodeName (Node), NotifyValue, Node));
}
NotifyInfo->Common.DescriptorType = ACPI_DESC_TYPE_STATE_NOTIFY;
NotifyInfo->Notify.Node = Node;
NotifyInfo->Notify.Value = (UINT16) NotifyValue;
NotifyInfo->Notify.HandlerObj = HandlerObj;
Status = AcpiOsExecute (
OSL_NOTIFY_HANDLER, AcpiEvNotifyDispatch, NotifyInfo);
if (ACPI_FAILURE (Status))
{
AcpiUtDeleteGenericState (NotifyInfo);
}
}
else
{
/* There is no notify handler (per-device or system) for this device */
ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
"No notify handler for Notify (%4.4s, %X) node %p\n",
AcpiUtGetNodeName (Node), NotifyValue, Node));
AcpiUtDeleteGenericState (Info);
}
return (Status);
@ -235,61 +210,37 @@ static void ACPI_SYSTEM_XFACE
AcpiEvNotifyDispatch (
void *Context)
{
ACPI_GENERIC_STATE *NotifyInfo = (ACPI_GENERIC_STATE *) Context;
ACPI_NOTIFY_HANDLER GlobalHandler = NULL;
void *GlobalContext = NULL;
ACPI_GENERIC_STATE *Info = (ACPI_GENERIC_STATE *) Context;
ACPI_OPERAND_OBJECT *HandlerObj;
ACPI_FUNCTION_ENTRY ();
/*
* We will invoke a global notify handler if installed. This is done
* _before_ we invoke the per-device handler attached to the device.
*/
if (NotifyInfo->Notify.Value <= ACPI_MAX_SYS_NOTIFY)
{
/* Global system notification handler */
/* Invoke a global notify handler if installed */
if (AcpiGbl_SystemNotify.Handler)
{
GlobalHandler = AcpiGbl_SystemNotify.Handler;
GlobalContext = AcpiGbl_SystemNotify.Context;
}
}
else
if (Info->Notify.Global->Handler)
{
/* Global driver notification handler */
if (AcpiGbl_DeviceNotify.Handler)
{
GlobalHandler = AcpiGbl_DeviceNotify.Handler;
GlobalContext = AcpiGbl_DeviceNotify.Context;
}
Info->Notify.Global->Handler (Info->Notify.Node,
Info->Notify.Value,
Info->Notify.Global->Context);
}
/* Invoke the system handler first, if present */
/* Now invoke the local notify handler(s) if any are installed */
if (GlobalHandler)
HandlerObj = Info->Notify.HandlerListHead;
while (HandlerObj)
{
GlobalHandler (NotifyInfo->Notify.Node, NotifyInfo->Notify.Value,
GlobalContext);
}
/* Now invoke the per-device handler, if present */
HandlerObj = NotifyInfo->Notify.HandlerObj;
if (HandlerObj)
{
HandlerObj->Notify.Handler (NotifyInfo->Notify.Node,
NotifyInfo->Notify.Value,
HandlerObj->Notify.Handler (Info->Notify.Node,
Info->Notify.Value,
HandlerObj->Notify.Context);
HandlerObj = HandlerObj->Notify.Next[Info->Notify.HandlerListId];
}
/* All done with the info object */
AcpiUtDeleteGenericState (NotifyInfo);
AcpiUtDeleteGenericState (Info);
}

View File

@ -60,15 +60,21 @@
*
* PARAMETERS: Device - The device for which notifies will be handled
* HandlerType - The type of handler:
* ACPI_SYSTEM_NOTIFY: SystemHandler (00-7f)
* ACPI_DEVICE_NOTIFY: DriverHandler (80-ff)
* ACPI_ALL_NOTIFY: both system and device
* ACPI_SYSTEM_NOTIFY: System Handler (00-7F)
* ACPI_DEVICE_NOTIFY: Device Handler (80-FF)
* ACPI_ALL_NOTIFY: Both System and Device
* Handler - Address of the handler
* Context - Value passed to the handler on each GPE
*
* RETURN: Status
*
* DESCRIPTION: Install a handler for notifies on an ACPI device
* DESCRIPTION: Install a handler for notifications on an ACPI Device,
* ThermalZone, or Processor object.
*
* NOTES: The Root namespace object may have only one handler for each
* type of notify (System/Device). Device/Thermal/Processor objects
* may have one device notify handler, and multiple system notify
* handlers.
*
******************************************************************************/
@ -79,10 +85,11 @@ AcpiInstallNotifyHandler (
ACPI_NOTIFY_HANDLER Handler,
void *Context)
{
ACPI_NAMESPACE_NODE *Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Device);
ACPI_OPERAND_OBJECT *ObjDesc;
ACPI_OPERAND_OBJECT *NotifyObj;
ACPI_NAMESPACE_NODE *Node;
ACPI_OPERAND_OBJECT *HandlerObj;
ACPI_STATUS Status;
UINT32 i;
ACPI_FUNCTION_TRACE (AcpiInstallNotifyHandler);
@ -90,8 +97,7 @@ AcpiInstallNotifyHandler (
/* Parameter validation */
if ((!Device) ||
(!Handler) ||
if ((!Device) || (!Handler) || (!HandlerType) ||
(HandlerType > ACPI_MAX_NOTIFY_HANDLER_TYPE))
{
return_ACPI_STATUS (AE_BAD_PARAMETER);
@ -103,137 +109,126 @@ AcpiInstallNotifyHandler (
return_ACPI_STATUS (Status);
}
/* Convert and validate the device handle */
Node = AcpiNsValidateHandle (Device);
if (!Node)
{
Status = AE_BAD_PARAMETER;
goto UnlockAndExit;
}
/*
* Root Object:
* Registering a notify handler on the root object indicates that the
* caller wishes to receive notifications for all objects. Note that
* only one <external> global handler can be regsitered (per notify type).
* only one global handler can be registered per notify type.
* Ensure that a handler is not already installed.
*/
if (Device == ACPI_ROOT_OBJECT)
{
/* Make sure the handler is not already installed */
if (((HandlerType & ACPI_SYSTEM_NOTIFY) &&
AcpiGbl_SystemNotify.Handler) ||
((HandlerType & ACPI_DEVICE_NOTIFY) &&
AcpiGbl_DeviceNotify.Handler))
for (i = 0; i < ACPI_NUM_NOTIFY_TYPES; i++)
{
Status = AE_ALREADY_EXISTS;
goto UnlockAndExit;
if (HandlerType & (i+1))
{
if (AcpiGbl_GlobalNotify[i].Handler)
{
Status = AE_ALREADY_EXISTS;
goto UnlockAndExit;
}
AcpiGbl_GlobalNotify[i].Handler = Handler;
AcpiGbl_GlobalNotify[i].Context = Context;
}
}
if (HandlerType & ACPI_SYSTEM_NOTIFY)
{
AcpiGbl_SystemNotify.Node = Node;
AcpiGbl_SystemNotify.Handler = Handler;
AcpiGbl_SystemNotify.Context = Context;
}
if (HandlerType & ACPI_DEVICE_NOTIFY)
{
AcpiGbl_DeviceNotify.Node = Node;
AcpiGbl_DeviceNotify.Handler = Handler;
AcpiGbl_DeviceNotify.Context = Context;
}
/* Global notify handler installed */
goto UnlockAndExit; /* Global notify handler installed, all done */
}
/*
* All Other Objects:
* Caller will only receive notifications specific to the target object.
* Note that only certain object types can receive notifications.
* Caller will only receive notifications specific to the target
* object. Note that only certain object types are allowed to
* receive notifications.
*/
else
/* Are Notifies allowed on this object? */
if (!AcpiEvIsNotifyObject (Node))
{
/* Notifies allowed on this object? */
Status = AE_TYPE;
goto UnlockAndExit;
}
if (!AcpiEvIsNotifyObject (Node))
{
Status = AE_TYPE;
goto UnlockAndExit;
}
/* Check for an existing internal object, might not exist */
/* Check for an existing internal object */
ObjDesc = AcpiNsGetAttachedObject (Node);
if (!ObjDesc)
{
/* Create a new object */
ObjDesc = AcpiNsGetAttachedObject (Node);
if (ObjDesc)
{
/* Object exists - make sure there's no handler */
if (((HandlerType & ACPI_SYSTEM_NOTIFY) &&
ObjDesc->CommonNotify.SystemNotify) ||
((HandlerType & ACPI_DEVICE_NOTIFY) &&
ObjDesc->CommonNotify.DeviceNotify))
{
Status = AE_ALREADY_EXISTS;
goto UnlockAndExit;
}
}
else
{
/* Create a new object */
ObjDesc = AcpiUtCreateInternalObject (Node->Type);
if (!ObjDesc)
{
Status = AE_NO_MEMORY;
goto UnlockAndExit;
}
/* Attach new object to the Node */
Status = AcpiNsAttachObject (Device, ObjDesc, Node->Type);
/* Remove local reference to the object */
AcpiUtRemoveReference (ObjDesc);
if (ACPI_FAILURE (Status))
{
goto UnlockAndExit;
}
}
/* Install the handler */
NotifyObj = AcpiUtCreateInternalObject (ACPI_TYPE_LOCAL_NOTIFY);
if (!NotifyObj)
ObjDesc = AcpiUtCreateInternalObject (Node->Type);
if (!ObjDesc)
{
Status = AE_NO_MEMORY;
goto UnlockAndExit;
}
NotifyObj->Notify.Node = Node;
NotifyObj->Notify.Handler = Handler;
NotifyObj->Notify.Context = Context;
/* Attach new object to the Node, remove local reference */
if (HandlerType & ACPI_SYSTEM_NOTIFY)
Status = AcpiNsAttachObject (Device, ObjDesc, Node->Type);
AcpiUtRemoveReference (ObjDesc);
if (ACPI_FAILURE (Status))
{
ObjDesc->CommonNotify.SystemNotify = NotifyObj;
goto UnlockAndExit;
}
}
if (HandlerType & ACPI_DEVICE_NOTIFY)
/* Ensure that the handler is not already installed in the lists */
for (i = 0; i < ACPI_NUM_NOTIFY_TYPES; i++)
{
if (HandlerType & (i+1))
{
ObjDesc->CommonNotify.DeviceNotify = NotifyObj;
}
HandlerObj = ObjDesc->CommonNotify.NotifyList[i];
while (HandlerObj)
{
if (HandlerObj->Notify.Handler == Handler)
{
Status = AE_ALREADY_EXISTS;
goto UnlockAndExit;
}
if (HandlerType == ACPI_ALL_NOTIFY)
HandlerObj = HandlerObj->Notify.Next[i];
}
}
}
/* Create and populate a new notify handler object */
HandlerObj = AcpiUtCreateInternalObject (ACPI_TYPE_LOCAL_NOTIFY);
if (!HandlerObj)
{
Status = AE_NO_MEMORY;
goto UnlockAndExit;
}
HandlerObj->Notify.Node = Node;
HandlerObj->Notify.HandlerType = HandlerType;
HandlerObj->Notify.Handler = Handler;
HandlerObj->Notify.Context = Context;
/* Install the handler at the list head(s) */
for (i = 0; i < ACPI_NUM_NOTIFY_TYPES; i++)
{
if (HandlerType & (i+1))
{
/* Extra ref if installed in both */
HandlerObj->Notify.Next[i] =
ObjDesc->CommonNotify.NotifyList[i];
AcpiUtAddReference (NotifyObj);
ObjDesc->CommonNotify.NotifyList[i] = HandlerObj;
}
}
/* Add an extra reference if handler was installed in both lists */
if (HandlerType == ACPI_ALL_NOTIFY)
{
AcpiUtAddReference (HandlerObj);
}
UnlockAndExit:
(void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
@ -247,11 +242,11 @@ ACPI_EXPORT_SYMBOL (AcpiInstallNotifyHandler)
*
* FUNCTION: AcpiRemoveNotifyHandler
*
* PARAMETERS: Device - The device for which notifies will be handled
* PARAMETERS: Device - The device for which the handler is installed
* HandlerType - The type of handler:
* ACPI_SYSTEM_NOTIFY: SystemHandler (00-7f)
* ACPI_DEVICE_NOTIFY: DriverHandler (80-ff)
* ACPI_ALL_NOTIFY: both system and device
* ACPI_SYSTEM_NOTIFY: System Handler (00-7F)
* ACPI_DEVICE_NOTIFY: Device Handler (80-FF)
* ACPI_ALL_NOTIFY: Both System and Device
* Handler - Address of the handler
*
* RETURN: Status
@ -266,10 +261,12 @@ AcpiRemoveNotifyHandler (
UINT32 HandlerType,
ACPI_NOTIFY_HANDLER Handler)
{
ACPI_OPERAND_OBJECT *NotifyObj;
ACPI_NAMESPACE_NODE *Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Device);
ACPI_OPERAND_OBJECT *ObjDesc;
ACPI_NAMESPACE_NODE *Node;
ACPI_OPERAND_OBJECT *HandlerObj;
ACPI_OPERAND_OBJECT *PreviousHandlerObj;
ACPI_STATUS Status;
UINT32 i;
ACPI_FUNCTION_TRACE (AcpiRemoveNotifyHandler);
@ -277,122 +274,105 @@ AcpiRemoveNotifyHandler (
/* Parameter validation */
if ((!Device) ||
(!Handler) ||
if ((!Device) || (!Handler) || (!HandlerType) ||
(HandlerType > ACPI_MAX_NOTIFY_HANDLER_TYPE))
{
return_ACPI_STATUS (AE_BAD_PARAMETER);
}
#ifdef _UNDER_DEVELOPMENT
/* Make sure all deferred tasks are completed */
AcpiOsWaitEventsComplete (NULL);
#endif
Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
if (ACPI_FAILURE (Status))
{
return_ACPI_STATUS (Status);
}
/* Convert and validate the device handle */
Node = AcpiNsValidateHandle (Device);
if (!Node)
{
Status = AE_BAD_PARAMETER;
goto UnlockAndExit;
}
/* Root Object */
/* Root Object. Global handlers are removed here */
if (Device == ACPI_ROOT_OBJECT)
{
ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
"Removing notify handler for namespace root object\n"));
if (((HandlerType & ACPI_SYSTEM_NOTIFY) &&
!AcpiGbl_SystemNotify.Handler) ||
((HandlerType & ACPI_DEVICE_NOTIFY) &&
!AcpiGbl_DeviceNotify.Handler))
for (i = 0; i < ACPI_NUM_NOTIFY_TYPES; i++)
{
Status = AE_NOT_EXIST;
goto UnlockAndExit;
if (HandlerType & (i+1))
{
if (!AcpiGbl_GlobalNotify[i].Handler ||
(AcpiGbl_GlobalNotify[i].Handler != Handler))
{
Status = AE_NOT_EXIST;
goto UnlockAndExit;
}
ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
"Removing global notify handler\n"));
AcpiGbl_GlobalNotify[i].Handler = NULL;
AcpiGbl_GlobalNotify[i].Context = NULL;
}
}
if (HandlerType & ACPI_SYSTEM_NOTIFY)
{
AcpiGbl_SystemNotify.Node = NULL;
AcpiGbl_SystemNotify.Handler = NULL;
AcpiGbl_SystemNotify.Context = NULL;
}
if (HandlerType & ACPI_DEVICE_NOTIFY)
{
AcpiGbl_DeviceNotify.Node = NULL;
AcpiGbl_DeviceNotify.Handler = NULL;
AcpiGbl_DeviceNotify.Context = NULL;
}
goto UnlockAndExit;
}
/* All Other Objects */
/* All other objects: Are Notifies allowed on this object? */
else
if (!AcpiEvIsNotifyObject (Node))
{
/* Notifies allowed on this object? */
Status = AE_TYPE;
goto UnlockAndExit;
}
if (!AcpiEvIsNotifyObject (Node))
/* Must have an existing internal object */
ObjDesc = AcpiNsGetAttachedObject (Node);
if (!ObjDesc)
{
Status = AE_NOT_EXIST;
goto UnlockAndExit;
}
/* Internal object exists. Find the handler and remove it */
for (i = 0; i < ACPI_NUM_NOTIFY_TYPES; i++)
{
if (HandlerType & (i+1))
{
Status = AE_TYPE;
goto UnlockAndExit;
}
HandlerObj = ObjDesc->CommonNotify.NotifyList[i];
PreviousHandlerObj = NULL;
/* Check for an existing internal object */
/* Attempt to find the handler in the handler list */
ObjDesc = AcpiNsGetAttachedObject (Node);
if (!ObjDesc)
{
Status = AE_NOT_EXIST;
goto UnlockAndExit;
}
while (HandlerObj &&
(HandlerObj->Notify.Handler != Handler))
{
PreviousHandlerObj = HandlerObj;
HandlerObj = HandlerObj->Notify.Next[i];
}
/* Object exists - make sure there's an existing handler */
if (HandlerType & ACPI_SYSTEM_NOTIFY)
{
NotifyObj = ObjDesc->CommonNotify.SystemNotify;
if (!NotifyObj)
if (!HandlerObj)
{
Status = AE_NOT_EXIST;
goto UnlockAndExit;
}
if (NotifyObj->Notify.Handler != Handler)
/* Remove the handler object from the list */
if (PreviousHandlerObj) /* Handler is not at the list head */
{
Status = AE_BAD_PARAMETER;
goto UnlockAndExit;
PreviousHandlerObj->Notify.Next[i] =
HandlerObj->Notify.Next[i];
}
else /* Handler is at the list head */
{
ObjDesc->CommonNotify.NotifyList[i] =
HandlerObj->Notify.Next[i];
}
/* Remove the handler */
ObjDesc->CommonNotify.SystemNotify = NULL;
AcpiUtRemoveReference (NotifyObj);
}
if (HandlerType & ACPI_DEVICE_NOTIFY)
{
NotifyObj = ObjDesc->CommonNotify.DeviceNotify;
if (!NotifyObj)
{
Status = AE_NOT_EXIST;
goto UnlockAndExit;
}
if (NotifyObj->Notify.Handler != Handler)
{
Status = AE_BAD_PARAMETER;
goto UnlockAndExit;
}
/* Remove the handler */
ObjDesc->CommonNotify.DeviceNotify = NULL;
AcpiUtRemoveReference (NotifyObj);
AcpiUtRemoveReference (HandlerObj);
}
}

View File

@ -131,8 +131,8 @@ static ACPI_EXDUMP_INFO AcpiExDumpDevice[4] =
{
{ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpDevice), NULL},
{ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Device.Handler), "Handler"},
{ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Device.SystemNotify), "System Notify"},
{ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Device.DeviceNotify), "Device Notify"}
{ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Device.NotifyList[0]), "System Notify"},
{ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Device.NotifyList[1]), "Device Notify"}
};
static ACPI_EXDUMP_INFO AcpiExDumpEvent[2] =
@ -179,8 +179,8 @@ static ACPI_EXDUMP_INFO AcpiExDumpPower[5] =
{ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpPower), NULL},
{ACPI_EXD_UINT32, ACPI_EXD_OFFSET (PowerResource.SystemLevel), "System Level"},
{ACPI_EXD_UINT32, ACPI_EXD_OFFSET (PowerResource.ResourceOrder), "Resource Order"},
{ACPI_EXD_POINTER, ACPI_EXD_OFFSET (PowerResource.SystemNotify), "System Notify"},
{ACPI_EXD_POINTER, ACPI_EXD_OFFSET (PowerResource.DeviceNotify), "Device Notify"}
{ACPI_EXD_POINTER, ACPI_EXD_OFFSET (PowerResource.NotifyList[0]), "System Notify"},
{ACPI_EXD_POINTER, ACPI_EXD_OFFSET (PowerResource.NotifyList[1]), "Device Notify"}
};
static ACPI_EXDUMP_INFO AcpiExDumpProcessor[7] =
@ -189,16 +189,16 @@ static ACPI_EXDUMP_INFO AcpiExDumpProcessor[7] =
{ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Processor.ProcId), "Processor ID"},
{ACPI_EXD_UINT8 , ACPI_EXD_OFFSET (Processor.Length), "Length"},
{ACPI_EXD_ADDRESS, ACPI_EXD_OFFSET (Processor.Address), "Address"},
{ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Processor.SystemNotify), "System Notify"},
{ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Processor.DeviceNotify), "Device Notify"},
{ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Processor.NotifyList[0]), "System Notify"},
{ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Processor.NotifyList[1]), "Device Notify"},
{ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Processor.Handler), "Handler"}
};
static ACPI_EXDUMP_INFO AcpiExDumpThermal[4] =
{
{ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpThermal), NULL},
{ACPI_EXD_POINTER, ACPI_EXD_OFFSET (ThermalZone.SystemNotify), "System Notify"},
{ACPI_EXD_POINTER, ACPI_EXD_OFFSET (ThermalZone.DeviceNotify), "Device Notify"},
{ACPI_EXD_POINTER, ACPI_EXD_OFFSET (ThermalZone.NotifyList[0]), "System Notify"},
{ACPI_EXD_POINTER, ACPI_EXD_OFFSET (ThermalZone.NotifyList[1]), "Device Notify"},
{ACPI_EXD_POINTER, ACPI_EXD_OFFSET (ThermalZone.Handler), "Handler"}
};
@ -258,11 +258,15 @@ static ACPI_EXDUMP_INFO AcpiExDumpAddressHandler[6] =
{ACPI_EXD_POINTER, ACPI_EXD_OFFSET (AddressSpace.Context), "Context"}
};
static ACPI_EXDUMP_INFO AcpiExDumpNotify[3] =
static ACPI_EXDUMP_INFO AcpiExDumpNotify[7] =
{
{ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpNotify), NULL},
{ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Notify.Node), "Node"},
{ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Notify.Context), "Context"}
{ACPI_EXD_UINT32, ACPI_EXD_OFFSET (Notify.HandlerType), "Handler Type"},
{ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Notify.Handler), "Handler"},
{ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Notify.Context), "Context"},
{ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Notify.Next[0]), "Next System Notify"},
{ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Notify.Next[1]), "Next Device Notify"}
};
@ -1001,10 +1005,7 @@ AcpiExDumpPackageObj (
case ACPI_TYPE_STRING:
AcpiOsPrintf ("[String] Value: ");
for (i = 0; i < ObjDesc->String.Length; i++)
{
AcpiOsPrintf ("%c", ObjDesc->String.Pointer[i]);
}
AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX);
AcpiOsPrintf ("\n");
break;

View File

@ -132,7 +132,7 @@ AcpiHwExtendedSleep (
/* Clear wake status (WAK_STS) */
Status = AcpiWrite (ACPI_X_WAKE_STATUS, &AcpiGbl_FADT.SleepStatus);
Status = AcpiWrite ((UINT64) ACPI_X_WAKE_STATUS, &AcpiGbl_FADT.SleepStatus);
if (ACPI_FAILURE (Status))
{
return_ACPI_STATUS (Status);
@ -163,7 +163,7 @@ AcpiHwExtendedSleep (
SleepTypeValue = ((AcpiGbl_SleepTypeA << ACPI_X_SLEEP_TYPE_POSITION) &
ACPI_X_SLEEP_TYPE_MASK);
Status = AcpiWrite ((SleepTypeValue | ACPI_X_SLEEP_ENABLE),
Status = AcpiWrite ((UINT64) (SleepTypeValue | ACPI_X_SLEEP_ENABLE),
&AcpiGbl_FADT.SleepControl);
if (ACPI_FAILURE (Status))
{
@ -219,7 +219,7 @@ AcpiHwExtendedWakePrep (
SleepTypeValue = ((AcpiGbl_SleepTypeA << ACPI_X_SLEEP_TYPE_POSITION) &
ACPI_X_SLEEP_TYPE_MASK);
(void) AcpiWrite ((SleepTypeValue | ACPI_X_SLEEP_ENABLE),
(void) AcpiWrite ((UINT64) (SleepTypeValue | ACPI_X_SLEEP_ENABLE),
&AcpiGbl_FADT.SleepControl);
}
@ -269,7 +269,7 @@ AcpiHwExtendedWake (
* and use it to determine whether the system is rebooting or
* resuming. Clear WAK_STS for compatibility.
*/
(void) AcpiWrite (ACPI_X_WAKE_STATUS, &AcpiGbl_FADT.SleepStatus);
(void) AcpiWrite ((UINT64) ACPI_X_WAKE_STATUS, &AcpiGbl_FADT.SleepStatus);
AcpiGbl_SystemAwakeAndRunning = TRUE;
AcpiHwExecuteSleepMethod (METHOD_PATHNAME__SST, ACPI_SST_WORKING);

View File

@ -167,7 +167,7 @@ AcpiUtDeleteInternalObj (
case ACPI_TYPE_PROCESSOR:
case ACPI_TYPE_THERMAL:
/* Walk the notify handler list for this object */
/* Walk the address handler list for this object */
HandlerDesc = Object->CommonNotify.Handler;
while (HandlerDesc)
@ -523,6 +523,7 @@ AcpiUtUpdateObjectReference (
ACPI_STATUS Status = AE_OK;
ACPI_GENERIC_STATE *StateList = NULL;
ACPI_OPERAND_OBJECT *NextObject = NULL;
ACPI_OPERAND_OBJECT *PrevObject;
ACPI_GENERIC_STATE *State;
UINT32 i;
@ -552,10 +553,20 @@ AcpiUtUpdateObjectReference (
case ACPI_TYPE_POWER:
case ACPI_TYPE_THERMAL:
/* Update the notify objects for these types (if present) */
AcpiUtUpdateRefCount (Object->CommonNotify.SystemNotify, Action);
AcpiUtUpdateRefCount (Object->CommonNotify.DeviceNotify, Action);
/*
* Update the notify objects for these types (if present)
* Two lists, system and device notify handlers.
*/
for (i = 0; i < ACPI_NUM_NOTIFY_TYPES; i++)
{
PrevObject = Object->CommonNotify.NotifyList[i];
while (PrevObject)
{
NextObject = PrevObject->Notify.Next[i];
AcpiUtUpdateRefCount (PrevObject, Action);
PrevObject = NextObject;
}
}
break;
case ACPI_TYPE_PACKAGE:

View File

@ -287,8 +287,8 @@ AcpiUtInitGlobals (
/* Global handlers */
AcpiGbl_SystemNotify.Handler = NULL;
AcpiGbl_DeviceNotify.Handler = NULL;
AcpiGbl_GlobalNotify[0].Handler = NULL;
AcpiGbl_GlobalNotify[1].Handler = NULL;
AcpiGbl_ExceptionHandler = NULL;
AcpiGbl_InitHandler = NULL;
AcpiGbl_TableHandler = NULL;

View File

@ -633,21 +633,21 @@ AcpiUtDumpAllocations (
switch (ACPI_GET_DESCRIPTOR_TYPE (Descriptor))
{
case ACPI_DESC_TYPE_OPERAND:
if (Element->Size == sizeof (ACPI_DESC_TYPE_OPERAND))
if (Element->Size == sizeof (ACPI_OPERAND_OBJECT))
{
DescriptorType = ACPI_DESC_TYPE_OPERAND;
}
break;
case ACPI_DESC_TYPE_PARSER:
if (Element->Size == sizeof (ACPI_DESC_TYPE_PARSER))
if (Element->Size == sizeof (ACPI_PARSE_OBJECT))
{
DescriptorType = ACPI_DESC_TYPE_PARSER;
}
break;
case ACPI_DESC_TYPE_NAMED:
if (Element->Size == sizeof (ACPI_DESC_TYPE_NAMED))
if (Element->Size == sizeof (ACPI_NAMESPACE_NODE))
{
DescriptorType = ACPI_DESC_TYPE_NAMED;
}

View File

@ -254,8 +254,7 @@ ACPI_EXTERN ACPI_CACHE_T *AcpiGbl_OperandCache;
/* Global handlers */
ACPI_EXTERN ACPI_OBJECT_NOTIFY_HANDLER AcpiGbl_DeviceNotify;
ACPI_EXTERN ACPI_OBJECT_NOTIFY_HANDLER AcpiGbl_SystemNotify;
ACPI_EXTERN ACPI_GLOBAL_NOTIFY_HANDLER AcpiGbl_GlobalNotify[2];
ACPI_EXTERN ACPI_EXCEPTION_HANDLER AcpiGbl_ExceptionHandler;
ACPI_EXTERN ACPI_INIT_HANDLER AcpiGbl_InitHandler;
ACPI_EXTERN ACPI_TABLE_HANDLER AcpiGbl_TableHandler;

View File

@ -716,6 +716,15 @@ ACPI_STATUS (*ACPI_PARSE_UPWARDS) (
struct acpi_walk_state *WalkState);
/* Global handlers for AML Notifies */
typedef struct acpi_global_notify_handler
{
ACPI_NOTIFY_HANDLER Handler;
void *Context;
} ACPI_GLOBAL_NOTIFY_HANDLER;
/*
* Notify info - used to pass info to the deferred notify
* handler/dispatcher.
@ -723,8 +732,10 @@ ACPI_STATUS (*ACPI_PARSE_UPWARDS) (
typedef struct acpi_notify_info
{
ACPI_STATE_COMMON
UINT8 HandlerListId;
ACPI_NAMESPACE_NODE *Node;
union acpi_operand_object *HandlerObj;
union acpi_operand_object *HandlerListHead;
ACPI_GLOBAL_NOTIFY_HANDLER *Global;
} ACPI_NOTIFY_INFO;

View File

@ -246,8 +246,7 @@ typedef struct acpi_object_method
* Common fields for objects that support ASL notifications
*/
#define ACPI_COMMON_NOTIFY_INFO \
union acpi_operand_object *SystemNotify; /* Handler for system notifies */\
union acpi_operand_object *DeviceNotify; /* Handler for driver notifies */\
union acpi_operand_object *NotifyList[2]; /* Handlers for system/device notifies */\
union acpi_operand_object *Handler; /* Handler for Address space */
@ -389,8 +388,10 @@ typedef struct acpi_object_notify_handler
{
ACPI_OBJECT_COMMON_HEADER
ACPI_NAMESPACE_NODE *Node; /* Parent device */
ACPI_NOTIFY_HANDLER Handler;
UINT32 HandlerType; /* Type: Device/System/Both */
ACPI_NOTIFY_HANDLER Handler; /* Handler addess */
void *Context;
union acpi_operand_object *Next[2]; /* Device and System handler lists */
} ACPI_OBJECT_NOTIFY_HANDLER;

View File

@ -48,7 +48,7 @@
/* Current ACPICA subsystem version in YYYYMMDD format */
#define ACPI_CA_VERSION 0x20120320
#define ACPI_CA_VERSION 0x20120420
#include "acconfig.h"
#include "actypes.h"

View File

@ -708,10 +708,14 @@ typedef UINT32 ACPI_EVENT_STATUS;
#define ACPI_DEVICE_NOTIFY 0x2
#define ACPI_ALL_NOTIFY (ACPI_SYSTEM_NOTIFY | ACPI_DEVICE_NOTIFY)
#define ACPI_MAX_NOTIFY_HANDLER_TYPE 0x3
#define ACPI_NUM_NOTIFY_TYPES 2
#define ACPI_MAX_SYS_NOTIFY 0x7F
#define ACPI_MAX_DEVICE_SPECIFIC_NOTIFY 0xBF
#define ACPI_SYSTEM_HANDLER_LIST 0 /* Used as index, must be SYSTEM_NOTIFY -1 */
#define ACPI_DEVICE_HANDLER_LIST 1 /* Used as index, must be DEVICE_NOTIFY -1 */
/* Address Space (Operation Region) Types */

View File

@ -49,11 +49,23 @@
/* Local prototypes */
static void
AeNotifyHandler (
AeNotifyHandler1 (
ACPI_HANDLE Device,
UINT32 Value,
void *Context);
static void
AeNotifyHandler2 (
ACPI_HANDLE Device,
UINT32 Value,
void *Context);
static void
AeCommonNotifyHandler (
ACPI_HANDLE Device,
UINT32 Value,
UINT32 HandlerId);
static void
AeDeviceNotifyHandler (
ACPI_HANDLE Device,
@ -186,24 +198,51 @@ AeCtrlCHandler (
/******************************************************************************
*
* FUNCTION: AeNotifyHandler
* FUNCTION: AeNotifyHandler(s)
*
* PARAMETERS: Standard notify handler parameters
*
* RETURN: Status
*
* DESCRIPTION: System notify handler for AcpiExec utility. Used by the ASL
* DESCRIPTION: Notify handlers for AcpiExec utility. Used by the ASL
* test suite(s) to communicate errors and other information to
* this utility via the Notify() operator.
* this utility via the Notify() operator. Tests notify handling
* and multiple notify handler support.
*
*****************************************************************************/
static void
AeNotifyHandler (
ACPI_HANDLE Device,
UINT32 Value,
void *Context)
AeNotifyHandler1 (
ACPI_HANDLE Device,
UINT32 Value,
void *Context)
{
AeCommonNotifyHandler (Device, Value, 1);
}
static void
AeNotifyHandler2 (
ACPI_HANDLE Device,
UINT32 Value,
void *Context)
{
AeCommonNotifyHandler (Device, Value, 2);
}
static void
AeCommonNotifyHandler (
ACPI_HANDLE Device,
UINT32 Value,
UINT32 HandlerId)
{
char *Type;
Type = "Device";
if (Value <= ACPI_MAX_SYS_NOTIFY)
{
Type = "System";
}
switch (Value)
{
@ -237,12 +276,13 @@ AeNotifyHandler (
#endif
default:
printf ("[AcpiExec] Received a System Notify on [%4.4s] %p Value 0x%2.2X (%s)\n",
AcpiUtGetNodeName (Device), Device, Value,
printf ("[AcpiExec] Handler %u: Received a %s Notify on [%4.4s] %p Value 0x%2.2X (%s)\n",
HandlerId, Type, AcpiUtGetNodeName (Device), Device, Value,
AcpiUtGetNotifyName (Value));
if (AcpiGbl_DebugFile)
{
AcpiOsPrintf ("[AcpiExec] Received a system notify, Value 0x%2.2X\n", Value);
AcpiOsPrintf ("[AcpiExec] Handler %u: Received a %s notify, Value 0x%2.2X\n",
HandlerId, Type, Value);
}
(void) AcpiEvaluateObject (Device, "_NOT", NULL, NULL);
@ -251,6 +291,39 @@ AeNotifyHandler (
}
/******************************************************************************
*
* FUNCTION: AeSystemNotifyHandler
*
* PARAMETERS: Standard notify handler parameters
*
* RETURN: Status
*
* DESCRIPTION: System notify handler for AcpiExec utility. Used by the ASL
* test suite(s) to communicate errors and other information to
* this utility via the Notify() operator.
*
*****************************************************************************/
static void
AeSystemNotifyHandler (
ACPI_HANDLE Device,
UINT32 Value,
void *Context)
{
printf ("[AcpiExec] Global: Received a System Notify on [%4.4s] %p Value 0x%2.2X (%s)\n",
AcpiUtGetNodeName (Device), Device, Value,
AcpiUtGetNotifyName (Value));
if (AcpiGbl_DebugFile)
{
AcpiOsPrintf ("[AcpiExec] Global: Received a System Notify, Value 0x%2.2X\n", Value);
}
(void) AcpiEvaluateObject (Device, "_NOT", NULL, NULL);
}
/******************************************************************************
*
* FUNCTION: AeDeviceNotifyHandler
@ -272,12 +345,12 @@ AeDeviceNotifyHandler (
void *Context)
{
printf ("[AcpiExec] Received a Device Notify on [%4.4s] %p Value 0x%2.2X (%s)\n",
printf ("[AcpiExec] Global: Received a Device Notify on [%4.4s] %p Value 0x%2.2X (%s)\n",
AcpiUtGetNodeName (Device), Device, Value,
AcpiUtGetNotifyName (Value));
if (AcpiGbl_DebugFile)
{
AcpiOsPrintf ("[AcpiExec] Received a device notify, Value 0x%2.2X\n", Value);
AcpiOsPrintf ("[AcpiExec] Global: Received a Device Notify, Value 0x%2.2X\n", Value);
}
(void) AcpiEvaluateObject (Device, "_NOT", NULL, NULL);
@ -687,18 +760,18 @@ AeInstallEarlyHandlers (
AcpiFormatException (Status));
}
/* Install global notify handler */
/* Install global notify handlers */
Status = AcpiInstallNotifyHandler (ACPI_ROOT_OBJECT, ACPI_SYSTEM_NOTIFY,
AeNotifyHandler, NULL);
AeSystemNotifyHandler, NULL);
if (ACPI_FAILURE (Status))
{
printf ("Could not install a global notify handler, %s\n",
printf ("Could not install a global system notify handler, %s\n",
AcpiFormatException (Status));
}
Status = AcpiInstallNotifyHandler (ACPI_ROOT_OBJECT, ACPI_DEVICE_NOTIFY,
AeDeviceNotifyHandler, NULL);
AeDeviceNotifyHandler, NULL);
if (ACPI_FAILURE (Status))
{
printf ("Could not install a global notify handler, %s\n",
@ -709,7 +782,7 @@ AeInstallEarlyHandlers (
if (ACPI_SUCCESS (Status))
{
Status = AcpiInstallNotifyHandler (Handle, ACPI_SYSTEM_NOTIFY,
AeNotifyHandler, NULL);
AeNotifyHandler1, NULL);
if (ACPI_FAILURE (Status))
{
printf ("Could not install a notify handler, %s\n",
@ -717,7 +790,7 @@ AeInstallEarlyHandlers (
}
Status = AcpiRemoveNotifyHandler (Handle, ACPI_SYSTEM_NOTIFY,
AeNotifyHandler);
AeNotifyHandler1);
if (ACPI_FAILURE (Status))
{
printf ("Could not remove a notify handler, %s\n",
@ -725,20 +798,35 @@ AeInstallEarlyHandlers (
}
Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
AeNotifyHandler, NULL);
AeNotifyHandler1, NULL);
AE_CHECK_OK (AcpiInstallNotifyHandler, Status);
Status = AcpiRemoveNotifyHandler (Handle, ACPI_ALL_NOTIFY,
AeNotifyHandler);
AeNotifyHandler1);
AE_CHECK_OK (AcpiRemoveNotifyHandler, Status);
#if 0
Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
AeNotifyHandler, NULL);
AeNotifyHandler1, NULL);
if (ACPI_FAILURE (Status))
{
printf ("Could not install a notify handler, %s\n",
AcpiFormatException (Status));
}
#endif
/* Install two handlers for _SB_ */
Status = AcpiInstallNotifyHandler (Handle, ACPI_SYSTEM_NOTIFY,
AeNotifyHandler1, ACPI_CAST_PTR (void, 0x01234567));
Status = AcpiInstallNotifyHandler (Handle, ACPI_SYSTEM_NOTIFY,
AeNotifyHandler2, ACPI_CAST_PTR (void, 0x89ABCDEF));
/* Attempt duplicate handler installation, should fail */
Status = AcpiInstallNotifyHandler (Handle, ACPI_SYSTEM_NOTIFY,
AeNotifyHandler1, ACPI_CAST_PTR (void, 0x77777777));
Status = AcpiAttachData (Handle, AeAttachedDataHandler, Handle);
AE_CHECK_OK (AcpiAttachData, Status);
@ -755,6 +843,37 @@ AeInstallEarlyHandlers (
}
Status = AcpiGetHandle (NULL, "\\_TZ.TZ1", &Handle);
if (ACPI_SUCCESS (Status))
{
Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
AeNotifyHandler1, ACPI_CAST_PTR (void, 0x01234567));
Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
AeNotifyHandler2, ACPI_CAST_PTR (void, 0x89ABCDEF));
Status = AcpiRemoveNotifyHandler (Handle, ACPI_ALL_NOTIFY,
AeNotifyHandler1);
Status = AcpiRemoveNotifyHandler (Handle, ACPI_ALL_NOTIFY,
AeNotifyHandler2);
Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
AeNotifyHandler2, ACPI_CAST_PTR (void, 0x89ABCDEF));
Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
AeNotifyHandler1, ACPI_CAST_PTR (void, 0x01234567));
}
Status = AcpiGetHandle (NULL, "\\_PR.CPU0", &Handle);
if (ACPI_SUCCESS (Status))
{
Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
AeNotifyHandler1, ACPI_CAST_PTR (void, 0x01234567));
Status = AcpiInstallNotifyHandler (Handle, ACPI_SYSTEM_NOTIFY,
AeNotifyHandler2, ACPI_CAST_PTR (void, 0x89ABCDEF));
}
/*
* Install handlers that will override the default handlers for some of
* the space IDs.

View File

@ -229,6 +229,7 @@ ACPI_TYPED_IDENTIFIER_TABLE AcpiIdentifiers[] = {
{"ACPI_GENERIC_ADDRESS", SRC_TYPE_STRUCT},
{"ACPI_GENERIC_STATE", SRC_TYPE_UNION},
{"ACPI_GET_DEVICES_INFO", SRC_TYPE_STRUCT},
{"ACPI_GLOBAL_NOTIFY_HANDLER", SRC_TYPE_STRUCT},
{"ACPI_GPE_BLOCK_INFO", SRC_TYPE_STRUCT},
{"ACPI_GPE_CALLBACK", SRC_TYPE_SIMPLE},
{"ACPI_GPE_DEVICE_INFO", SRC_TYPE_STRUCT},

View File

@ -9322,6 +9322,7 @@ DefinitionBlock (
{
Store (SMIX, Local0)
Notify (\_SB_, 0x29)
If (And (Local0, 0x01))
{ Notify (\_SB_.SMIS, 0x21)}
@ -9336,6 +9337,17 @@ DefinitionBlock (
} // End Method EVNT
Method (NTFY)
{
Notify (\_SB_, 1)
Notify (\_TZ_.TZ1, 2)
Notify (\_PR_.CPU0, 3)
Notify (\_SB_, 0x81)
Notify (\_TZ_.TZ1, 0x82)
Notify (\_PR_.CPU0, 0x83)
}
Device (SMIS)
{
Method (BINK)
@ -9375,6 +9387,7 @@ DefinitionBlock (
// Expect EVNT to generate Notify value we just previously
// stored in BYTE
Store (0x20, BYTE)
EVNT ()
Store (0x21, BYTE)
@ -9384,6 +9397,7 @@ DefinitionBlock (
Store (0x23, BYTE)
EVNT ()
NTFY ()
Return (0) // pass
} // End Method TEST
} // Device SMIS