From 70cafac9d7f7261b28170c8b76e426646630ff44 Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Sun, 19 Jan 2020 16:02:39 +0100 Subject: [PATCH] Add linux-boot and render-init apps --- apps/default.nix | 25 ++++++++++++-- apps/linux-boot/default.nix | 18 ++++++++++ apps/linux-boot/script.dhall | 30 ++++++++++++++++ apps/nova-image/default.nix | 22 ++++++++---- apps/{ => nova-image}/nova-modules.as.dhall | 0 apps/nova-iso/default.nix | 38 +++++++++------------ apps/render-init/default.nix | 17 +++++++++ 7 files changed, 120 insertions(+), 30 deletions(-) create mode 100644 apps/linux-boot/default.nix create mode 100644 apps/linux-boot/script.dhall rename apps/{ => nova-image}/nova-modules.as.dhall (100%) create mode 100644 apps/render-init/default.nix diff --git a/apps/default.nix b/apps/default.nix index a0e9a6b..1159fca 100644 --- a/apps/default.nix +++ b/apps/default.nix @@ -1,8 +1,16 @@ # SPDX-License-Identifier: CC0-1.0 -{ nixpkgs, packages, dhallApps }: +{ nixpkgs, dhallApps, packages }: rec { + + linux-boot = + let drv = import ./linux-boot { inherit nixpkgs dhallApps packages; }; + in { + type = "app"; + program = "${drv}/bin/linux-boot"; + }; + nova-image = let drv = import ./nova-image { stdenv = packages.stdenv; @@ -11,16 +19,29 @@ rec { in { type = "app"; program = "${drv}/bin/nova-image"; + function = attrs: bootDesc: + nixpkgs.runCommand "nova-iso" (attrs // { inherit bootDesc; }) + "${drv}/bin/nova-image $out $bootDesc"; }; nova-iso = let drv = import ./nova-iso { stdenv = packages.stdenv; - inherit nixpkgs dhallApps packages nova-image; + inherit nixpkgs packages nova-image; }; in { type = "app"; program = "${drv}/bin/nova-iso"; + function = attrs: bootDesc: + nixpkgs.runCommand "nova.iso" attrs + ''${drv}/bin/nova-iso $out "${bootDesc}"''; }; + render-init = + let drv = import ./render-init { inherit nixpkgs dhallApps packages; }; + in { + type = "app"; + program = "${drv}/bin/render-init"; + }; + } diff --git a/apps/linux-boot/default.nix b/apps/linux-boot/default.nix new file mode 100644 index 0000000..b3ba25a --- /dev/null +++ b/apps/linux-boot/default.nix @@ -0,0 +1,18 @@ +# SPDX-License-Identifier: CC0-1.0 + +{ nixpkgs, dhallApps, packages }: + +nixpkgs.writeScriptBin "linux-boot" (with nixpkgs.buildPackages; '' + #!${runtimeShell} + set -eu + if [ -z "$@" ]; then + echo "Error: a boot description must be passed as an argument - $0" > /dev/stderr + exit 1 + fi + export DHALL_PRELUDE=''${DHALL_PRELUDE:-${packages.dhallPrelude}/package.dhall} + export DHALL_GENODE=''${DHALL_GENODE:-${packages.dhallGenode}/package.dhall} + export BASE_LINUX_MANIFEST=''${BASE_LINUX_MANIFEST:-${packages.genode.base-linux.manifest}} + export OS_MANIFEST=''${OS_MANIFEST:-${packages.genode.os.manifest}} + ${dhallApps.dhall.program} text <<< "${./script.dhall} ($@)" > boot.sh + source boot.sh +'') diff --git a/apps/linux-boot/script.dhall b/apps/linux-boot/script.dhall new file mode 100644 index 0000000..5017e0c --- /dev/null +++ b/apps/linux-boot/script.dhall @@ -0,0 +1,30 @@ +-- SPDX-License-Identifier: CC0-1.0 + +let Genode = env:DHALL_GENODE + +let Prelude = Genode.Prelude + +let Args = + { config : Genode.Init.Type, rom : Genode.Prelude.Map.Type Text Text } + : Type + +in λ(args : Args) + → let addLink = + λ(e : Prelude.Map.Entry Text Text) + → λ(script : Text) + → script ++ "ln -s ${Text/show e.mapValue} ${Text/show e.mapKey}\n" + + let links = + Prelude.List.fold + (Prelude.Map.Entry Text Text) + args.rom + Text + addLink + "" + + in '' + #!/bin/sh + ${links} + echo ${Text/show (Genode.Init.render args.config)} > config + exec ./core-linux + '' diff --git a/apps/nova-image/default.nix b/apps/nova-image/default.nix index cc0bd51..acfbd29 100644 --- a/apps/nova-image/default.nix +++ b/apps/nova-image/default.nix @@ -10,19 +10,27 @@ in nixpkgs.writeScriptBin "nova-image" (with nixpkgs.buildPackages; #!${runtimeShell} set -eu + out="$1" + shift + + if [ -e "$out" ]; then + echo "refusing to overwrite $out as output" > /dev/stderr + exit 1 + fi + CC="${cc}/bin/${cc.targetPrefix}cc" LD="${buildPackages.binutils}/bin/${buildPackages.binutils.targetPrefix}ld" - TMPDIR="$(${coreutils}/bin/mktemp -p /tmp -d nova-iso.XXXX)" - # trap "rm -rf $TMPDIR" err exit - CORE_NOVA="${base-nova}/lib/core-nova.o" + TMPDIR="$(${coreutils}/bin/mktemp -d)" + trap "rm -rf $TMPDIR" err exit + 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 + } ($@)" > "$TMPDIR/modules.as" # compile the boot modules into one object file $CC -c -x assembler -o "$TMPDIR/boot_modules.o" "$TMPDIR/modules.as" @@ -34,5 +42,5 @@ in nixpkgs.writeScriptBin "nova-image" (with nixpkgs.buildPackages; -z max-page-size=0x1000 \ -Ttext=0x100000 -gc-sections \ "$CORE_NOVA" "$TMPDIR/boot_modules.o" \ - -o "image.elf" + -o "$out" '') diff --git a/apps/nova-modules.as.dhall b/apps/nova-image/nova-modules.as.dhall similarity index 100% rename from apps/nova-modules.as.dhall rename to apps/nova-image/nova-modules.as.dhall diff --git a/apps/nova-iso/default.nix b/apps/nova-iso/default.nix index f6d1298..7f159f0 100644 --- a/apps/nova-iso/default.nix +++ b/apps/nova-iso/default.nix @@ -1,6 +1,6 @@ # SPDX-License-Identifier: CC0-1.0 -{ stdenv, nixpkgs, dhallApps, packages, nova-image }: +{ stdenv, nixpkgs, packages, nova-image }: nixpkgs.writeScriptBin "nova-iso" (with nixpkgs.buildPackages; let inherit (stdenv) cc; @@ -9,20 +9,25 @@ nixpkgs.writeScriptBin "nova-iso" (with nixpkgs.buildPackages; #!${runtimeShell} set -eu - CC="${cc}/bin/${cc.targetPrefix}cc" - LD="${buildPackages.binutils}/bin/${buildPackages.binutils.targetPrefix}ld" + out="$1" + shift + + if [ -e "$out" ]; then + echo "refusing to overwrite $out as output" > /dev/stderr + exit 1 + fi + SYSLINUX="${syslinux}/share/syslinux" - TMPDIR="$(${coreutils}/bin/mktemp -p /tmp -d nova-iso.XXXX)" - mkdir -p "$TMPDIR/boot/syslinux" + TMPDIR="$(${coreutils}/bin/mktemp -d)" trap "rm -rf $TMPDIR" err exit - ${nova-image.program} $@ - mv image.elf "$TMPDIR/boot" + mkdir -p "$TMPDIR/boot/syslinux" + ${nova-image.program} "$TMPDIR/boot/image.elf" $@ pushd "$TMPDIR" - # build ISO image + # build ISO layout cp ${packages.NOVA}/hypervisor* boot/hypervisor cp ${./isolinux.cfg} boot/syslinux/isolinux.cfg cp \ @@ -33,22 +38,13 @@ nixpkgs.writeScriptBin "nova-iso" (with nixpkgs.buildPackages; boot/syslinux chmod +w boot/syslinux/isolinux.bin - ISO_FILE="''${DIRSTACK[1]}/nova.iso" - - ${cdrkit}/bin/mkisofs -o "$ISO_FILE" \ + # create ISO image + ${cdrkit}/bin/mkisofs -o "$out" \ -b syslinux/isolinux.bin -c syslinux/boot.cat \ -no-emul-boot -boot-load-size 4 -boot-info-table \ -iso-level 2 \ boot - popd - - # build test script - QEMU_SCRIPT=boot-qemu.sh - cat > "$QEMU_SCRIPT" << EOF - #!/bin/sh - qemu-system-x86_64 -cdrom nova.iso -machine q35 -serial mon:stdio \$@ - EOF - - chmod +x "$QEMU_SCRIPT" + ${syslinux}/bin/isohybrid "$out" + echo ISO is at $out '') diff --git a/apps/render-init/default.nix b/apps/render-init/default.nix new file mode 100644 index 0000000..9687086 --- /dev/null +++ b/apps/render-init/default.nix @@ -0,0 +1,17 @@ +# SPDX-License-Identifier: CC0-1.0 + +{ nixpkgs, dhallApps, packages }: + +nixpkgs.writeScriptBin "render-init" (with nixpkgs.buildPackages; '' + #!${runtimeShell} + set -eu + if [ -z "$@" ]; then + echo "Error: a Dhall init configuration file must be passed as an argument - $0" > /dev/stderr + exit 1 + fi + export DHALL_PRELUDE=''${DHALL_PRELUDE:-${packages.dhallPrelude}/package.dhall} + export DHALL_GENODE=''${DHALL_GENODE:-${packages.dhallGenode}/package.dhall} + ${dhallApps.dhall.program} text \ + <<< "(env:DHALL_GENODE).Init.render ($@)" \ + | ${nixpkgs.buildPackages.libxml2}/bin/xmllint -format - +'')