185 lines
5.1 KiB
Nix
185 lines
5.1 KiB
Nix
{ 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
|
|
'';
|
|
};
|
|
}
|