]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
commands/acpi: Use xsdt_addr if present
authorQiumiao Zhang <zhangqiumiao1@huawei.com>
Tue, 13 Jun 2023 03:17:36 +0000 (11:17 +0800)
committerDaniel Kiper <daniel.kiper@oracle.com>
Tue, 13 Jun 2023 13:59:18 +0000 (15:59 +0200)
According to the ACPI specification, in ACPI 2.0 or later, an
ACPI-compatible OS must use the XSDT if present. So, we should
use xsdt_addr instead of rsdt_addr if xsdt_addr is valid.

Signed-off-by: Qiumiao Zhang <zhangqiumiao1@huawei.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
grub-core/commands/acpi.c

index deec4bb43ca4752e2c145d7dad3acdf7c0788a4f..1c034463cf0f4075dd0524b010c137d03be5e37d 100644 (file)
@@ -514,7 +514,11 @@ grub_cmd_acpi (struct grub_extcmd_context *ctxt, int argc, char **args)
       /* Set revision variables to replicate the same version as host. */
       rev1 = ! rsdp->revision;
       rev2 = rsdp->revision;
-      rsdt = (struct grub_acpi_table_header *) (grub_addr_t) rsdp->rsdt_addr;
+      if (rev2 && ((struct grub_acpi_table_header *) (grub_addr_t) ((struct grub_acpi_rsdp_v20 *) rsdp)->xsdt_addr) != NULL)
+       rsdt = (struct grub_acpi_table_header *) (grub_addr_t) ((struct grub_acpi_rsdp_v20 *) rsdp)->xsdt_addr;
+      else
+       rsdt = (struct grub_acpi_table_header *) (grub_addr_t) rsdp->rsdt_addr;
+
       /* Load host tables. */
       for (entry_ptr = (grub_uint32_t *) (rsdt + 1);
           entry_ptr < (grub_uint32_t *) (((grub_uint8_t *) rsdt)