aboutsummaryrefslogtreecommitdiff
path: root/arch/riscv/kernel/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/riscv/kernel/main.c')
-rw-r--r--arch/riscv/kernel/main.c67
1 files changed, 37 insertions, 30 deletions
diff --git a/arch/riscv/kernel/main.c b/arch/riscv/kernel/main.c
index 5576d68..794b71b 100644
--- a/arch/riscv/kernel/main.c
+++ b/arch/riscv/kernel/main.c
@@ -1,6 +1,7 @@
#include <apos/debug.h>
#include <apos/vmem.h>
#include <apos/pmem.h>
+#include <apos/utils.h>
#include <apos/types.h>
#include <apos/mem.h>
#include <apos/lock.h>
@@ -54,7 +55,7 @@ static struct pm_layout_t get_memlayout(void *fdt)
/* -1 because base is a legitimate memory address */
pm_t top = (pm_t)fdt_load_int_ptr(ci.size_cells, mem_reg) + base - 1;
- return (struct pm_layout_t){__va(base), __va(top)};
+ return (struct pm_layout_t){(size_t)__va(base), (size_t)__va(top)};
}
static pm_t get_kerneltop()
@@ -161,10 +162,12 @@ static struct pm_layout_t setup_pmem(void *fdt)
static struct pm_orders_t init_pmem(void *fdt)
{
- enum mm_mode_t mmode = get_mmode(fdt);
+ /* bad idea for now */
+ /* enum mm_mode_t mmode = get_mmode(fdt); */
size_t max_order = 0;
size_t order_bits = 9;
+ enum mm_mode_t mmode = Sv39;
switch(mmode){
case Sv32:
max_order = 1;
@@ -193,16 +196,21 @@ static struct pm_orders_t init_pmem(void *fdt)
return ret;
}
-static void populate_root_branch(struct vm_branch_t *b, size_t mul)
+/* assume Sv39 for now */
+#define to_pte(a, f) (((a) >> 12) << 10 | (f))
+static void populate_root_branch(struct vm_branch_t *b)
{
- for(size_t i = 0; i <= (MM_KPAGE_SIZE / sizeof(size_t))/2; ++i)
- b->leaf[i] = (struct vm_branch_t *)(mul * i | VM_V | VM_R | VM_W | VM_X | VM_G);
+ size_t flags = VM_V | VM_R | VM_W | VM_X | VM_G;
+ for(size_t i = 256; i < 512; ++i)
+ b->leaf[i] = (struct vm_branch_t *)to_pte(RAM_BASE + SZ_1G * (i - 256), flags);
}
static void start_vmem(struct vm_branch_t *branch, enum mm_mode_t m)
{
/* TODO: get ASID from CPU id */
+ branch = (struct vm_branch_t *)__pa(branch);
+
if(m == Sv32)
csr_write(CSR_SATP, SATP_MODE_Sv32 | pm_to_pnum((pm_t)(branch)));
else if (m == Sv39)
@@ -216,35 +224,15 @@ static void start_vmem(struct vm_branch_t *branch, enum mm_mode_t m)
static struct vm_branch_t *init_vmem(void *fdt)
{
- struct pm_orders_t o = init_pmem(fdt);
+ init_pmem(fdt);
setup_pmem(fdt);
struct vm_branch_t *b = (struct vm_branch_t *)alloc_page(MM_KPAGE, 0);
memset(b, 0, sizeof(struct vm_branch_t));
- enum mm_mode_t mm = Sv48;
- size_t mul = 0;
- switch(o.max_order){
- case 3: /* Sv48 */
- mm = Sv48;
- mul = 1UL << 37;
- break;
-
- case 2: /* Sv39 */
- mm = Sv39;
- mul = 1UL << 28;
- break;
-
- case 1: /* Sv32 */
- mm = Sv32;
- mul = 1UL << 20;
- break;
- }
-
- set_uvmem_size(mul);
- populate_root_branch(b, uvmem_size());
- /* jump to vmem */
- start_vmem(b, mm);
+ populate_root_branch(b);
+ /* update which memory branch to use */
+ start_vmem(b, Sv39);
return b;
}
@@ -259,7 +247,8 @@ static void init_proc(void *fdt, struct vm_branch_t *b)
t->pid = 0;
t->tid = 0;
threads_insert(t);
- sp_mem_init(&t->sp_r, -uvmem_size(), uvmem_size() - 1);
+ /* first page reserved to avoid issues with null pointers being legal*/
+ sp_mem_init(&t->sp_r, SZ_4K, SZ_256G);
/* binary itself */
size_t sz = align_up(get_init_size(fdt), BASE_PAGE_SIZE);
@@ -274,8 +263,26 @@ static void init_proc(void *fdt, struct vm_branch_t *b)
jump_to_userspace(t, 0, 0);
}
+#define __va_reg(reg)\
+{\
+ vm_t reg = 0;\
+ __asm__("mv %0, " QUOTE(reg) : "=r" (reg) :: );\
+ reg = (vm_t)__va(reg);\
+ __asm__("mv " QUOTE(reg) ", %0" :: "rK" (reg) : );\
+}
+
+static void update_stack()
+{
+ __va_reg(sp);
+ __va_reg(gp);
+}
+
void __main main(void *fdt)
{
+ __va_reg(sp);
+ __va_reg(fp);
+ __va_reg(gp);
+
/* correct fdt pointer */
fdt = (void *)__va(fdt);
init_dbg(fdt);