summaryrefslogtreecommitdiff
path: root/source/os_specific/service_layers/oslinuxtbl.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/os_specific/service_layers/oslinuxtbl.c')
-rw-r--r--source/os_specific/service_layers/oslinuxtbl.c61
1 files changed, 53 insertions, 8 deletions
diff --git a/source/os_specific/service_layers/oslinuxtbl.c b/source/os_specific/service_layers/oslinuxtbl.c
index aee929e0ee91..aae93325add2 100644
--- a/source/os_specific/service_layers/oslinuxtbl.c
+++ b/source/os_specific/service_layers/oslinuxtbl.c
@@ -98,6 +98,11 @@ OslUnmapTable (
ACPI_TABLE_HEADER *Table);
static ACPI_PHYSICAL_ADDRESS
+OslFindRsdpViaEfiByKeyword (
+ FILE *File,
+ const char *Keyword);
+
+static ACPI_PHYSICAL_ADDRESS
OslFindRsdpViaEfi (
void);
@@ -490,6 +495,44 @@ AcpiOsGetTableByIndex (
/******************************************************************************
*
+ * FUNCTION: OslFindRsdpViaEfiByKeyword
+ *
+ * PARAMETERS: Keyword - Character string indicating ACPI GUID version
+ * in the EFI table
+ *
+ * RETURN: RSDP address if found
+ *
+ * DESCRIPTION: Find RSDP address via EFI using keyword indicating the ACPI
+ * GUID version.
+ *
+ *****************************************************************************/
+
+static ACPI_PHYSICAL_ADDRESS
+OslFindRsdpViaEfiByKeyword (
+ FILE *File,
+ const char *Keyword)
+{
+ char Buffer[80];
+ unsigned long long Address = 0;
+ char Format[32];
+
+
+ snprintf (Format, 32, "%s=%s", Keyword, "%llx");
+ fseek (File, 0, SEEK_SET);
+ while (fgets (Buffer, 80, File))
+ {
+ if (sscanf (Buffer, Format, &Address) == 1)
+ {
+ break;
+ }
+ }
+
+ return ((ACPI_PHYSICAL_ADDRESS) (Address));
+}
+
+
+/******************************************************************************
+ *
* FUNCTION: OslFindRsdpViaEfi
*
* PARAMETERS: None
@@ -505,24 +548,21 @@ OslFindRsdpViaEfi (
void)
{
FILE *File;
- char Buffer[80];
- unsigned long Address = 0;
+ ACPI_PHYSICAL_ADDRESS Address = 0;
File = fopen (EFI_SYSTAB, "r");
if (File)
{
- while (fgets (Buffer, 80, File))
+ Address = OslFindRsdpViaEfiByKeyword (File, "ACPI20");
+ if (!Address)
{
- if (sscanf (Buffer, "ACPI20=0x%lx", &Address) == 1)
- {
- break;
- }
+ Address = OslFindRsdpViaEfiByKeyword (File, "ACPI");
}
fclose (File);
}
- return ((ACPI_PHYSICAL_ADDRESS) (Address));
+ return (Address);
}
@@ -907,6 +947,11 @@ OslGetBiosTable (
ACPI_COMPARE_NAME (Signature, ACPI_SIG_DSDT) ||
ACPI_COMPARE_NAME (Signature, ACPI_SIG_FACS))
{
+ if (Instance > 0)
+ {
+ return (AE_LIMIT);
+ }
+
/*
* Get the appropriate address, either 32-bit or 64-bit. Be very
* careful about the FADT length and validate table addresses.