diff options
author | Andreas Kling <awesomekling@gmail.com> | 2020-01-17 23:56:13 +0100 |
---|---|---|
committer | Andreas Kling <awesomekling@gmail.com> | 2020-01-18 00:28:16 +0100 |
commit | 3e8b60c6181757d28c619622dbdcc863dda89f30 (patch) | |
tree | 9c5b6c6c9f84e70facd9d862bb5537cc0fb5d356 /Kernel/Arch | |
parent | 6b52f6c61db3b81f44c83be55aeddaccbd580ee8 (diff) | |
download | serenity-3e8b60c6181757d28c619622dbdcc863dda89f30.zip |
Kernel: Clean up MemoryManager initialization a bit more
Move the CPU feature enabling to functions in Arch/i386/CPU.cpp.
Diffstat (limited to 'Kernel/Arch')
-rw-r--r-- | Kernel/Arch/i386/CPU.cpp | 77 | ||||
-rw-r--r-- | Kernel/Arch/i386/CPU.h | 7 |
2 files changed, 82 insertions, 2 deletions
diff --git a/Kernel/Arch/i386/CPU.cpp b/Kernel/Arch/i386/CPU.cpp index e08a7e6acf..8a7b18223e 100644 --- a/Kernel/Arch/i386/CPU.cpp +++ b/Kernel/Arch/i386/CPU.cpp @@ -570,7 +570,6 @@ void detect_cpu_features() g_cpu_supports_umip = (extended_features.ecx() & (1 << 2)); } - void stac() { if (!g_cpu_supports_smap) @@ -586,3 +585,79 @@ void clac() asm volatile("clac" :: : "cc"); } + +void x86_enable_pae() +{ + // Turn on CR4.PAE + asm volatile( + "mov %cr4, %eax\n" + "orl $0x20, %eax\n" + "mov %eax, %cr4\n"); +} + +void x86_enable_pge() +{ + if (g_cpu_supports_pge) { + // Turn on CR4.PGE so the CPU will respect the G bit in page tables. + asm volatile( + "mov %cr4, %eax\n" + "orl $0x80, %eax\n" + "mov %eax, %cr4\n"); + kprintf("x86: PGE support enabled\n"); + } else { + kprintf("x86: PGE support not detected\n"); + } +} + +void x86_enable_smep() +{ + if (g_cpu_supports_smep) { + // Turn on CR4.SMEP + asm volatile( + "mov %cr4, %eax\n" + "orl $0x100000, %eax\n" + "mov %eax, %cr4\n"); + kprintf("x86: SMEP support enabled\n"); + } else { + kprintf("x86: SMEP support not detected\n"); + } +} + +void x86_enable_smap() +{ + if (g_cpu_supports_smap) { + // Turn on CR4.SMAP + kprintf("x86: Enabling SMAP\n"); + asm volatile( + "mov %cr4, %eax\n" + "orl $0x200000, %eax\n" + "mov %eax, %cr4\n"); + kprintf("x86: SMAP support enabled\n"); + } else { + kprintf("x86: SMAP support not detected\n"); + } +} + +void x86_enable_nx() +{ + if (g_cpu_supports_nx) { + // Turn on IA32_EFER.NXE + asm volatile( + "movl $0xc0000080, %ecx\n" + "rdmsr\n" + "orl $0x800, %eax\n" + "wrmsr\n"); + kprintf("x86: NX support enabled\n"); + } else { + kprintf("x86: NX support not detected\n"); + } +} + +void x86_enable_wp() +{ + asm volatile( + "movl %%cr0, %%eax\n" + "orl $0x00010000, %%eax\n" + "movl %%eax, %%cr0\n" :: + : "%eax", "memory"); +} diff --git a/Kernel/Arch/i386/CPU.h b/Kernel/Arch/i386/CPU.h index 583a66d7f9..7a73f2b458 100644 --- a/Kernel/Arch/i386/CPU.h +++ b/Kernel/Arch/i386/CPU.h @@ -539,8 +539,13 @@ extern bool g_cpu_supports_tsc; extern bool g_cpu_supports_umip; void stac(); - void clac(); +void x86_enable_pae(); +void x86_enable_pge(); +void x86_enable_smep(); +void x86_enable_smap(); +void x86_enable_nx(); +void x86_enable_wp(); class SmapDisabler { public: |