-- SPDX-License-Identifier: CC0-1.0 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 Vfs/inline = λ(name : Text) → λ(body : Text) → XML.element { name = "inline" , attributes = toMap { name = name } , content = [ XML.text body ] } let toVbox = λ ( params : { vdiFilename : Text , vdiPkg : Text , vdiUuid : Text , memorySize : Natural , vmName : Text } ) → let vboxConfig = '' '' in Child.flat Child.Attributes::{ , binary = "virtualbox5" , config = Init.Config::{ , attributes = toMap { vbox_file = "machine.vbox", vm_name = params.vmName } , content = [ XML.leaf { name = "libc" , attributes = toMap { stdout = "/dev/log" , stderr = "/dev/log" , rtc = "/dev/rtc" } } , XML.element { name = "vfs" , attributes = XML.emptyAttributes , content = let tag = λ(name : Text) → XML.leaf { name = name , attributes = XML.emptyAttributes } in [ Vfs/inline "machine.vbox" vboxConfig , XML.element { name = "dir" , attributes = toMap { name = "dev" } , content = [ tag "log", tag "rtc" ] } , XML.leaf { name = "fs" , attributes = toMap { writeable = "yes" } } , XML.element { name = "import" , attributes = toMap { overwrite = "no" } , content = [ XML.leaf { name = "fs" , attributes = toMap { label = "nix/store" , root = "${params.vdiPkg}" } } ] } ] } ] } , resources = Resources::{ , caps = 1024 , ram = Genode.units.MiB 128 + Genode.units.MiB params.memorySize } , routes = [ ServiceRoute.parent "File_system" , ServiceRoute.parent "Nic" , ServiceRoute.parent "Nitpicker" , ServiceRoute.parent "Rtc" , ServiceRoute.parent "Timer" , ServiceRoute.parent "VM" , ServiceRoute.parent "Report" , ServiceRoute.parentLabel "ROM" (Some "platform_info") (Some "platform_info") ] } in toVbox