From 6fea3166118a79baf5546555592694a37a08bb51 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 18 Jan 2020 10:11:29 +0100 Subject: [PATCH] Kernel: Move all CPU feature initialization into cpu_setup() ..and do it very very early in boot. --- Kernel/Arch/i386/CPU.cpp | 109 +++++++++++++++++++----------------- Kernel/Arch/i386/CPU.h | 8 +-- Kernel/VM/MemoryManager.cpp | 7 --- Kernel/init.cpp | 27 +-------- 4 files changed, 61 insertions(+), 90 deletions(-) diff --git a/Kernel/Arch/i386/CPU.cpp b/Kernel/Arch/i386/CPU.cpp index 1c6dee5388..b53fcc722b 100644 --- a/Kernel/Arch/i386/CPU.cpp +++ b/Kernel/Arch/i386/CPU.cpp @@ -578,7 +578,7 @@ bool g_cpu_supports_sse; bool g_cpu_supports_tsc; bool g_cpu_supports_umip; -void detect_cpu_features() +void cpu_detect() { CPUID processor_info(0x1); g_cpu_supports_pae = (processor_info.edx() & (1 << 6)); @@ -612,17 +612,22 @@ void clac() : "cc"); } -void x86_enable_pae() +void cpu_setup() { - // Turn on CR4.PAE - asm volatile( - "mov %cr4, %eax\n" - "orl $0x20, %eax\n" - "mov %eax, %cr4\n"); -} + cpu_detect(); + + if (g_cpu_supports_sse) { + sse_init(); + kprintf("x86: SSE support enabled\n"); + } + + asm volatile( + "movl %%cr0, %%eax\n" + "orl $0x00010000, %%eax\n" + "movl %%eax, %%cr0\n" :: + : "%eax", "memory"); + kprintf("x86: WP support enabled\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( @@ -633,39 +638,7 @@ void x86_enable_pge() } 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( @@ -677,13 +650,49 @@ void x86_enable_nx() } 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"); + 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"); + } + + 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"); + } + + if (g_cpu_supports_umip) { + asm volatile( + "mov %cr4, %eax\n" + "orl $0x800, %eax\n" + "mov %eax, %cr4\n"); + kprintf("x86: UMIP support enabled\n"); + } + + if (g_cpu_supports_tsc) { + asm volatile( + "mov %cr4, %eax\n" + "orl $0x4, %eax\n" + "mov %eax, %cr4\n"); + kprintf("x86: RDTSC support restricted\n"); + } + + if (g_cpu_supports_rdrand) { + kprintf("x86: Using RDRAND for good randomness\n"); + } else { + kprintf("x86: No RDRAND support detected. Randomness will be shitty\n"); + } } diff --git a/Kernel/Arch/i386/CPU.h b/Kernel/Arch/i386/CPU.h index d72b19d204..540d6a2b89 100644 --- a/Kernel/Arch/i386/CPU.h +++ b/Kernel/Arch/i386/CPU.h @@ -553,7 +553,7 @@ public: } }; -void detect_cpu_features(); +void cpu_setup(); extern bool g_cpu_supports_nx; extern bool g_cpu_supports_pae; extern bool g_cpu_supports_pge; @@ -566,12 +566,6 @@ 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: diff --git a/Kernel/VM/MemoryManager.cpp b/Kernel/VM/MemoryManager.cpp index 30a23432fc..a134e72dca 100644 --- a/Kernel/VM/MemoryManager.cpp +++ b/Kernel/VM/MemoryManager.cpp @@ -53,13 +53,6 @@ MemoryManager::MemoryManager() parse_memory_map(); - x86_enable_pae(); - x86_enable_pge(); - x86_enable_smep(); - x86_enable_smap(); - x86_enable_nx(); - x86_enable_wp(); - asm volatile("movl %%eax, %%cr3" ::"a"(kernel_page_directory().cr3())); setup_low_1mb(); diff --git a/Kernel/init.cpp b/Kernel/init.cpp index 8bca72f681..7b54959f6f 100644 --- a/Kernel/init.cpp +++ b/Kernel/init.cpp @@ -277,7 +277,7 @@ extern "C" [[noreturn]] void init() if (cmdline && bad_prefix_check(reinterpret_cast(cmdline), "serial_debug")) set_serial_debug(true); - detect_cpu_features(); + cpu_setup(); kmalloc_init(); slab_alloc_init(); @@ -309,32 +309,7 @@ extern "C" [[noreturn]] void init() kprintf("Starting SerenityOS...\n"); - if (g_cpu_supports_sse) { - sse_init(); - kprintf("x86: SSE support enabled\n"); - } - if (g_cpu_supports_umip) { - asm volatile( - "mov %cr4, %eax\n" - "orl $0x800, %eax\n" - "mov %eax, %cr4\n"); - kprintf("x86: UMIP support enabled\n"); - } - - if (g_cpu_supports_tsc) { - asm volatile( - "mov %cr4, %eax\n" - "orl $0x4, %eax\n" - "mov %eax, %cr4\n"); - kprintf("x86: RDTSC support restricted\n"); - } - - if (g_cpu_supports_rdrand) { - kprintf("x86: Using RDRAND for good randomness\n"); - } else { - kprintf("x86: No RDRAND support detected. Randomness will be shitty\n"); - } __stack_chk_guard = get_good_random();