154 lines
3.9 KiB
Nix
154 lines
3.9 KiB
Nix
{ self }:
|
|
{ config, lib, pkgs, ... }:
|
|
let
|
|
config' = config;
|
|
lib' = self.lib.x86_64-linux-x86_64-genode;
|
|
pkgs' = self.packages.x86_64-linux-x86_64-genode;
|
|
|
|
modulesPath = "${self.inputs.nixpkgs}/nixos/modules";
|
|
|
|
toVdi = config:
|
|
import "${modulesPath}/../lib/make-disk-image.nix" {
|
|
inherit config lib pkgs;
|
|
diskSize = config.virtualbox.baseImageSize;
|
|
partitionTableType = "legacy";
|
|
fsType = "ext4";
|
|
name = "nixos-${pkgs.stdenv.hostPlatform.system}.vdi";
|
|
format = "vdi";
|
|
};
|
|
|
|
guestChildren = lib'.runDhallCommand "vbox.dhall" { } (''
|
|
dhall > $out << END
|
|
let Genode = env:DHALL_GENODE
|
|
let toVbox = ${./dhall/vbox-guest.dhall}
|
|
in [
|
|
'' + builtins.concatStringsSep "," (lib.mapAttrsToList (vmName: cfg:
|
|
let
|
|
inherit (cfg) config;
|
|
vdiFile = "${toVdi config}/nixos.vdi";
|
|
in ''
|
|
{ mapKey = "vbox-${vmName}"
|
|
, mapValue =
|
|
toVbox
|
|
{ vdiFilename = "${vdiFile}"
|
|
, vdiUuid =
|
|
"$(${pkgs.virtualbox}/bin/VBoxManage showmediuminfo ${vdiFile} | awk '/^UUID:/ {print \$2}')"
|
|
, memorySize = ${toString config.virtualbox.memorySize}
|
|
, vmName = "${vmName}"
|
|
}
|
|
}
|
|
'') config.genode.guests) + ''
|
|
] : Genode.Init.Children.Type
|
|
END
|
|
'');
|
|
|
|
buildBootDescription =
|
|
self.legacyPackages.x86_64-linux.callPackage ./buildBootDescription.nix {
|
|
lib = lib';
|
|
};
|
|
|
|
bootDescription = buildBootDescription {
|
|
initConfig = "${./dhall}/vbox-host.dhall ${guestChildren}";
|
|
imageInputs = map pkgs'.genodeSources.depot [
|
|
"acpi_drv"
|
|
"ahci_drv"
|
|
"chroot"
|
|
"cached_fs_rom"
|
|
"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"
|
|
"intel_fb_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" { gzip = true; } bootDescription;
|
|
|
|
in {
|
|
|
|
options.genode.guests = with lib;
|
|
mkOption {
|
|
type = types.attrsOf (types.submodule ({ config, options, name, ... }: {
|
|
options = {
|
|
|
|
config = mkOption {
|
|
description = ''
|
|
A specification of the desired configuration of this
|
|
guest VM, as a NixOS module.
|
|
'';
|
|
type = mkOptionType {
|
|
name = "Toplevel NixOS config";
|
|
merge = loc: defs:
|
|
(import "${modulesPath}/../lib/eval-config.nix" {
|
|
inherit (config'.nixpkgs) system;
|
|
modules =
|
|
[ "${modulesPath}/virtualisation/virtualbox-image.nix" ]
|
|
++ (map (x: x.value) defs);
|
|
prefix = [ "guests" name ];
|
|
}).config;
|
|
};
|
|
};
|
|
|
|
};
|
|
}));
|
|
default = { };
|
|
};
|
|
|
|
config = {
|
|
system.build.genodeFirmware = firmware;
|
|
|
|
boot.loader.grub = {
|
|
extraEntries = ''
|
|
menuentry Genode on NOVA {
|
|
insmod multiboot2
|
|
insmod gzio
|
|
multiboot2 /boot/bender
|
|
module2 /boot/hypervisor hypervisor iommu novpid serial logmem
|
|
module2 /boot/image.elf.gz image.elf
|
|
}
|
|
'';
|
|
|
|
extraFiles = {
|
|
bender = "${pkgs'.genodeSources}/tool/boot/bender";
|
|
hypervisor = "${pkgs'.NOVA}/hypervisor-x86_64";
|
|
"image.elf.gz" = "${firmware}/image.elf.gz";
|
|
};
|
|
};
|
|
};
|
|
}
|