Kernel: Use the CPU's NX bit to enforce PROT_EXEC on memory mappings

Now that we have PAE support, we can ask the CPU to crash processes for
trying to execute non-executable memory. This is pretty cool! :^)
This commit is contained in:
Andreas Kling 2019-12-25 11:44:32 +01:00
parent c22a4301ed
commit ce5f7f6c07
Notes: sideshowbarker 2024-07-19 10:41:25 +09:00
2 changed files with 9 additions and 0 deletions

View file

@ -167,6 +167,13 @@ void MemoryManager::initialize_paging()
"orl $0x20, %eax\n"
"mov %eax, %cr4\n");
// Turn on IA32_EFER.NXE
asm volatile(
"movl $0xc0000080, %ecx\n"
"rdmsr\n"
"orl $0x800, %eax\n"
"wrmsr\n");
asm volatile("movl %%eax, %%cr3" ::"a"(kernel_page_directory().cr3()));
asm volatile(
"movl %%cr0, %%eax\n"

View file

@ -216,6 +216,7 @@ void Region::remap_page(size_t index)
pte.set_writable(false);
else
pte.set_writable(is_writable());
pte.set_execute_disabled(!is_executable());
pte.set_user_allowed(is_user_accessible());
m_page_directory->flush(page_vaddr);
#ifdef MM_DEBUG
@ -264,6 +265,7 @@ void Region::map(PageDirectory& page_directory)
pte.set_writable(false);
else
pte.set_writable(is_writable());
pte.set_execute_disabled(!is_executable());
} else {
pte.set_physical_page_base(0);
pte.set_present(false);