Kernel: Clean up MemoryManager initialization a bit more

Move the CPU feature enabling to functions in Arch/i386/CPU.cpp.
This commit is contained in:
Andreas Kling 2020-01-17 23:56:13 +01:00
parent 6b52f6c61d
commit 3e8b60c618
Notes: sideshowbarker 2024-07-19 09:59:44 +09:00
4 changed files with 94 additions and 90 deletions

View file

@ -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");
}

View file

@ -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:

View file

@ -25,100 +25,25 @@ MemoryManager::MemoryManager()
{
m_kernel_page_directory = PageDirectory::create_kernel_page_directory();
initialize_paging();
parse_memory_map();
kprintf("MM initialized.\n");
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();
protect_kernel_image();
}
MemoryManager::~MemoryManager()
{
}
void MemoryManager::initialize_paging()
{
if (!g_cpu_supports_pae) {
kprintf("x86: Cannot boot on machines without PAE support.\n");
hang();
}
#ifdef MM_DEBUG
dbgprintf("MM: Kernel page directory @ %p\n", kernel_page_directory().cr3());
#endif
parse_memory_map();
#ifdef MM_DEBUG
dbgprintf("MM: Installing page directory\n");
#endif
// Turn on CR4.PAE
asm volatile(
"mov %cr4, %eax\n"
"orl $0x20, %eax\n"
"mov %eax, %cr4\n");
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");
}
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_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");
}
asm volatile("movl %%eax, %%cr3" ::"a"(kernel_page_directory().cr3()));
asm volatile(
"movl %%cr0, %%eax\n"
"orl $0x80010001, %%eax\n"
"movl %%eax, %%cr0\n" ::
: "%eax", "memory");
setup_low_1mb();
protect_kernel_image();
#ifdef MM_DEBUG
dbgprintf("MM: Paging initialized.\n");
#endif
}
void MemoryManager::protect_kernel_image()
{
// Disable writing to the kernel text and rodata segments.

View file

@ -121,7 +121,6 @@ private:
void unregister_region(Region&);
void detect_cpu_features();
void initialize_paging();
void setup_low_1mb();
void protect_kernel_image();
void parse_memory_map();