aboutsummaryrefslogtreecommitdiff
path: root/arch/riscv/init
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2021-10-10 23:03:20 +0300
committerKimplul <kimi.h.kuparinen@gmail.com>2021-10-10 23:03:20 +0300
commitd2ff961a2a08229e1f2245e8dba9b2275016133c (patch)
treecffab8f0586b05a059715b2fa9676b8310bd297e /arch/riscv/init
parentb30ee14270a44e48167934b9b3923b4280bdc855 (diff)
downloadkmi-d2ff961a2a08229e1f2245e8dba9b2275016133c.tar.gz
kmi-d2ff961a2a08229e1f2245e8dba9b2275016133c.zip
Prepare proper jump to kernel
Diffstat (limited to 'arch/riscv/init')
-rw-r--r--arch/riscv/init/init.c44
1 files changed, 33 insertions, 11 deletions
diff --git a/arch/riscv/init/init.c b/arch/riscv/init/init.c
index 1e04d34..f1a4697 100644
--- a/arch/riscv/init/init.c
+++ b/arch/riscv/init/init.c
@@ -1,3 +1,5 @@
+/* TODO: cleanup :P */
+
#include <apos/init.h>
#include <apos/sizes.h>
#include <apos/types.h>
@@ -79,7 +81,6 @@ static enum serial_dev_t serial_dev_enum(const char *dev_name)
return -1;
}
-static void* uart_ptr_glbl = 0;
static void init_debug(void *fdt)
{
int chosen_offset = fdt_path_offset(fdt, "/chosen");
@@ -98,9 +99,7 @@ static void init_debug(void *fdt)
struct cell_info ci = get_reginfo(fdt, stdout);
void *reg_ptr = (void *)fdt_getprop(fdt, stdout_offset, "reg", NULL);
- void *uart_ptr = 0;
- uart_ptr = (void *)(paddr_t)fdt_load_int_ptr(ci.addr_cells, reg_ptr);
- uart_ptr_glbl = uart_ptr;
+ void *uart_ptr = (void *)(paddr_t)fdt_load_int_ptr(ci.addr_cells, reg_ptr);
dbg_init(uart_ptr, dev);
}
@@ -258,30 +257,53 @@ struct vm_branch_t *prepare_vmem()
/* map stack */
map_vmem(branch, PM_STACK_BASE, PM_STACK_BASE, VM_R | VM_W | VM_V, MM_MPAGE);
- /* map debug VERY UGLY GLOBALS BAH */
- map_vmem(branch, (paddr_t)uart_ptr_glbl, (paddr_t)uart_ptr_glbl, VM_R | VM_W | VM_V, MM_KPAGE);
-
- /* TODO: map more stuff */
-
+ /* TODO: map more stuff? */
return branch;
}
void start_vmem(struct vm_branch_t *branch)
{
/* assume Sv48 and ASID 0*/
+ /* TODO: get ASID from CPU id
+ * TODO: more cores lol
+ */
csr_write(CSR_SATP, SATP_MODE_48 | (((paddr_t)(branch)) >> 12));
}
+struct init_data_t populate_initdata(void *fdt, struct vm_branch_t *branch)
+{
+ extern char __init_start, __init_end;
+
+ struct init_data_t d = {0};
+ d.init_base = (paddr_t)&__init_start;
+ d.init_top = (paddr_t)&__init_end;
+
+ d.initrd_base = get_initrdbase(fdt);
+ d.initrd_top = get_initrdtop(fdt);
+
+ d.fdt_base = get_fdtbase(fdt);
+ d.fdt_top = get_fdttop(fdt);
+
+ d.stack_base = PM_STACK_BASE;
+ d.stack_top = PM_STACK_TOP;
+
+ d.kernel_vm_base = branch;
+
+ return d;
+}
+
void init(void *fdt)
{
init_debug(fdt);
dbg_fdt(fdt);
setup_pmem(fdt);
+
struct vm_branch_t *branch = prepare_vmem();
+ struct init_data_t d = populate_initdata(fdt, branch);
start_vmem(branch);
/* update_pmap(TODO: figure out where to place pmap in vmem); */
- void (*main)(void *uart) = (void (*)(void *))VM_KERN;
- main(uart_ptr_glbl);
+ void (*main)(struct init_data_t) = (void (*)(struct init_data_t))VM_KERN;
+ main(d);
}