diff options
Diffstat (limited to 'arch/x86_64/usermode.c')
-rw-r--r-- | arch/x86_64/usermode.c | 38 |
1 files changed, 8 insertions, 30 deletions
diff --git a/arch/x86_64/usermode.c b/arch/x86_64/usermode.c index 9ce5ed3..66a641c 100644 --- a/arch/x86_64/usermode.c +++ b/arch/x86_64/usermode.c @@ -1,12 +1,10 @@ #include "arch/x86_64/object.h" #include "object.h" -#include "memory.h" #include "bootargs.h" #include "device/initrd.h" #include "object.h" #include "panic.h" #include "string.h" -#include "print.h" #include "device/processor.h" #include "arch/x86_64/page.h" @@ -28,23 +26,6 @@ s_new_mapping(objdir_t *untyped_dir) return 0; } -static uintptr_t -s_new_kstack(objdir_t *untyped_dir, objdir_entry_t *dest_entry) -{ - objdir_entry_t *untyped_entry = NULL; - for(int i = 1; i < OBJECT_DIRECTORY_MAX_ENTRIES; i++) { - untyped_entry = &untyped_dir->entries[i]; - if(untyped_entry->type != KO_MEMORY_UNTYPED) continue; - - int err = untyped_retype_kernel_stack(untyped_entry, dest_entry); - if(err != 0) continue; - - uintptr_t ptr = dest_entry->data; - return (uintptr_t)vmem_phys_tovirt(ptr); - } - return 0; -} - static pmle_t* s_ensure_mapping_layer(pmle_t *pml, objdir_t *untyped_dir, uintptr_t addr, uint8_t layer) { @@ -60,13 +41,14 @@ s_ensure_mapping_layer(pmle_t *pml, objdir_t *untyped_dir, uintptr_t addr, uint8 .p = 1, .rw = 1, .us = 1, + .osflg = (layer - 1) & 3, .paddr = table_phys >> 12 }; __asm__ volatile("invlpg (%0)":: "r"(table_phys)); return vmem_phys_tovirt(table_phys); } -static void +static uintptr_t s_map_page(pmle_t *pml4, objdir_t *untyped_dir, uintptr_t addr) { pmle_t *pml3 = s_ensure_mapping_layer(pml4, untyped_dir, addr, 4); @@ -82,9 +64,11 @@ s_map_page(pmle_t *pml4, objdir_t *untyped_dir, uintptr_t addr) .p = 1, .rw = 1, .us = 1, + .osflg = 0, .paddr = pptr >> 12 }; __asm__ volatile("invlpg (%0)":: "r"(addr)); + return pptr; } __attribute__((noreturn)) @@ -114,11 +98,9 @@ init_load(void) } size_t tcb_diri = _initDirectory.self.data++; - size_t kstack_diri = _initDirectory.self.data++; size_t message_diri = _initDirectory.self.data++; _initData.tcb_object = tcb_diri; - _initData.kernel_stack_object = kstack_diri; _initData.message_object = message_diri; _initDirectory.entries[tcb_diri] = (objdir_entry_t) { @@ -130,7 +112,7 @@ init_load(void) objdir_t *untyped_dir = (objdir_t*)_initDirectory.entries[untyped_diri].data; size_t pml4_diri = _initData.pm_object; - pmle_t *pml4 = vmem_phys_tovirt(_initDirectory.entries[pml4_diri].data); + pmle_t *pml4 = vmem_phys_tovirt(_initDirectory.entries[pml4_diri].data & ~3ULL); //Reserve and map pages for init binary size_t init_size = initrd_file_size(init_header); @@ -150,11 +132,7 @@ init_load(void) uintptr_t sp = stack_base + 0xFF0; //Create a kernel stack for the init TCB - uintptr_t ksp_base = (uintptr_t)s_new_kstack(untyped_dir, &_initDirectory.entries[kstack_diri]); - _initDirectory.entries[kstack_diri] = (objdir_entry_t) { - .type = KO_KERNEL_STACK, - .data = ksp_base - }; + uintptr_t ksp_base = (uintptr_t)s_init_tcb.kstack; s_init_tcb.ksp = ksp_base + 0xFF0; processor_t *proc = (processor_t*)processor_current(); @@ -164,10 +142,10 @@ init_load(void) uintptr_t message_base = init_base + (init_pages << 12); message_base += ((~(message_base & 0xFFF)) & 0xFFF) + 1; - s_map_page(pml4, untyped_dir, message_base); + uintptr_t message_phys = s_map_page(pml4, untyped_dir, message_base); _initDirectory.entries[message_diri] = (objdir_entry_t) { .type = KO_MESSAGE, - .data = message_base + .data = (uintptr_t)vmem_phys_tovirt(message_phys) }; _initData.message_object_address = message_base; |