From 165cf60551fb398ba74169955d511be8431851e7 Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Tue, 2 Mar 2021 22:55:59 +0100 Subject: [PATCH] nixos-modules: consolidate common init functions The "config.genode.init.children" option is a superset of the "config.genode.core.children" option, so refactor both into helper functions. --- nixos-modules/genode-core.nix | 74 ++++------------------ nixos-modules/genode-init.nix | 110 +++++++-------------------------- nixos-modules/lib/children.nix | 93 ++++++++++++++++++++++++++++ 3 files changed, 126 insertions(+), 151 deletions(-) create mode 100644 nixos-modules/lib/children.nix diff --git a/nixos-modules/genode-core.nix b/nixos-modules/genode-core.nix index 95855a6..869e2ca 100644 --- a/nixos-modules/genode-core.nix +++ b/nixos-modules/genode-core.nix @@ -3,52 +3,8 @@ with lib; let localPackages = pkgs.buildPackages; - binary = mkOption { - description = "Program binary for this child. Must be an ERIS URN"; - default = null; - type = types.nullOr - (types.str // { check = lib.strings.hasPrefix "urn:erisx2:"; }); - example = - "urn:erisx2:AEAU4KT7AGJLA5BHPWFZ7HX2OVVNVFGDM2SIS726OPZBGXDED64QIDPHN2M5P5HIMOG3YDSWBGDPNUMZKCG4CRVU4DI5BOS5IJRFCSLQQY"; - }; - package = mkOption { - description = "Package to source the binary for this child."; - type = lib.types.package; - example = literalExample "pkg.genodePackages.init"; - }; - coreROMs = mkOption { - type = with types; listOf str; - default = [ ]; - description = '' - List of label suffixes that when matched against - ROM requests shall be forwared to the core. - ''; - example = [ "platform_info" ]; - }; - extraInputs = mkOption { - description = "List of packages to build a ROM store with."; - default = [ ]; - type = types.listOf types.package; - }; - children' = with builtins; - lib.attrsets.mapAttrs (childName: child: - if child.binary != null then { - inherit (child) binary configFile; - roms = { }; - } else - let bin = lib.getEris "bin" child.package; - in { - config = ''${child.configFile} "${bin.cap}"''; - binary = bin.cap; - roms = [{ - name = bin.cap; - value = bin.path; - }] ++ lib.mapAttrsToList (path: cap: { - name = cap; - value = path; - }) bin.closure; - }) config.genode.core.children; + children' = config.lib.children.freeze config.genode.init.children; coreErisCaps = with builtins; let pkgNames = [ "cached_fs_rom" "jitter_sponge" "rtc_drv" ]; @@ -177,6 +133,9 @@ let }) config.genode.init.romModules; in { + + imports = [ ./lib/children.nix ]; + options.genode = { core = { @@ -193,23 +152,14 @@ in { description = "Hardware supported by this core."; }; - children = mkOption { - type = with types; - attrsOf (submodule { - options = { - inherit binary coreROMs extraInputs package; - configFile = mkOption { - type = types.path; - description = '' - Set of children at the lowest init level, these children must not - have any dependency on a Nix store. - Configuration format is a Dhall configuration of type - Genode.Init.Child.Type. - See https://git.sr.ht/~ehmry/dhall-genode/tree/master/Init/Child/Type - ''; - }; - }; - }); + children = config.lib.types.children { extraOptions = { }; } // { + description = '' + Set of children at the lowest init level, these children must not + have any dependency on a Nix store. + Configuration format is a Dhall configuration of type + Genode.Init.Child.Type. + See https://git.sr.ht/~ehmry/dhall-genode/tree/master/Init/Child/Type + ''; }; }; diff --git a/nixos-modules/genode-init.nix b/nixos-modules/genode-init.nix index 6a160de..a02c2d2 100644 --- a/nixos-modules/genode-init.nix +++ b/nixos-modules/genode-init.nix @@ -5,62 +5,7 @@ with lib; let cfg = config.genode.init; - binary = mkOption { - description = "Program binary for this child. Must be an ERIS URN."; - default = null; - type = types.nullOr - (types.str // { check = lib.strings.hasPrefix "urn:erisx2:"; }); - example = - "urn:erisx2:AEAU4KT7AGJLA5BHPWFZ7HX2OVVNVFGDM2SIS726OPZBGXDED64QIDPHN2M5P5HIMOG3YDSWBGDPNUMZKCG4CRVU4DI5BOS5IJRFCSLQQY"; - }; - package = mkOption { - description = "Package to source the binary for this child."; - type = lib.types.package; - example = literalExample "pkg.genodePackages.init"; - }; - coreROMs = mkOption { - type = with types; listOf str; - default = [ ]; - description = '' - List of label suffixes that when matched against - ROM requests shall be forwared to the core. - ''; - example = [ "platform_info" ]; - }; - extraInputs = - # TODO: deprecated? - mkOption { - description = "List of packages to build a ROM store with."; - default = [ ]; - type = types.listOf types.package; - }; - - extraErisInputs = mkOption { - description = "List of ERIS inputs to add to the init closure."; - default = [ ]; - type = types.listOf types.attrs; - }; - - children' = with builtins; - lib.attrsets.mapAttrs (childName: child: - let - toRoms = { cap, closure, path }: - [{ - name = cap; - value = path; - }] ++ (lib.mapAttrsToList (value: name: { inherit name value; }) - closure); - extraRoms = lib.lists.flatten (map toRoms child.extraErisInputs); - in if child.binary != null then { - inherit (child) binary configFile; - roms = { }; # extraRoms; - } else - let bin = lib.getEris "bin" child.package; - in { - config = ''${child.configFile} "${bin.cap}"''; - binary = bin.cap; - roms = toRoms bin ++ extraRoms; - }) config.genode.init.children; + children' = config.lib.children.freeze config.genode.init.children; in { @@ -96,41 +41,28 @@ in { ''; }; - children = mkOption { - default = { }; - type = with types; - attrsOf (submodule { - options = { - inherit binary coreROMs extraErisInputs extraInputs package; + children = config.lib.types.children { + extraOptions = { - routeToNics = lib.mkOption { - type = with types; listOf str; - default = [ ]; - example = [ "eth0" ]; - description = '' - Grant access to these Nic interfaces. - ''; - }; + routeToNics = lib.mkOption { + type = with types; listOf str; + default = [ ]; + example = [ "eth0" ]; + description = '' + Grant access to these Nic interfaces. + ''; + }; - fsPersistence = lib.mkOption { - type = types.bool; - default = false; - description = '' - Whether this child will have access to mutable and persistent storage. - This space is shared among all components for which this option is available - and UNIX permission bits are not honored. - ''; - }; - - configFile = mkOption { - type = types.path; - description = '' - Dhall configuration of child. - See https://git.sr.ht/~ehmry/dhall-genode/tree/master/Init/Child/Type - ''; - }; - }; - }); + fsPersistence = lib.mkOption { + type = types.bool; + default = false; + description = '' + Whether this child will have access to mutable and persistent storage. + This space is shared among all components for which this option is available + and UNIX permission bits are not honored. + ''; + }; + }; }; romModules = mkOption { diff --git a/nixos-modules/lib/children.nix b/nixos-modules/lib/children.nix new file mode 100644 index 0000000..dc9832d --- /dev/null +++ b/nixos-modules/lib/children.nix @@ -0,0 +1,93 @@ +{ lib, ... }: + +{ + lib = { + + # Type of a declaration of init children. + types.children = { extraOptions }: + with lib; + mkOption { + default = { }; + type = with types; + attrsOf (submodule { + options = { + + binary = mkOption { + description = + "Program binary for this child. Must be an ERIS URN."; + default = null; + type = types.nullOr (types.str // { + check = lib.strings.hasPrefix "urn:erisx2:"; + }); + example = + "urn:erisx2:AEAU4KT7AGJLA5BHPWFZ7HX2OVVNVFGDM2SIS726OPZBGXDED64QIDPHN2M5P5HIMOG3YDSWBGDPNUMZKCG4CRVU4DI5BOS5IJRFCSLQQY"; + }; + + coreROMs = mkOption { + type = with types; listOf str; + default = [ ]; + description = '' + List of label suffixes that when matched against + ROM requests shall be forwared to the core. + ''; + example = [ "platform_info" ]; + }; + + configFile = mkOption { + type = types.path; + description = '' + Dhall configuration of child. + See https://git.sr.ht/~ehmry/dhall-genode/tree/master/Init/Child/Type + ''; + }; + + extraErisInputs = mkOption { + description = "List of ERIS inputs to add to the init closure."; + default = [ ]; + type = types.listOf types.attrs; + }; + + extraInputs = + # TODO: deprecated? + mkOption { + description = "List of packages to build a ROM store with."; + default = [ ]; + type = types.listOf types.package; + }; + + package = mkOption { + description = "Package to source the binary for this child."; + type = lib.types.package; + example = literalExample "pkg.genodePackages.init"; + }; + + } // extraOptions; + }); + }; + + /* Map a set of children to the config and + ROM closure of each child. + */ + children.freeze = children: + with builtins; + lib.attrsets.mapAttrs (_: + { binary, configFile, extraErisInputs, package, ... }: + let + toRoms = { cap, closure, path }: + [{ + name = cap; + value = path; + }] ++ (lib.mapAttrsToList (value: name: { inherit name value; }) + closure); + extraRoms = map toRoms extraErisInputs; + in if binary != null then { + config = ''${configFile} "${binary}"''; + roms = extraRoms; + } else + let bin = lib.getEris "bin" package; + in { + config = ''${configFile} "${bin.cap}"''; + roms = toRoms bin ++ extraRoms; + }) children; + }; +}