diff options
Diffstat (limited to 'boards')
-rw-r--r-- | boards/default.nix | 33 | ||||
-rw-r--r-- | boards/qemu-virt/default.nix | 7 | ||||
-rw-r--r-- | boards/qemu-virt/qemu-virt.ld | 29 | ||||
-rw-r--r-- | boards/qemu-virt/qemu-virt.s | 23 |
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 |