:: commit 05d55187133bf5ed49bf6ad0e1fde1abd6287e09

Andy-Python-Programmer <andypythonappdeveloper@gmail.com> — 2021-10-04 22:34

parents: cd588982da

acpi_get_rsdp: UEFI RSDP lookup return RSDPv1

* This commit makes the acpi_get_rsdp function to return the RSDPv1 if
avaliable (in UEFI) to match this functions behaviour under BIOS where
it returns the XSDP or the RSDP depending on which one is avaliable.

Signed-off-by: Andy-Python-Programmer <andypythonappdeveloper@gmail.com>
diff --git a/stage23/lib/acpi.c b/stage23/lib/acpi.c
index 0cf01160..65589f5d 100644
--- a/stage23/lib/acpi.c
+++ b/stage23/lib/acpi.c
@@ -64,14 +64,18 @@ void acpi_get_smbios(void **smbios32, void **smbios64) {
 #include <efi.h>
 
 void *acpi_get_rsdp(void) {
+    EFI_GUID acpi_2_guid = ACPI_20_TABLE_GUID;
+    EFI_GUID acpi_1_guid = ACPI_TABLE_GUID;
+
     for (size_t i = 0; i < gST->NumberOfTableEntries; i++) {
         EFI_CONFIGURATION_TABLE *cur_table = &gST->ConfigurationTable[i];
-        EFI_GUID acpi_2_guid = ACPI_20_TABLE_GUID;
 
-        if (memcmp(&cur_table->VendorGuid, &acpi_2_guid, sizeof(EFI_GUID)) != 0)
+        if (memcmp(&cur_table->VendorGuid, &acpi_2_guid, sizeof(EFI_GUID)) != 0 || // XSDP
+            memcmp(&cur_table->VendorGuid, &acpi_1_guid, sizeof(EFI_GUID)) != 0)   // RSDP
             continue;
 
-        if (acpi_checksum(cur_table->VendorTable, sizeof(struct rsdp)) != 0)
+        if (acpi_checksum(cur_table->VendorTable, sizeof(struct rsdp)) != 0 || // XSDP is 36 bytes wide
+            acpi_checksum(cur_table->VendorTable, 20) != 0)                   // RSDP is 20 bytes wide
             continue;
 
         printv("acpi: Found RSDP at %X\n", cur_table->VendorTable);
tab: 248 wrap: offon