diff --git a/nixos-modules/genode-core.nix b/nixos-modules/genode-core.nix index f4981e7..80d3c2b 100644 --- a/nixos-modules/genode-core.nix +++ b/nixos-modules/genode-core.nix @@ -5,7 +5,7 @@ let localPackages = pkgs.buildPackages; children' = config.lib.children.freeze - (config.genode.core.children // config.genode.core.supportChildren); + (config.genode.core.children // config.genode.core.auxiliaryChildren); coreErisCaps = with builtins; let pkgNames = [ "rtc_drv" ]; @@ -22,17 +22,15 @@ let bootConfigFile = let storeBackendInputs = { - fs = [ ]; memory = [ config.system.build.tarball ]; - net = [ ]; - }.${config.genode.core.storeBackend}; + }.${config.genode.core.storeBackend} or [ ]; coreInputs = # TODO: get rid of this? with builtins; concatMap (getAttr "extraInputs") ((attrValues config.genode.core.children) - ++ (attrValues config.genode.core.supportChildren)); + ++ (attrValues config.genode.core.auxiliaryChildren)); mergeManifests = inputs: with builtins; @@ -149,7 +147,7 @@ in { ''; }; - supportChildren = config.lib.types.children { extraOptions = { }; } // { + auxiliaryChildren = config.lib.types.children { extraOptions = { }; } // { internal = true; description = '' Children added to support other children, such as drivers. diff --git a/nixos-modules/genode-init.nix b/nixos-modules/genode-init.nix index d32b537..36fd66a 100644 --- a/nixos-modules/genode-init.nix +++ b/nixos-modules/genode-init.nix @@ -5,7 +5,8 @@ with lib; let cfg = config.genode.init; - children' = config.lib.children.freeze config.genode.init.children; + children' = config.lib.children.freeze + (config.genode.init.children // config.genode.init.auxiliaryChildren); in { @@ -65,6 +66,14 @@ in { }; }; + auxiliaryChildren = config.lib.types.children { extraOptions = { }; } // { + internal = true; + description = '' + Children added to support other children, such as drivers. + Do not manually add children here. + ''; + }; + romModules = mkOption { type = types.attrsOf types.path; default = { }; diff --git a/nixos-modules/hardware/default.nix b/nixos-modules/hardware/default.nix index ce99eb3..7f87d17 100644 --- a/nixos-modules/hardware/default.nix +++ b/nixos-modules/hardware/default.nix @@ -15,6 +15,9 @@ in { }; config = let + deviceManagerEnable = config.hardware.genode.ahci.enable + || config.hardware.genode.usb.enable; + ahciEris = lib.getEris "bin" pkgs.genodePackages.ahci_drv; partBlockEris = lib.getEris "bin" pkgs.genodePackages.part_block; @@ -121,27 +124,25 @@ in { ''; }; - genode.core.children.device_manager = lib.mkIf - (config.hardware.genode.ahci.enable - || config.hardware.genode.usb.enable) { - package = pkgs.genodePackages.device_manager; - configFile = pkgs.writeText "device_manager.dhall" '' - let Sigil = env:DHALL_SIGIL + genode.core.children.device_manager = lib.mkIf deviceManagerEnable { + package = pkgs.genodePackages.device_manager; + configFile = pkgs.writeText "device_manager.dhall" '' + let Sigil = env:DHALL_SIGIL - in λ(cap : Text) → - Sigil.Init.Child.flat - ( (${managerConfig}).device_manager - ⫽ { binary = cap - , resources = Sigil.Init.Resources::{ - , caps = 256 - , ram = Sigil.units.MiB 8 - } - } - ) - ''; - }; + in λ(cap : Text) → + Sigil.Init.Child.flat + ( (${managerConfig}).device_manager + ⫽ { binary = cap + , resources = Sigil.Init.Resources::{ + , caps = 256 + , ram = Sigil.units.MiB 8 + } + } + ) + ''; + }; - genode.core.children.drivers = { + genode.core.children.drivers = lib.mkIf deviceManagerEnable { package = pkgs.genodePackages.init; extraErisInputs = [ partBlockEris ] ++ lib.optional config.hardware.genode.ahci.enable ahciEris diff --git a/nixos-modules/hardware/framebuffer.nix b/nixos-modules/hardware/framebuffer.nix index 870bc15..236b297 100644 --- a/nixos-modules/hardware/framebuffer.nix +++ b/nixos-modules/hardware/framebuffer.nix @@ -13,15 +13,29 @@ with lib; config = { + hardware.genode.platform.policies = + lib.optional config.hardware.genode.framebuffer.enable + (builtins.toFile ("framebuffer.platform-policy.dhall") '' + let Sigil = env:DHALL_SIGIL + + in Sigil.Init.Config.Policy::{ + , service = "Platform" + , label = Sigil.Init.LabelSelector.prefix "fb_drv" + , content = + [ Sigil.Prelude.XML.leaf + { name = "pci", attributes = toMap { class = "VGA" } } + ] + } + ''); + genode.core.children.fb_drv = mkIf config.hardware.genode.framebuffer.enable { - configFile = let - binary = with pkgs.genodePackages; - { - boot = boot_fb_drv; - vesa = vesa_drv; - }.${config.hardware.genode.framebuffer.driver}; - in builtins.toFile "fb_drv.dhall" '' + package = with pkgs.genodePackages; + { + boot = boot_fb_drv; + vesa = vesa_drv; + }.${config.hardware.genode.framebuffer.driver}; + configFile = builtins.toFile "fb_drv.dhall" '' let Sigil = env:DHALL_SIGIL let Init = Sigil.Init @@ -39,6 +53,9 @@ with lib; ''; }; + virtualisation.graphics = + lib.mkDefault config.hardware.genode.framebuffer.enable; + }; } diff --git a/nixos-modules/hardware/nic.nix b/nixos-modules/hardware/nic.nix index 914d87c..86f8993 100644 --- a/nixos-modules/hardware/nic.nix +++ b/nixos-modules/hardware/nic.nix @@ -1,108 +1,132 @@ { config, pkgs, lib, ... }: -with lib; +let + mkUplinkDriver = { name, policyPrefix, driver, verbose }: { + package = with pkgs.genodePackages; + { + ipxe = ipxe_nic_drv; + virtio = virtio_nic_drv; + }.${driver}; + configFile = pkgs.writeText "${name}.dhall" '' + let Sigil = env:DHALL_SIGIL -{ + let Init = Sigil.Init - config = - # TODO: create drivers in both the first and second level inits - { - hardware.genode.platform.policies = let - mkPolicy = { name, platformPolicy }: - pkgs.writeText "${name}.policy.dhall" ''${platformPolicy} "${name}"''; - - childPolicies = builtins.concatLists (lib.attrsets.mapAttrsToList - (child: childAttrs: - lib.attrsets.mapAttrsToList (uplink: uplinkAttrs: - mkPolicy { - name = "${child}-${uplink}-driver"; - inherit (uplinkAttrs) platformPolicy; - }) childAttrs.uplinks) config.genode.core.children); - - in childPolicies; - - genode.core.supportChildren = let - - mkUplinkDriver = { name, policyPrefix, driver, verbose }: { - package = with pkgs.genodePackages; - { - ipxe = ipxe_nic_drv; - virtio = virtio_nic_drv; - }.${driver}; - configFile = pkgs.writeText "${name}.dhall" '' - let Sigil = env:DHALL_SIGIL - - let Init = Sigil.Init - - in λ(binary : Text) → - Init.Child.flat - Init.Child.Attributes::{ - , binary - , resources = Init.Resources::{ caps = 128, ram = Sigil.units.MiB 4 } - , routes = [ Init.ServiceRoute.parent "IO_MEM" ] - , config = Init.Config::{ - , attributes = toMap { verbose = "${ - if verbose then "yes" else "no" - }" } - , policies = - [ Init.Config.Policy::{ - , service = "Nic" - , label = Init.LabelSelector.prefix "${policyPrefix}" - } - ] - } + in λ(binary : Text) → + Init.Child.flat + Init.Child.Attributes::{ + , binary + , resources = Init.Resources::{ caps = 128, ram = Sigil.units.MiB 4 } + , routes = [ Init.ServiceRoute.parent "IO_MEM" ] + , config = Init.Config::{ + , attributes = toMap { verbose = "${ + if verbose then "yes" else "no" + }" } + , policies = + [ Init.Config.Policy::{ + , service = "Nic" + , label = Init.LabelSelector.prefix "${policyPrefix}" } - ''; - }; + ] + } + } + ''; + }; - mkUplinkDump = { name, childName, policyPrefix }: { - package = pkgs.genodePackages.nic_dump; - configFile = pkgs.writeText "${name}.dhall" '' - let Sigil = env:DHALL_SIGIL + mkUplinkDump = { name, childName, policyPrefix }: { + package = pkgs.genodePackages.nic_dump; + configFile = pkgs.writeText "${name}.dhall" '' + let Sigil = env:DHALL_SIGIL - let Init = Sigil.Init + let Init = Sigil.Init - in λ(binary : Text) → - Init.Child.flat - Init.Child.Attributes::{ - , binary - , resources = Init.Resources::{ caps = 128, ram = Sigil.units.MiB 6 } - , config = Init.Config::{ - , attributes = toMap { downlink = "${childName}", uplink = "driver" } - , policies = - [ Init.Config.Policy::{ - , service = "Nic" - , label = Init.LabelSelector.prefix "${policyPrefix}" - } - ] - } + in λ(binary : Text) → + Init.Child.flat + Init.Child.Attributes::{ + , binary + , resources = Init.Resources::{ caps = 128, ram = Sigil.units.MiB 6 } + , config = Init.Config::{ + , attributes = toMap { downlink = "${childName}", uplink = "driver" } + , policies = + [ Init.Config.Policy::{ + , service = "Nic" + , label = Init.LabelSelector.prefix "${policyPrefix}" } - ''; - }; + ] + } + } + ''; + }; - otherDrivers = lib.lists.flatten (lib.attrsets.mapAttrsToList - (childName: - { uplinks, ... }: - lib.attrsets.mapAttrsToList (uplink: - let - childLabel = "${childName} -> ${uplink}"; - driverName = "${childName}-${uplink}-driver"; - dumpName = "${childName}-${uplink}-dump"; - in { driver, dump, verbose, ... }: - [(rec { - name = driverName; - value = mkUplinkDriver { - inherit name driver verbose; - policyPrefix = if dump then dumpName else childLabel; - }; - })] ++ lib.lists.optional dump (rec { - name = dumpName; - value = mkUplinkDump { - inherit name childName; - policyPrefix = childLabel; - }; - })) uplinks) config.genode.core.children); + nicDriversFor = children: + builtins.listToAttrs (lib.lists.flatten (lib.attrsets.mapAttrsToList + (childName: + { uplinks, ... }: + lib.attrsets.mapAttrsToList (uplink: + let + childLabel = "${childName} -> ${uplink}"; + driverName = "${childName}-${uplink}-driver"; + dumpName = "${childName}-${uplink}-dump"; + in { driver, dump, verbose, ... }: + [(rec { + name = driverName; + value = mkUplinkDriver { + inherit name driver verbose; + policyPrefix = if dump then dumpName else childLabel; + }; + })] ++ lib.lists.optional dump (rec { + name = dumpName; + value = mkUplinkDump { + inherit name childName; + policyPrefix = childLabel; + }; + })) uplinks) children)); - in builtins.listToAttrs otherDrivers; - }; + qemuNicsFor = children: + builtins.listToAttrs (lib.lists.flatten (lib.attrsets.mapAttrsToList + (childName: + { uplinks, ... }: + lib.attrsets.mapAttrsToList (uplink: + { driver, ... }: { + name = "${childName}-${uplink}"; + value = { + netdev = { + kind = "user"; + settings = { ipv6 = "off"; }; + }; + device = { + kind = { + ipxe = "e1000"; + virtio = "virtio"; + }.${driver}; + }; + }; + }) uplinks) children)); + +in { + + config = { + hardware.genode.platform.policies = let + mkPolicy = { name, platformPolicy }: + pkgs.writeText "${name}.policy.dhall" ''${platformPolicy} "${name}"''; + + childPolicies = prefix: children: + builtins.concatLists (lib.attrsets.mapAttrsToList (child: childAttrs: + lib.attrsets.mapAttrsToList (uplink: uplinkAttrs: + mkPolicy { + name = "${prefix}${child}-${uplink}-driver"; + inherit (uplinkAttrs) platformPolicy; + }) childAttrs.uplinks) children); + + corePolicies = childPolicies "" config.genode.core.children; + initPolicies = childPolicies "nixos -> " config.genode.init.children; + in corePolicies ++ initPolicies; + + genode.core.auxiliaryChildren = nicDriversFor config.genode.core.children; + genode.init.auxiliaryChildren = nicDriversFor config.genode.init.children; + + virtualisation.qemu.nics = + qemuNicsFor (config.genode.core.children // config.genode.init.children); + + }; }