aboutsummaryrefslogtreecommitdiff
path: root/arch/riscv64/init/init.c
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2023-06-04 00:48:15 +0300
committerKimplul <kimi.h.kuparinen@gmail.com>2023-06-04 00:48:15 +0300
commit52e5c94314fa8e10efded82db85d181ed32f00bd (patch)
tree869dd5a01c24effe32266518d057c87106c73a44 /arch/riscv64/init/init.c
parent3ace1ddd76b9c04f3ed23883de6279b4485612e8 (diff)
downloadkmi-52e5c94314fa8e10efded82db85d181ed32f00bd.tar.gz
kmi-52e5c94314fa8e10efded82db85d181ed32f00bd.zip
visionfive2 boots until debugging is initialized
Diffstat (limited to 'arch/riscv64/init/init.c')
-rw-r--r--arch/riscv64/init/init.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/arch/riscv64/init/init.c b/arch/riscv64/init/init.c
index 278b9db..38639d7 100644
--- a/arch/riscv64/init/init.c
+++ b/arch/riscv64/init/init.c
@@ -16,6 +16,13 @@
#include "../kernel/csr.h"
+void flush_tlb_full()
+{
+ /** @todo could be nice to have a common set of features with kernel,
+ * but for now this is good enough. */
+ __asm__ volatile ("sfence.vma\n" ::: "memory");
+}
+
/**
* Create page table entry.
* Copy from \ref arch/riscv64/kernel/vmem.c.
@@ -50,7 +57,9 @@ static pm_t __fdt_ram_base(void *fdt)
*/
static void init_bootmem(uintptr_t load_addr, uintptr_t ram_base)
{
- size_t flags = VM_V | VM_X | VM_R | VM_W;
+ /* set all flags on, especially A and D since MMUs are allowed to raise
+ * exceptions that we're not ready to handle if they're unset. */
+ size_t flags = VM_V | VM_X | VM_R | VM_W | VM_D | VM_A;
extern char *__kernel;
extern char *__kernel_size;
@@ -83,6 +92,8 @@ static void init_bootmem(uintptr_t load_addr, uintptr_t ram_base)
case Sv48: mode = SATP_MODE_Sv48; break;
default: break;
};
+
+ flush_tlb_full();
csr_write(CSR_SATP, mode | ((uintptr_t)root_branch >> 12));
}