summaryrefslogtreecommitdiffstats
path: root/arch/x86_64/usermode.c
diff options
context:
space:
mode:
authorJon Santmyer <jon@jonsantmyer.com>2025-08-10 15:40:19 -0400
committerJon Santmyer <jon@jonsantmyer.com>2025-08-10 15:40:19 -0400
commitc4f8ef91f18d854a4ede7a94e95b2eab898d6963 (patch)
treec2772c4f380a684b6fa347f03b13f9476bf9500c /arch/x86_64/usermode.c
parentb905869a35f062a4e5072f10bec3a2ba3db0e365 (diff)
downloadjove-kernel-c4f8ef91f18d854a4ede7a94e95b2eab898d6963.tar.gz
jove-kernel-c4f8ef91f18d854a4ede7a94e95b2eab898d6963.tar.bz2
jove-kernel-c4f8ef91f18d854a4ede7a94e95b2eab898d6963.zip
working usermode objdir iteration
Diffstat (limited to 'arch/x86_64/usermode.c')
-rw-r--r--arch/x86_64/usermode.c38
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;