summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86_64/page_directory.c4
-rw-r--r--arch/x86_64/processor.c5
-rw-r--r--arch/x86_64/untyped_memory.c4
-rw-r--r--arch/x86_64/usermode.c28
-rw-r--r--device/initrd.c5
-rw-r--r--device/portio_uart.c4
-rw-r--r--device/uart.c4
-rw-r--r--include/arch/x86_64/object.h12
-rw-r--r--include/device/uart.h2
-rw-r--r--include/jove.h1
-rw-r--r--include/object.h13
-rw-r--r--include/syscall.h4
-rw-r--r--lib/print.c3
-rw-r--r--main.c1
-rw-r--r--syscall/invoke_objdir.c36
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;
}
diff --git a/main.c b/main.c
index 4416bba..7315f50 100644
--- a/main.c
+++ b/main.c
@@ -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*);