68 lines
1.8 KiB
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"
|
|
'')
|