aboutsummaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2021-12-20 21:03:37 +0200
committerKimplul <kimi.h.kuparinen@gmail.com>2021-12-20 21:03:37 +0200
commit61291639524e4aebf93a3315661e7180ac1b9c1e (patch)
treeb524cd94fe1c59c9733e913f1de1e1c68b313bda /arch
parent6f8e5772d17d277842be3f6162ddd665a17e5be9 (diff)
downloadkmi-61291639524e4aebf93a3315661e7180ac1b9c1e.tar.gz
kmi-61291639524e4aebf93a3315661e7180ac1b9c1e.zip
Right up to init_proc, FUCK YEAH
+ Lots to do still, should keep a more detailed TODO.txt, among other things implement Sv48 support, make more things single truths etc.
Diffstat (limited to 'arch')
-rw-r--r--arch/riscv/config.h6
-rw-r--r--arch/riscv/init/init.c7
-rw-r--r--arch/riscv/kernel/main.c67
-rw-r--r--arch/riscv/kernel/vmem.c7
4 files changed, 49 insertions, 38 deletions
diff --git a/arch/riscv/config.h b/arch/riscv/config.h
index 35e0b6e..fa6785e 100644
--- a/arch/riscv/config.h
+++ b/arch/riscv/config.h
@@ -8,9 +8,9 @@
/* don't touch >:( */
-#define PM_STACK_BASE (PM_KERN + SZ_2M)
-#define PM_STACK_TOP (PM_STACK_BASE + SZ_2M - 2)
-#define VM_DMAP (-SZ_256G) /* testing for now */
+#define PM_STACK_BASE (PM_KERN)
+#define PM_STACK_TOP (RAM_BASE + SZ_1M)
+#define VM_DMAP (0xffffffc000000000) /* testing for now */
#define VM_KERN (VM_DMAP + SZ_256K)
#define TMP_PTE (-SZ_2G)
#define ROOT_PTE (0)
diff --git a/arch/riscv/init/init.c b/arch/riscv/init/init.c
index 728f8dd..029c855 100644
--- a/arch/riscv/init/init.c
+++ b/arch/riscv/init/init.c
@@ -11,6 +11,8 @@ struct __packed init_vmem {
struct init_vmem *root_branch;
+#define to_pte(a, f) (((a) >> 12) << 10 | (f))
+
/* assume Sv39 for now */
void init_vmem()
{
@@ -23,12 +25,13 @@ void init_vmem()
/* direct mapping (temp) */
for(size_t i = 0; i < 256; ++i)
- root_branch->leaf[i] = (int *)((1UL << 28) * i | flags);
+ root_branch->leaf[i] = (int*)to_pte(SZ_1G * i, flags);
/* kernel (also sort of direct mapping) */
/* FIXME set up actually correct addressing retard */
+ flags |= VM_G;
for(size_t i = 256; i < 512; ++i)
- root_branch->leaf[256] = (int *)(((RAM_BASE >> 12) << 10) | flags);
+ root_branch->leaf[i] = (int *)to_pte(RAM_BASE + SZ_1G * (i - 256), flags);
csr_write(CSR_SATP, SATP_MODE_Sv39 | ((size_t)root_branch >> 12));
}
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);
diff --git a/arch/riscv/kernel/vmem.c b/arch/riscv/kernel/vmem.c
index 4cb84a6..744f633 100644
--- a/arch/riscv/kernel/vmem.c
+++ b/arch/riscv/kernel/vmem.c
@@ -4,11 +4,12 @@
#include <apos/mem.h>
#include <apos/debug.h>
#include <pages.h>
+#include <vmem.h>
#define pte_ppn(pte) (((pm_t)(pte)) >> 10)
#define pte_flags(pte) (((pm_t)(pte)) & 0xff)
-#define to_pte(p, f) ((pm_to_pnum(p) << 10) + (f))
-#define pte_addr(pte) (pnum_to_paddr(pte_ppn(pte)))
+#define to_pte(p, f) ((pm_to_pnum((pm_t)__pa(p)) << 10) | (f))
+#define pte_addr(pte) __va(pnum_to_paddr(pte_ppn(pte)))
#define vm_to_index(a, o) (pm_to_index(a, o))
void mod_vmem(struct vm_branch_t *branch, vm_t vaddr, uint8_t flags, enum mm_order_t order)
@@ -51,7 +52,7 @@ void unmap_vmem(struct vm_branch_t *branch, vm_t vaddr, enum mm_order_t order)
size_t idx = pm_to_index(vaddr, order);
if (branch->leaf[idx])
- free_page(order, pte_addr(branch->leaf[idx]));
+ free_page(order, (pm_t)pte_addr(branch->leaf[idx]));
branch->leaf[idx] = 0;
}