let Genode = env:DHALL_GENODE let Prelude = Genode.Prelude let XML = Prelude.XML let Init = Genode.Init let Child = Init.Child let parentRoutes = Prelude.List.map Text Init.ServiceRoute.Type Init.ServiceRoute.parent in λ(params : { coreutils : Text, execStart : Text }) → Init::{ , verbose = True , routes = parentRoutes [ "Timer", "Rtc", "File_system" ] , children = toMap { vfs = Child.flat Child.Attributes::{ , binary = "vfs" , exitPropagate = True , provides = [ "File_system" ] , resources = Genode.Init.Resources::{ , caps = 256 , ram = Genode.units.MiB 8 } , config = Init.Config::{ , content = [ XML.element { name = "vfs" , attributes = XML.emptyAttributes , content = let dir = λ(name : Text) → λ(content : List XML.Type) → XML.element { name = "dir" , content , attributes = toMap { name } } let leaf = λ(name : Text) → XML.leaf { name, attributes = XML.emptyAttributes } in [ dir "dev" [ dir "pipes" [ leaf "pipe" ] , dir "sockets" [ XML.leaf { name = "fs" , attributes = toMap { label = "sockets" } } ] , leaf "log" , leaf "null" , leaf "rtc" , leaf "zero" ] , dir "etc" [ XML.element { name = "inline" , attributes = toMap { name = "ExecStart" } , content = [ XML.text params.execStart ] } ] , dir "usr" [ dir "bin" [ XML.leaf { name = "symlink" , attributes = toMap { name = "env" , target = "${params.coreutils}/bin/env" } } ] ] , dir "tmp" [ leaf "ram" ] , dir "nix" [ dir "store" [ XML.leaf { name = "fs" , attributes = toMap { label = "nix-store" } } ] ] ] } ] , policies = [ Init.Config.Policy::{ , service = "File_system" , label = Init.LabelSelector.prefix "shell" , attributes = toMap { root = "/", writeable = "yes" } } ] } } , shell = Child.flat Child.Attributes::{ , binary = "bash" , exitPropagate = True , resources = Genode.Init.Resources::{ , caps = 256 , ram = Genode.units.MiB 8 } , config = Genode.Init.Config::{ , content = [ XML.leaf { name = "libc" , attributes = toMap { stdin = "/dev/null" , stdout = "/dev/log" , stderr = "/dev/log" , pipe = "/dev/pipes" , rtc = "/dev/rtc" , socket = "/dev/sockets" } } , XML.element { name = "vfs" , attributes = XML.emptyAttributes , content = [ XML.leaf { name = "fs" , attributes = XML.emptyAttributes } ] } ] # Prelude.List.map Text XML.Type ( λ(x : Text) → XML.leaf { name = "arg" , attributes = toMap { value = x } } ) [ "bash", "/etc/ExecStart" ] } } } }