summaryrefslogtreecommitdiff
path: root/kernel/riscv
diff options
context:
space:
mode:
authorNathan Lee <me@nwlee.tech>2026-08-28 21:26:14 -0500
committerNathan Lee <me@nwlee.tech>2026-08-28 21:26:14 -0500
commit7f4c833ced046f88160a50e7adb1f55343e7e759 (patch)
treeec41ed5c02ba61bc9abf58b9db5f8a1d88c8ebd1 /kernel/riscv
parent4bbe418d2ecea36f80a38b74462c2936343f3b7d (diff)
rework early kernel init
Diffstat (limited to 'kernel/riscv')
-rw-r--r--kernel/riscv/kernel.c81
1 files changed, 60 insertions, 21 deletions
diff --git a/kernel/riscv/kernel.c b/kernel/riscv/kernel.c
index 4e72e2a..d34437f 100644
--- a/kernel/riscv/kernel.c
+++ b/kernel/riscv/kernel.c
@@ -1,42 +1,81 @@
#include <sys/log.h>
+#include <sys/log.h>
#include <sys/mem.h>
#include <sys/cpio.h>
-#include <early/bump.h>
+#include <early/dtb.h>
+
+struct kernel_info {
+ struct dt_node *head;
+ void *mem_start;
+ size_t mem_size;
+
+ void *initrd_start;
+ size_t initrd_size;
+};
-#define KERNEL_SIZE 3 * 1024 * 1024
uint32_t user_regs[31];
-void kernel_main(size_t hart, void *fdt) {
- printk("Doing kernel init with hard ID %d\n", hart);
+struct kernel_info *discover_arch(void *fdt) {
+ struct kernel_info *kernel_info = kemalloc(sizeof(struct kernel_info));
struct dt_node *head = dt_parse(fdt);
- struct mem_info *info = km_find_memory(head);
+ if (head == NULL) {
+ printk("[E;F] Failed to parse device tree!");
+ return NULL;
+ }
+ kernel_info->head = head;
- if (!info) {
- printk("failed to find memory info!\n");
- return;
+
+ struct dt_node *memory = dt_find_device(head, "memory");
+ if (memory == NULL) {
+ printk("[E;F] Failed to fidn the memory device!");
+ return NULL;
}
- info->start = (void *)((uint8_t *)info->start + KERNEL_SIZE);
- info->size -= KERNEL_SIZE;
+ size_t len = 0;
- km_init(info);
+ uint8_t *memory_reg = dt_get_prop(head, "reg", &len);
- printk("memory blocks initialized\n");
+ if (!memory_reg || len < sizeof(uintptr_t) + sizeof(size_t)) {
+ printk("[E;F] reg property for memory in provided device tree is nonexistent or invalid!");
+ return NULL;
+ }
- size_t len = 0;
- uint32_t *initrd = dt_get_prop(head, "initrd", &len);
- if (!initrd || len < 8) {
- printk("failed to find initrd!\n");
+ uintptr_t base = btohi(*memory_reg);
+ size_t size = btohi(*(memory_reg + sizeof(uintptr_t)));
+
+ kernel_info->mem_start = (void *)base;
+ kernel_info->mem_size = size;
+
+
+ uint8_t *initrd_reg = dt_get_prop(head, "initrd", &len);
+ if (!initrd_reg || len < sizeof(uintptr_t) + sizeof(size_t)) {
+ printk("[E;F] initrd property for head of provided device tree is nonexistent or invalid!");
+ return NULL;
+ }
+
+ base = btohi(*initrd_reg);
+ size = btohi(*(initrd_reg + sizeof(uintptr_t)));
+
+ kernel_info->initrd_start = (void *)base;
+ kernel_info->initrd_size = size;
+
+
+ return kernel_info;
+}
+
+void kernel_main(size_t hart, void *fdt) {
+ printk("wkern version %s (Compiler %s, Linker %s)%s\n", VERSION, COMPILER_NAME, LINKER_NAME);
+ if (hart != 0)
+ return;
+
+ struct kernel_info *kernel_info = discover_arch(fdt);
+
+ if (!kernel_info) {
return;
}
- uint32_t base = btohi(initrd[0]);
- uint32_t size = btohi(initrd[1]);
-
- char *file = cpio_get_file((void*)base, (size_t)size, "/sbin/init");
- (void)file;
}
void kernel_trap() {