aboutsummaryrefslogtreecommitdiff
path: root/arch/riscv64/kernel
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2022-09-11 21:50:55 +0300
committerKimplul <kimi.h.kuparinen@gmail.com>2022-09-14 21:21:27 +0300
commit025778e89e7d0fe3cd1ad53537c9cc6f3cd819cc (patch)
treea137a9f405578b41e092e13892516feccc4d71e6 /arch/riscv64/kernel
parent9e2720ca086a74cfb6fa595da8c42e6cd24352ee (diff)
downloadkmi-025778e89e7d0fe3cd1ad53537c9cc6f3cd819cc.tar.gz
kmi-025778e89e7d0fe3cd1ad53537c9cc6f3cd819cc.zip
riscv32 boots and advances as far as riscv64
Diffstat (limited to 'arch/riscv64/kernel')
-rw-r--r--arch/riscv64/kernel/pmem.c14
-rw-r--r--arch/riscv64/kernel/vmem.c17
2 files changed, 19 insertions, 12 deletions
diff --git a/arch/riscv64/kernel/pmem.c b/arch/riscv64/kernel/pmem.c
index e438131..3076dc5 100644
--- a/arch/riscv64/kernel/pmem.c
+++ b/arch/riscv64/kernel/pmem.c
@@ -12,13 +12,21 @@ stat_t stat_pmem_conf(void *fdt, size_t *max_order, size_t *base_bits,
size_t bits[NUM_ORDERS])
{
UNUSED(fdt);
+ *base_bits = 12;
+
+ size_t nbits = 9;
- /* Sv39 for now */
+#if defined(riscv64)
*max_order = 2;
- *base_bits = 12;
+ nbits = 9;
+#else
+ *max_order = 1;
+ nbits = 10;
+#endif
+
/* we can assume bits[] is zeroed out beforehand */
for (size_t i = 0; i <= *max_order; ++i)
- bits[i] = 9;
+ bits[i] = nbits;
return OK;
}
diff --git a/arch/riscv64/kernel/vmem.c b/arch/riscv64/kernel/vmem.c
index 381ef5c..1abc58d 100644
--- a/arch/riscv64/kernel/vmem.c
+++ b/arch/riscv64/kernel/vmem.c
@@ -279,7 +279,7 @@ struct vmem *create_vmem()
stat_t use_vmem(struct vmem *b)
{
- __use_vmem(b, Sv39);
+ __use_vmem(b, DEFAULT_Sv_MODE);
return OK;
}
@@ -294,21 +294,20 @@ stat_t populate_kvmem(struct vmem *b)
size_t flags = VM_V | VM_R | VM_W | VM_X | VM_G;
for (size_t i = KSTART_PAGE; i < IO_PAGE; ++i)
b->leaf[i] = (struct vmem *)to_pte(
- RAM_BASE + SZ_1G * (i - KSTART_PAGE), flags);
+ RAM_BASE + TOP_PAGE_SIZE * (i - KSTART_PAGE), flags);
- /* map kernel IO to zero for now, this will be overridden later
- * (if at all) */
- b->leaf[IO_PAGE] = (struct vmem *)to_pte(0, flags);
+ /* map in IO region */
+ map_io_dbg(b);
return OK;
}
#if defined(DEBUG)
vm_t setup_kernel_io(struct vmem *b, vm_t paddr)
{
- /* assume Sv39 for now */
- pm_t gigapage = paddr / MM_GPAGE_SIZE;
- b->leaf[IO_PAGE] = (struct vmem *)to_pte(gigapage, VM_V | VM_R | VM_W);
- return -SZ_1G + paddr - (gigapage * MM_GPAGE_SIZE);
+ pm_t top_page = paddr / TOP_PAGE_SIZE;
+ b->leaf[IO_PAGE] = (struct vmem *)to_pte(top_page * TOP_PAGE_SIZE,
+ VM_V | VM_R | VM_W);
+ return -TOP_PAGE_SIZE + paddr - (top_page * TOP_PAGE_SIZE);
}
#endif