summaryrefslogtreecommitdiff
path: root/boards/qemu-virt
diff options
context:
space:
mode:
Diffstat (limited to 'boards/qemu-virt')
-rw-r--r--boards/qemu-virt/default.nix7
-rw-r--r--boards/qemu-virt/qemu-virt.ld29
-rw-r--r--boards/qemu-virt/qemu-virt.s23
3 files changed, 59 insertions, 0 deletions
diff --git a/boards/qemu-virt/default.nix b/boards/qemu-virt/default.nix
new file mode 100644
index 0000000..e41d924
--- /dev/null
+++ b/boards/qemu-virt/default.nix
@@ -0,0 +1,7 @@
+{ mkKernel }:
+
+mkKernel {
+ name = "qemu-virt";
+ asmFile = ./qemu-virt.s;
+ linkerScript = ./qemu-virt.ld;
+}
diff --git a/boards/qemu-virt/qemu-virt.ld b/boards/qemu-virt/qemu-virt.ld
new file mode 100644
index 0000000..9673637
--- /dev/null
+++ b/boards/qemu-virt/qemu-virt.ld
@@ -0,0 +1,29 @@
+OUTPUT("elf64-littleriscv")
+ENTRY(_start)
+
+SECTIONS {
+ . = 0x80000000;
+ .text : {
+ *(.text.start)
+ *(.text .text.*)
+ . = ALIGN(0x1000);
+ }
+
+ .rodata : {
+ *(.rodata)
+ . = ALIGN(0x1000);
+ }
+
+ .data : {
+ *(.data)
+ }
+ .bss : {
+ *(.bss)
+ . = ALIGN(0x1000);
+ }
+
+ .hart0_initial_stack : {
+ . += 0x1000;
+ PROVIDE(hart0_initial_stack_top = .);
+ }
+}
diff --git a/boards/qemu-virt/qemu-virt.s b/boards/qemu-virt/qemu-virt.s
new file mode 100644
index 0000000..4813b57
--- /dev/null
+++ b/boards/qemu-virt/qemu-virt.s
@@ -0,0 +1,23 @@
+.section .text.start
+
+.extern main
+
+.global _start
+_start:
+ # Have harts other than 0 spin until hart0 wakes them up.
+ csrr a0, mhartid
+ c.bnez a0, wait_for_hart0
+
+ # Set up hart0's stack.
+ la sp, hart0_initial_stack_top
+ call hart0_boot
+
+ # Fall through to a spin loop.
+halt:
+ j halt
+
+.section .text
+
+wait_for_hart0:
+ # TODO
+ j halt