aboutsummaryrefslogtreecommitdiff
path: root/arch/riscv
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2021-12-20 14:53:44 +0200
committerKimplul <kimi.h.kuparinen@gmail.com>2021-12-20 14:53:44 +0200
commit6f8e5772d17d277842be3f6162ddd665a17e5be9 (patch)
tree45f5a2b9df6b6c2f3c369cf5b7e5b46c9acbccdd /arch/riscv
parent6b2465318b2dc922de282deea96c1621f7f41039 (diff)
downloadkmi-6f8e5772d17d277842be3f6162ddd665a17e5be9.tar.gz
kmi-6f8e5772d17d277842be3f6162ddd665a17e5be9.zip
More sensible init
+ Who knew some reservations were a good thing? (at least relativelyy speaking)
Diffstat (limited to 'arch/riscv')
-rw-r--r--arch/riscv/conf/apos.its4
-rw-r--r--arch/riscv/conf/init-link.S3
-rw-r--r--arch/riscv/config.h6
-rw-r--r--arch/riscv/init/init.c42
-rw-r--r--arch/riscv/kernel/main.c4
-rw-r--r--arch/riscv/mm.txt4
6 files changed, 49 insertions, 14 deletions
diff --git a/arch/riscv/conf/apos.its b/arch/riscv/conf/apos.its
index 15db4a4..da48860 100644
--- a/arch/riscv/conf/apos.its
+++ b/arch/riscv/conf/apos.its
@@ -12,8 +12,8 @@
arch = "riscv";
os = "apos";
compression = "none";
- load = <0x83800000>;
- entry = <0x83800000>;
+ load = <0x80080000>;
+ entry = <0x80080000>;
hash-1 {
algo = "sha1";
};
diff --git a/arch/riscv/conf/init-link.S b/arch/riscv/conf/init-link.S
index 642e831..53d24ab 100644
--- a/arch/riscv/conf/init-link.S
+++ b/arch/riscv/conf/init-link.S
@@ -1,5 +1,5 @@
OUTPUT_ARCH(riscv)
-ENTRY(main)
+ENTRY(init)
SECTIONS {
. = ABSOLUTE(PM_KERN);
@@ -27,4 +27,5 @@ SECTIONS {
}
__init_end = . ;
+ __kernel_size = <KERNEL_SIZE>;
}
diff --git a/arch/riscv/config.h b/arch/riscv/config.h
index fa3c178..35e0b6e 100644
--- a/arch/riscv/config.h
+++ b/arch/riscv/config.h
@@ -2,14 +2,16 @@
/* --- START ARCH USER CONFIG VALUES --- */
/* physical address to which the kernel will be loaded */
-#define PM_KERN 0x83800000
+#define RAM_BASE 0x80000000
+#define PM_KERN (RAM_BASE + SZ_512K)
/* --- END ARCH USER CONFIG VALUES --- */
/* don't touch >:( */
#define PM_STACK_BASE (PM_KERN + SZ_2M)
#define PM_STACK_TOP (PM_STACK_BASE + SZ_2M - 2)
-#define VM_KERN (-SZ_1G)
+#define VM_DMAP (-SZ_256G) /* testing for now */
+#define VM_KERN (VM_DMAP + SZ_256K)
#define TMP_PTE (-SZ_2G)
#define ROOT_PTE (0)
#define ROOT_REGION (SZ_4K)
diff --git a/arch/riscv/init/init.c b/arch/riscv/init/init.c
index d9b32a0..728f8dd 100644
--- a/arch/riscv/init/init.c
+++ b/arch/riscv/init/init.c
@@ -1,5 +1,6 @@
#include <apos/types.h>
#include <apos/attrs.h>
+#include <apos/utils.h>
#include <vmem.h>
#include <csr.h>
@@ -8,22 +9,47 @@ struct __packed init_vmem {
int *leaf[512];
};
-struct init_vmem root_branch;
+struct init_vmem *root_branch;
-/* assume Sv48 for now */
-void init_lowmem()
+/* assume Sv39 for now */
+void init_vmem()
{
size_t flags = VM_V | VM_X | VM_R | VM_W;
+
+ extern char *__init_start;
+ root_branch = (struct init_vmem *)align_down((size_t)&__init_start - SZ_4K, SZ_4K);
for(size_t i = 0; i < 512; ++i)
- root_branch.leaf[i] = (int *)((1UL << 37) * i | flags);
+ root_branch->leaf[i] = 0;
+
+ /* direct mapping (temp) */
+ for(size_t i = 0; i < 256; ++i)
+ root_branch->leaf[i] = (int *)((1UL << 28) * i | flags);
+
+ /* kernel (also sort of direct mapping) */
+ /* FIXME set up actually correct addressing retard */
+ for(size_t i = 256; i < 512; ++i)
+ root_branch->leaf[256] = (int *)(((RAM_BASE >> 12) << 10) | flags);
+
+ csr_write(CSR_SATP, SATP_MODE_Sv39 | ((size_t)root_branch >> 12));
+}
+
+void move_kernel()
+{
+ extern char *__init_end;
+ extern char *__kernel_size;
- csr_write(CSR_SATP, SATP_MODE_Sv48 | ((size_t)&root_branch >> 12));
+ size_t sz = (size_t)&__kernel_size;
+ char *src = (char *)&__init_end;
+ char *dst = (char *)VM_KERN;
+ for(size_t i = 0; i < sz; ++i)
+ dst[i] = src[i];
}
-void __section(".init.start") main(void *fdt)
+void __init init(void *fdt)
{
extern char *__init_end;
- void (*kernel_main)(void *fdt) = (void (*)(void *))(VM_KERN + (size_t)&__init_end);
- init_lowmem();
+ void (*kernel_main)(void *fdt) = (void (*)(void *))(VM_KERN);
+ init_vmem();
+ move_kernel();
kernel_main(fdt);
}
diff --git a/arch/riscv/kernel/main.c b/arch/riscv/kernel/main.c
index 6c504f8..5576d68 100644
--- a/arch/riscv/kernel/main.c
+++ b/arch/riscv/kernel/main.c
@@ -54,7 +54,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){base, top};
+ return (struct pm_layout_t){__va(base), __va(top)};
}
static pm_t get_kerneltop()
@@ -276,6 +276,8 @@ static void init_proc(void *fdt, struct vm_branch_t *b)
void __main main(void *fdt)
{
+ /* correct fdt pointer */
+ fdt = (void *)__va(fdt);
init_dbg(fdt);
dbg_fdt(fdt);
diff --git a/arch/riscv/mm.txt b/arch/riscv/mm.txt
index fa06180..30ffc88 100644
--- a/arch/riscv/mm.txt
+++ b/arch/riscv/mm.txt
@@ -14,6 +14,10 @@ Offset | Size | Purpose
-255 GiB | 1 GiB | Kernel IO
-256 GiB | 1 GiB | Kernel
+(alternate scheme: Kernel vmem is itself a direct mapping?)
+(first 256KiB page reserved for whatever, next 256KiB reserved for kernel vma,
+ next 512KiB reserved for kernel pma?)
+
Sv48:
Offset | Size | Purpose