:: commit d5543928503dedd6a55cb9ce41efe3322792bae3

mintsuki <mintsuki@protonmail.com> — 2024-08-01 06:27

parents: ddd3f5161a

mm/vmm: Fix paging_mode_va_bits() for aarch64 4 level paging and loongarch64

diff --git a/common/mm/vmm.h b/common/mm/vmm.h
index 144dc24c..8adea18a 100644
--- a/common/mm/vmm.h
+++ b/common/mm/vmm.h
@@ -58,7 +58,7 @@ void map_page(pagemap_t pagemap, uint64_t virt_addr, uint64_t phys_addr, uint64_
 #define PAGING_MODE_MIN PAGING_MODE_AARCH64_4LVL
 #define PAGING_MODE_MAX PAGING_MODE_AARCH64_5LVL
 
-#define paging_mode_va_bits(mode) ((mode) ? 53 : 48)
+#define paging_mode_va_bits(mode) ((mode) ? 53 : 49)
 
 static inline uint64_t paging_mode_higher_half(int paging_mode) {
     if (paging_mode == PAGING_MODE_AARCH64_5LVL) {
@@ -123,7 +123,7 @@ void map_page(pagemap_t pagemap, uint64_t virt_addr, uint64_t phys_addr, uint64_
 
 #elif defined (__loongarch64)
 
-#define paging_mode_va_bits(mode) 48
+#define paging_mode_va_bits(mode) 49
 
 static inline uint64_t paging_mode_higher_half(int paging_mode) {
     (void)paging_mode;
diff --git a/common/protos/limine.c b/common/protos/limine.c
index 1b13f8bf..64b71f31 100644
--- a/common/protos/limine.c
+++ b/common/protos/limine.c
@@ -803,7 +803,7 @@ FEAT_END
 
     uint64_t pa = aa64mmfr0 & 0xF;
 
-    uint64_t tsz = 64 - paging_mode_va_bits(paging_mode);
+    uint64_t tsz = 64 - (paging_mode_va_bits(paging_mode) - 1);
 #endif
 
     struct limine_file *kf = ext_mem_alloc(sizeof(struct limine_file));
tab: 248 wrap: offon