aboutsummaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
Diffstat (limited to 'arch')
-rw-r--r--arch/riscv/init/start.S5
-rw-r--r--arch/riscv/source.mk10
-rw-r--r--arch/riscv64/conf/apos.its (renamed from arch/riscv/conf/apos.its)0
-rw-r--r--arch/riscv64/conf/boot.cmd (renamed from arch/riscv/conf/boot.cmd)0
-rwxr-xr-xarch/riscv64/conf/init (renamed from arch/riscv/conf/init)bin968 -> 968 bytes
-rw-r--r--arch/riscv64/conf/init-link.S (renamed from arch/riscv/conf/init-link.S)2
-rw-r--r--arch/riscv64/conf/initrd (renamed from arch/riscv/conf/initrd)bin1536 -> 1536 bytes
-rw-r--r--arch/riscv64/conf/kernel-link.S (renamed from arch/riscv/conf/kernel-link.S)2
-rwxr-xr-xarch/riscv64/conf/mkimage.sh (renamed from arch/riscv/conf/mkimage.sh)4
-rwxr-xr-xarch/riscv64/conf/rmimage.sh (renamed from arch/riscv/conf/rmimage.sh)0
-rw-r--r--arch/riscv64/conf/rootfs.fd (renamed from arch/riscv/conf/rootfs.fd)0
-rw-r--r--arch/riscv64/conf/s.S (renamed from arch/riscv/conf/s.S)0
-rw-r--r--arch/riscv64/config.h (renamed from arch/riscv/config.h)0
-rw-r--r--arch/riscv64/include/csr.h (renamed from arch/riscv/include/csr.h)8
-rw-r--r--arch/riscv64/include/lock.h (renamed from arch/riscv/include/lock.h)0
-rw-r--r--arch/riscv64/include/pages.h (renamed from arch/riscv/include/pages.h)0
-rw-r--r--arch/riscv64/include/sbi.h (renamed from arch/riscv/include/sbi.h)0
-rw-r--r--arch/riscv64/include/tcb.h (renamed from arch/riscv/include/tcb.h)0
-rw-r--r--arch/riscv64/include/vmem.h (renamed from arch/riscv/include/vmem.h)0
-rw-r--r--arch/riscv64/init/init.c (renamed from arch/riscv/init/init.c)4
-rw-r--r--arch/riscv64/init/start.S12
-rw-r--r--arch/riscv64/ipc.txt (renamed from arch/riscv/ipc.txt)0
-rw-r--r--arch/riscv64/kernel/cpu.c (renamed from arch/riscv/kernel/cpu.c)0
-rw-r--r--arch/riscv64/kernel/irq.c (renamed from arch/riscv/kernel/irq.c)0
-rw-r--r--arch/riscv64/kernel/main.c (renamed from arch/riscv/kernel/main.c)0
-rw-r--r--arch/riscv64/kernel/pmem.c (renamed from arch/riscv/kernel/pmem.c)0
-rw-r--r--arch/riscv64/kernel/proc.c (renamed from arch/riscv/kernel/proc.c)4
-rw-r--r--arch/riscv64/kernel/vmem.c (renamed from arch/riscv/kernel/vmem.c)4
-rw-r--r--arch/riscv64/mm.txt (renamed from arch/riscv/mm.txt)0
-rw-r--r--arch/riscv64/proc.txt (renamed from arch/riscv/proc.txt)0
-rw-r--r--arch/riscv64/source.mk17
31 files changed, 44 insertions, 28 deletions
diff --git a/arch/riscv/init/start.S b/arch/riscv/init/start.S
deleted file mode 100644
index f9bfb92..0000000
--- a/arch/riscv/init/start.S
+++ /dev/null
@@ -1,5 +0,0 @@
-.section .init.start
-.global _start
-_start:
-li sp, PM_STACK_TOP
-jal init
diff --git a/arch/riscv/source.mk b/arch/riscv/source.mk
deleted file mode 100644
index e50880c..0000000
--- a/arch/riscv/source.mk
+++ /dev/null
@@ -1,10 +0,0 @@
-KERNEL_LOCAL != echo arch/riscv/kernel/*.[cS]
-KERNEL_SOURCES += $(KERNEL_LOCAL)
-INIT_SOURCES += arch/riscv/init/*.[cS]
-
-CLEANUP_CMD := ./arch/riscv/conf/rmimage.sh
-
-ARCH_FLAGS := -mcmodel=medany
-
-run:
- ./arch/riscv/conf/mkimage.sh
diff --git a/arch/riscv/conf/apos.its b/arch/riscv64/conf/apos.its
index da48860..da48860 100644
--- a/arch/riscv/conf/apos.its
+++ b/arch/riscv64/conf/apos.its
diff --git a/arch/riscv/conf/boot.cmd b/arch/riscv64/conf/boot.cmd
index a7517fd..a7517fd 100644
--- a/arch/riscv/conf/boot.cmd
+++ b/arch/riscv64/conf/boot.cmd
diff --git a/arch/riscv/conf/init b/arch/riscv64/conf/init
index f05254f..f05254f 100755
--- a/arch/riscv/conf/init
+++ b/arch/riscv64/conf/init
Binary files differ
diff --git a/arch/riscv/conf/init-link.S b/arch/riscv64/conf/init-link.S
index ce53e5e..baabcc6 100644
--- a/arch/riscv/conf/init-link.S
+++ b/arch/riscv64/conf/init-link.S
@@ -23,7 +23,7 @@ SECTIONS {
}
.bss : {
- *(.bss*) *(COMMON)
+ *(.sbss*) *(.bss*) *(COMMON)
}
__init_end = . ;
diff --git a/arch/riscv/conf/initrd b/arch/riscv64/conf/initrd
index 90344c1..90344c1 100644
--- a/arch/riscv/conf/initrd
+++ b/arch/riscv64/conf/initrd
Binary files differ
diff --git a/arch/riscv/conf/kernel-link.S b/arch/riscv64/conf/kernel-link.S
index d3b1223..c6a910a 100644
--- a/arch/riscv/conf/kernel-link.S
+++ b/arch/riscv64/conf/kernel-link.S
@@ -19,7 +19,7 @@ SECTIONS {
}
.bss : {
- *(.bss*) *(COMMON)
+ *(.sbss*) *(.bss*) *(COMMON)
}
__kernel_end = .;
diff --git a/arch/riscv/conf/mkimage.sh b/arch/riscv64/conf/mkimage.sh
index 5a22d01..d097248 100755
--- a/arch/riscv/conf/mkimage.sh
+++ b/arch/riscv64/conf/mkimage.sh
@@ -16,9 +16,9 @@ mount -o loop,offset=$((${SSIZE}*${OFFSET})) rootfs.img fs
# not entirely pleased with this solution, although eventually I should probably
# move `run` out of the kernel repo and into some `aposos` repo with a runtime
# and proper initrd etc. so this is good enough for now
-../u-boot-apos/tools/mkimage -f arch/riscv/conf/apos.its fs/apos.itb
+../u-boot-apos/tools/mkimage -f arch/riscv64/conf/apos.its fs/apos.itb
../u-boot-apos/tools/mkimage -A riscv -O apos -T script \
- -d arch/riscv/conf/boot.cmd fs/boot.scr
+ -d arch/riscv64/conf/boot.cmd fs/boot.scr
umount -l fs
diff --git a/arch/riscv/conf/rmimage.sh b/arch/riscv64/conf/rmimage.sh
index 8d6457f..8d6457f 100755
--- a/arch/riscv/conf/rmimage.sh
+++ b/arch/riscv64/conf/rmimage.sh
diff --git a/arch/riscv/conf/rootfs.fd b/arch/riscv64/conf/rootfs.fd
index 59fb5f8..59fb5f8 100644
--- a/arch/riscv/conf/rootfs.fd
+++ b/arch/riscv64/conf/rootfs.fd
diff --git a/arch/riscv/conf/s.S b/arch/riscv64/conf/s.S
index 80a3a11..80a3a11 100644
--- a/arch/riscv/conf/s.S
+++ b/arch/riscv64/conf/s.S
diff --git a/arch/riscv/config.h b/arch/riscv64/config.h
index 0ef22fa..0ef22fa 100644
--- a/arch/riscv/config.h
+++ b/arch/riscv64/config.h
diff --git a/arch/riscv/include/csr.h b/arch/riscv64/include/csr.h
index b309f0b..52db9c1 100644
--- a/arch/riscv/include/csr.h
+++ b/arch/riscv64/include/csr.h
@@ -49,15 +49,15 @@
#endif
#define csr_read(csr, res)\
- __asm__ ("csrr %0, " __ASM_STR(csr) : "=r" (res) : : "memory")
+ __asm__ volatile ("csrr %0, " __ASM_STR(csr) : "=r" (res) : : "memory")
#define csr_write(csr, val)\
- __asm__ ("csrw " __ASM_STR(csr) ", %0" : : "rK" (val) : "memory")
+ __asm__ volatile ("csrw " __ASM_STR(csr) ", %0" : : "r" (val) : "memory")
#define csr_set(csr, val)\
- __asm__ ("csrs " __ASM_STR(csr) ", %0" : : "rK" (val) : "memory")
+ __asm__ volatile ("csrs " __ASM_STR(csr) ", %0" : : "r" (val) : "memory")
#define csr_clear(csr, val)\
- __asm__ ("csrc " __ASM_STR(csr) ", %0" : : "rK" (val) : "memory")
+ __asm__ volatile ("csrc " __ASM_STR(csr) ", %0" : : "r" (val) : "memory")
#endif /* APOS_CSR_H */
diff --git a/arch/riscv/include/lock.h b/arch/riscv64/include/lock.h
index 4f71344..4f71344 100644
--- a/arch/riscv/include/lock.h
+++ b/arch/riscv64/include/lock.h
diff --git a/arch/riscv/include/pages.h b/arch/riscv64/include/pages.h
index 362499a..362499a 100644
--- a/arch/riscv/include/pages.h
+++ b/arch/riscv64/include/pages.h
diff --git a/arch/riscv/include/sbi.h b/arch/riscv64/include/sbi.h
index 609849d..609849d 100644
--- a/arch/riscv/include/sbi.h
+++ b/arch/riscv64/include/sbi.h
diff --git a/arch/riscv/include/tcb.h b/arch/riscv64/include/tcb.h
index d1e0717..d1e0717 100644
--- a/arch/riscv/include/tcb.h
+++ b/arch/riscv64/include/tcb.h
diff --git a/arch/riscv/include/vmem.h b/arch/riscv64/include/vmem.h
index 228b24b..228b24b 100644
--- a/arch/riscv/include/vmem.h
+++ b/arch/riscv64/include/vmem.h
diff --git a/arch/riscv/init/init.c b/arch/riscv64/init/init.c
index 23dcadd..7aecfb5 100644
--- a/arch/riscv/init/init.c
+++ b/arch/riscv64/init/init.c
@@ -60,11 +60,13 @@ void move_kernel()
void init(void *fdt)
{
extern char *__init_end;
+ extern void jump_to_kernel(void *k, void *fdt);
void (*kernel_main)(void *fdt) = (void (*)(void *))(VM_KERN);
init_bootmem();
move_kernel();
__va_reg(sp);
__va_reg(fp);
__va_reg(gp);
- kernel_main(__va(fdt));
+ jump_to_kernel((void *)VM_KERN, __va(fdt));
+ //kernel_main(__va(fdt));
}
diff --git a/arch/riscv64/init/start.S b/arch/riscv64/init/start.S
new file mode 100644
index 0000000..7842946
--- /dev/null
+++ b/arch/riscv64/init/start.S
@@ -0,0 +1,12 @@
+.section .init.start
+.global _start
+_start:
+li sp, PM_STACK_TOP
+call init
+
+.section .text
+.global jump_to_kernel
+jump_to_kernel:
+mv a2, a0 // store kernel addr
+mv a0, a1 // move fdt pointer to first argument
+jr a2 // jump to kernel
diff --git a/arch/riscv/ipc.txt b/arch/riscv64/ipc.txt
index 21d758e..21d758e 100644
--- a/arch/riscv/ipc.txt
+++ b/arch/riscv64/ipc.txt
diff --git a/arch/riscv/kernel/cpu.c b/arch/riscv64/kernel/cpu.c
index 6ae4ee7..6ae4ee7 100644
--- a/arch/riscv/kernel/cpu.c
+++ b/arch/riscv64/kernel/cpu.c
diff --git a/arch/riscv/kernel/irq.c b/arch/riscv64/kernel/irq.c
index f844dd1..f844dd1 100644
--- a/arch/riscv/kernel/irq.c
+++ b/arch/riscv64/kernel/irq.c
diff --git a/arch/riscv/kernel/main.c b/arch/riscv64/kernel/main.c
index 9ce256e..9ce256e 100644
--- a/arch/riscv/kernel/main.c
+++ b/arch/riscv64/kernel/main.c
diff --git a/arch/riscv/kernel/pmem.c b/arch/riscv64/kernel/pmem.c
index 45b8eeb..45b8eeb 100644
--- a/arch/riscv/kernel/pmem.c
+++ b/arch/riscv64/kernel/pmem.c
diff --git a/arch/riscv/kernel/proc.c b/arch/riscv64/kernel/proc.c
index 6120c2d..b696912 100644
--- a/arch/riscv/kernel/proc.c
+++ b/arch/riscv64/kernel/proc.c
@@ -5,8 +5,8 @@
void jump_to_userspace(struct tcb *t, int argc, char **argv)
{
csr_write(CSR_SEPC, t->entry);
- __asm__("mv sp, %0\n" : "=r" (t->proc_stack) :: "memory");
- __asm__("sret\n" ::: "memory");
+ __asm__ volatile ("mv sp, %0\n" : "=r" (t->proc_stack) :: "memory");
+ __asm__ volatile ("sret\n" ::: "memory");
}
void return_to_userspace(struct tcb *t)
diff --git a/arch/riscv/kernel/vmem.c b/arch/riscv64/kernel/vmem.c
index 1f1f44a..bc1a74e 100644
--- a/arch/riscv/kernel/vmem.c
+++ b/arch/riscv64/kernel/vmem.c
@@ -125,12 +125,12 @@ void unmap_vmem(struct vm_branch *branch, vm_t vaddr)
void flush_tlb()
{
- __asm__("sfence.vma %0\n" :: "rk" (cpu_id()) : "memory");
+ __asm__ volatile ("sfence.vma %0\n" :: "r" (cpu_id()) : "memory");
}
void flush_tlb_all()
{
- __asm__("sfence.vma\n" ::: "memory");
+ __asm__ volatile ("sfence.vma\n" ::: "memory");
}
static void start_vmem(struct vm_branch *branch, enum mm_mode m)
diff --git a/arch/riscv/mm.txt b/arch/riscv64/mm.txt
index e5c52cb..e5c52cb 100644
--- a/arch/riscv/mm.txt
+++ b/arch/riscv64/mm.txt
diff --git a/arch/riscv/proc.txt b/arch/riscv64/proc.txt
index 29b2e92..29b2e92 100644
--- a/arch/riscv/proc.txt
+++ b/arch/riscv64/proc.txt
diff --git a/arch/riscv64/source.mk b/arch/riscv64/source.mk
new file mode 100644
index 0000000..d1986d4
--- /dev/null
+++ b/arch/riscv64/source.mk
@@ -0,0 +1,17 @@
+KERNEL_LOCAL != echo arch/riscv64/kernel/*.[cS]
+KERNEL_SOURCES += $(KERNEL_LOCAL)
+INIT_SOURCES += arch/riscv64/init/*.[cS]
+
+CLEANUP_CMD := ./arch/riscv64/conf/rmimage.sh
+
+ARCH_FLAGS := -mcmodel=medany
+
+# llvm compilation doesn't seem to work, either bfd reads the object files wrong
+# and outputs incorrect symbols or lld handles relocations in a dumb way. Only
+# GCC compiles the kernel correctly at the moment (on RISCV, at least). I'll
+# look into this later, but for now I'll just use GCC. The code does _compile_
+# with clang, it just won't link.
+#LINKFLAGS := -fuse-ld=bfd
+
+run:
+ ./arch/riscv64/conf/mkimage.sh