aboutsummaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
Diffstat (limited to 'arch')
-rwxr-xr-xarch/riscv64/conf/mkimage.sh4
-rw-r--r--arch/riscv64/init/init.c17
-rw-r--r--arch/riscv64/init/start.S20
-rw-r--r--arch/riscv64/kernel/vmem.c3
4 files changed, 40 insertions, 4 deletions
diff --git a/arch/riscv64/conf/mkimage.sh b/arch/riscv64/conf/mkimage.sh
index badac4c..1726e57 100755
--- a/arch/riscv64/conf/mkimage.sh
+++ b/arch/riscv64/conf/mkimage.sh
@@ -14,6 +14,10 @@ SSIZE=$(fdisk -l rootfs.img | awk '$1=="Units:" {print $8}')
OFFSET=$(fdisk -l rootfs.img | awk '$1=="rootfs.img1" {print $2}')
mount -o loop,offset=$((${SSIZE}*${OFFSET})) rootfs.img fs
+# copy over files outside the .itb to mess around with manual booting
+cp kmi.bin fs
+cp arch/riscv64/conf/initrd fs
+
# not entirely pleased with this solution, although eventually I should probably
# move `run` out of the kernel repo and into some `kmios` repo with a runtime
# and proper initrd etc. so this is good enough for now
diff --git a/arch/riscv64/init/init.c b/arch/riscv64/init/init.c
index 92f8053..278b9db 100644
--- a/arch/riscv64/init/init.c
+++ b/arch/riscv64/init/init.c
@@ -54,7 +54,8 @@ static void init_bootmem(uintptr_t load_addr, uintptr_t ram_base)
extern char *__kernel;
extern char *__kernel_size;
- uintptr_t top = load_addr + (uintptr_t)&__kernel + (uintptr_t)&__kernel_size;
+ uintptr_t top = load_addr + (uintptr_t)&__kernel +
+ (uintptr_t)&__kernel_size;
/* this could be risky, as we might overwrite some bits of initrd or fdt
* if they're allocated too close to the kernel payload.
@@ -119,3 +120,17 @@ void init(void *fdt, pm_t load_addr)
jump_to_kernel(fdt, ram_base, (void *)VM_KERN);
}
+
+#if GENERIC_UBOOT
+void init_go(int argc, char **argv, pm_t load_addr)
+{
+ if (argc != 2)
+ return;
+
+ void *fdt = (void *)strtouintptr(argv[1]);
+
+ /* fdt is passed as second argument, load address first but since we
+ * already have it due to our ingenious _start, no need to parse it */
+ init(fdt, load_addr);
+}
+#endif
diff --git a/arch/riscv64/init/start.S b/arch/riscv64/init/start.S
index 7439d93..b6394f7 100644
--- a/arch/riscv64/init/start.S
+++ b/arch/riscv64/init/start.S
@@ -1,17 +1,33 @@
/* SPDX-License-Identifier: copyleft-next-0.3.1 */
/* Copyright 2021 - 2022, Kim Kuparinen < kimi.h.kuparinen@gmail.com > */
+/* generic u-boot passes argc and argv as if we were a regular
+ * program, so our load address must be placed third.
+ * If we have a 'custom' u-boot with kmi support, the fdt
+ * will be passed to us directly, so the load address can go second.
+ */
+#if GENERIC_UBOOT
+# define LOAD_REG a2
+# define INIT init_go
+#else
+# define LOAD_REG a1
+# define INIT init
+#endif
+
.section .init
.global _start
/* Entry point to the kernel loader. */
_start:
/* get load address */
-auipc a1, 0
+auipc LOAD_REG, 0
/* keep using bootloader stack for now */
//li sp, PM_STACK_TOP
/* make sure there's no garbage in tp, important for id assignment */
li tp, 0
-call init
+call INIT
+// INIT shouldn't return, but if we do we might as well just jump back to u-boot
+// or wherever
+ret
.section .text
.global jump_to_kernel
diff --git a/arch/riscv64/kernel/vmem.c b/arch/riscv64/kernel/vmem.c
index d0cac2c..235884b 100644
--- a/arch/riscv64/kernel/vmem.c
+++ b/arch/riscv64/kernel/vmem.c
@@ -427,7 +427,8 @@ 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(
- get_ram_base() + TOP_PAGE_SIZE * (i - KSTART_PAGE), flags);
+ get_ram_base() + TOP_PAGE_SIZE * (i - KSTART_PAGE),
+ flags);
/* map in IO region */
map_io_dbg(b);