stivale/limine: Fix build_pagemap issue introduced in 07e6c2d5
diff --git a/common/protos/limine.c b/common/protos/limine.c
index 7ece73f2..c0e43fb2 100644
--- a/common/protos/limine.c
+++ b/common/protos/limine.c
@@ -626,7 +626,7 @@ FEAT_END
#endif
pagemap_t pagemap = {0};
- pagemap = stivale_build_pagemap(want_5lv, nx_available, ranges, ranges_count, true,
+ pagemap = stivale_build_pagemap(want_5lv, nx_available, true, ranges, ranges_count, true,
physical_base, virtual_base, direct_map_offset);
#if defined (UEFI)
diff --git a/common/protos/stivale.c b/common/protos/stivale.c
index 6bb67dd2..b91fba00 100644
--- a/common/protos/stivale.c
+++ b/common/protos/stivale.c
@@ -357,7 +357,7 @@ noreturn void stivale_load(char *config, char *cmdline) {
pagemap_t pagemap = {0};
if (bits == 64)
- pagemap = stivale_build_pagemap(want_5lv, false, NULL, 0, false, 0, 0, direct_map_offset);
+ pagemap = stivale_build_pagemap(want_5lv, false, false, NULL, 0, false, 0, 0, direct_map_offset);
// Reserve 32K at 0x70000 if possible
if (!memmap_alloc_range(0x70000, 0x8000, MEMMAP_USABLE, true, false, false, false)) {
@@ -385,7 +385,7 @@ noreturn void stivale_load(char *config, char *cmdline) {
stivale_hdr.stack, false, false, (uintptr_t)local_gdt);
}
-pagemap_t stivale_build_pagemap(bool level5pg, bool unmap_null, struct elf_range *ranges, size_t ranges_count,
+pagemap_t stivale_build_pagemap(bool level5pg, bool nx, bool unmap_null, struct elf_range *ranges, size_t ranges_count,
bool want_fully_virtual, uint64_t physical_base, uint64_t virtual_base,
uint64_t direct_map_offset) {
pagemap_t pagemap = new_pagemap(level5pg ? 5 : 4);
@@ -411,7 +411,7 @@ pagemap_t stivale_build_pagemap(bool level5pg, bool unmap_null, struct elf_range
}
uint64_t pf = VMM_FLAG_PRESENT |
- (ranges[i].permissions & ELF_PF_X ? 0 : VMM_FLAG_NOEXEC) |
+ (ranges[i].permissions & ELF_PF_X ? 0 : (nx ? VMM_FLAG_NOEXEC : 0)) |
(ranges[i].permissions & ELF_PF_W ? VMM_FLAG_WRITE : 0);
for (uint64_t j = 0; j < ranges[i].length; j += 0x1000) {
diff --git a/common/protos/stivale.h b/common/protos/stivale.h
index ae8e5aa7..9d15e216 100644
--- a/common/protos/stivale.h
+++ b/common/protos/stivale.h
@@ -11,7 +11,7 @@ noreturn void stivale_load(char *config, char *cmdline);
bool stivale_load_by_anchor(void **_anchor, const char *magic,
uint8_t *file, uint64_t filesize);
-pagemap_t stivale_build_pagemap(bool level5pg, bool unmap_null, struct elf_range *ranges, size_t ranges_count,
+pagemap_t stivale_build_pagemap(bool level5pg, bool nx, bool unmap_null, struct elf_range *ranges, size_t ranges_count,
bool want_fully_virtual, uint64_t physical_base, uint64_t virtual_base,
uint64_t direct_map_offset);
noreturn void stivale_spinup(
diff --git a/common/protos/stivale2.c b/common/protos/stivale2.c
index 5f778425..fb8d7ee6 100644
--- a/common/protos/stivale2.c
+++ b/common/protos/stivale2.c
@@ -779,7 +779,7 @@ have_tm_tag:;
pagemap_t pagemap = {0};
if (bits == 64)
- pagemap = stivale_build_pagemap(want_5lv, unmap_null,
+ pagemap = stivale_build_pagemap(want_5lv, true, unmap_null,
want_pmrs ? ranges : NULL,
want_pmrs ? ranges_count : 0,
want_fully_virtual, physical_base, virtual_base,
