[kvm-unit-tests PATCH 1/7] riscv: Initialize the ACPI RSDP from the EFI system table
Xiang W
wangxiang at iscas.ac.cn
Wed Sep 23 20:39:39 PDT 2026
On EFI boots without a DT, ACPI table lookup needs a valid RSDP.
Fetch the ACPI 2.0 table from the EFI configuration table and
register it with set_efi_rsdp() before cpu_init() and
timer_get_frequency().
The RSDP lives in EFI_ACPI_RECLAIM_MEMORY, which the RISC-V
allocator does not reuse, so there is no need to copy it aside.
Signed-off-by: Xiang W <wangxiang at iscas.ac.cn>
---
lib/riscv/setup.c | 29 +++++++++++++++++++++++++++++
1 file changed, 29 insertions(+)
diff --git a/lib/riscv/setup.c b/lib/riscv/setup.c
index a30aa0c4..8c22120d 100644
--- a/lib/riscv/setup.c
+++ b/lib/riscv/setup.c
@@ -226,10 +226,31 @@ void setup(const void *fdt, phys_addr_t freemem_start)
#ifdef CONFIG_EFI
#include <efi.h>
+#include <acpi.h>
extern unsigned long exception_vectors;
extern unsigned long boot_hartid;
+static efi_status_t setup_rsdp(efi_bootinfo_t *efi_bootinfo __unused)
+{
+ efi_status_t status;
+ struct acpi_table_rsdp *rsdp;
+
+ /*
+ * RSDP resides in an EFI_ACPI_RECLAIM_MEMORY region, which is not used
+ * by kvm-unit-tests RISC-V memory allocator. So it is not necessary to
+ * copy the data structure to another memory region to prevent
+ * unintentional overwrite.
+ */
+ status = efi_get_system_config_table(ACPI_20_TABLE_GUID, (void **)&rsdp);
+ if (status != EFI_SUCCESS)
+ return status;
+
+ set_efi_rsdp(rsdp);
+
+ return EFI_SUCCESS;
+}
+
static efi_status_t efi_mem_init(efi_bootinfo_t *efi_bootinfo)
{
struct mem_region *freemem_mr = NULL, *code, *data;
@@ -273,6 +294,14 @@ efi_status_t setup_efi(efi_bootinfo_t *efi_bootinfo)
return status;
}
+ if (!dt_available()) {
+ status = setup_rsdp(efi_bootinfo);
+ if (status != EFI_SUCCESS) {
+ printf("Cannot find RSDP in EFI system table\n");
+ return status;
+ }
+ }
+
cpu_init();
timer_get_frequency();
thread_info_init();
--
2.47.3
More information about the kvm-riscv
mailing list