diff options
-rw-r--r-- | arch/x86_64/page_directory.c | 4 | ||||
-rw-r--r-- | arch/x86_64/processor.c | 5 | ||||
-rw-r--r-- | arch/x86_64/untyped_memory.c | 4 | ||||
-rw-r--r-- | arch/x86_64/usermode.c | 28 | ||||
-rw-r--r-- | device/initrd.c | 5 | ||||
-rw-r--r-- | device/portio_uart.c | 4 | ||||
-rw-r--r-- | device/uart.c | 4 | ||||
-rw-r--r-- | include/arch/x86_64/object.h | 12 | ||||
-rw-r--r-- | include/device/uart.h | 2 | ||||
-rw-r--r-- | include/jove.h | 1 | ||||
-rw-r--r-- | include/object.h | 13 | ||||
-rw-r--r-- | include/syscall.h | 4 | ||||
-rw-r--r-- | lib/print.c | 3 | ||||
-rw-r--r-- | main.c | 1 | ||||
-rw-r--r-- | syscall/invoke_objdir.c | 36 |
15 files changed, 37 insertions, 89 deletions
diff --git a/arch/x86_64/page_directory.c b/arch/x86_64/page_directory.c index bcc71cf..494cab5 100644 --- a/arch/x86_64/page_directory.c +++ b/arch/x86_64/page_directory.c @@ -112,10 +112,8 @@ vmem_setup(void) __asm__ volatile("mov %0, %%cr3":: "r"(kernel_pml4_base)); //Add page mapping object to init directory. - uint8_t pm_i = _initDirectory.self.data++; - _initDirectory.entries[pm_i] = (objdir_entry_t) { + _initDirectory.entries[INIT_OBJECT_PAGEMAP] = (objdir_entry_t) { .type = KO_MEMORY_MAPPING, .data = kernel_pml4_base | 3 }; - _initData.pm_object = pm_i; } diff --git a/arch/x86_64/processor.c b/arch/x86_64/processor.c index 666eb3d..3ebf1ee 100644 --- a/arch/x86_64/processor.c +++ b/arch/x86_64/processor.c @@ -103,13 +103,10 @@ bsp_setup(void) enable_avx(); #endif - uint64_t pd_i = _initDirectory.self.data++; - - _initDirectory.entries[pd_i] = (objdir_entry_t) { + _initDirectory.entries[INIT_OBJECT_PROCESSOR_DIR] = (objdir_entry_t) { .type = KO_OBJECT_DIRECTORY, .data = (uintptr_t)(&s_processor_dir) }; - _initData.processor_dir = pd_i; ivt_setup(); s_enable_sce(); diff --git a/arch/x86_64/untyped_memory.c b/arch/x86_64/untyped_memory.c index 699cdbf..bd3bc6d 100644 --- a/arch/x86_64/untyped_memory.c +++ b/arch/x86_64/untyped_memory.c @@ -22,12 +22,10 @@ static volatile struct limine_memmap_request s_memmap_req = { void pmem_setup(void) { - size_t diri = _initDirectory.self.data++; - _initDirectory.entries[diri] = (objdir_entry_t) { + _initDirectory.entries[INIT_OBJECT_UNTYPED_DIR] = (objdir_entry_t) { .type = KO_OBJECT_DIRECTORY, .data = (uintptr_t)&s_untyped_dir }; - _initData.untyped_data_dir = diri; if(s_memmap_req.response == NULL) { klogf("Failed to load physical memory map"); 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; diff --git a/device/initrd.c b/device/initrd.c index 1a04338..b2e615e 100644 --- a/device/initrd.c +++ b/device/initrd.c @@ -87,13 +87,10 @@ initrd_setup(void) klogf("Initrd found at %p\n", initrd_addr); tar_parse((tar_block_t*)initrd_addr); - size_t initrd_diri = _initDirectory.self.data++; - _initDirectory.entries[initrd_diri] = (objdir_entry_t) { + _initDirectory.entries[INIT_OBJECT_INITRD_DIR] = (objdir_entry_t) { .type = KO_OBJECT_DIRECTORY, .data = (uintptr_t)&s_initrd_dir }; - //Add initrd dir to init object - _initData.initrd_dir = initrd_diri; } int diff --git a/device/portio_uart.c b/device/portio_uart.c index 00800b5..58314d5 100644 --- a/device/portio_uart.c +++ b/device/portio_uart.c @@ -49,12 +49,10 @@ portio_uart_setup(void) s_set_fcr(PORTIO_UART_COM1, 1 | 2 | 8); s_set_mcr(PORTIO_UART_COM1, 1 | 2 | 4 | 8); - uint64_t serial_i = _initDirectory.self.data++; - _initDirectory.entries[serial_i] = (struct jove_ObjectDirectoryEntry) { + _initDirectory.entries[INIT_OBJECT_LOG] = (struct jove_ObjectDirectoryEntry) { .type = KO_DEV_UART, .data = PORTIO_UART_COM1 }; - _initData.log_object = serial_i; } void diff --git a/device/uart.c b/device/uart.c index 5c65207..0a8945d 100644 --- a/device/uart.c +++ b/device/uart.c @@ -3,9 +3,9 @@ #include "object.h" void -uart_write(objdir_t *dir, path_byte_t *path, const char *s, size_t w) +uart_write(objdir_t *dir, size_t pathw, path_byte_t *path, const char *s, size_t w) { - objdir_entry_t *entry = objdir_seek(dir, path, 1); + objdir_entry_t *entry = objdir_seek(dir, path, pathw); if(entry == NULL || entry->type != KO_DEV_UART) return; #ifdef ENABLE_PORTIO_UART diff --git a/include/arch/x86_64/object.h b/include/arch/x86_64/object.h index 6512049..770487b 100644 --- a/include/arch/x86_64/object.h +++ b/include/arch/x86_64/object.h @@ -7,18 +7,6 @@ #define KERNEL_STACKBYTES 4096 #endif -typedef struct jove_InitData -{ - uint8_t log_object; - uint16_t untyped_data_dir; - uint16_t processor_dir; - uint8_t pm_object; //Page mapping object. - uint16_t initrd_dir; //Init ramdisk files directory. - uint8_t tcb_object; - uint8_t message_object; - uintptr_t message_object_address; -} init_data_t; - typedef struct jove_ThreadControlBlock { void *stack; diff --git a/include/device/uart.h b/include/device/uart.h index 9e5c3d3..ba36cbb 100644 --- a/include/device/uart.h +++ b/include/device/uart.h @@ -5,6 +5,6 @@ #include "object.h" -void uart_write(objdir_t *dir, path_byte_t *path, const char *s, size_t w); +void uart_write(objdir_t *dir, size_t pathw, path_byte_t *path, const char *s, size_t w); #endif diff --git a/include/jove.h b/include/jove.h index cbe1a77..63d2ce9 100644 --- a/include/jove.h +++ b/include/jove.h @@ -8,7 +8,6 @@ extern void (*_kernel_end)(void); #include "object.h" extern objdir_t _initDirectory; -extern init_data_t _initData; NORETURN void hcf(void); diff --git a/include/object.h b/include/object.h index 190b082..94e6b15 100644 --- a/include/object.h +++ b/include/object.h @@ -3,9 +3,16 @@ #include <stdint.h> -#if defined(__x86_64__) -#include "arch/x86_64/object.h" -#endif +enum { + INIT_OBJECT_ROOTDIR = 0, + INIT_OBJECT_PAGEMAP, + INIT_OBJECT_PROCESSOR_DIR, + INIT_OBJECT_UNTYPED_DIR, + INIT_OBJECT_INITRD_DIR, + INIT_OBJECT_TCB, + INIT_OBJECT_MESSAGE, + INIT_OBJECT_LOG +}; enum { diff --git a/include/syscall.h b/include/syscall.h index e70ba82..9025f57 100644 --- a/include/syscall.h +++ b/include/syscall.h @@ -21,12 +21,10 @@ enum /**@ENUM objdir invokes*/ enum { - /*[target path][u8 funcid][u8 ret]*/ - INVOKE_OBJDIR_NMEMB = 0, /*[target path][u8 funcid][u8 memb][u16 ret]*/ INVOKE_OBJDIR_GETMEMB, /*[target path][u8 funcid][u8 ret]*/ - INVOKE_OBJDIR_LASTFREE + INVOKE_OBJDIR_LASTMEMB }; /**@ENUM untyped invokes*/ enum diff --git a/lib/print.c b/lib/print.c index a53ab4f..6f5c551 100644 --- a/lib/print.c +++ b/lib/print.c @@ -44,7 +44,8 @@ int kvprintf(const char *fmt, va_list ap) kvsnprintf(buffer, size, fmt, ap_dup); #ifdef ENABLE_UART - uart_write(&_initDirectory, &_initData.log_object, buffer, size - 1); + uint8_t uart_obj = INIT_OBJECT_LOG; + uart_write(&_initDirectory, 1, &uart_obj, buffer, size - 1); #endif return size; } @@ -16,7 +16,6 @@ struct jove_ObjectDirectory _initDirectory = { }, } }; -init_data_t _initData; void _jove_main(void) diff --git a/syscall/invoke_objdir.c b/syscall/invoke_objdir.c index 9cd3f32..97dd126 100644 --- a/syscall/invoke_objdir.c +++ b/syscall/invoke_objdir.c @@ -5,25 +5,6 @@ #include "print.h" static int -s_handle_invoke_objdir_nmemb( - objdir_t *root_dir, - objdir_t *target_dir, - uint8_t *payload, - size_t payload_at - ) -{ - uint8_t *dest; - SYSCALL_PAYLOAD_TAKEP(payload, payload_at, dest, uint8_t); - - *dest = target_dir->self.data; - -#ifdef DBG_SYSCALL - klogf("objdir_nmemb %p[%i]\n", dest, *dest); -#endif - return KE_OK; -} - -static int s_handle_invoke_objdir_getmemb( objdir_t *root_dir, objdir_t *target_dir, @@ -46,7 +27,7 @@ s_handle_invoke_objdir_getmemb( } static int -s_handle_invoke_objdir_lastfree( +s_handle_invoke_objdir_lastmemb( objdir_t *root_dir, objdir_t *target_dir, uint8_t *payload, @@ -56,19 +37,18 @@ s_handle_invoke_objdir_lastfree( path_byte_t *dest; SYSCALL_PAYLOAD_TAKEP(payload, payload_at, dest, path_byte_t); - for(int i = 0; i < 256; i++) { - if(target_dir->entries[i].type == KO_NONE) { - *dest = (path_byte_t)i; - return KE_OK; - } + uint8_t lastfull = 0; + for(int i = 1; i < 256; i++) { + if(target_dir->entries[i].type != KO_NONE) lastfull = i; } - return -KE_FULL; + + *dest = lastfull; + return 0; } static int (*s_invoke_handles[])(objdir_t*, objdir_t*, uint8_t*, size_t) = { - [INVOKE_OBJDIR_NMEMB] = s_handle_invoke_objdir_nmemb, [INVOKE_OBJDIR_GETMEMB] = s_handle_invoke_objdir_getmemb, - [INVOKE_OBJDIR_LASTFREE] = s_handle_invoke_objdir_lastfree + [INVOKE_OBJDIR_LASTMEMB] = s_handle_invoke_objdir_lastmemb }; static size_t s_invoke_handles_count = sizeof(s_invoke_handles) / sizeof(void*); |