diff --git a/apps/default.nix b/apps/default.nix index 7c029f8..1fd70ee 100644 --- a/apps/default.nix +++ b/apps/default.nix @@ -31,7 +31,7 @@ rec { program = "${drv}/bin/nova-image"; function = attrs: bootDesc: nixpkgs.runCommand "nova-iso" (attrs // { inherit bootDesc; }) - "${drv}/bin/nova-image $bootDesc > $out"; + "XDG_CACHE_HOME=$TMPDIR ${drv}/bin/nova-image $bootDesc > $out"; }; nova-iso = let @@ -44,7 +44,7 @@ rec { program = "${drv}/bin/nova-iso"; function = attrs: bootDesc: nixpkgs.runCommand "nova.iso" attrs - ''${drv}/bin/nova-iso "${bootDesc}" > $out''; + ''XDG_CACHE_HOME=$TMPDIR ${drv}/bin/nova-iso "${bootDesc}" > $out''; }; render-init = diff --git a/apps/nova-image/default.nix b/apps/nova-image/default.nix index 20cb78a..e4f5b5a 100644 --- a/apps/nova-image/default.nix +++ b/apps/nova-image/default.nix @@ -26,9 +26,9 @@ in nixpkgs.writeScriptBin "nova-image" (with nixpkgs.buildPackages; export DHALL_PRELUDE=${packages.dhallPrelude}/package.dhall export DHALL_GENODE=${packages.dhallGenode}/package.dhall - ${dhallApps.dhall.program} text <<< "${ - ./nova-modules.as.dhall - } ($@)" > "$TMPDIR/modules.as" + ${dhallApps.dhall.program} text <<< \ + "(${./nova-modules.as.dhall}).to32bitImage ($@)" \ + > "$TMPDIR/modules.as" # compile the boot modules into one object file $CC -c -x assembler -o "$TMPDIR/boot_modules.o" "$TMPDIR/modules.as" diff --git a/apps/nova-image/nova-modules.as.dhall b/apps/nova-image/nova-modules.as.dhall index 70e3c5d..6a6891b 100644 --- a/apps/nova-image/nova-modules.as.dhall +++ b/apps/nova-image/nova-modules.as.dhall @@ -4,123 +4,119 @@ let Genode = env:DHALL_GENODE let Prelude = Genode.Prelude -let RomMap = Prelude.Map.Type Text Genode.Boot.Rom - let RomEntry = Prelude.Map.Entry Text Genode.Boot.Rom -let Configuration = - { arch : < x86_32 | x86_64 >, config : Genode.Init.Type, rom : RomMap } - : Type +let compile = + λ ( addressType + : Text + ) + → λ(boot : Genode.Boot.Type) + → let NaturalIndex = + { index : Natural, value : Text } + + let TextIndex = { index : Text, value : Text } + + let rom = + [ { mapKey = "config" + , mapValue = + Genode.Boot.Rom.RomText (Genode.Init.render boot.config) + } + ] + # boot.rom + + let moduleKeys = Prelude.Map.keys Text Genode.Boot.Rom rom + + let moduleValues = + let f = + λ(e : RomEntry) + → merge + { RomText = λ(text : Text) → ".ascii ${Text/show text}" + , RomPath = λ(path : Text) → ".incbin ${Text/show path}" + } + e.mapValue + + in Prelude.List.map RomEntry Text f rom + + let map = + λ(list : List Text) + → λ(f : TextIndex → Text) + → let indexedNatural = Prelude.List.indexed Text list + + let indexed = + Prelude.List.map + NaturalIndex + TextIndex + ( λ(x : NaturalIndex) + → { index = Prelude.Natural.show x.index + , value = x.value + } + ) + indexedNatural + + let texts = Prelude.List.map TextIndex Text f indexed + + in Prelude.Text.concatSep "\n" texts + + let mapNames = map moduleKeys + + let mapValues = map moduleValues + + in '' + .set MIN_PAGE_SIZE_LOG2, 12 + .set DATA_ACCESS_ALIGNM_LOG2, 3 + + .section .data + + .p2align DATA_ACCESS_ALIGNM_LOG2 + .global _boot_modules_headers_begin + _boot_modules_headers_begin: + + '' + ++ mapNames + ( λ ( m + : TextIndex + ) + → '' + ${addressType} _boot_module_${m.index}_name + ${addressType} _boot_module_${m.index}_begin + ${addressType} _boot_module_${m.index}_end - _boot_module_${m.index}_begin + '' + ) + ++ '' + .global _boot_modules_headers_end + _boot_modules_headers_end: + + '' + ++ mapNames + ( λ(m : TextIndex) + → '' + .p2align DATA_ACCESS_ALIGNM_LOG2 + _boot_module_${m.index}_name: + .string "${m.value}" + .byte 0 + + '' + ) + ++ '' + .section .data.boot_modules_binaries + + .global _boot_modules_binaries_begin + _boot_modules_binaries_begin: + + '' + ++ mapValues + ( λ(m : TextIndex) + → '' + .p2align MIN_PAGE_SIZE_LOG2 + _boot_module_${m.index}_begin: + ${m.value} + _boot_module_${m.index}_end: + '' + ) + ++ '' + .p2align MIN_PAGE_SIZE_LOG2 + .global _boot_modules_binaries_end + _boot_modules_binaries_end: + '' -in λ ( boot - : Configuration - ) - → let NaturalIndex = - { index : Natural, value : Text } - - let TextIndex = { index : Text, value : Text } - - let rom = - [ { mapKey = "config" - , mapValue = - Genode.Boot.Rom.RomText (Genode.Init.render boot.config) - } - ] - # boot.rom - - let moduleKeys = Prelude.Map.keys Text Genode.Boot.Rom rom - - let moduleValues = - let f = - λ(e : RomEntry) - → merge - { RomText = λ(text : Text) → ".ascii ${Text/show text}" - , RomPath = λ(path : Text) → ".incbin ${Text/show path}" - } - e.mapValue - - in Prelude.List.map RomEntry Text f rom - - let map = - λ(list : List Text) - → λ(f : TextIndex → Text) - → let indexedNatural = Prelude.List.indexed Text list - - let indexed = - Prelude.List.map - NaturalIndex - TextIndex - ( λ(x : NaturalIndex) - → { index = Prelude.Natural.show x.index - , value = x.value - } - ) - indexedNatural - - let texts = Prelude.List.map TextIndex Text f indexed - - in Prelude.Text.concatSep "\n" texts - - let mapNames = map moduleKeys - - let mapValues = map moduleValues - - let addressType = merge { x86_32 = ".long", x86_64 = ".quad" } boot.arch - - in '' - .set MIN_PAGE_SIZE_LOG2, 12 - .set DATA_ACCESS_ALIGNM_LOG2, 3 - - .section .data - - .p2align DATA_ACCESS_ALIGNM_LOG2 - .global _boot_modules_headers_begin - _boot_modules_headers_begin: - - '' - ++ mapNames - ( λ ( m - : TextIndex - ) - → '' - ${addressType} _boot_module_${m.index}_name - ${addressType} _boot_module_${m.index}_begin - ${addressType} _boot_module_${m.index}_end - _boot_module_${m.index}_begin - '' - ) - ++ '' - .global _boot_modules_headers_end - _boot_modules_headers_end: - - '' - ++ mapNames - ( λ(m : TextIndex) - → '' - .p2align DATA_ACCESS_ALIGNM_LOG2 - _boot_module_${m.index}_name: - .string "${m.value}" - .byte 0 - - '' - ) - ++ '' - .section .data.boot_modules_binaries - - .global _boot_modules_binaries_begin - _boot_modules_binaries_begin: - - '' - ++ mapValues - ( λ(m : TextIndex) - → '' - .p2align MIN_PAGE_SIZE_LOG2 - _boot_module_${m.index}_begin: - ${m.value} - _boot_module_${m.index}_end: - '' - ) - ++ '' - .p2align MIN_PAGE_SIZE_LOG2 - .global _boot_modules_binaries_end - _boot_modules_binaries_end: - '' +in { to32bitImage = compile ".long", to64bitImage = compile ".quad" } diff --git a/tests/driver-nova-config.dhall b/tests/driver-nova-config.dhall index 21878c9..6692d99 100644 --- a/tests/driver-nova-config.dhall +++ b/tests/driver-nova-config.dhall @@ -2,15 +2,8 @@ let Genode = env:DHALL_GENODE -let Prelude = Genode.Prelude - -let RomMap = Prelude.Map.Type Text Genode.Boot.Rom - -let Args = { config : Genode.Init.Type, rom : RomMap } : Type - -in λ(args : Args) - → { arch = let Arch = < x86_32 | x86_64 > in Arch.x86_64 - , config = +in λ(args : Genode.Boot.Type) + → { config = Genode.Init::{ , verbose = True , defaultRoutes = diff --git a/tests/libc.dhall b/tests/libc.dhall index 52d19d4..565b1be 100644 --- a/tests/libc.dhall +++ b/tests/libc.dhall @@ -2,35 +2,42 @@ let Genode = env:DHALL_GENODE -in λ ( _ - : {} - ) - → Genode.Init::{ - , verbose = True - , children = - toMap - { test-libc = - Genode.Init.Start::{ - , binary = "test-libc" - , exitPropagate = True - , resources = { caps = 200, ram = Genode.units.MiB 400 } - , routes = [ Genode.ServiceRoute.parent "Timer" ] - , config = - Some - ( Genode.Prelude.XML.text - '' - - - - - 2019-08-20 15:01 - - - - - '' - ) - } - : Genode.Init.Start.Type - } - } +in { config = + Genode.Init::{ + , verbose = True + , children = + toMap + { test-libc = + Genode.Init.Start::{ + , binary = "test-libc" + , exitPropagate = True + , resources = { caps = 200, ram = Genode.units.MiB 400 } + , routes = [ Genode.ServiceRoute.parent "Timer" ] + , config = + Some + ( Genode.Prelude.XML.text + '' + + + + + 2019-08-20 15:01 + + + + + '' + ) + } + : Genode.Init.Start.Type + } + } + , rom = + let manifest = env:MANIFEST + + in Genode.Boot.toRomPaths + [ manifest.libc.lib.libc + manifest.libc.lib.libm + manifest.test-libc.bin.test-libc + ] + }