mirror of
https://github.com/RGBCube/serenity
synced 2025-05-22 19:45:08 +00:00
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:
parent
6b52f6c61d
commit
3e8b60c618
4 changed files with 94 additions and 90 deletions
|
@ -570,7 +570,6 @@ void detect_cpu_features()
|
||||||
g_cpu_supports_umip = (extended_features.ecx() & (1 << 2));
|
g_cpu_supports_umip = (extended_features.ecx() & (1 << 2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void stac()
|
void stac()
|
||||||
{
|
{
|
||||||
if (!g_cpu_supports_smap)
|
if (!g_cpu_supports_smap)
|
||||||
|
@ -586,3 +585,79 @@ void clac()
|
||||||
asm volatile("clac" ::
|
asm volatile("clac" ::
|
||||||
: "cc");
|
: "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");
|
||||||
|
}
|
||||||
|
|
|
@ -539,8 +539,13 @@ extern bool g_cpu_supports_tsc;
|
||||||
extern bool g_cpu_supports_umip;
|
extern bool g_cpu_supports_umip;
|
||||||
|
|
||||||
void stac();
|
void stac();
|
||||||
|
|
||||||
void clac();
|
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 {
|
class SmapDisabler {
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -25,100 +25,25 @@ MemoryManager::MemoryManager()
|
||||||
{
|
{
|
||||||
m_kernel_page_directory = PageDirectory::create_kernel_page_directory();
|
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()
|
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()
|
void MemoryManager::protect_kernel_image()
|
||||||
{
|
{
|
||||||
// Disable writing to the kernel text and rodata segments.
|
// Disable writing to the kernel text and rodata segments.
|
||||||
|
|
|
@ -121,7 +121,6 @@ private:
|
||||||
void unregister_region(Region&);
|
void unregister_region(Region&);
|
||||||
|
|
||||||
void detect_cpu_features();
|
void detect_cpu_features();
|
||||||
void initialize_paging();
|
|
||||||
void setup_low_1mb();
|
void setup_low_1mb();
|
||||||
void protect_kernel_image();
|
void protect_kernel_image();
|
||||||
void parse_memory_map();
|
void parse_memory_map();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue