From 9b475d3db3275d4c34f02161ae70ced5595a0fdb Mon Sep 17 00:00:00 2001 From: Anton Kling Date: Wed, 21 Feb 2024 20:06:35 +0100 Subject: Kernel: Remove all inline assembly. Now the kernel does not rely upon inline assembly which is often very error prone. This also means that the kernel could probably be compiled with any c99 compiler which would help future bootstrapping. --- kernel/arch/i386/mmu.c | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) (limited to 'kernel/arch') diff --git a/kernel/arch/i386/mmu.c b/kernel/arch/i386/mmu.c index 201fa8e..240c9ea 100644 --- a/kernel/arch/i386/mmu.c +++ b/kernel/arch/i386/mmu.c @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -130,12 +131,6 @@ void *align_page(void *a) { return a; } -void flush_tlb(void) { - asm volatile("\ - mov %cr3, %eax;\ - mov %eax, %cr3"); -} - u32 first_free_frame(void) { for (u32 i = 1; i < INDEX_FROM_BIT(num_of_frames); i++) { if (frames[i] == 0xFFFFFFFF) { @@ -506,8 +501,8 @@ void move_stack(u32 new_stack_address, u32 size) { u32 old_stack_pointer, old_base_pointer; - asm volatile("mov %%esp, %0" : "=r"(old_stack_pointer)); - asm volatile("mov %%ebp, %0" : "=r"(old_base_pointer)); + old_stack_pointer = get_current_sp(); + old_base_pointer = get_current_sbp(); u32 new_stack_pointer = old_stack_pointer + ((u32)new_stack_address - inital_esp); @@ -528,8 +523,8 @@ void move_stack(u32 new_stack_address, u32 size) { inital_esp = new_stack_pointer; // Actually change the stack - asm volatile("mov %0, %%esp" ::"irm"(new_stack_pointer)); - asm volatile("mov %0, %%ebp" ::"irm"(new_base_pointer)); + set_sp(new_stack_pointer + 8); + set_sbp(new_base_pointer); } // C strings have a unknown length so it does not makes sense to check @@ -581,13 +576,7 @@ void *is_valid_userpointer(const void *ptr, size_t s) { void switch_page_directory(PageDirectory *directory) { active_directory = directory; - asm("mov %0, %%cr3" ::"r"(directory->physical_address)); -} - -void enable_paging(void) { - asm("mov %cr0, %eax\n" - "or 0b10000000000000000000000000000000, %eax\n" - "mov %eax, %cr0\n"); + set_cr3(directory->physical_address); } void create_table(int table_index) { @@ -603,8 +592,7 @@ void create_table(int table_index) { } void paging_init(u64 memsize) { - u32 *cr3; - asm volatile("mov %%cr3, %0" : "=r"(cr3)); + u32 *cr3 = (void *)get_cr3(); u32 *virtual = (u32 *)((u32)cr3 + 0xC0000000); frames = ksbrk(1024 * sizeof(u32)); memset(frames, 0, 1024 * sizeof(u32)); -- cgit v1.2.3