summaryrefslogtreecommitdiff
path: root/kernel/arch
diff options
context:
space:
mode:
authorAnton Kling <anton@kling.gg>2024-02-21 20:06:35 +0100
committerAnton Kling <anton@kling.gg>2024-02-21 20:06:35 +0100
commit9b475d3db3275d4c34f02161ae70ced5595a0fdb (patch)
tree0c50e4af3ce52017f295c44f6f4319e4a43de085 /kernel/arch
parent6c9cb0bd8ceb039ce387c850e25adc6f99cfcd6f (diff)
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.
Diffstat (limited to 'kernel/arch')
-rw-r--r--kernel/arch/i386/mmu.c26
1 files changed, 7 insertions, 19 deletions
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 <assert.h>
+#include <cpu/arch_inst.h>
#include <ksbrk.h>
#include <log.h>
#include <math.h>
@@ -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));