Import ACPICA 20090903
This commit is contained in:
parent
69f0585e84
commit
f8b5be9b37
73
changes.txt
73
changes.txt
@ -1,3 +1,76 @@
|
||||
----------------------------------------
|
||||
03 September 2009. Summary of changes for version 20090903:
|
||||
|
||||
This release is available at www.acpica.org/downloads
|
||||
|
||||
1) ACPI CA Core Subsystem:
|
||||
|
||||
For Windows Vista compatibility, added the automatic execution of an _INI
|
||||
method located at the namespace root (\_INI). This method is executed at
|
||||
table load time. This support is in addition to the automatic execution of
|
||||
\_SB._INI. Lin Ming.
|
||||
|
||||
Fixed a possible memory leak in the interpreter for AML package objects if
|
||||
the package initializer list is longer than the defined size of the package.
|
||||
This apparently can only happen if the BIOS changes the package size on the
|
||||
fly (seen in a _PSS object), as ASL compilers do not allow this. The
|
||||
interpreter will truncate the package to the defined size (and issue an error
|
||||
message), but previously could leave the extra objects undeleted if they were
|
||||
pre-created during the argument processing (such is the case if the package
|
||||
consists of a number of sub-packages as in the _PSS.) ACPICA BZ 805.
|
||||
|
||||
Fixed a problem seen when a Buffer or String is stored to itself via ASL.
|
||||
This has been reported in the field. Previously, ACPICA would zero out the
|
||||
buffer/string. Now, the operation is treated as a noop. Provides Windows
|
||||
compatibility. ACPICA BZ 803. Lin Ming.
|
||||
|
||||
Removed an extraneous error message for ASL constructs of the form
|
||||
Store(LocalX,LocalX) when LocalX is uninitialized. These curious statements
|
||||
are seen in many BIOSs and are once again treated as NOOPs and no error is
|
||||
emitted when they are encountered. ACPICA BZ 785.
|
||||
|
||||
Fixed an extraneous warning message if a _DSM reserved method returns a
|
||||
Package object. _DSM can return any type of object, so validation on the
|
||||
return type cannot be performed. ACPICA BZ 802.
|
||||
|
||||
Example Code and Data Size: These are the sizes for the OS-independent
|
||||
acpica.lib produced by the Microsoft Visual C++ 6.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: 85.5K Code, 18.0K Data, 103.5K Total
|
||||
Debug Version: 161.6K Code, 50.9K Data, 212.5K Total
|
||||
Current Release:
|
||||
Non-Debug Version: 85.6K Code, 18.0K Data, 103.6K Total
|
||||
Debug Version: 161.7K Code, 50.9K Data, 212.6K Total
|
||||
|
||||
2) iASL Compiler/Disassembler and Tools:
|
||||
|
||||
iASL: Fixed a problem with the use of the Alias operator and Resource
|
||||
Templates. The correct alias is now constructed and no error is emitted.
|
||||
ACPICA BZ 738.
|
||||
|
||||
iASL: Implemented the -I option to specify additional search directories for
|
||||
include files. Allows multiple additional search paths for include files.
|
||||
Directories are searched in the order specified on the command line (after
|
||||
the local directory is searched.) ACPICA BZ 800.
|
||||
|
||||
iASL: Fixed a problem where the full pathname for include files was not
|
||||
emitted for warnings/errors. This caused the IDE support to not work
|
||||
properly. ACPICA BZ 765.
|
||||
|
||||
iASL: Implemented the -@ option to specify a Windows-style response file
|
||||
containing additional command line options. ACPICA BZ 801.
|
||||
|
||||
AcpiExec: Added support to load multiple AML files simultaneously (such as a
|
||||
DSDT and multiple SSDTs). Also added support for wildcards within the AML
|
||||
pathname. These features allow all machine tables to be easily loaded and
|
||||
debugged together. ACPICA BZ 804.
|
||||
|
||||
Disassembler: Added missing support for disassembly of HEST table Error Bank
|
||||
subtables.
|
||||
|
||||
----------------------------------------
|
||||
30 July 2009. Summary of changes for version 20090730:
|
||||
|
||||
|
@ -747,6 +747,8 @@ AcpiDmDumpHest (
|
||||
UINT32 Offset = sizeof (ACPI_TABLE_HEST);
|
||||
ACPI_DMTABLE_INFO *InfoTable;
|
||||
UINT32 SubTableLength;
|
||||
UINT32 BankCount;
|
||||
ACPI_HEST_IA_ERROR_BANK *BankTable;
|
||||
|
||||
|
||||
/* Main table */
|
||||
@ -762,16 +764,21 @@ AcpiDmDumpHest (
|
||||
SubTable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Table, Offset);
|
||||
while (Offset < Table->Length)
|
||||
{
|
||||
BankCount = 0;
|
||||
switch (SubTable->Type)
|
||||
{
|
||||
case ACPI_HEST_TYPE_IA32_CHECK:
|
||||
InfoTable = AcpiDmTableInfoHest0;
|
||||
SubTableLength = sizeof (ACPI_HEST_IA_MACHINE_CHECK);
|
||||
BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK,
|
||||
SubTable))->NumHardwareBanks;
|
||||
break;
|
||||
|
||||
case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
|
||||
InfoTable = AcpiDmTableInfoHest1;
|
||||
SubTableLength = sizeof (ACPI_HEST_IA_CORRECTED);
|
||||
BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED,
|
||||
SubTable))->NumHardwareBanks;
|
||||
break;
|
||||
|
||||
case ACPI_HEST_TYPE_IA32_NMI:
|
||||
@ -814,9 +821,34 @@ AcpiDmDumpHest (
|
||||
return;
|
||||
}
|
||||
|
||||
/* Point to next sub-table (each subtable is of fixed length) */
|
||||
/* Point to end of current subtable (each subtable above is of fixed length) */
|
||||
|
||||
Offset += SubTableLength;
|
||||
|
||||
/* If there are any (fixed-length) Error Banks from above, dump them now */
|
||||
|
||||
if (BankCount)
|
||||
{
|
||||
BankTable = ACPI_ADD_PTR (ACPI_HEST_IA_ERROR_BANK, SubTable, SubTableLength);
|
||||
SubTableLength += BankCount * sizeof (ACPI_HEST_IA_ERROR_BANK);
|
||||
|
||||
while (BankCount)
|
||||
{
|
||||
AcpiOsPrintf ("\n");
|
||||
Status = AcpiDmDumpTable (Length, Offset, BankTable,
|
||||
sizeof (ACPI_HEST_IA_ERROR_BANK), AcpiDmTableInfoHestBank);
|
||||
if (ACPI_FAILURE (Status))
|
||||
{
|
||||
return;
|
||||
}
|
||||
Offset += sizeof (ACPI_HEST_IA_ERROR_BANK);
|
||||
BankTable++;
|
||||
BankCount--;
|
||||
}
|
||||
}
|
||||
|
||||
/* Point to next sub-table */
|
||||
|
||||
SubTable = ACPI_ADD_PTR (ACPI_HEST_HEADER, SubTable, SubTableLength);
|
||||
}
|
||||
}
|
||||
|
@ -178,6 +178,7 @@
|
||||
#define ACPI_HEST8_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_HEST_AER_BRIDGE,f)
|
||||
#define ACPI_HEST9_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_HEST_GENERIC,f)
|
||||
#define ACPI_HESTN_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_HEST_NOTIFY,f)
|
||||
#define ACPI_HESTB_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_HEST_IA_ERROR_BANK,f)
|
||||
#define ACPI_IVRSH_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_IVRS_HEADER,f)
|
||||
#define ACPI_IVRS0_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_IVRS_HARDWARE,f)
|
||||
#define ACPI_IVRS1_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_IVRS_MEMORY,f)
|
||||
@ -905,6 +906,25 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoHestNotify[] =
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* IA32 Error Bank(s) - Follows the ACPI_HEST_IA_MACHINE_CHECK and
|
||||
* ACPI_HEST_IA_CORRECTED structures.
|
||||
*/
|
||||
ACPI_DMTABLE_INFO AcpiDmTableInfoHestBank[] =
|
||||
{
|
||||
{ACPI_DMT_UINT8, ACPI_HESTB_OFFSET (BankNumber), "Bank Number"},
|
||||
{ACPI_DMT_UINT8, ACPI_HESTB_OFFSET (ClearStatusOnInit), "Clear Status On Init"},
|
||||
{ACPI_DMT_UINT8, ACPI_HESTB_OFFSET (StatusFormat), "Status Format"},
|
||||
{ACPI_DMT_UINT8, ACPI_HESTB_OFFSET (Reserved), "Reserved"},
|
||||
{ACPI_DMT_UINT32, ACPI_HESTB_OFFSET (ControlRegister), "Control Register"},
|
||||
{ACPI_DMT_UINT64, ACPI_HESTB_OFFSET (ControlData), "Control Data"},
|
||||
{ACPI_DMT_UINT32, ACPI_HESTB_OFFSET (StatusRegister), "Status Register"},
|
||||
{ACPI_DMT_UINT32, ACPI_HESTB_OFFSET (AddressRegister), "Address Register"},
|
||||
{ACPI_DMT_UINT32, ACPI_HESTB_OFFSET (MiscRegister), "Misc Register"},
|
||||
{ACPI_DMT_EXIT, 0, NULL}
|
||||
};
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* HPET - High Precision Event Timer table
|
||||
|
@ -555,6 +555,10 @@ void
|
||||
AslAbort (
|
||||
void);
|
||||
|
||||
void
|
||||
FlAddIncludeDirectory (
|
||||
char *Dir);
|
||||
|
||||
void
|
||||
FlOpenIncludeFile (
|
||||
ACPI_PARSE_OBJECT *Op);
|
||||
|
@ -128,10 +128,11 @@ FlOpenFile (
|
||||
char *Filename,
|
||||
char *Mode);
|
||||
|
||||
static FILE *
|
||||
FlOpenLocalFile (
|
||||
char *LocalName,
|
||||
char *Mode);
|
||||
FILE *
|
||||
FlOpenIncludeWithPrefix (
|
||||
char *PrefixDir,
|
||||
char *Filename);
|
||||
|
||||
|
||||
#ifdef ACPI_OBSOLETE_FUNCTIONS
|
||||
ACPI_STATUS
|
||||
@ -170,45 +171,6 @@ AslAbort (
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: FlOpenLocalFile
|
||||
*
|
||||
* PARAMETERS: LocalName - Single filename (not a pathname)
|
||||
* Mode - Open mode for fopen
|
||||
*
|
||||
* RETURN: File descriptor
|
||||
*
|
||||
* DESCRIPTION: Build a complete pathname for the input filename and open
|
||||
* the file.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static FILE *
|
||||
FlOpenLocalFile (
|
||||
char *LocalName,
|
||||
char *Mode)
|
||||
{
|
||||
|
||||
StringBuffer[0] = 0;
|
||||
|
||||
/* Check for an absolute pathname */
|
||||
|
||||
if ((LocalName[0] != '/') && /* Forward slash */
|
||||
(LocalName[0] != '\\') && /* backslash (Win) */
|
||||
(LocalName[1] != ':')) /* Device name (Win) */
|
||||
{
|
||||
/* The include file path is relative, prepend the directory path */
|
||||
|
||||
strcat (StringBuffer, Gbl_DirectoryPath);
|
||||
}
|
||||
strcat (StringBuffer, LocalName);
|
||||
|
||||
DbgPrint (ASL_PARSE_OUTPUT, "FlOpenLocalFile: %s\n", StringBuffer);
|
||||
return (fopen (StringBuffer, (const char *) Mode));
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: FlFileError
|
||||
@ -479,6 +441,122 @@ FlSetLineNumber (
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: FlAddIncludeDirectory
|
||||
*
|
||||
* PARAMETERS: Dir - Directory pathname string
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Add a directory the list of include prefix directories.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void
|
||||
FlAddIncludeDirectory (
|
||||
char *Dir)
|
||||
{
|
||||
ASL_INCLUDE_DIR *NewDir;
|
||||
ASL_INCLUDE_DIR *NextDir;
|
||||
ASL_INCLUDE_DIR *PrevDir = NULL;
|
||||
UINT32 NeedsSeparator = 0;
|
||||
size_t DirLength;
|
||||
|
||||
|
||||
DirLength = strlen (Dir);
|
||||
if (!DirLength)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
/* Make sure that the pathname ends with a path separator */
|
||||
|
||||
if ((Dir[DirLength-1] != '/') &&
|
||||
(Dir[DirLength-1] != '\\'))
|
||||
{
|
||||
NeedsSeparator = 1;
|
||||
}
|
||||
|
||||
NewDir = ACPI_ALLOCATE_ZEROED (sizeof (ASL_INCLUDE_DIR));
|
||||
NewDir->Dir = ACPI_ALLOCATE (DirLength + 1 + NeedsSeparator);
|
||||
strcpy (NewDir->Dir, Dir);
|
||||
if (NeedsSeparator)
|
||||
{
|
||||
strcat (NewDir->Dir, "/");
|
||||
}
|
||||
|
||||
/*
|
||||
* Preserve command line ordering of -I options by adding new elements
|
||||
* at the end of the list
|
||||
*/
|
||||
NextDir = Gbl_IncludeDirList;
|
||||
while (NextDir)
|
||||
{
|
||||
PrevDir = NextDir;
|
||||
NextDir = NextDir->Next;
|
||||
}
|
||||
|
||||
if (PrevDir)
|
||||
{
|
||||
PrevDir->Next = NewDir;
|
||||
}
|
||||
else
|
||||
{
|
||||
Gbl_IncludeDirList = NewDir;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: FlOpenIncludeWithPrefix
|
||||
*
|
||||
* PARAMETERS: PrefixDir - Prefix directory pathname. Can be a zero
|
||||
* length string.
|
||||
* Filename - The include filename from the source ASL.
|
||||
*
|
||||
* RETURN: Valid file descriptor if successful. Null otherwise.
|
||||
*
|
||||
* DESCRIPTION: Open an include file and push it on the input file stack.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
FILE *
|
||||
FlOpenIncludeWithPrefix (
|
||||
char *PrefixDir,
|
||||
char *Filename)
|
||||
{
|
||||
FILE *IncludeFile;
|
||||
char *Pathname;
|
||||
|
||||
|
||||
/* Build the full pathname to the file */
|
||||
|
||||
Pathname = ACPI_ALLOCATE (strlen (PrefixDir) + strlen (Filename) + 1);
|
||||
|
||||
strcpy (Pathname, PrefixDir);
|
||||
strcat (Pathname, Filename);
|
||||
|
||||
DbgPrint (ASL_PARSE_OUTPUT, "\nAttempt to open include file: path %s\n\n",
|
||||
Pathname);
|
||||
|
||||
/* Attempt to open the file, push if successful */
|
||||
|
||||
IncludeFile = fopen (Pathname, "r");
|
||||
if (IncludeFile)
|
||||
{
|
||||
/* Push the include file on the open input file stack */
|
||||
|
||||
AslPushInputFileStack (IncludeFile, Pathname);
|
||||
return (IncludeFile);
|
||||
}
|
||||
|
||||
ACPI_FREE (Pathname);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: FlOpenIncludeFile
|
||||
@ -495,7 +573,8 @@ void
|
||||
FlOpenIncludeFile (
|
||||
ACPI_PARSE_OBJECT *Op)
|
||||
{
|
||||
FILE *IncFile;
|
||||
FILE *IncludeFile;
|
||||
ASL_INCLUDE_DIR *NextDir;
|
||||
|
||||
|
||||
/* Op must be valid */
|
||||
@ -518,21 +597,58 @@ FlOpenIncludeFile (
|
||||
FlPrintFile (ASL_FILE_SOURCE_OUTPUT, "\n");
|
||||
Gbl_CurrentLineOffset++;
|
||||
|
||||
/* Prepend the directory pathname and open the include file */
|
||||
|
||||
DbgPrint (ASL_PARSE_OUTPUT, "\nOpen include file: path %s\n\n",
|
||||
Op->Asl.Value.String);
|
||||
IncFile = FlOpenLocalFile (Op->Asl.Value.String, "r");
|
||||
if (!IncFile)
|
||||
/* Attempt to open the include file */
|
||||
|
||||
/* If the file specifies an absolute path, just open it */
|
||||
|
||||
if ((Op->Asl.Value.String[0] == '/') ||
|
||||
(Op->Asl.Value.String[0] == '\\') ||
|
||||
(Op->Asl.Value.String[1] == ':'))
|
||||
{
|
||||
sprintf (MsgBuffer, "%s (%s)", Op->Asl.Value.String, strerror (errno));
|
||||
AslError (ASL_ERROR, ASL_MSG_INCLUDE_FILE_OPEN, Op, MsgBuffer);
|
||||
IncludeFile = FlOpenIncludeWithPrefix ("", Op->Asl.Value.String);
|
||||
if (!IncludeFile)
|
||||
{
|
||||
goto ErrorExit;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
/* Push the include file on the open input file stack */
|
||||
/*
|
||||
* The include filename is not an absolute path.
|
||||
*
|
||||
* First, search for the file within the "local" directory -- meaning
|
||||
* the same directory that contains the source file.
|
||||
*
|
||||
* Construct the file pathname from the global directory name.
|
||||
*/
|
||||
IncludeFile = FlOpenIncludeWithPrefix (Gbl_DirectoryPath, Op->Asl.Value.String);
|
||||
if (IncludeFile)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
AslPushInputFileStack (IncFile, Op->Asl.Value.String);
|
||||
/*
|
||||
* Second, search for the file within the (possibly multiple) directories
|
||||
* specified by the -I option on the command line.
|
||||
*/
|
||||
NextDir = Gbl_IncludeDirList;
|
||||
while (NextDir)
|
||||
{
|
||||
IncludeFile = FlOpenIncludeWithPrefix (NextDir->Dir, Op->Asl.Value.String);
|
||||
if (IncludeFile)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
NextDir = NextDir->Next;
|
||||
}
|
||||
|
||||
/* We could not open the include file after trying very hard */
|
||||
|
||||
ErrorExit:
|
||||
sprintf (MsgBuffer, "%s, %s", Op->Asl.Value.String, strerror (errno));
|
||||
AslError (ASL_ERROR, ASL_MSG_INCLUDE_FILE_OPEN, Op, MsgBuffer);
|
||||
}
|
||||
|
||||
|
||||
|
@ -148,7 +148,7 @@ extern char HexLookup[];
|
||||
#define ASL_LINE_BUFFER_SIZE 512
|
||||
#define ASL_MSG_BUFFER_SIZE 4096
|
||||
#define HEX_TABLE_LINE_SIZE 8
|
||||
#define HEX_LISTING_LINE_SIZE 16
|
||||
#define HEX_LISTING_LINE_SIZE 8
|
||||
|
||||
|
||||
/* Source code buffers and pointers for error reporting */
|
||||
@ -212,6 +212,7 @@ ASL_EXTERN char *Gbl_DirectoryPath;
|
||||
ASL_EXTERN char ASL_INIT_GLOBAL (*Gbl_ExternalFilename, NULL);
|
||||
ASL_EXTERN char ASL_INIT_GLOBAL (*Gbl_IncludeFilename, NULL);
|
||||
ASL_EXTERN char ASL_INIT_GLOBAL (*Gbl_OutputFilenamePrefix, NULL);
|
||||
ASL_EXTERN ASL_INCLUDE_DIR ASL_INIT_GLOBAL (*Gbl_IncludeDirList, NULL);
|
||||
ASL_EXTERN char *Gbl_CurrentInputFilename;
|
||||
|
||||
ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_HasIncludeFiles, FALSE);
|
||||
|
@ -353,6 +353,7 @@ LdLoadResourceElements (
|
||||
|
||||
Node->Value = (UINT32) Op->Asl.Value.Integer;
|
||||
Node->Op = Op;
|
||||
Op->Asl.Node = Node;
|
||||
|
||||
/*
|
||||
* Now enter the predefined fields, for easy lookup when referenced
|
||||
|
@ -150,6 +150,28 @@ AslCommandLine (
|
||||
int argc,
|
||||
char **argv);
|
||||
|
||||
static int
|
||||
AslDoOptions (
|
||||
int argc,
|
||||
char **argv,
|
||||
BOOLEAN IsResponseFile);
|
||||
|
||||
static void
|
||||
AslMergeOptionTokens (
|
||||
char *InBuffer,
|
||||
char *OutBuffer);
|
||||
|
||||
static int
|
||||
AslDoResponseFile (
|
||||
char *Filename);
|
||||
|
||||
extern int AcpiGbl_Opterr;
|
||||
extern int AcpiGbl_Optind;
|
||||
|
||||
|
||||
#define ASL_TOKEN_SEPARATORS " \t\n"
|
||||
#define ASL_SUPPORTED_OPTIONS "@:2b:cd^e:fgh^i^I:l^o:p:r:s:t:v:w:x:"
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
@ -168,8 +190,12 @@ Options (
|
||||
void)
|
||||
{
|
||||
|
||||
printf ("General Output:\n");
|
||||
printf (" -p <prefix> Specify path/filename prefix for all output files\n");
|
||||
printf ("Global:\n");
|
||||
printf (" -@<file> Specify command file\n");
|
||||
printf (" -I<dir> Specify additional include directory\n");
|
||||
|
||||
printf ("\nGeneral Output:\n");
|
||||
printf (" -p<prefix> Specify path/filename prefix for all output files\n");
|
||||
printf (" -va Disable all errors and warnings (summary only)\n");
|
||||
printf (" -vi Less verbose errors and warnings for use with IDEs\n");
|
||||
printf (" -vo Enable optimization comments\n");
|
||||
@ -310,39 +336,149 @@ AslInitialize (
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: AslCommandLine
|
||||
* FUNCTION: AslMergeOptionTokens
|
||||
*
|
||||
* PARAMETERS: argc/argv
|
||||
* PARAMETERS: InBuffer - Input containing an option string
|
||||
* OutBuffer - Merged output buffer
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Command line processing
|
||||
* DESCRIPTION: Remove all whitespace from an option string.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static void
|
||||
AslMergeOptionTokens (
|
||||
char *InBuffer,
|
||||
char *OutBuffer)
|
||||
{
|
||||
char *Token;
|
||||
|
||||
|
||||
*OutBuffer = 0;
|
||||
|
||||
Token = strtok (InBuffer, ASL_TOKEN_SEPARATORS);
|
||||
while (Token)
|
||||
{
|
||||
strcat (OutBuffer, Token);
|
||||
Token = strtok (NULL, ASL_TOKEN_SEPARATORS);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: AslDoResponseFile
|
||||
*
|
||||
* PARAMETERS: Filename - Name of the response file
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Open a response file and process all options within.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static int
|
||||
AslCommandLine (
|
||||
int argc,
|
||||
char **argv)
|
||||
AslDoResponseFile (
|
||||
char *Filename)
|
||||
{
|
||||
char *argv = StringBuffer2;
|
||||
FILE *ResponseFile;
|
||||
int OptStatus = 0;
|
||||
int Opterr;
|
||||
int Optind;
|
||||
|
||||
|
||||
ResponseFile = fopen (Filename, "r");
|
||||
if (!ResponseFile)
|
||||
{
|
||||
printf ("Could not open command file %s, %s\n",
|
||||
Filename, strerror (errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Must save the current GetOpt globals */
|
||||
|
||||
Opterr = AcpiGbl_Opterr;
|
||||
Optind = AcpiGbl_Optind;
|
||||
|
||||
/*
|
||||
* Process all lines in the response file. There must be one complete
|
||||
* option per line
|
||||
*/
|
||||
while (fgets (StringBuffer, ASL_MSG_BUFFER_SIZE, ResponseFile))
|
||||
{
|
||||
/* Compress all tokens, allowing us to use a single argv entry */
|
||||
|
||||
AslMergeOptionTokens (StringBuffer, StringBuffer2);
|
||||
|
||||
/* Process the option */
|
||||
|
||||
AcpiGbl_Opterr = 0;
|
||||
AcpiGbl_Optind = 0;
|
||||
|
||||
OptStatus = AslDoOptions (1, &argv, TRUE);
|
||||
if (OptStatus)
|
||||
{
|
||||
printf ("Invalid option in command file %s: %s\n",
|
||||
Filename, StringBuffer);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Restore the GetOpt globals */
|
||||
|
||||
AcpiGbl_Opterr = Opterr;
|
||||
AcpiGbl_Optind = Optind;
|
||||
|
||||
fclose (ResponseFile);
|
||||
return (OptStatus);
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: AslDoOptions
|
||||
*
|
||||
* PARAMETERS: argc/argv - Standard argc/argv
|
||||
* IsResponseFile - TRUE if executing a response file.
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Command line option processing
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static int
|
||||
AslDoOptions (
|
||||
int argc,
|
||||
char **argv,
|
||||
BOOLEAN IsResponseFile)
|
||||
{
|
||||
BOOLEAN BadCommandLine = FALSE;
|
||||
int j;
|
||||
|
||||
|
||||
/* Minimum command line contains at least one option or an input file */
|
||||
|
||||
if (argc < 2)
|
||||
{
|
||||
AslCompilerSignon (ASL_FILE_STDOUT);
|
||||
Usage ();
|
||||
exit (1);
|
||||
}
|
||||
|
||||
/* Get the command line options */
|
||||
|
||||
while ((j = AcpiGetopt (argc, argv, "2b:cd^e:fgh^i^l^o:p:r:s:t:v:w:x:")) != EOF) switch (j)
|
||||
while ((j = AcpiGetopt (argc, argv, ASL_SUPPORTED_OPTIONS)) != EOF) switch (j)
|
||||
{
|
||||
case '@': /* Begin a response file */
|
||||
|
||||
if (IsResponseFile)
|
||||
{
|
||||
printf ("Nested command files are not supported\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (AslDoResponseFile (AcpiGbl_Optarg))
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case '2':
|
||||
|
||||
Gbl_Acpi2 = TRUE;
|
||||
break;
|
||||
|
||||
@ -364,8 +500,7 @@ AslCommandLine (
|
||||
|
||||
default:
|
||||
printf ("Unknown option: -b%s\n", AcpiGbl_Optarg);
|
||||
BadCommandLine = TRUE;
|
||||
break;
|
||||
return (-1);
|
||||
}
|
||||
|
||||
/* Produce debug output file */
|
||||
@ -394,8 +529,7 @@ AslCommandLine (
|
||||
|
||||
default:
|
||||
printf ("Unknown option: -d%s\n", AcpiGbl_Optarg);
|
||||
BadCommandLine = TRUE;
|
||||
break;
|
||||
return (-1);
|
||||
}
|
||||
|
||||
Gbl_DisasmFlag = TRUE;
|
||||
@ -444,12 +578,17 @@ AslCommandLine (
|
||||
|
||||
default:
|
||||
printf ("Unknown option: -h%s\n", AcpiGbl_Optarg);
|
||||
BadCommandLine = TRUE;
|
||||
break;
|
||||
return (-1);
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case 'I': /* Add an include file search directory */
|
||||
|
||||
FlAddIncludeDirectory (AcpiGbl_Optarg);
|
||||
break;
|
||||
|
||||
|
||||
case 'i':
|
||||
|
||||
switch (AcpiGbl_Optarg[0])
|
||||
@ -470,8 +609,7 @@ AslCommandLine (
|
||||
|
||||
default:
|
||||
printf ("Unknown option: -s%s\n", AcpiGbl_Optarg);
|
||||
BadCommandLine = TRUE;
|
||||
break;
|
||||
return (-1);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -500,8 +638,7 @@ AslCommandLine (
|
||||
|
||||
default:
|
||||
printf ("Unknown option: -l%s\n", AcpiGbl_Optarg);
|
||||
BadCommandLine = TRUE;
|
||||
break;
|
||||
return (-1);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -549,8 +686,7 @@ AslCommandLine (
|
||||
|
||||
default:
|
||||
printf ("Unknown option: -c%s\n", AcpiGbl_Optarg);
|
||||
BadCommandLine = TRUE;
|
||||
break;
|
||||
return (-1);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -589,8 +725,7 @@ AslCommandLine (
|
||||
|
||||
default:
|
||||
printf ("Unknown option: -s%s\n", AcpiGbl_Optarg);
|
||||
BadCommandLine = TRUE;
|
||||
break;
|
||||
return (-1);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -611,8 +746,7 @@ AslCommandLine (
|
||||
|
||||
default:
|
||||
printf ("Unknown option: -t%s\n", AcpiGbl_Optarg);
|
||||
BadCommandLine = TRUE;
|
||||
break;
|
||||
return (-1);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -647,8 +781,7 @@ AslCommandLine (
|
||||
|
||||
default:
|
||||
printf ("Unknown option: -v%s\n", AcpiGbl_Optarg);
|
||||
BadCommandLine = TRUE;
|
||||
break;
|
||||
return (-1);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -671,8 +804,7 @@ AslCommandLine (
|
||||
|
||||
default:
|
||||
printf ("Unknown option: -w%s\n", AcpiGbl_Optarg);
|
||||
BadCommandLine = TRUE;
|
||||
break;
|
||||
return (-1);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -685,10 +817,46 @@ AslCommandLine (
|
||||
|
||||
default:
|
||||
|
||||
BadCommandLine = TRUE;
|
||||
break;
|
||||
return (-1);
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: AslCommandLine
|
||||
*
|
||||
* PARAMETERS: argc/argv
|
||||
*
|
||||
* RETURN: Last argv index
|
||||
*
|
||||
* DESCRIPTION: Command line processing
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static int
|
||||
AslCommandLine (
|
||||
int argc,
|
||||
char **argv)
|
||||
{
|
||||
int BadCommandLine = 0;
|
||||
|
||||
|
||||
/* Minimum command line contains at least the command and an input file */
|
||||
|
||||
if (argc < 2)
|
||||
{
|
||||
AslCompilerSignon (ASL_FILE_STDOUT);
|
||||
Usage ();
|
||||
exit (1);
|
||||
}
|
||||
|
||||
/* Process all command line options */
|
||||
|
||||
BadCommandLine = AslDoOptions (argc, argv, FALSE);
|
||||
|
||||
/* Next parameter must be the input filename */
|
||||
|
||||
if (!argv[AcpiGbl_Optind] &&
|
||||
|
@ -255,6 +255,14 @@ typedef enum
|
||||
#define ASL_NUM_FILES (ASL_MAX_FILE_TYPE + 1)
|
||||
|
||||
|
||||
typedef struct asl_include_dir
|
||||
{
|
||||
char *Dir;
|
||||
struct asl_include_dir *Next;
|
||||
|
||||
} ASL_INCLUDE_DIR;
|
||||
|
||||
|
||||
/* An entry in the exception list, one for each error/warning */
|
||||
|
||||
typedef struct asl_error_msg
|
||||
|
@ -548,9 +548,10 @@ AcpiDsMethodDataGetValue (
|
||||
|
||||
case ACPI_REFCLASS_LOCAL:
|
||||
|
||||
ACPI_ERROR ((AE_INFO,
|
||||
"Uninitialized Local[%d] at node %p", Index, Node));
|
||||
|
||||
/*
|
||||
* No error message for this case, will be trapped again later to
|
||||
* detect and ignore cases of Store(LocalX,LocalX)
|
||||
*/
|
||||
return_ACPI_STATUS (AE_AML_UNINITIALIZED_LOCAL);
|
||||
|
||||
default:
|
||||
|
@ -570,15 +570,28 @@ AcpiDsBuildInternalPackageObj (
|
||||
{
|
||||
/*
|
||||
* NumElements was exhausted, but there are remaining elements in the
|
||||
* PackageList.
|
||||
* PackageList. Truncate the package to NumElements.
|
||||
*
|
||||
* Note: technically, this is an error, from ACPI spec: "It is an error
|
||||
* for NumElements to be less than the number of elements in the
|
||||
* PackageList". However, for now, we just print an error message and
|
||||
* no exception is returned.
|
||||
* PackageList". However, we just print an error message and
|
||||
* no exception is returned. This provides Windows compatibility. Some
|
||||
* BIOSs will alter the NumElements on the fly, creating this type
|
||||
* of ill-formed package object.
|
||||
*/
|
||||
while (Arg)
|
||||
{
|
||||
/*
|
||||
* We must delete any package elements that were created earlier
|
||||
* and are not going to be used because of the package truncation.
|
||||
*/
|
||||
if (Arg->Common.Node)
|
||||
{
|
||||
AcpiUtRemoveReference (
|
||||
ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Arg->Common.Node));
|
||||
Arg->Common.Node = NULL;
|
||||
}
|
||||
|
||||
/* Find out how many elements there really are */
|
||||
|
||||
i++;
|
||||
@ -586,7 +599,7 @@ AcpiDsBuildInternalPackageObj (
|
||||
}
|
||||
|
||||
ACPI_ERROR ((AE_INFO,
|
||||
"Package List length (%X) larger than NumElements count (%X), truncated\n",
|
||||
"Package List length (0x%X) larger than NumElements count (0x%X), truncated\n",
|
||||
i, ElementCount));
|
||||
}
|
||||
else if (i < ElementCount)
|
||||
@ -596,7 +609,7 @@ AcpiDsBuildInternalPackageObj (
|
||||
* Note: this is not an error, the package is padded out with NULLs.
|
||||
*/
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
|
||||
"Package List length (%X) smaller than NumElements count (%X), padded with null elements\n",
|
||||
"Package List length (0x%X) smaller than NumElements count (0x%X), padded with null elements\n",
|
||||
i, ElementCount));
|
||||
}
|
||||
|
||||
|
@ -150,6 +150,13 @@ AcpiExStoreBufferToBuffer (
|
||||
ACPI_FUNCTION_TRACE_PTR (ExStoreBufferToBuffer, SourceDesc);
|
||||
|
||||
|
||||
/* If Source and Target are the same, just return */
|
||||
|
||||
if (SourceDesc == TargetDesc)
|
||||
{
|
||||
return_ACPI_STATUS (AE_OK);
|
||||
}
|
||||
|
||||
/* We know that SourceDesc is a buffer by now */
|
||||
|
||||
Buffer = ACPI_CAST_PTR (UINT8, SourceDesc->Buffer.Pointer);
|
||||
@ -248,6 +255,13 @@ AcpiExStoreStringToString (
|
||||
ACPI_FUNCTION_TRACE_PTR (ExStoreStringToString, SourceDesc);
|
||||
|
||||
|
||||
/* If Source and Target are the same, just return */
|
||||
|
||||
if (SourceDesc == TargetDesc)
|
||||
{
|
||||
return_ACPI_STATUS (AE_OK);
|
||||
}
|
||||
|
||||
/* We know that SourceDesc is a string by now */
|
||||
|
||||
Buffer = ACPI_CAST_PTR (UINT8, SourceDesc->String.Pointer);
|
||||
|
@ -273,6 +273,7 @@ extern ACPI_DMTABLE_INFO AcpiDmTableInfoHest7[];
|
||||
extern ACPI_DMTABLE_INFO AcpiDmTableInfoHest8[];
|
||||
extern ACPI_DMTABLE_INFO AcpiDmTableInfoHest9[];
|
||||
extern ACPI_DMTABLE_INFO AcpiDmTableInfoHestNotify[];
|
||||
extern ACPI_DMTABLE_INFO AcpiDmTableInfoHestBank[];
|
||||
extern ACPI_DMTABLE_INFO AcpiDmTableInfoHpet[];
|
||||
extern ACPI_DMTABLE_INFO AcpiDmTableInfoIvrs[];
|
||||
extern ACPI_DMTABLE_INFO AcpiDmTableInfoIvrs0[];
|
||||
|
@ -1127,6 +1127,9 @@ typedef struct acpi_bit_register_info
|
||||
#define ACPI_OSI_WIN_XP_SP2 0x05
|
||||
#define ACPI_OSI_WINSRV_2003_SP1 0x06
|
||||
#define ACPI_OSI_WIN_VISTA 0x07
|
||||
#define ACPI_OSI_WINSRV_2008 0x08
|
||||
#define ACPI_OSI_WIN_VISTA_SP1 0x09
|
||||
#define ACPI_OSI_WIN_7 0x0A
|
||||
|
||||
#define ACPI_ALWAYS_ILLEGAL 0x00
|
||||
|
||||
|
@ -120,7 +120,7 @@
|
||||
|
||||
/* Current ACPICA subsystem version in YYYYMMDD format */
|
||||
|
||||
#define ACPI_CA_VERSION 0x20090730
|
||||
#define ACPI_CA_VERSION 0x20090903
|
||||
|
||||
#include "actypes.h"
|
||||
#include "actbl.h"
|
||||
|
@ -264,6 +264,22 @@ AcpiNsInitializeDevices (
|
||||
goto ErrorExit;
|
||||
}
|
||||
|
||||
/*
|
||||
* Execute the "global" _INI method that may appear at the root. This
|
||||
* support is provided for Windows compatibility (Vista+) and is not
|
||||
* part of the ACPI specification.
|
||||
*/
|
||||
Info.EvaluateInfo->PrefixNode = AcpiGbl_RootNode;
|
||||
Info.EvaluateInfo->Pathname = METHOD_NAME__INI;
|
||||
Info.EvaluateInfo->Parameters = NULL;
|
||||
Info.EvaluateInfo->Flags = ACPI_IGNORE_RETURN_VALUE;
|
||||
|
||||
Status = AcpiNsEvaluate (Info.EvaluateInfo);
|
||||
if (ACPI_SUCCESS (Status))
|
||||
{
|
||||
Info.Num_INI++;
|
||||
}
|
||||
|
||||
/* Walk namespace to execute all _INIs on present devices */
|
||||
|
||||
Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
|
||||
|
@ -288,11 +288,15 @@ AcpiNsCheckPredefinedNames (
|
||||
}
|
||||
|
||||
/*
|
||||
* We have a return value, but if one wasn't expected, just exit, this is
|
||||
* 1) We have a return value, but if one wasn't expected, just exit, this is
|
||||
* not a problem. For example, if the "Implicit Return" feature is
|
||||
* enabled, methods will always return a value.
|
||||
*
|
||||
* 2) If the return value can be of any type, then we cannot perform any
|
||||
* validation, exit.
|
||||
*/
|
||||
if (!Predefined->Info.ExpectedBtypes)
|
||||
if ((!Predefined->Info.ExpectedBtypes) ||
|
||||
(Predefined->Info.ExpectedBtypes == ACPI_RTYPE_ALL))
|
||||
{
|
||||
goto Cleanup;
|
||||
}
|
||||
|
@ -594,7 +594,7 @@ AcpiPsGetArguments (
|
||||
if (WalkState->PassNumber == ACPI_IMODE_LOAD_PASS1)
|
||||
{
|
||||
AcpiPsLinkModuleCode (AmlOpStart,
|
||||
WalkState->ParserState.PkgEnd - AmlOpStart,
|
||||
(UINT32) (WalkState->ParserState.PkgEnd - AmlOpStart),
|
||||
WalkState->OwnerId);
|
||||
}
|
||||
|
||||
@ -625,8 +625,9 @@ AcpiPsGetArguments (
|
||||
"Detected an unsupported executable opcode "
|
||||
"at module-level: [0x%.4X] at table offset 0x%.4X",
|
||||
Op->Common.AmlOpcode,
|
||||
(AmlOpStart - WalkState->ParserState.AmlStart) +
|
||||
sizeof (ACPI_TABLE_HEADER)));
|
||||
(UINT32) (ACPI_PTR_DIFF (AmlOpStart,
|
||||
WalkState->ParserState.AmlStart) +
|
||||
sizeof (ACPI_TABLE_HEADER))));
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -138,6 +138,14 @@
|
||||
extern FILE *AcpiGbl_DebugFile;
|
||||
extern BOOLEAN AcpiGbl_IgnoreErrors;
|
||||
|
||||
|
||||
typedef struct ae_table_desc
|
||||
{
|
||||
ACPI_TABLE_HEADER *Table;
|
||||
struct ae_table_desc *Next;
|
||||
|
||||
} AE_TABLE_DESC;
|
||||
|
||||
/*
|
||||
* Debug Regions
|
||||
*/
|
||||
@ -170,7 +178,8 @@ AeCtrlCHandler (
|
||||
|
||||
ACPI_STATUS
|
||||
AeBuildLocalTables (
|
||||
ACPI_TABLE_HEADER *UserTable);
|
||||
UINT32 TableCount,
|
||||
AE_TABLE_DESC *TableList);
|
||||
|
||||
ACPI_STATUS
|
||||
AeInstallTables (
|
||||
|
@ -490,7 +490,6 @@ AeHardwareInterfaces (
|
||||
UINT32 Value;
|
||||
|
||||
|
||||
|
||||
Status = AcpiWriteBitRegister (ACPI_BITREG_WAKE_STATUS, 1);
|
||||
Status = AcpiWriteBitRegister (ACPI_BITREG_GLOBAL_LOCK_ENABLE, 1);
|
||||
Status = AcpiWriteBitRegister (ACPI_BITREG_SLEEP_ENABLE, 1);
|
||||
|
@ -961,4 +961,3 @@ DoFunction:
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@ -127,6 +127,15 @@ BOOLEAN AcpiGbl_IgnoreErrors = FALSE;
|
||||
BOOLEAN AcpiGbl_DbOpt_NoRegionSupport = FALSE;
|
||||
BOOLEAN AcpiGbl_DebugTimeout = FALSE;
|
||||
char BatchBuffer[128];
|
||||
AE_TABLE_DESC *AeTableListHead = NULL;
|
||||
|
||||
#define ASL_MAX_FILES 256
|
||||
char *FileList[ASL_MAX_FILES];
|
||||
int FileCount;
|
||||
|
||||
|
||||
|
||||
#define AE_SUPPORTED_OPTIONS "?ab:de^ghimo:rstvx:z"
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
@ -144,7 +153,7 @@ char BatchBuffer[128];
|
||||
static void
|
||||
usage (void)
|
||||
{
|
||||
printf ("Usage: acpiexec [Options] [InputFile]\n\n");
|
||||
printf ("Usage: acpiexec [options] AMLfile1 AMLfile2 ...\n\n");
|
||||
|
||||
printf ("Where:\n");
|
||||
printf (" -? Display this message\n");
|
||||
@ -218,6 +227,184 @@ AcpiDbRunBatchMode (
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: FlStrdup
|
||||
*
|
||||
* DESCRIPTION: Local strdup function
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static char *
|
||||
FlStrdup (
|
||||
char *String)
|
||||
{
|
||||
char *NewString;
|
||||
|
||||
|
||||
NewString = AcpiOsAllocate (strlen (String) + 1);
|
||||
if (!NewString)
|
||||
{
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
strcpy (NewString, String);
|
||||
return (NewString);
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: FlSplitInputPathname
|
||||
*
|
||||
* PARAMETERS: InputFilename - The user-specified ASL source file to be
|
||||
* compiled
|
||||
* OutDirectoryPath - Where the directory path prefix is
|
||||
* returned
|
||||
* OutFilename - Where the filename part is returned
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Split the input path into a directory and filename part
|
||||
* 1) Directory part used to open include files
|
||||
* 2) Filename part used to generate output filenames
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
ACPI_STATUS
|
||||
FlSplitInputPathname (
|
||||
char *InputPath,
|
||||
char **OutDirectoryPath,
|
||||
char **OutFilename)
|
||||
{
|
||||
char *Substring;
|
||||
char *DirectoryPath;
|
||||
char *Filename;
|
||||
|
||||
|
||||
*OutDirectoryPath = NULL;
|
||||
*OutFilename = NULL;
|
||||
|
||||
if (!InputPath)
|
||||
{
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/* Get the path to the input filename's directory */
|
||||
|
||||
DirectoryPath = FlStrdup (InputPath);
|
||||
if (!DirectoryPath)
|
||||
{
|
||||
return (AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
Substring = strrchr (DirectoryPath, '\\');
|
||||
if (!Substring)
|
||||
{
|
||||
Substring = strrchr (DirectoryPath, '/');
|
||||
if (!Substring)
|
||||
{
|
||||
Substring = strrchr (DirectoryPath, ':');
|
||||
}
|
||||
}
|
||||
|
||||
if (!Substring)
|
||||
{
|
||||
DirectoryPath[0] = 0;
|
||||
Filename = FlStrdup (InputPath);
|
||||
}
|
||||
else
|
||||
{
|
||||
Filename = FlStrdup (Substring + 1);
|
||||
*(Substring+1) = 0;
|
||||
}
|
||||
|
||||
if (!Filename)
|
||||
{
|
||||
return (AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
*OutDirectoryPath = DirectoryPath;
|
||||
*OutFilename = Filename;
|
||||
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* FUNCTION: AsDoWildcard
|
||||
*
|
||||
* PARAMETERS: None
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Process files via wildcards. This function is for the Windows
|
||||
* case only.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static char **
|
||||
AsDoWildcard (
|
||||
char *DirectoryPathname,
|
||||
char *FileSpecifier)
|
||||
{
|
||||
#ifdef WIN32
|
||||
void *DirInfo;
|
||||
char *Filename;
|
||||
|
||||
|
||||
FileCount = 0;
|
||||
|
||||
/* Open parent directory */
|
||||
|
||||
DirInfo = AcpiOsOpenDirectory (DirectoryPathname, FileSpecifier, REQUEST_FILE_ONLY);
|
||||
if (!DirInfo)
|
||||
{
|
||||
/* Either the directory or file does not exist */
|
||||
|
||||
printf ("File or directory %s%s does not exist\n", DirectoryPathname, FileSpecifier);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/* Process each file that matches the wildcard specification */
|
||||
|
||||
while ((Filename = AcpiOsGetNextFilename (DirInfo)))
|
||||
{
|
||||
/* Add the filename to the file list */
|
||||
|
||||
FileList[FileCount] = AcpiOsAllocate (strlen (Filename) + 1);
|
||||
strcpy (FileList[FileCount], Filename);
|
||||
FileCount++;
|
||||
|
||||
if (FileCount >= ASL_MAX_FILES)
|
||||
{
|
||||
printf ("Max files reached\n");
|
||||
FileList[0] = NULL;
|
||||
return (FileList);
|
||||
}
|
||||
}
|
||||
|
||||
/* Cleanup */
|
||||
|
||||
AcpiOsCloseDirectory (DirInfo);
|
||||
FileList[FileCount] = NULL;
|
||||
return (FileList);
|
||||
|
||||
#else
|
||||
/*
|
||||
* Linux/Unix cases - Wildcards are expanded by the shell automatically.
|
||||
* Just return the filename in a null terminated list
|
||||
*/
|
||||
FileList[0] = AcpiOsAllocate (strlen (FileSpecifier) + 1);
|
||||
strcpy (FileList[0], FileSpecifier);
|
||||
FileList[1] = NULL;
|
||||
|
||||
return (FileList);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* FUNCTION: main
|
||||
@ -238,7 +425,13 @@ main (
|
||||
int j;
|
||||
ACPI_STATUS Status;
|
||||
UINT32 InitFlags;
|
||||
ACPI_TABLE_HEADER *Table;
|
||||
ACPI_TABLE_HEADER *Table = NULL;
|
||||
UINT32 TableCount;
|
||||
AE_TABLE_DESC *TableDesc;
|
||||
char **FileList;
|
||||
char *Filename;
|
||||
char *Directory;
|
||||
char *FullPathname;
|
||||
|
||||
|
||||
#ifdef _DEBUG
|
||||
@ -269,7 +462,7 @@ main (
|
||||
|
||||
/* Get the command line options */
|
||||
|
||||
while ((j = AcpiGetopt (argc, argv, "?ab:de^gimo:rstvx:z")) != EOF) switch(j)
|
||||
while ((j = AcpiGetopt (argc, argv, AE_SUPPORTED_OPTIONS)) != EOF) switch(j)
|
||||
{
|
||||
case 'a':
|
||||
AcpiGbl_IgnoreErrors = TRUE;
|
||||
@ -352,6 +545,7 @@ main (
|
||||
break;
|
||||
|
||||
case '?':
|
||||
case 'h':
|
||||
default:
|
||||
usage();
|
||||
return -1;
|
||||
@ -364,21 +558,89 @@ main (
|
||||
InitFlags |= (ACPI_NO_DEVICE_INIT | ACPI_NO_OBJECT_INIT);
|
||||
}
|
||||
|
||||
/* Standalone filename is the only argument */
|
||||
/* The remaining arguments are filenames for ACPI tables */
|
||||
|
||||
if (argv[AcpiGbl_Optind])
|
||||
{
|
||||
AcpiGbl_DbOpt_tables = TRUE;
|
||||
AcpiGbl_DbFilename = argv[AcpiGbl_Optind];
|
||||
TableCount = 0;
|
||||
|
||||
Status = AcpiDbReadTableFromFile (AcpiGbl_DbFilename, &Table);
|
||||
if (ACPI_FAILURE (Status))
|
||||
/* Get each of the ACPI table files on the command line */
|
||||
|
||||
while (argv[AcpiGbl_Optind])
|
||||
{
|
||||
printf ("**** Could not get input table, %s\n", AcpiFormatException (Status));
|
||||
goto enterloop;
|
||||
/* Split incoming path into a directory/filename combo */
|
||||
|
||||
Status = FlSplitInputPathname (argv[AcpiGbl_Optind], &Directory, &Filename);
|
||||
if (ACPI_FAILURE (Status))
|
||||
{
|
||||
return (Status);
|
||||
}
|
||||
|
||||
/* Expand wildcards (Windows only) */
|
||||
|
||||
FileList = AsDoWildcard (Directory, Filename);
|
||||
if (!FileList)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
while (*FileList)
|
||||
{
|
||||
FullPathname = AcpiOsAllocate (
|
||||
strlen (Directory) + strlen (*FileList) + 1);
|
||||
|
||||
/* Construct a full path to the file */
|
||||
|
||||
strcpy (FullPathname, Directory);
|
||||
strcat (FullPathname, *FileList);
|
||||
|
||||
/* Get one table */
|
||||
|
||||
Status = AcpiDbReadTableFromFile (FullPathname, &Table);
|
||||
if (ACPI_FAILURE (Status))
|
||||
{
|
||||
printf ("**** Could not get input table %s, %s\n", FullPathname,
|
||||
AcpiFormatException (Status));
|
||||
goto enterloop;
|
||||
}
|
||||
|
||||
AcpiOsFree (FullPathname);
|
||||
AcpiOsFree (*FileList);
|
||||
*FileList = NULL;
|
||||
FileList++;
|
||||
|
||||
/*
|
||||
* Ignore an FACS or RSDT, we can't use them.
|
||||
*/
|
||||
if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_FACS) ||
|
||||
ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_RSDT))
|
||||
{
|
||||
AcpiOsFree (Table);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Allocate and link a table descriptor */
|
||||
|
||||
TableDesc = AcpiOsAllocate (sizeof (AE_TABLE_DESC));
|
||||
TableDesc->Table = Table;
|
||||
TableDesc->Next = AeTableListHead;
|
||||
AeTableListHead = TableDesc;
|
||||
|
||||
TableCount++;
|
||||
}
|
||||
|
||||
AcpiGbl_Optind++;
|
||||
}
|
||||
|
||||
/* Build a local RSDT with all tables and let ACPICA process the RSDT */
|
||||
|
||||
Status = AeBuildLocalTables (TableCount, AeTableListHead);
|
||||
if (ACPI_FAILURE (Status))
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
AeBuildLocalTables (Table);
|
||||
Status = AeInstallTables ();
|
||||
if (ACPI_FAILURE (Status))
|
||||
{
|
||||
|
@ -144,6 +144,15 @@ unsigned char DsdtCode[] =
|
||||
0x04,0x12,0x08,0x20,
|
||||
};
|
||||
|
||||
unsigned char LocalDsdtCode[] =
|
||||
{
|
||||
0x44,0x53,0x44,0x54,0x24,0x00,0x00,0x00, /* 00000000 "DSDT$..." */
|
||||
0x02,0x2C,0x49,0x6E,0x74,0x65,0x6C,0x00, /* 00000008 ".,Intel." */
|
||||
0x4C,0x6F,0x63,0x61,0x6C,0x00,0x00,0x00, /* 00000010 "Local..." */
|
||||
0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C, /* 00000018 "....INTL" */
|
||||
0x30,0x07,0x09,0x20,
|
||||
};
|
||||
|
||||
/* Several example SSDTs */
|
||||
|
||||
unsigned char Ssdt1Code[] = /* Has method _T98 */
|
||||
@ -229,15 +238,14 @@ ACPI_TABLE_HEADER *DsdtToInstallOverride;
|
||||
ACPI_TABLE_RSDP LocalRSDP;
|
||||
ACPI_TABLE_FADT LocalFADT;
|
||||
ACPI_TABLE_FACS LocalFACS;
|
||||
ACPI_TABLE_HEADER LocalDSDT;
|
||||
ACPI_TABLE_HEADER LocalTEST;
|
||||
ACPI_TABLE_HEADER LocalBADTABLE;
|
||||
ACPI_TABLE_RSDT *LocalRSDT;
|
||||
|
||||
#define RSDT_TABLES 7
|
||||
#define RSDT_SIZE (sizeof (ACPI_TABLE_RSDT) + ((RSDT_TABLES -1) * sizeof (UINT32)))
|
||||
#define BASE_RSDT_TABLES 6
|
||||
#define BASE_RSDT_SIZE (sizeof (ACPI_TABLE_RSDT) + ((BASE_RSDT_TABLES -1) * sizeof (UINT32)))
|
||||
|
||||
#define ACPI_MAX_INIT_TABLES (16)
|
||||
#define ACPI_MAX_INIT_TABLES (32)
|
||||
static ACPI_TABLE_DESC Tables[ACPI_MAX_INIT_TABLES];
|
||||
|
||||
|
||||
@ -276,8 +284,8 @@ AeTableOverride (
|
||||
*
|
||||
* FUNCTION: AeBuildLocalTables
|
||||
*
|
||||
* PARAMETERS: UserTable - pointer to an input table to be loaded.
|
||||
* a DSDT or SSDT
|
||||
* PARAMETERS: TableCount - Number of tables on the command line
|
||||
* TableList - List of actual tables from files
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
@ -288,129 +296,199 @@ AeTableOverride (
|
||||
|
||||
ACPI_STATUS
|
||||
AeBuildLocalTables (
|
||||
ACPI_TABLE_HEADER *UserTable)
|
||||
UINT32 TableCount,
|
||||
AE_TABLE_DESC *TableList)
|
||||
{
|
||||
ACPI_PHYSICAL_ADDRESS DsdtAddress;
|
||||
ACPI_PHYSICAL_ADDRESS DsdtAddress = 0;
|
||||
UINT32 RsdtSize;
|
||||
AE_TABLE_DESC *NextTable;
|
||||
UINT32 NextIndex;
|
||||
ACPI_TABLE_FADT *ExternalFadt = NULL;
|
||||
|
||||
|
||||
/*
|
||||
* Update the table count. For DSDT, it is not put into the RSDT. For
|
||||
* FADT, this is already accounted for since we usually install a
|
||||
* local FADT.
|
||||
*/
|
||||
NextTable = TableList;
|
||||
while (NextTable)
|
||||
{
|
||||
if (ACPI_COMPARE_NAME (NextTable->Table->Signature, ACPI_SIG_DSDT) ||
|
||||
ACPI_COMPARE_NAME (NextTable->Table->Signature, ACPI_SIG_FADT))
|
||||
{
|
||||
TableCount--;
|
||||
}
|
||||
NextTable = NextTable->Next;
|
||||
}
|
||||
|
||||
RsdtSize = BASE_RSDT_SIZE + (TableCount * sizeof (UINT32));
|
||||
|
||||
/* Build an RSDT */
|
||||
|
||||
LocalRSDT = AcpiOsAllocate (RSDT_SIZE);
|
||||
LocalRSDT = AcpiOsAllocate (RsdtSize);
|
||||
if (!LocalRSDT)
|
||||
{
|
||||
return AE_NO_MEMORY;
|
||||
}
|
||||
|
||||
ACPI_MEMSET (LocalRSDT, 0, RSDT_SIZE);
|
||||
ACPI_MEMSET (LocalRSDT, 0, RsdtSize);
|
||||
ACPI_STRNCPY (LocalRSDT->Header.Signature, ACPI_SIG_RSDT, 4);
|
||||
LocalRSDT->Header.Length = RSDT_SIZE;
|
||||
LocalRSDT->Header.Length = RsdtSize;
|
||||
|
||||
LocalRSDT->TableOffsetEntry[0] = ACPI_PTR_TO_PHYSADDR (&LocalTEST);
|
||||
LocalRSDT->TableOffsetEntry[1] = ACPI_PTR_TO_PHYSADDR (&LocalBADTABLE);
|
||||
LocalRSDT->TableOffsetEntry[2] = ACPI_PTR_TO_PHYSADDR (&LocalFADT);
|
||||
LocalRSDT->TableOffsetEntry[3] = ACPI_PTR_TO_PHYSADDR (&LocalTEST); /* Just a placeholder for a user SSDT */
|
||||
|
||||
/* Install two SSDTs to test multiple table support */
|
||||
|
||||
LocalRSDT->TableOffsetEntry[4] = ACPI_PTR_TO_PHYSADDR (&Ssdt1Code);
|
||||
LocalRSDT->TableOffsetEntry[5] = ACPI_PTR_TO_PHYSADDR (&Ssdt2Code);
|
||||
LocalRSDT->TableOffsetEntry[3] = ACPI_PTR_TO_PHYSADDR (&Ssdt1Code);
|
||||
LocalRSDT->TableOffsetEntry[4] = ACPI_PTR_TO_PHYSADDR (&Ssdt2Code);
|
||||
|
||||
/* Install the OEM1 table to test LoadTable */
|
||||
|
||||
LocalRSDT->TableOffsetEntry[6] = ACPI_PTR_TO_PHYSADDR (&Oem1Code);
|
||||
LocalRSDT->TableOffsetEntry[5] = ACPI_PTR_TO_PHYSADDR (&Oem1Code);
|
||||
|
||||
/*
|
||||
* Install the user tables. The DSDT must be installed in the FADT.
|
||||
* All other tables are installed directly into the RSDT.
|
||||
*/
|
||||
NextIndex = BASE_RSDT_TABLES;
|
||||
NextTable = TableList;
|
||||
while (NextTable)
|
||||
{
|
||||
/*
|
||||
* Incoming DSDT or FADT are special cases. All other tables are
|
||||
* just immediately installed into the RSDT.
|
||||
*/
|
||||
if (ACPI_COMPARE_NAME (NextTable->Table->Signature, ACPI_SIG_DSDT))
|
||||
{
|
||||
if (DsdtAddress)
|
||||
{
|
||||
printf ("Already found a DSDT, only one allowed\n");
|
||||
return AE_ALREADY_EXISTS;
|
||||
}
|
||||
|
||||
/* The incoming user table is a DSDT */
|
||||
|
||||
DsdtAddress = ACPI_PTR_TO_PHYSADDR (&DsdtCode);
|
||||
DsdtToInstallOverride = NextTable->Table;
|
||||
}
|
||||
else if (ACPI_COMPARE_NAME (NextTable->Table->Signature, ACPI_SIG_FADT))
|
||||
{
|
||||
ExternalFadt = ACPI_CAST_PTR (ACPI_TABLE_FADT, NextTable->Table);
|
||||
LocalRSDT->TableOffsetEntry[2] = ACPI_PTR_TO_PHYSADDR (NextTable->Table);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Install the table in the RSDT */
|
||||
|
||||
LocalRSDT->TableOffsetEntry[NextIndex] = ACPI_PTR_TO_PHYSADDR (NextTable->Table);
|
||||
NextIndex++;
|
||||
}
|
||||
|
||||
NextTable = NextTable->Next;
|
||||
}
|
||||
|
||||
/* Build an RSDP */
|
||||
|
||||
ACPI_MEMSET (&LocalRSDP, 0, sizeof (ACPI_TABLE_RSDP));
|
||||
ACPI_MEMCPY (LocalRSDP.Signature, ACPI_SIG_RSDP, 8);
|
||||
ACPI_MEMCPY (LocalRSDP.OemId, "I_TEST", 6);
|
||||
LocalRSDP.Revision = 1;
|
||||
LocalRSDP.RsdtPhysicalAddress = ACPI_PTR_TO_PHYSADDR (LocalRSDT);
|
||||
LocalRSDP.Length = sizeof (ACPI_TABLE_RSDT);
|
||||
ACPI_MEMCPY (LocalRSDP.OemId, "I_TEST", 6);
|
||||
|
||||
/*
|
||||
* Examine the incoming user table. At this point, it has been verified
|
||||
* to be either a DSDT, SSDT, or a PSDT, but they must be handled differently
|
||||
*/
|
||||
if (ACPI_COMPARE_NAME (UserTable->Signature, ACPI_SIG_DSDT))
|
||||
{
|
||||
/* The incoming user table is a DSDT */
|
||||
|
||||
DsdtAddress = ACPI_PTR_TO_PHYSADDR (&DsdtCode);
|
||||
DsdtToInstallOverride = UserTable;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Build a local DSDT because incoming table is an SSDT or PSDT */
|
||||
|
||||
ACPI_MEMSET (&LocalDSDT, 0, sizeof (ACPI_TABLE_HEADER));
|
||||
ACPI_STRNCPY (LocalDSDT.Signature, ACPI_SIG_DSDT, 4);
|
||||
LocalDSDT.Revision = 1;
|
||||
LocalDSDT.Length = sizeof (ACPI_TABLE_HEADER);
|
||||
LocalDSDT.Checksum = (UINT8) -AcpiTbChecksum ((void *) &LocalDSDT, LocalDSDT.Length);
|
||||
|
||||
/* Install incoming table (SSDT or PSDT) directly into the RSDT */
|
||||
|
||||
LocalRSDT->TableOffsetEntry[3] = ACPI_PTR_TO_PHYSADDR (UserTable);
|
||||
DsdtAddress = ACPI_PTR_TO_PHYSADDR (&LocalDSDT);
|
||||
DsdtToInstallOverride = &LocalDSDT;
|
||||
}
|
||||
|
||||
/* Set checksums for both RSDT and RSDP */
|
||||
|
||||
LocalRSDT->Header.Checksum = (UINT8) -AcpiTbChecksum ((void *) LocalRSDT, LocalRSDT->Header.Length);
|
||||
LocalRSDP.Checksum = (UINT8) -AcpiTbChecksum ((void *) &LocalRSDP, ACPI_RSDP_CHECKSUM_LENGTH);
|
||||
LocalRSDT->Header.Checksum = (UINT8) -AcpiTbChecksum (
|
||||
(void *) LocalRSDT, LocalRSDT->Header.Length);
|
||||
LocalRSDP.Checksum = (UINT8) -AcpiTbChecksum (
|
||||
(void *) &LocalRSDP, ACPI_RSDP_CHECKSUM_LENGTH);
|
||||
|
||||
/*
|
||||
* Build a FADT so we can test the hardware/event init
|
||||
*/
|
||||
ACPI_MEMSET (&LocalFADT, 0, sizeof (ACPI_TABLE_FADT));
|
||||
ACPI_STRNCPY (LocalFADT.Header.Signature, ACPI_SIG_FADT, 4);
|
||||
if (!DsdtAddress)
|
||||
{
|
||||
/* Use the local DSDT because incoming table(s) are all SSDT(s) */
|
||||
|
||||
/* Setup FADT header and DSDT/FACS addresses */
|
||||
DsdtAddress = ACPI_PTR_TO_PHYSADDR (LocalDsdtCode);
|
||||
DsdtToInstallOverride = ACPI_CAST_PTR (ACPI_TABLE_HEADER, LocalDsdtCode);
|
||||
}
|
||||
|
||||
LocalFADT.Dsdt = DsdtAddress;
|
||||
LocalFADT.Facs = ACPI_PTR_TO_PHYSADDR (&LocalFACS);
|
||||
if (ExternalFadt)
|
||||
{
|
||||
/*
|
||||
* Use the external FADT, but we must update the DSDT/FACS addresses
|
||||
* as well as the checksum
|
||||
*/
|
||||
ExternalFadt->Dsdt = DsdtAddress;
|
||||
ExternalFadt->Facs = ACPI_PTR_TO_PHYSADDR (&LocalFACS);
|
||||
|
||||
LocalFADT.XDsdt = DsdtAddress;
|
||||
LocalFADT.XFacs = ACPI_PTR_TO_PHYSADDR (&LocalFACS);
|
||||
if (ExternalFadt->Header.Length > ACPI_PTR_DIFF (&ExternalFadt->XDsdt, ExternalFadt))
|
||||
{
|
||||
ExternalFadt->XDsdt = DsdtAddress;
|
||||
ExternalFadt->XFacs = ACPI_PTR_TO_PHYSADDR (&LocalFACS);
|
||||
}
|
||||
/* Complete the FADT with the checksum */
|
||||
|
||||
LocalFADT.Header.Revision = 3;
|
||||
LocalFADT.Header.Length = sizeof (ACPI_TABLE_FADT);
|
||||
ExternalFadt->Header.Checksum = 0;
|
||||
ExternalFadt->Header.Checksum = (UINT8) -AcpiTbChecksum (
|
||||
(void *) ExternalFadt, ExternalFadt->Header.Length);
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Build a local FADT so we can test the hardware/event init
|
||||
*/
|
||||
ACPI_MEMSET (&LocalFADT, 0, sizeof (ACPI_TABLE_FADT));
|
||||
ACPI_STRNCPY (LocalFADT.Header.Signature, ACPI_SIG_FADT, 4);
|
||||
|
||||
/* Miscellaneous FADT fields */
|
||||
/* Setup FADT header and DSDT/FACS addresses */
|
||||
|
||||
LocalFADT.Gpe0BlockLength = 16;
|
||||
LocalFADT.Gpe1BlockLength = 6;
|
||||
LocalFADT.Gpe1Base = 96;
|
||||
LocalFADT.Dsdt = DsdtAddress;
|
||||
LocalFADT.Facs = ACPI_PTR_TO_PHYSADDR (&LocalFACS);
|
||||
|
||||
LocalFADT.Pm1EventLength = 4;
|
||||
LocalFADT.Pm1ControlLength = 2;
|
||||
LocalFADT.PmTimerLength = 4;
|
||||
LocalFADT.XDsdt = DsdtAddress;
|
||||
LocalFADT.XFacs = ACPI_PTR_TO_PHYSADDR (&LocalFACS);
|
||||
|
||||
LocalFADT.Gpe0Block = 0x00001234;
|
||||
LocalFADT.Gpe1Block = 0x00005678;
|
||||
LocalFADT.Header.Revision = 3;
|
||||
LocalFADT.Header.Length = sizeof (ACPI_TABLE_FADT);
|
||||
|
||||
LocalFADT.Pm1aEventBlock = 0x00001aaa;
|
||||
LocalFADT.Pm1bEventBlock = 0x00001bbb;
|
||||
LocalFADT.PmTimerBlock = 0xA0;
|
||||
LocalFADT.Pm1aControlBlock = 0xB0;
|
||||
/* Miscellaneous FADT fields */
|
||||
|
||||
/* Setup one example X-64 field */
|
||||
LocalFADT.Gpe0BlockLength = 16;
|
||||
LocalFADT.Gpe1BlockLength = 6;
|
||||
LocalFADT.Gpe1Base = 96;
|
||||
|
||||
LocalFADT.XPm1bEventBlock.SpaceId = ACPI_ADR_SPACE_SYSTEM_IO;
|
||||
LocalFADT.XPm1bEventBlock.Address = LocalFADT.Pm1bEventBlock;
|
||||
LocalFADT.XPm1bEventBlock.BitWidth = (UINT8) ACPI_MUL_8 (LocalFADT.Pm1EventLength);
|
||||
LocalFADT.Pm1EventLength = 4;
|
||||
LocalFADT.Pm1ControlLength = 2;
|
||||
LocalFADT.PmTimerLength = 4;
|
||||
|
||||
/* Complete the FADT with the checksum */
|
||||
LocalFADT.Gpe0Block = 0x00001234;
|
||||
LocalFADT.Gpe1Block = 0x00005678;
|
||||
|
||||
LocalFADT.Header.Checksum = 0;
|
||||
LocalFADT.Header.Checksum = (UINT8) -AcpiTbChecksum ((void *) &LocalFADT, LocalFADT.Header.Length);
|
||||
LocalFADT.Pm1aEventBlock = 0x00001aaa;
|
||||
LocalFADT.Pm1bEventBlock = 0x00001bbb;
|
||||
LocalFADT.PmTimerBlock = 0xA0;
|
||||
LocalFADT.Pm1aControlBlock = 0xB0;
|
||||
|
||||
/* Setup one example X-64 field */
|
||||
|
||||
LocalFADT.XPm1bEventBlock.SpaceId = ACPI_ADR_SPACE_SYSTEM_IO;
|
||||
LocalFADT.XPm1bEventBlock.Address = LocalFADT.Pm1bEventBlock;
|
||||
LocalFADT.XPm1bEventBlock.BitWidth = (UINT8) ACPI_MUL_8 (LocalFADT.Pm1EventLength);
|
||||
|
||||
/* Complete the FADT with the checksum */
|
||||
|
||||
LocalFADT.Header.Checksum = 0;
|
||||
LocalFADT.Header.Checksum = (UINT8) -AcpiTbChecksum (
|
||||
(void *) &LocalFADT, LocalFADT.Header.Length);
|
||||
}
|
||||
|
||||
/* Build a FACS */
|
||||
|
||||
ACPI_MEMSET (&LocalFACS, 0, sizeof (ACPI_TABLE_FACS));
|
||||
ACPI_STRNCPY (LocalFACS.Signature, ACPI_SIG_FACS, 4);
|
||||
|
||||
LocalFACS.Length = sizeof (ACPI_TABLE_FACS);
|
||||
LocalFACS.GlobalLock = 0x11AA0011;
|
||||
|
||||
@ -421,7 +499,8 @@ AeBuildLocalTables (
|
||||
|
||||
LocalTEST.Revision = 1;
|
||||
LocalTEST.Length = sizeof (ACPI_TABLE_HEADER);
|
||||
LocalTEST.Checksum = (UINT8) -AcpiTbChecksum ((void *) &LocalTEST, LocalTEST.Length);
|
||||
LocalTEST.Checksum = (UINT8) -AcpiTbChecksum (
|
||||
(void *) &LocalTEST, LocalTEST.Length);
|
||||
|
||||
/* Build a fake table with a bad signature [BAD!] so that we make sure that the CA core ignores it */
|
||||
|
||||
@ -430,7 +509,8 @@ AeBuildLocalTables (
|
||||
|
||||
LocalBADTABLE.Revision = 1;
|
||||
LocalBADTABLE.Length = sizeof (ACPI_TABLE_HEADER);
|
||||
LocalBADTABLE.Checksum = (UINT8) -AcpiTbChecksum ((void *) &LocalBADTABLE, LocalBADTABLE.Length);
|
||||
LocalBADTABLE.Checksum = (UINT8) -AcpiTbChecksum (
|
||||
(void *) &LocalBADTABLE, LocalBADTABLE.Length);
|
||||
|
||||
return (AE_OK);
|
||||
}
|
||||
|
@ -146,6 +146,9 @@ static const ACPI_INTERFACE_INFO AcpiInterfacesSupported[] =
|
||||
{"Windows 2001 SP2", ACPI_OSI_WIN_XP_SP2}, /* Windows XP SP2 */
|
||||
{"Windows 2001.1 SP1", ACPI_OSI_WINSRV_2003_SP1}, /* Windows Server 2003 SP1 - Added 03/2006 */
|
||||
{"Windows 2006", ACPI_OSI_WIN_VISTA}, /* Windows Vista - Added 03/2006 */
|
||||
{"Windows 2006.1", ACPI_OSI_WINSRV_2008}, /* Windows Server 2008 - Added 09/2009 */
|
||||
{"Windows 2006 SP1", ACPI_OSI_WIN_VISTA_SP1}, /* Windows Vista SP1 - Added 09/2009 */
|
||||
{"Windows 2009", ACPI_OSI_WIN_7}, /* Windows 7 and Server 2008 R2 - Added 09/2009 */
|
||||
|
||||
/* Feature Group Strings */
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user