let Genode = env:DHALL_GENODE let Prelude = Genode.Prelude let XML = Prelude.XML let Init = Genode.Init let Child = Init.Child let Resources = Init.Resources let ServiceRoute = Init.ServiceRoute let Policy = Init.Config.Policy let DefaultPolicy = Init.Config.DefaultPolicy let LabelSelector = Init.LabelSelector let label = λ(label : Text) → { local = label, route = label } : Child.Attributes.Label let rootInit = λ ( params : { fbDriver : Init.Child.Type , guests : Init.Children.Type , inputFilterChargens : List XML.Type , partitionType : Text , wm : Init.Type , graphical-log : Init.Type , fs-log : Init.Type , systemLabel : Text } ) → Init::{ , children = toMap { timer = Child.flat Child.Attributes::{ , binary = "timer_drv" , provides = [ "Timer" ] } , rtc = Child.flat Child.Attributes::{ , binary = "rtc_drv" , provides = [ "Rtc" ] , routes = [ ServiceRoute.parent "IO_PORT" , ServiceRoute.parent "IO_MEM" ] } , acpi_drv = Child.flat Child.Attributes::{ , binary = "acpi_drv" , priority = 1 , resources = Resources::{ , caps = 350 , ram = Genode.units.MiB 4 } , romReports = [ label "acpi", label "smbios_table" ] , routes = [ ServiceRoute.parent "IO_MEM" ] } , platform_drv = Child.flat Child.Attributes::{ , binary = "platform_drv" , resources = Resources::{ , caps = 400 , ram = Genode.units.MiB 4 , constrainPhys = True } , reportRoms = [ label "acpi" ] , romReports = [ label "pci" ] , provides = [ "Acpi", "Platform" ] , routes = [ ServiceRoute.parent "IRQ" , ServiceRoute.parent "IO_MEM" , ServiceRoute.parent "IO_PORT" , ServiceRoute.parentLabel "ROM" (Some "system") (Some "system") ] , config = Init.Config::{ , attributes = toMap { system = "yes" } , content = let PciPolicy/Type = { labelSuffix : Text, pciClass : Text } in [ XML.text '' '' ] # Prelude.List.map PciPolicy/Type XML.Type ( λ(policy : PciPolicy/Type) → XML.element { name = "policy" , attributes = toMap { label_suffix = policy.labelSuffix } , content = [ XML.leaf { name = "pci" , attributes = toMap { class = policy.pciClass } } ] } ) [ { labelSuffix = "ahci_drv" , pciClass = "AHCI" } , { labelSuffix = "nic_drv" , pciClass = "ETHERNET" } , { labelSuffix = "usb_drv", pciClass = "USB" } , { labelSuffix = "vesa_fb_drv" , pciClass = "VGA" } ] } } , framebuffer = params.fbDriver , event_filter = Child.flat Child.Attributes::{ , binary = "event_filter" , config = let key = λ(name : Text) → XML.leaf { name = "key", attributes = toMap { name } } let remap = λ(name : Text) → λ(to : Text) → XML.leaf { name = "key" , attributes = toMap { name, to } } in Init.Config::{ , content = [ XML.leaf { name = "input" , attributes = toMap { label = "ps2" } } , XML.leaf { name = "input" , attributes = toMap { label = "usb" } } , XML.element { name = "output" , attributes = XML.emptyAttributes , content = [ XML.element { name = "chargen" , attributes = XML.emptyAttributes , content = [ XML.element { name = "remap" , attributes = XML.emptyAttributes , content = [ remap "KEY_LEFTMETA" "KEY_SCREEN" , XML.element { name = "merge" , attributes = XML.emptyAttributes , content = [ XML.leaf { name = "input" , attributes = toMap { name = "ps2" } } , XML.leaf { name = "input" , attributes = toMap { name = "usb" } } ] } ] } , XML.element { name = "mod1" , attributes = XML.emptyAttributes , content = [ key "KEY_LEFTSHIFT" , key "KEY_RIGHTSHIFT" ] } , XML.element { name = "mod2" , attributes = XML.emptyAttributes , content = [ key "KEY_LEFTCTRL" , key "KEY_RIGHTCTRL" ] } , XML.element { name = "mod3" , attributes = XML.emptyAttributes , content = [ key "KEY_RIGHTALT" ] } ] # params.inputFilterChargens } ] } ] } , provides = [ "Input" ] , routes = [ ServiceRoute.parentLabel "ROM" (Some "config") (Some "config -> event_filter.config") , ServiceRoute.childLabel "Input" "ps2_drv" (Some "ps2") (None Text) , ServiceRoute.childLabel "Input" "usb_drv" (Some "usb") (None Text) , ServiceRoute.child "Capture" "nitpicker" ] } , ps2_drv = Child.flat Child.Attributes::{ , binary = "ps2_drv" , provides = [ "Input" ] , routes = [ ServiceRoute.childLabel "Platform" "platform_drv" (None Text) (Some "ps2_drv") ] } , usb_drv = Child.flat Child.Attributes::{ , binary = "usb_drv" , config = Init.Config::{ , attributes = toMap { uhci = "yes" , ohci = "yes" , ehci = "yes" , xhci = "yes" , bios_handoff = "yes" } , content = [ XML.leaf { name = "hid", attributes = XML.emptyAttributes } ] } , provides = [ "Input" ] , resources = Init.Resources::{ , caps = 128 , ram = Genode.units.MiB 12 } , routes = [ ServiceRoute.childLabel "Platform" "platform_drv" (None Text) (Some "usb_drv") ] } , wm = Init.toChild params.wm Init.Attributes::{ , provides = [ "Capture", "Event", "Gui", "Report", "ROM" ] , romReports = [ label "clipboard", label "shape" ] , routes = [ ServiceRoute.child "Framebuffer" "framebuffer" , ServiceRoute.child "Input" "event_filter" ] } , fonts_fs = Child.flat Child.Attributes::{ , binary = "vfs" , config = Init.Config::{ , content = [ XML.element { name = "vfs" , attributes = XML.emptyAttributes , content = [ XML.leaf { name = "rom" , attributes = toMap { name = "Inconsolata.ttf" } } , XML.element { name = "dir" , attributes = toMap { name = "fonts" } , content = [ XML.element { name = "dir" , attributes = toMap { name = "title" } , content = [ XML.leaf { name = "ttf" , attributes = toMap { name = "regular" , path = "/Inconsolata.ttf" , size_px = "12" } } ] } , XML.element { name = "dir" , attributes = toMap { name = "text" } , content = [ XML.leaf { name = "ttf" , attributes = toMap { name = "regular" , path = "/Inconsolata.ttf" , size_px = "12" } } ] } , XML.element { name = "dir" , attributes = toMap { name = "annotation" } , content = [ XML.leaf { name = "ttf" , attributes = toMap { name = "regular" , path = "/Inconsolata.ttf" , size_px = "12" } } ] } , XML.element { name = "dir" , attributes = toMap { name = "monospace" } , content = [ XML.leaf { name = "ttf" , attributes = toMap { name = "regular" , path = "/Inconsolata.ttf" , size_px = "12" } } ] } ] } ] } ] , defaultPolicy = Some DefaultPolicy::{ , attributes = toMap { root = "/fonts" } } } , provides = [ "File_system" ] , resources = Init.Resources::{ , caps = 256 , ram = Genode.units.MiB 12 } , routes = [ ServiceRoute.child "Block" "block_router" ] } , graphical-log = Init.toChild params.graphical-log Init.Attributes::{ , routes = [ ServiceRoute.child "Gui" "wm" , ServiceRoute.child "File_system" "fonts_fs" ] } , fs-log = Init.toChild params.fs-log Init.Attributes::{ , routes = [ ServiceRoute.childLabel "File_system" "chroot" (None Text) (Some "dump") ] } , rom_to_file = Child.flat Child.Attributes::{ , binary = "rom_to_file" , config = Init.Config::{ , attributes = toMap { rom = "init.config" } } , routes = [ ServiceRoute.childLabel "File_system" "chroot" (None Text) (Some "dump") , ServiceRoute.parentLabel "ROM" (Some "init.config") (Some "config") ] } , block = Child.flat Child.Attributes::{ , binary = "ahci_drv" , config = Init.Config::{ , defaultPolicy = Some DefaultPolicy::{ , attributes = toMap { device = "0", writeable = "yes" } } } , provides = [ "Block" ] , resources = Init.Resources::{ , caps = 256 , ram = Genode.units.MiB 10 } , routes = [ ServiceRoute.childLabel "Platform" "platform_drv" (None Text) (Some "ahci_drv") ] } , block_partitions = Child.flat Child.Attributes::{ , binary = "part_block" , config = Init.Config::{ , content = Prelude.List.map Natural XML.Type ( λ(i : Natural) → XML.leaf { name = "policy" , attributes = let partition = Prelude.Natural.show (i + 1) in toMap { label_suffix = " ${partition}" , partition , writeable = "yes" } } ) (Prelude.Natural.enumerate 128) # [ XML.leaf { name = "report" , attributes = toMap { partitions = "yes" } } ] } , resources = Resources::{ , caps = 256 , ram = Genode.units.MiB 8 } , provides = [ "Block" ] , routes = [ ServiceRoute.child "Block" "block" , ServiceRoute.child "Report" "block_router" ] } , block_router = Child.flat Child.Attributes::{ , binary = "block_router" , config = Init.Config::{ , attributes = toMap { verbose = "yes" } , content = [ XML.element { name = "default-policy" , attributes = XML.emptyAttributes , content = [ XML.leaf { name = "partition" , attributes = toMap { type = params.partitionType , writeable = "yes" } } ] } ] } , resources = Resources::{ , caps = 256 , ram = Genode.units.MiB 8 } , provides = [ "Block", "Report" ] , routes = [ ServiceRoute.child "Block" "block_partitions" ] } , file_system = Child.flat Child.Attributes::{ , binary = "vfs" , config = Init.Config::{ , content = [ XML.element { name = "vfs" , attributes = XML.emptyAttributes , content = [ XML.element { name = "dir" , attributes = toMap { name = "ext2" } , content = [ XML.leaf { name = "rump" , attributes = toMap { fs = "ext2fs" , writeable = "yes" , ram = "8M" } } ] } ] } ] , policies = [ Policy::{ , label = LabelSelector.suffix "nix/store" , attributes = toMap { root = "/ext2/nix/store", writeable = "no" } } , Policy::{ , label = LabelSelector.prefix "chroot" , attributes = toMap { root = "/ext2", writeable = "yes", path = "/" } } , Policy::{ , label = LabelSelector.prefix "init -> console" , attributes = toMap { root = "/", writeable = "yes" } } ] } , provides = [ "File_system" ] , resources = Init.Resources::{ , caps = 256 , ram = Genode.units.MiB 12 } , routes = [ ServiceRoute.child "Block" "block_router" ] } , chroot = Child.flat Child.Attributes::{ , binary = "chroot" , config = Init.Config::{ , policies = [ Policy::{ , label = LabelSelector.label "dump" , attributes = toMap { path = params.systemLabel, writeable = "yes" } } ] , defaultPolicy = Some DefaultPolicy::{ , attributes = toMap { writeable = "yes" } } } , provides = [ "File_system" ] , routes = [ ServiceRoute.child "File_system" "file_system" ] } , nic_drv = Child.flat Child.Attributes::{ , binary = "ipxe_nic_drv" , provides = [ "Nic" ] , resources = Init.Resources::{ , caps = 128 , ram = Genode.units.MiB 4 } , routes = [ ServiceRoute.childLabel "Platform" "platform_drv" (None Text) (Some "nic_drv") ] } , nic_router = Child.flat Child.Attributes::{ , binary = "nic_router" , config = Init.Config::{ , content = [ XML.leaf { name = "uplink" , attributes = toMap { domain = "uplink" } } , XML.element { name = "domain" , attributes = toMap { name = "uplink" } , content = [ XML.leaf { name = "nat" , attributes = toMap { domain = "default" , tcp-ports = "1024" , udp-ports = "1024" , icmp-ids = "1024" } } ] } , XML.element { name = "domain" , attributes = toMap { name = "default", interface = "10.0.1.1/24" } , content = [ XML.leaf { name = "dhcp-server" , attributes = toMap { ip_first = "10.0.1.2" , ip_last = "10.0.1.200" , dns_server_from = "uplink" } } ] # Prelude.List.map Text XML.Type ( λ(proto : Text) → XML.element { name = proto , attributes = toMap { dst = "0.0.0.0/0" , domain = "uplink" } , content = [ XML.leaf { name = "permit-any" , attributes = toMap { domain = "uplink" } } ] } ) [ "tcp", "udp", "icmp" ] } ] , defaultPolicy = Some DefaultPolicy::{ , attributes = toMap { domain = "default" } } } , provides = [ "Nic" ] , resources = Init.Resources::{ ram = Genode.units.MiB 8 } , routes = [ ServiceRoute.child "Nic" "nic_drv" ] } , init = Init.toChild Init::{ children = params.guests } Init.Attributes::{ , routes = [ ServiceRoute.parent "VM" , ServiceRoute.child "Gui" "wm" , { service = { name = "File_system" , label = LabelSelector.last "fonts" } , route = Init.Route.Type.Child { name = "fonts_fs" , label = None Text , diag = None Bool } } , { service = { name = "File_system" , label = LabelSelector.suffix "nix/store" } , route = Init.Route.Type.Child { name = "file_system" , label = Some "nix/store" , diag = None Bool } } , { service = { name = "File_system" , label = LabelSelector.prefix "console" } , route = Init.Route.Type.Child { name = "file_system" , label = None Text , diag = None Bool } } , ServiceRoute.child "File_system" "chroot" , ServiceRoute.child "Nic" "nic_router" , ServiceRoute.child "Rtc" "rtc" , ServiceRoute.parentLabel "ROM" (Some "platform_info") (Some "platform_info") , ServiceRoute.child "Report" "_report_rom" ] } } , routes = [ ServiceRoute.child "Timer" "timer" ] } in rootInit