genode/apps/nova-iso/default.nix

68 lines
1.8 KiB
Nix

{ stdenv, nixpkgs, dhallApps, NOVA, base-nova }:
nixpkgs.writeScriptBin "nova-iso" (with nixpkgs.buildPackages;
let inherit (stdenv) cc;
in ''
#!${runtimeShell}
set -eu
CC="${cc}/bin/${cc.targetPrefix}cc"
LD="${buildPackages.binutils}/bin/${buildPackages.binutils.targetPrefix}ld"
SYSLINUX="${syslinux}/share/syslinux"
TMPDIR="$(${coreutils}/bin/mktemp -p /tmp -d nova-iso.XXXX)"
mkdir -p "$TMPDIR/boot/syslinux"
trap "rm -rf $TMPDIR" err exit
CORE_NOVA="${base-nova}/lib/core-nova.o"
${dhallApps.dhall.program} text <<< "(${
./modules.as.dhall
}) ($@)" > "$TMPDIR/modules.as"
# compile the boot modules into one object file
$CC -c -x assembler -o "$TMPDIR/boot_modules.o" "$TMPDIR/modules.as"
# link final image
$LD -nostdlib \
-T${../../repos/base/src/ld/genode.ld} \
-T${../../repos/base-nova/src/core/core-bss.ld} \
-z max-page-size=0x1000 \
-Ttext=0x100000 -gc-sections \
"$CORE_NOVA" "$TMPDIR/boot_modules.o" \
-o "$TMPDIR/boot/image.elf"
pushd "$TMPDIR"
# build ISO image
cp ${NOVA}/hypervisor* boot/hypervisor
cp ${./isolinux.cfg} boot/syslinux/isolinux.cfg
cp \
$SYSLINUX/isolinux.bin \
$SYSLINUX/ldlinux.c32 \
$SYSLINUX/libcom32.c32 \
$SYSLINUX/mboot.c32 \
boot/syslinux
chmod +w boot/syslinux/isolinux.bin
ISO_FILE="''${DIRSTACK[1]}/nova.iso"
${cdrkit}/bin/mkisofs -o "$ISO_FILE" \
-b syslinux/isolinux.bin -c syslinux/boot.cat \
-no-emul-boot -boot-load-size 4 -boot-info-table \
-iso-level 2 \
boot
popd
# build test script
QEMU_SCRIPT=boot-qemu.sh
cat > "$QEMU_SCRIPT" << EOF
#!/bin/sh
qemu-system-x86_64 -cdrom nova.iso -machine q35 -serial mon:stdio \$@
EOF
chmod +x "$QEMU_SCRIPT"
'')