diff options
Diffstat (limited to 'kernel/riscv/kernel.c')
| -rw-r--r-- | kernel/riscv/kernel.c | 81 |
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() { |
