summaryrefslogtreecommitdiffstats
path: root/arch/x86_64/usermode.c
diff options
context:
space:
mode:
authorJon Santmyer <jon@jonsantmyer.com>2025-08-11 19:04:26 -0400
committerJon Santmyer <jon@jonsantmyer.com>2025-08-11 19:04:26 -0400
commitf466364b8a3858e7b3f19258d142851cb4a7e6d6 (patch)
treea22819dc585c44a6dd0cdd5c6856420443a031eb /arch/x86_64/usermode.c
parentc4f8ef91f18d854a4ede7a94e95b2eab898d6963 (diff)
downloadjove-kernel-main.tar.gz
jove-kernel-main.tar.bz2
jove-kernel-main.zip
remove _initData, replace with enum indexesmain
Diffstat (limited to 'arch/x86_64/usermode.c')
-rw-r--r--arch/x86_64/usermode.c28
1 files changed, 8 insertions, 20 deletions
diff --git a/arch/x86_64/usermode.c b/arch/x86_64/usermode.c
index 66a641c..68cb45a 100644
--- a/arch/x86_64/usermode.c
+++ b/arch/x86_64/usermode.c
@@ -15,7 +15,7 @@ static uintptr_t
s_new_mapping(objdir_t *untyped_dir)
{
objdir_entry_t *untyped_entry = NULL;
- for(int i = 1; i < OBJECT_DIRECTORY_MAX_ENTRIES; i++) {
+ for(int i = untyped_dir->self.data - 1; i != 0; i--) {
untyped_entry = &untyped_dir->entries[i];
if(untyped_entry->type != KO_MEMORY_UNTYPED) continue;
uintptr_t mapping = 0;
@@ -23,7 +23,7 @@ s_new_mapping(objdir_t *untyped_dir)
if(err != 0) continue;
return mapping;
}
- return 0;
+ kpanic("Could not allocate page for init\n");
}
static pmle_t*
@@ -97,22 +97,13 @@ init_load(void)
kpanic("Init file not found in initrd. (expected \"%s\")", init_filename);
}
- size_t tcb_diri = _initDirectory.self.data++;
- size_t message_diri = _initDirectory.self.data++;
-
- _initData.tcb_object = tcb_diri;
- _initData.message_object = message_diri;
-
- _initDirectory.entries[tcb_diri] = (objdir_entry_t) {
+ _initDirectory.entries[INIT_OBJECT_TCB] = (objdir_entry_t) {
.type = KO_TCB,
.data = (uintptr_t)&s_init_tcb
};
- size_t untyped_diri = _initData.untyped_data_dir;
- 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 & ~3ULL);
+ objdir_t *untyped_dir = (objdir_t*)_initDirectory.entries[INIT_OBJECT_UNTYPED_DIR].data;
+ pmle_t *pml4 = vmem_phys_tovirt(_initDirectory.entries[INIT_OBJECT_PAGEMAP].data & ~3ULL);
//Reserve and map pages for init binary
size_t init_size = initrd_file_size(init_header);
@@ -143,17 +134,14 @@ init_load(void)
message_base += ((~(message_base & 0xFFF)) & 0xFFF) + 1;
uintptr_t message_phys = s_map_page(pml4, untyped_dir, message_base);
- _initDirectory.entries[message_diri] = (objdir_entry_t) {
+ _initDirectory.entries[INIT_OBJECT_MESSAGE] = (objdir_entry_t) {
.type = KO_MESSAGE,
.data = (uintptr_t)vmem_phys_tovirt(message_phys)
};
- _initData.message_object_address = message_base;
- //Write init data to user stack.
- sp -= sizeof(init_data_t);
- memcpy((void*)sp, &_initData, sizeof(init_data_t));
+ //Write message address to user stack.
sp -= sizeof(uintptr_t);
- *((uintptr_t*)sp) = sp + sizeof(uintptr_t);
+ *((uintptr_t*)sp) = message_base;
//Setup usermode and jump
proc->tcb = &s_init_tcb;