nova-image: remove Arch union type
This commit is contained in:
parent
66db226f44
commit
0afe6af54d
|
@ -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 =
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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" }
|
||||
|
|
|
@ -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 =
|
||||
|
|
|
@ -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
|
||||
''
|
||||
<config>
|
||||
<vfs>
|
||||
<dir name="dev">
|
||||
<log/>
|
||||
<inline name="rtc">2019-08-20 15:01</inline>
|
||||
</dir>
|
||||
</vfs>
|
||||
<libc stdout="/dev/log" stderr="/dev/log" rtc="/dev/rtc"/>
|
||||
</config>
|
||||
''
|
||||
)
|
||||
}
|
||||
: 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
|
||||
''
|
||||
<config>
|
||||
<vfs>
|
||||
<dir name="dev">
|
||||
<log/>
|
||||
<inline name="rtc">2019-08-20 15:01</inline>
|
||||
</dir>
|
||||
</vfs>
|
||||
<libc stdout="/dev/log" stderr="/dev/log" rtc="/dev/rtc"/>
|
||||
</config>
|
||||
''
|
||||
)
|
||||
}
|
||||
: 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
|
||||
]
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue