summaryrefslogtreecommitdiff
path: root/boards
diff options
context:
space:
mode:
Diffstat (limited to 'boards')
-rw-r--r--boards/default.nix33
-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
4 files changed, 92 insertions, 0 deletions
diff --git a/boards/default.nix b/boards/default.nix
new file mode 100644
index 0000000..dd09255
--- /dev/null
+++ b/boards/default.nix
@@ -0,0 +1,33 @@
+{ libkernel, pkgs }:
+
+let
+ mkKernel = { name, asmFile, linkerScript }:
+ pkgs.stdenvNoCC.mkDerivation {
+ pname = "${libkernel.pname}-${name}";
+ version = libkernel.version;
+ inherit asmFile linkerScript;
+
+ nativeBuildInputs = [ pkgs.stdenv.cc.bintools.bintools ];
+
+ dontUnpack = true;
+ buildPhase = ''
+ runHook preBuild
+
+ riscv64-unknown-none-elf-as -g -march=rv64gc -mabi=lp64d -o asm.o \
+ $asmFile
+
+ riscv64-unknown-none-elf-ld --gc-sections -T$linkerScript -o kernel.elf \
+ asm.o ${libkernel}/lib/libkernel.a
+
+ runHook postBuild
+ '';
+ installPhase = ''
+ runHook preInstall
+ install -Dt $out kernel.elf
+ runHook postInstall
+ '';
+ };
+
+in pkgs.lib.recurseIntoAttrs {
+ qemu-virt = pkgs.callPackage ./qemu-virt { inherit mkKernel; };
+}
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