aboutsummaryrefslogtreecommitdiff
path: root/arch
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
parentb30ee14270a44e48167934b9b3923b4280bdc855 (diff)
downloadkmi-d2ff961a2a08229e1f2245e8dba9b2275016133c.tar.gz
kmi-d2ff961a2a08229e1f2245e8dba9b2275016133c.zip
Prepare proper jump to kernel
Diffstat (limited to 'arch')
-rw-r--r--arch/riscv/common/vmem.c4
-rw-r--r--arch/riscv/config.h2
-rw-r--r--arch/riscv/init/init.c44
-rw-r--r--arch/riscv/kernel/main.c14
4 files changed, 44 insertions, 20 deletions
diff --git a/arch/riscv/common/vmem.c b/arch/riscv/common/vmem.c
index 17db777..d0f3ebe 100644
--- a/arch/riscv/common/vmem.c
+++ b/arch/riscv/common/vmem.c
@@ -3,10 +3,6 @@
#include <pages.h>
#include <vmem.h>
-extern const size_t mm_shifts[10];
-extern const size_t mm_widths[10];
-extern const size_t mm_sizes[10];
-
#define pte_ppn(pte) (((paddr_t)(pte)) >> 10)
#define pte_flags(pte) (((paddr_t)(pte)) & 0xff)
#define to_pte(p, f) ((paddr_to_pnum(p) << 10) + (f))
diff --git a/arch/riscv/config.h b/arch/riscv/config.h
index 13e166b..f223ee7 100644
--- a/arch/riscv/config.h
+++ b/arch/riscv/config.h
@@ -2,7 +2,7 @@
#define PM_KERN 0x83800000
#define PM_STACK_BASE (PM_KERN + SZ_2M)
#define PM_STACK_TOP (PM_STACK_BASE + SZ_2M - 2)
-#define VM_KERN ((-1) - SZ_1G + 1)
+#define VM_KERN (-SZ_1G)
#define MAX_ORDER 3
#define PAGE_SHIFT 12
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);
}
diff --git a/arch/riscv/kernel/main.c b/arch/riscv/kernel/main.c
index 510ea42..3575ceb 100644
--- a/arch/riscv/kernel/main.c
+++ b/arch/riscv/kernel/main.c
@@ -1,8 +1,14 @@
-#include <apos/main.h>
#include <apos/debug.h>
+#include <apos/init.h>
-void __main main(void *uart)
+void __main main(struct init_data_t d)
{
- dbg_init(uart, NS16550A);
- dbg("Hello from (hopefully) virtual memory!\n");
+ /* TODO: approximate order of business:
+ * setup debugging in vmem
+ * free unnecessary init
+ * setup interrupts (should this be done in init?)
+ * load init from initrd
+ * setup init environment (thread control blocks etc.)
+ * jumpstart init (free stack init setup)
+ */
}