diff options
Diffstat (limited to 'source/os_specific')
-rw-r--r-- | source/os_specific/service_layers/oslinuxtbl.c | 111 | ||||
-rw-r--r-- | source/os_specific/service_layers/osunixxf.c | 23 |
2 files changed, 104 insertions, 30 deletions
diff --git a/source/os_specific/service_layers/oslinuxtbl.c b/source/os_specific/service_layers/oslinuxtbl.c index f6e94c061235..aee929e0ee91 100644 --- a/source/os_specific/service_layers/oslinuxtbl.c +++ b/source/os_specific/service_layers/oslinuxtbl.c @@ -593,6 +593,34 @@ OslLoadRsdp ( /****************************************************************************** * + * FUNCTION: OslCanUseXsdt + * + * PARAMETERS: None + * + * RETURN: TRUE if XSDT is allowed to be used. + * + * DESCRIPTION: This function collects logic that can be used to determine if + * XSDT should be used instead of RSDT. + * + *****************************************************************************/ + +static BOOLEAN +OslCanUseXsdt ( + void) +{ + if (Gbl_Revision && !AcpiGbl_DoNotUseXsdt) + { + return (TRUE); + } + else + { + return (FALSE); + } +} + + +/****************************************************************************** + * * FUNCTION: OslTableInitialize * * PARAMETERS: None @@ -628,7 +656,7 @@ OslTableInitialize ( /* Get XSDT from memory */ - if (Gbl_Rsdp.Revision) + if (Gbl_Rsdp.Revision && !Gbl_DoNotDumpXsdt) { if (Gbl_Xsdt) { @@ -778,7 +806,7 @@ OslListBiosTables ( UINT32 i; - if (Gbl_Revision) + if (OslCanUseXsdt ()) { ItemSize = sizeof (UINT64); TableData = ACPI_CAST8 (Gbl_Xsdt) + sizeof (ACPI_TABLE_HEADER); @@ -799,7 +827,7 @@ OslListBiosTables ( for (i = 0; i < NumberOfTables; ++i, TableData += ItemSize) { - if (Gbl_Revision) + if (OslCanUseXsdt ()) { TableAddress = (ACPI_PHYSICAL_ADDRESS) (*ACPI_CAST64 (TableData)); @@ -810,6 +838,13 @@ OslListBiosTables ( (ACPI_PHYSICAL_ADDRESS) (*ACPI_CAST32 (TableData)); } + /* Skip NULL entries in RSDT/XSDT */ + + if (!TableAddress) + { + continue; + } + Status = OslMapTable (TableAddress, NULL, &MappedTable); if (ACPI_FAILURE (Status)) { @@ -933,7 +968,7 @@ OslGetBiosTable ( } else /* Case for a normal ACPI table */ { - if (Gbl_Revision) + if (OslCanUseXsdt ()) { ItemSize = sizeof (UINT64); TableData = ACPI_CAST8 (Gbl_Xsdt) + sizeof (ACPI_TABLE_HEADER); @@ -954,7 +989,7 @@ OslGetBiosTable ( for (i = 0; i < NumberOfTables; ++i, TableData += ItemSize) { - if (Gbl_Revision) + if (OslCanUseXsdt ()) { TableAddress = (ACPI_PHYSICAL_ADDRESS) (*ACPI_CAST64 (TableData)); @@ -965,6 +1000,13 @@ OslGetBiosTable ( (ACPI_PHYSICAL_ADDRESS) (*ACPI_CAST32 (TableData)); } + /* Skip NULL entries in RSDT/XSDT */ + + if (!TableAddress) + { + continue; + } + Status = OslMapTable (TableAddress, NULL, &MappedTable); if (ACPI_FAILURE (Status)) { @@ -1133,11 +1175,21 @@ OslMapTable ( /* If specified, signature must match */ - if (Signature && - !ACPI_COMPARE_NAME (Signature, MappedTable->Signature)) + if (Signature) { - AcpiOsUnmapMemory (MappedTable, sizeof (ACPI_TABLE_HEADER)); - return (AE_BAD_SIGNATURE); + if (ACPI_VALIDATE_RSDP_SIG (Signature)) + { + if (!ACPI_VALIDATE_RSDP_SIG (MappedTable->Signature)) + { + AcpiOsUnmapMemory (MappedTable, sizeof (ACPI_TABLE_HEADER)); + return (AE_BAD_SIGNATURE); + } + } + else if (!ACPI_COMPARE_NAME (Signature, MappedTable->Signature)) + { + AcpiOsUnmapMemory (MappedTable, sizeof (ACPI_TABLE_HEADER)); + return (AE_BAD_SIGNATURE); + } } /* Map the entire table */ @@ -1268,7 +1320,6 @@ OslReadTableFromFile ( ACPI_TABLE_HEADER *LocalTable = NULL; UINT32 TableLength; INT32 Count; - UINT32 Total = 0; ACPI_STATUS Status = AE_OK; @@ -1295,13 +1346,24 @@ OslReadTableFromFile ( /* If signature is specified, it must match the table */ - if (Signature && - !ACPI_COMPARE_NAME (Signature, Header.Signature)) + if (Signature) { - fprintf (stderr, "Incorrect signature: Expecting %4.4s, found %4.4s\n", - Signature, Header.Signature); - Status = AE_BAD_SIGNATURE; - goto Exit; + if (ACPI_VALIDATE_RSDP_SIG (Signature)) + { + if (!ACPI_VALIDATE_RSDP_SIG (Header.Signature)) { + fprintf (stderr, "Incorrect RSDP signature: found %8.8s\n", + Header.Signature); + Status = AE_BAD_SIGNATURE; + goto Exit; + } + } + else if (!ACPI_COMPARE_NAME (Signature, Header.Signature)) + { + fprintf (stderr, "Incorrect signature: Expecting %4.4s, found %4.4s\n", + Signature, Header.Signature); + Status = AE_BAD_SIGNATURE; + goto Exit; + } } TableLength = ApGetTableLength (&Header); @@ -1325,18 +1387,13 @@ OslReadTableFromFile ( fseek (TableFile, FileOffset, SEEK_SET); - while (!feof (TableFile) && Total < TableLength) + Count = fread (LocalTable, 1, TableLength, TableFile); + if (Count != TableLength) { - Count = fread (LocalTable, 1, TableLength-Total, TableFile); - if (Count < 0) - { - fprintf (stderr, "%4.4s: Could not read table content\n", - Header.Signature); - Status = AE_INVALID_TABLE_LENGTH; - goto Exit; - } - - Total += Count; + fprintf (stderr, "%4.4s: Could not read table content\n", + Header.Signature); + Status = AE_INVALID_TABLE_LENGTH; + goto Exit; } /* Validate checksum */ diff --git a/source/os_specific/service_layers/osunixxf.c b/source/os_specific/service_layers/osunixxf.c index 224f345599eb..dd151eee9551 100644 --- a/source/os_specific/service_layers/osunixxf.c +++ b/source/os_specific/service_layers/osunixxf.c @@ -93,6 +93,7 @@ typedef void* (*PTHREAD_CALLBACK) (void *); #include <termios.h> struct termios OriginalTermAttributes; +int TermAttributesWereSet = 0; ACPI_STATUS AcpiUtReadLine ( @@ -146,7 +147,7 @@ OsEnterLineEditMode ( if (tcgetattr (STDIN_FILENO, &OriginalTermAttributes)) { - fprintf (stderr, "Could not get/set terminal attributes!\n"); + fprintf (stderr, "Could not get terminal attributes!\n"); return; } @@ -159,16 +160,32 @@ OsEnterLineEditMode ( LocalTermAttributes.c_cc[VMIN] = 1; LocalTermAttributes.c_cc[VTIME] = 0; - tcsetattr (STDIN_FILENO, TCSANOW, &LocalTermAttributes); + if (tcsetattr (STDIN_FILENO, TCSANOW, &LocalTermAttributes)) + { + fprintf (stderr, "Could not set terminal attributes!\n"); + return; + } + + TermAttributesWereSet = 1; } + static void OsExitLineEditMode ( void) { + + if (!TermAttributesWereSet) + { + return; + } + /* Set terminal attributes back to the original values */ - tcsetattr (STDIN_FILENO, TCSANOW, &OriginalTermAttributes); + if (tcsetattr (STDIN_FILENO, TCSANOW, &OriginalTermAttributes)) + { + fprintf (stderr, "Could not restore terminal attributes!\n"); + } } |