2
0
Fork 0
genodepkgs/nixos-modules/default.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";
};
};
};
}