175 lines
4.5 KiB
Nix
175 lines
4.5 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";
|
|
|
|
cfg = config.genode;
|
|
|
|
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
|
|
in [
|
|
'' + builtins.concatStringsSep "," (lib.mapAttrsToList (vmName: cfg:
|
|
let
|
|
inherit (cfg) config;
|
|
vdiFile = "${toVdi config}/nixos.vdi";
|
|
in lib'.runDhallCommand "vbox.dhall" { } ''
|
|
vdiUuid=$(${pkgs.virtualbox}/bin/VBoxManage showmediuminfo "${vdiFile}" | awk '/^UUID:/ {print $2}')
|
|
dhall > $out << END
|
|
{ mapKey = "vbox-${vmName}"
|
|
, mapValue =
|
|
${./dhall/vbox-guest.dhall}
|
|
{ vdiFilename = "${vdiFile}"
|
|
, vdiUuid = "$vdiUuid"
|
|
, memorySize = ${toString config.virtualbox.memorySize}
|
|
, vmName = "${vmName}"
|
|
}
|
|
}
|
|
END
|
|
'') config.genode.guests) + ''
|
|
] : Genode.Init.Children.Type
|
|
END
|
|
'');
|
|
|
|
initConfig = "${./dhall}/vbox-host.dhall ${guestChildren}";
|
|
|
|
buildBootDescription =
|
|
self.legacyPackages.x86_64-linux.callPackage ./buildBootDescription.nix {
|
|
lib = lib';
|
|
};
|
|
|
|
bootDescription = buildBootDescription {
|
|
inherit initConfig;
|
|
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_audit"
|
|
"vfs_ttf"
|
|
] ++ lib.optional (cfg.fbDriver == "vesa") "vesa_drv"
|
|
++ lib.optional (cfg.fbDriver == "intel") "intel_fb_drv")
|
|
++ (with pkgs'; [ base-nova 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_audit.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 = with lib; {
|
|
fbDriver = mkOption {
|
|
default = "vesa";
|
|
type = types.enum [ "intel" "vesa" ];
|
|
description = ''
|
|
Set framebuffer driver.
|
|
'';
|
|
};
|
|
guests = 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.genode = {
|
|
inherit firmware;
|
|
config = lib'.runDhallCommand "config.dhall" { }
|
|
''dhall > $out <<< "${initConfig}"'';
|
|
};
|
|
|
|
boot.loader.grub = {
|
|
extraEntries = ''
|
|
menuentry Genode on NOVA {
|
|
insmod multiboot2
|
|
insmod gzio
|
|
multiboot2 /bender
|
|
module2 /hypervisor hypervisor iommu novpid serial logmem
|
|
module2 /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";
|
|
};
|
|
};
|
|
};
|
|
}
|