nixos: configure Nic uplinks for genode.init.children
…not just genode.core.children.
This commit is contained in:
parent
4d1d37a1ed
commit
291cde7b4a
|
@ -5,7 +5,7 @@ let
|
||||||
localPackages = pkgs.buildPackages;
|
localPackages = pkgs.buildPackages;
|
||||||
|
|
||||||
children' = config.lib.children.freeze
|
children' = config.lib.children.freeze
|
||||||
(config.genode.core.children // config.genode.core.supportChildren);
|
(config.genode.core.children // config.genode.core.auxiliaryChildren);
|
||||||
|
|
||||||
coreErisCaps = with builtins;
|
coreErisCaps = with builtins;
|
||||||
let pkgNames = [ "rtc_drv" ];
|
let pkgNames = [ "rtc_drv" ];
|
||||||
|
@ -22,17 +22,15 @@ let
|
||||||
bootConfigFile = let
|
bootConfigFile = let
|
||||||
|
|
||||||
storeBackendInputs = {
|
storeBackendInputs = {
|
||||||
fs = [ ];
|
|
||||||
memory = [ config.system.build.tarball ];
|
memory = [ config.system.build.tarball ];
|
||||||
net = [ ];
|
}.${config.genode.core.storeBackend} or [ ];
|
||||||
}.${config.genode.core.storeBackend};
|
|
||||||
|
|
||||||
coreInputs =
|
coreInputs =
|
||||||
# TODO: get rid of this?
|
# TODO: get rid of this?
|
||||||
with builtins;
|
with builtins;
|
||||||
concatMap (getAttr "extraInputs")
|
concatMap (getAttr "extraInputs")
|
||||||
((attrValues config.genode.core.children)
|
((attrValues config.genode.core.children)
|
||||||
++ (attrValues config.genode.core.supportChildren));
|
++ (attrValues config.genode.core.auxiliaryChildren));
|
||||||
|
|
||||||
mergeManifests = inputs:
|
mergeManifests = inputs:
|
||||||
with builtins;
|
with builtins;
|
||||||
|
@ -149,7 +147,7 @@ in {
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
supportChildren = config.lib.types.children { extraOptions = { }; } // {
|
auxiliaryChildren = config.lib.types.children { extraOptions = { }; } // {
|
||||||
internal = true;
|
internal = true;
|
||||||
description = ''
|
description = ''
|
||||||
Children added to support other children, such as drivers.
|
Children added to support other children, such as drivers.
|
||||||
|
|
|
@ -5,7 +5,8 @@ with lib;
|
||||||
let
|
let
|
||||||
cfg = config.genode.init;
|
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 {
|
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 {
|
romModules = mkOption {
|
||||||
type = types.attrsOf types.path;
|
type = types.attrsOf types.path;
|
||||||
default = { };
|
default = { };
|
||||||
|
|
|
@ -15,6 +15,9 @@ in {
|
||||||
};
|
};
|
||||||
|
|
||||||
config = let
|
config = let
|
||||||
|
deviceManagerEnable = config.hardware.genode.ahci.enable
|
||||||
|
|| config.hardware.genode.usb.enable;
|
||||||
|
|
||||||
ahciEris = lib.getEris "bin" pkgs.genodePackages.ahci_drv;
|
ahciEris = lib.getEris "bin" pkgs.genodePackages.ahci_drv;
|
||||||
partBlockEris = lib.getEris "bin" pkgs.genodePackages.part_block;
|
partBlockEris = lib.getEris "bin" pkgs.genodePackages.part_block;
|
||||||
|
|
||||||
|
@ -121,27 +124,25 @@ in {
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
genode.core.children.device_manager = lib.mkIf
|
genode.core.children.device_manager = lib.mkIf deviceManagerEnable {
|
||||||
(config.hardware.genode.ahci.enable
|
package = pkgs.genodePackages.device_manager;
|
||||||
|| config.hardware.genode.usb.enable) {
|
configFile = pkgs.writeText "device_manager.dhall" ''
|
||||||
package = pkgs.genodePackages.device_manager;
|
let Sigil = env:DHALL_SIGIL
|
||||||
configFile = pkgs.writeText "device_manager.dhall" ''
|
|
||||||
let Sigil = env:DHALL_SIGIL
|
|
||||||
|
|
||||||
in λ(cap : Text) →
|
in λ(cap : Text) →
|
||||||
Sigil.Init.Child.flat
|
Sigil.Init.Child.flat
|
||||||
( (${managerConfig}).device_manager
|
( (${managerConfig}).device_manager
|
||||||
⫽ { binary = cap
|
⫽ { binary = cap
|
||||||
, resources = Sigil.Init.Resources::{
|
, resources = Sigil.Init.Resources::{
|
||||||
, caps = 256
|
, caps = 256
|
||||||
, ram = Sigil.units.MiB 8
|
, ram = Sigil.units.MiB 8
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
genode.core.children.drivers = {
|
genode.core.children.drivers = lib.mkIf deviceManagerEnable {
|
||||||
package = pkgs.genodePackages.init;
|
package = pkgs.genodePackages.init;
|
||||||
extraErisInputs = [ partBlockEris ]
|
extraErisInputs = [ partBlockEris ]
|
||||||
++ lib.optional config.hardware.genode.ahci.enable ahciEris
|
++ lib.optional config.hardware.genode.ahci.enable ahciEris
|
||||||
|
|
|
@ -13,15 +13,29 @@ with lib;
|
||||||
|
|
||||||
config = {
|
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 =
|
genode.core.children.fb_drv =
|
||||||
mkIf config.hardware.genode.framebuffer.enable {
|
mkIf config.hardware.genode.framebuffer.enable {
|
||||||
configFile = let
|
package = with pkgs.genodePackages;
|
||||||
binary = with pkgs.genodePackages;
|
{
|
||||||
{
|
boot = boot_fb_drv;
|
||||||
boot = boot_fb_drv;
|
vesa = vesa_drv;
|
||||||
vesa = vesa_drv;
|
}.${config.hardware.genode.framebuffer.driver};
|
||||||
}.${config.hardware.genode.framebuffer.driver};
|
configFile = builtins.toFile "fb_drv.dhall" ''
|
||||||
in builtins.toFile "fb_drv.dhall" ''
|
|
||||||
let Sigil = env:DHALL_SIGIL
|
let Sigil = env:DHALL_SIGIL
|
||||||
|
|
||||||
let Init = Sigil.Init
|
let Init = Sigil.Init
|
||||||
|
@ -39,6 +53,9 @@ with lib;
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
virtualisation.graphics =
|
||||||
|
lib.mkDefault config.hardware.genode.framebuffer.enable;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,108 +1,132 @@
|
||||||
{ config, pkgs, lib, ... }:
|
{ 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 =
|
in λ(binary : Text) →
|
||||||
# TODO: create drivers in both the first and second level inits
|
Init.Child.flat
|
||||||
{
|
Init.Child.Attributes::{
|
||||||
hardware.genode.platform.policies = let
|
, binary
|
||||||
mkPolicy = { name, platformPolicy }:
|
, resources = Init.Resources::{ caps = 128, ram = Sigil.units.MiB 4 }
|
||||||
pkgs.writeText "${name}.policy.dhall" ''${platformPolicy} "${name}"'';
|
, routes = [ Init.ServiceRoute.parent "IO_MEM" ]
|
||||||
|
, config = Init.Config::{
|
||||||
childPolicies = builtins.concatLists (lib.attrsets.mapAttrsToList
|
, attributes = toMap { verbose = "${
|
||||||
(child: childAttrs:
|
if verbose then "yes" else "no"
|
||||||
lib.attrsets.mapAttrsToList (uplink: uplinkAttrs:
|
}" }
|
||||||
mkPolicy {
|
, policies =
|
||||||
name = "${child}-${uplink}-driver";
|
[ Init.Config.Policy::{
|
||||||
inherit (uplinkAttrs) platformPolicy;
|
, service = "Nic"
|
||||||
}) childAttrs.uplinks) config.genode.core.children);
|
, label = Init.LabelSelector.prefix "${policyPrefix}"
|
||||||
|
|
||||||
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}"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
'';
|
]
|
||||||
};
|
}
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
mkUplinkDump = { name, childName, policyPrefix }: {
|
mkUplinkDump = { name, childName, policyPrefix }: {
|
||||||
package = pkgs.genodePackages.nic_dump;
|
package = pkgs.genodePackages.nic_dump;
|
||||||
configFile = pkgs.writeText "${name}.dhall" ''
|
configFile = pkgs.writeText "${name}.dhall" ''
|
||||||
let Sigil = env:DHALL_SIGIL
|
let Sigil = env:DHALL_SIGIL
|
||||||
|
|
||||||
let Init = Sigil.Init
|
let Init = Sigil.Init
|
||||||
|
|
||||||
in λ(binary : Text) →
|
in λ(binary : Text) →
|
||||||
Init.Child.flat
|
Init.Child.flat
|
||||||
Init.Child.Attributes::{
|
Init.Child.Attributes::{
|
||||||
, binary
|
, binary
|
||||||
, resources = Init.Resources::{ caps = 128, ram = Sigil.units.MiB 6 }
|
, resources = Init.Resources::{ caps = 128, ram = Sigil.units.MiB 6 }
|
||||||
, config = Init.Config::{
|
, config = Init.Config::{
|
||||||
, attributes = toMap { downlink = "${childName}", uplink = "driver" }
|
, attributes = toMap { downlink = "${childName}", uplink = "driver" }
|
||||||
, policies =
|
, policies =
|
||||||
[ Init.Config.Policy::{
|
[ Init.Config.Policy::{
|
||||||
, service = "Nic"
|
, service = "Nic"
|
||||||
, label = Init.LabelSelector.prefix "${policyPrefix}"
|
, label = Init.LabelSelector.prefix "${policyPrefix}"
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
'';
|
]
|
||||||
};
|
}
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
otherDrivers = lib.lists.flatten (lib.attrsets.mapAttrsToList
|
nicDriversFor = children:
|
||||||
(childName:
|
builtins.listToAttrs (lib.lists.flatten (lib.attrsets.mapAttrsToList
|
||||||
{ uplinks, ... }:
|
(childName:
|
||||||
lib.attrsets.mapAttrsToList (uplink:
|
{ uplinks, ... }:
|
||||||
let
|
lib.attrsets.mapAttrsToList (uplink:
|
||||||
childLabel = "${childName} -> ${uplink}";
|
let
|
||||||
driverName = "${childName}-${uplink}-driver";
|
childLabel = "${childName} -> ${uplink}";
|
||||||
dumpName = "${childName}-${uplink}-dump";
|
driverName = "${childName}-${uplink}-driver";
|
||||||
in { driver, dump, verbose, ... }:
|
dumpName = "${childName}-${uplink}-dump";
|
||||||
[(rec {
|
in { driver, dump, verbose, ... }:
|
||||||
name = driverName;
|
[(rec {
|
||||||
value = mkUplinkDriver {
|
name = driverName;
|
||||||
inherit name driver verbose;
|
value = mkUplinkDriver {
|
||||||
policyPrefix = if dump then dumpName else childLabel;
|
inherit name driver verbose;
|
||||||
};
|
policyPrefix = if dump then dumpName else childLabel;
|
||||||
})] ++ lib.lists.optional dump (rec {
|
};
|
||||||
name = dumpName;
|
})] ++ lib.lists.optional dump (rec {
|
||||||
value = mkUplinkDump {
|
name = dumpName;
|
||||||
inherit name childName;
|
value = mkUplinkDump {
|
||||||
policyPrefix = childLabel;
|
inherit name childName;
|
||||||
};
|
policyPrefix = childLabel;
|
||||||
})) uplinks) config.genode.core.children);
|
};
|
||||||
|
})) 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);
|
||||||
|
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue