{ self }: let lib' = self.lib.x86_64-linux-x86_64-genode; pkgs' = self.packages.x86_64-linux-x86_64-genode; in { config, lib, pkgs, ... }: let inherit (pkgs.vmTools) qemu; buildBootDescription = self.legacyPackages.x86_64-linux.callPackage ./buildBootDescription.nix { lib = lib'; }; nixosVDI = "${config.system.build.virtualBoxVDI}/nixos.vdi"; genodeParams = lib'.runDhallCommand "params.dhall" { } '' vdiUuid=$(${pkgs.virtualbox}/bin/VBoxManage showmediuminfo ${nixosVDI} | awk '/^UUID:/ {print $2}') dhall > $out << EOD { vdiFilename = "nixos.vdi" , vdiUuid = "$vdiUuid" , memorySize = ${toString config.virtualbox.memorySize} , vmName = "${config.virtualbox.vmName}" } EOD ''; bootDescription = buildBootDescription { name = "boot-description"; initConfig = "${./dhall}/vbox-host.dhall ${genodeParams}"; imageInputs = map pkgs'.genodeSources.depot [ "acpi_drv" "ahci_drv" "init" "input_filter" "ipxe_nic_drv" "libc" "libiconv" "log_core" "nit_fb" "nitpicker" "part_block" "platform_drv" "ps2_drv" "report_rom" "rom_logger" "rtc_drv" "rump" "stdcxx" "terminal" "terminal_log" "vbox5" "vesa_drv" "vfs" "vfs_ttf" ] ++ [ pkgs'.base-nova pkgs'.block_router ]; extraBinaries = [ "ld.lib.so" "libc.so" "libc_pipe.so" "libiconv.so" "libm.so" "libqemu-usb.so" "librump.so" "librump_fs.so" "libstdcxx.so" "libvfs.so" "libvfs_rump.so" "libvfs_ttf.so" ]; extraRoms = { "Inconsolata.ttf" = "${pkgs.inconsolata}/share/fonts/truetype/inconsolata/Inconsolata-Regular.ttf"; }; }; firmware = lib'.novaImage "stage0" { } bootDescription; grubStandalone = pkgs.runCommand "grub-standalone" { buildInputs = [ pkgs.grub2_efi ]; grubModules = [ "multiboot2" "gzio" "normal" "gfxterm" ]; } '' cat > grub.cfg << EOF multiboot2 /bender module2 /hypervisor.gz hypervisor iommu novpid novga serial logmem module2 /image.elf.gz image.elf EOF gzip -c "${pkgs'.NOVA}/hypervisor-x86_64" > hypervisor.gz gzip -c "${firmware}" > image.elf.gz mkdir -p $out grub-mkstandalone -O x86_64-efi -o "$out/bootx64.efi" \ --install-modules="$grubModules" \ --modules="$grubModules" \ "boot/grub/grub.cfg=grub.cfg" \ "hypervisor.gz=hypervisor.gz" \ "image.elf.gz=image.elf.gz" \ ''; genodeDiskImage = pkgs.vmTools.runInLinuxVM (pkgs.runCommand "genode-disk-image" { preVM = '' mkdir $out diskImage=$out/disk.img bootFlash=$out/bios.bin ${qemu}/bin/qemu-img create -f qcow2 $diskImage 2G install -m0644 ${pkgs.OVMF-CSM.fd}/FV/OVMF.fd $bootFlash ''; buildInputs = with pkgs; [ e2fsprogs grub2_efi utillinux ]; QEMU_OPTS = "-pflash $out/bios.bin -nographic"; } # Use fixed GUIDs for reproducibility '' ${pkgs.gptfdisk}/bin/sgdisk \ --set-alignment=512 --new=1:0:16M --change-name=1:EFISystem \ --set-alignment=512 --largest-new=2 --change-name=2:Genode \ --typecode=1:ef00 \ --typecode=2:${import ./dhall/partition-type} \ --attributes=1:set:2 \ --disk-guid=E7D8E481-623A-4F0F-87E6-A2327CC591C6 \ --partition-guid=1:B4DC4B9C-8B22-43BB-8D96-7CD4473DABE6 \ --partition-guid=2:113F1671-8074-4D82-8C25-DC84BA04D2C9 \ --recompute-chs /dev/vda ${pkgs.dosfstools}/bin/mkfs.fat -F16 /dev/vda1 export MTOOLS_SKIP_CHECK=1 ${pkgs.mtools}/bin/mlabel -i /dev/vda1 ::boot mkdir /boot /genode mount /dev/vda1 /boot install -D ${grubStandalone}/bootx64.efi /boot/efi/boot/bootx64.efi umount /boot mke2fs /dev/vda2 mount /dev/vda2 /genode cp ${nixosVDI} /genode/nixos.vdi cp "${pkgs'.genodeSources}/tool/boot/bender" /genode/bender cp "${pkgs'.NOVA}/hypervisor-x86_64" /genode/hypervisor-x86_64 gzip -c "${firmware}" > /genode/image.elf.gz umount /genode ''); in { system.build = { genodeGuestScript = pkgs.writeScriptBin "genode-nixos-vm" '' #! ${pkgs.runtimeShell} set -e ${qemu}/bin/qemu-img create -f qcow2 -b \ ${genodeDiskImage}/disk.img disk.img || exit 1 install -m0644 ${genodeDiskImage}/bios.bin bios.bin || exit 1 ${pkgs.vmTools.qemu}/bin/qemu-system-x86_64 \ -machine q35 \ -cpu phenom \ -m 4096 \ -serial mon:stdio \ -pflash bios.bin \ disk.img \ $@ ''; genodeGuest = pkgs.runCommand "nixos-vm" { preferLocalBuild = true; } '' mkdir -p $out ln -s ${grubStandalone}/bootx64.efi $out/bootx64.efi ln -s ${nixosVDI} $out/nixo.vdi cat > $out/README << EOF # Installation instructions Copy the following UEFI boot image to the appropriate boot media: $out/bootx64.efi Copy the following disk image to an Ext2 partition with the partition type ${import ./dhall/partition-type} EOF ''; }; }