diff --git a/nixos-modules/genode-core.nix b/nixos-modules/genode-core.nix index 743478f..db8102b 100644 --- a/nixos-modules/genode-core.nix +++ b/nixos-modules/genode-core.nix @@ -90,11 +90,15 @@ in { in (foldl' f "[" inputs) + "]"; }; - romDirectories = mapAttrs (name: value: - pkgs.symlinkJoin { - name = "${name}-rom"; - paths = value.inputs; - }) config.genode.init.children; + romDirectories = filterAttrs (_: value: value != null) (mapAttrs + (name: value: + if value.inputs == [ ] then + null + else + pkgs.symlinkJoin { + name = "${name}-rom"; + paths = value.inputs; + }) config.genode.init.children); in { @@ -115,18 +119,33 @@ in { report_rom vfs ]))); - storeRomPolicies = let - policies = mapAttrsToList - (name: value: '', { mapKey = "${name}", mapValue = "${value}" }'') - romDirectories; - in "[${toString policies}]"; + + storeRomPolicies = mapAttrsToList + (name: value: '', { mapKey = "${name}", mapValue = "${value}" }'') + romDirectories; + + extraRoutes = lib.concatStringsSep ", " (lib.lists.flatten + (lib.mapAttrsToList (name: value: + map (suffix: '' + { service = + { name = "ROM" + , label = + Genode.Init.LabelSelector.Type.Partial + { prefix = Some "nixos -> ${name}", suffix = Some "${suffix}" } + } + , route = Genode.Init.Route.parent (Some "${suffix}") + } + '') value.coreROMs) config.genode.init.children)); + in localPackages.runCommand "boot.dhall" { } '' cat > $out << EOF + let Genode = env:DHALL_GENODE in ${./store-wrapper.dhall} (${config.genode.init.configFile}) "${config.system.build.tarball.fileName}.tar" $(stat --format '%s' ${tarball}) - ${storeRomPolicies} + ([${toString storeRomPolicies} ] : Genode.Prelude.Map.Type Text Text) + ([${extraRoutes} ] : List Genode.Init.ServiceRoute.Type) ${manifest} EOF ''; diff --git a/nixos-modules/genode-init.nix b/nixos-modules/genode-init.nix index da5ea8c..eec0960 100644 --- a/nixos-modules/genode-init.nix +++ b/nixos-modules/genode-init.nix @@ -4,6 +4,15 @@ with lib; let cfg = config.genode.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" ]; + }; inputs = mkOption { description = "List of packages to build a ROM store with."; default = [ ]; @@ -47,7 +56,7 @@ in { type = with types; attrsOf (submodule { options = { - inherit inputs; + inherit coreROMs inputs; configFile = mkOption { type = types.path; description = '' @@ -67,7 +76,7 @@ in { type = with types; attrsOf (submodule { options = { - inherit inputs; + inherit coreROMs inputs; configFile = mkOption { type = types.path; description = '' diff --git a/nixos-modules/store-wrapper.dhall b/nixos-modules/store-wrapper.dhall index 6af1e2e..5aaa9eb 100644 --- a/nixos-modules/store-wrapper.dhall +++ b/nixos-modules/store-wrapper.dhall @@ -16,9 +16,11 @@ in λ(subinit : Init.Type) → λ(storeName : Text) → λ(storeSize : Natural) → λ(storeRomPolicies : Prelude.Map.Type Text Text) → + λ(routes : List Init.ServiceRoute.Type) → λ(bootManifest : Manifest/Type) → Genode.Boot::{ , config = Init::{ + , routes , children = let child = Prelude.Map.keyValue Child.Type @@ -164,13 +166,7 @@ in λ(subinit : Init.Type) → ) in parentROMs - [ "ld.lib.so" - , "vfs.lib.so" - , "init" - , "platform_info" - , "core_log" - , "kernel_log" - ] + [ "ld.lib.so", "vfs.lib.so", "init" ] # [ Init.ServiceRoute.parent "IO_MEM" , Init.ServiceRoute.parent "IO_PORT" , Init.ServiceRoute.parent "IRQ" diff --git a/tests/x86.nix b/tests/x86.nix index 1ac0fbc..a4b282f 100644 --- a/tests/x86.nix +++ b/tests/x86.nix @@ -4,6 +4,7 @@ machine = { pkgs, ... }: { genode.init.subinits.test = { configFile = ./x86.dhall; + coreROMs = [ "platform_info" ]; inputs = with pkgs.genodePackages; [ acpi_drv platform_drv