:: commit 1f01ddfc6dfe2951110d12133b0481bc5edf4cc3

xvanc <xvancm@gmail.com> — 2023-06-04 18:16

parents: 9274ee656e

limine: scale the maximum KASLR offset based on the address space size

diff --git a/common/mm/vmm.c b/common/mm/vmm.c
index eca817b9..4ee192fa 100644
--- a/common/mm/vmm.c
+++ b/common/mm/vmm.c
@@ -273,6 +273,19 @@ uint64_t paging_mode_higher_half(int paging_mode) {
     }
 }
 
+int paging_mode_va_bits(int paging_mode) {
+    switch (paging_mode) {
+        case PAGING_MODE_RISCV_SV39:
+            return 39;
+        case PAGING_MODE_RISCV_SV48:
+            return 48;
+        case PAGING_MODE_RISCV_SV57:
+            return 57;
+        default:
+            panic(false, "paging_mode_va_bits: invalid mode");
+    }
+}
+
 int vmm_max_paging_mode(void)
 {
     static int max_level;
diff --git a/common/mm/vmm.h b/common/mm/vmm.h
index cddbd1eb..a435818d 100644
--- a/common/mm/vmm.h
+++ b/common/mm/vmm.h
@@ -15,6 +15,8 @@
 #define PAGING_MODE_X86_64_4LVL 0
 #define PAGING_MODE_X86_64_5LVL 1
 
+#define paging_mode_va_bits(mode) ((mode) ? 57 : 48)
+
 static inline uint64_t paging_mode_higher_half(int paging_mode) {
     if (paging_mode == PAGING_MODE_X86_64_5LVL) {
         return 0xff00000000000000;
@@ -89,6 +91,8 @@ void map_page(pagemap_t pagemap, uint64_t virt_addr, uint64_t phys_addr, uint64_
 #define PAGING_MODE_RISCV_SV48 9
 #define PAGING_MODE_RISCV_SV57 10
 
+int paging_mode_va_bits(int paging_mode);
+
 enum page_size {
     Size4KiB,
     Size2MiB,
diff --git a/common/protos/limine.c b/common/protos/limine.c
index 3f2862be..46c08850 100644
--- a/common/protos/limine.c
+++ b/common/protos/limine.c
@@ -194,7 +194,8 @@ static void **requests;
 static void set_paging_mode(int paging_mode, bool kaslr) {
     direct_map_offset = paging_mode_higher_half(paging_mode);
     if (kaslr) {
-        direct_map_offset += (rand64() & ~((uint64_t)0x40000000 - 1)) & 0xfffffffffff;
+        uint64_t mask = ((uint64_t)1 << (paging_mode_va_bits(paging_mode) - 4)) - 1;
+        direct_map_offset += (rand64() & ~((uint64_t)0x40000000 - 1)) & mask;
     }
 }
 
tab: 248 wrap: offon