From 01f1d2daaa0c3b4d72b19d30a0d6a031c97766e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B6nke=20Holz?= Date: Wed, 24 Apr 2024 20:34:47 +0200 Subject: [PATCH] Kernel/riscv64: Don't clobber the boot info argument in enable_paging "register asm" variables don't preserve the register value, so the call to calculate_physical_to_link_time_address_offset in the asm input operands is allowed to clobber a0. --- Kernel/Arch/riscv64/MMU.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Kernel/Arch/riscv64/MMU.cpp b/Kernel/Arch/riscv64/MMU.cpp index e54dade078e..131fb3c3576 100644 --- a/Kernel/Arch/riscv64/MMU.cpp +++ b/Kernel/Arch/riscv64/MMU.cpp @@ -177,8 +177,9 @@ static UNMAP_AFTER_INIT void setup_kernel_page_directory(u64* root_table) // This function has to fit into one page as it will be identity mapped. [[gnu::aligned(PAGE_SIZE)]] [[noreturn]] UNMAP_AFTER_INIT static void enable_paging(BootInfo const& info, FlatPtr satp, u64* enable_paging_pte) { - // Switch current root page table to argument 0. This will immediately take effect, but we won't not crash as this function is identity mapped. + // Switch current root page table to argument 1. This will immediately take effect, but we won't not crash as this function is identity mapped. // Also, set up a temporary trap handler to catch any traps while switching page tables. + auto offset = calculate_physical_to_link_time_address_offset(); register FlatPtr a0 asm("a0") = bit_cast(&info); asm volatile( " lla t0, 1f \n" @@ -213,7 +214,7 @@ static UNMAP_AFTER_INIT void setup_kernel_page_directory(u64* root_table) " wfi \n" " j 1b \n" : - : "r"(a0), [satp] "r"(satp), [offset] "r"(calculate_physical_to_link_time_address_offset()), [enable_paging_pte] "r"(enable_paging_pte) + : "r"(a0), [satp] "r"(satp), [offset] "r"(offset), [enable_paging_pte] "r"(enable_paging_pte) : "t0"); VERIFY_NOT_REACHED();