2
0
Fork 0
Browse Source

Add aarch64 platform

Add the hw-virt_qemu platform to tests, rename hw to hw-pc.
ncurses
Emery Hemingway 2 years ago
parent
commit
559f4aa3c0
  1. 47
      apps/default.nix
  2. 1
      apps/hw-iso/default.nix
  3. 12
      flake.nix
  4. 10
      lib/default.nix
  5. 46
      overlay/binutils/support-genode.patch
  6. 11
      overlay/default.nix
  7. 2
      overlay/libc/default.nix
  8. 4
      packages/NOVA/default.nix
  9. 25
      packages/default.nix
  10. 36
      packages/genodelabs/default.nix
  11. 5
      packages/genodelabs/toolchain.nix
  12. 3
      packages/solo5/default.nix
  13. 28
      packages/solo5/genode.patch
  14. 4
      packages/stdcxx/default.nix
  15. 94
      tests/default.nix
  16. 4
      tests/solo5/default.nix
  17. 33
      tests/solo5/solo5.dhall

47
apps/default.nix

@ -1,6 +1,6 @@
# SPDX-License-Identifier: CC0-1.0
{ self, nixpkgs, nixpkgsLocal, packages }:
{ system, self, nixpkgs, nixpkgsLocal, packages }:
let
dhallApps = let
@ -68,29 +68,30 @@ in dhallApps // {
program = "${drv}/bin/generate-manifest";
};
hw-image = let
drv = import ./hw-image {
stdenv = packages.stdenv;
render-init = let
drv = import ./render-init {
apps = self;
inherit nixpkgs packages;
};
in {
type = "app";
program = "${drv}/bin/hw-image";
function = attrs: bootDesc:
nixpkgs.runCommand "image.elf" attrs
''XDG_CACHE_HOME=$TMPDIR ${drv}/bin/hw-image "${bootDesc}" > $out'';
program = "${drv}/bin/render-init";
};
nova-image = let
drv = import ./nova-image {
} // (if system == "x86_64-genode" then {
hw-image = let
drv = import ./hw-image {
stdenv = packages.stdenv;
apps = self;
inherit nixpkgs packages;
};
in {
type = "app";
program = "${drv}/bin/nova-image";
program = "${drv}/bin/hw-image";
function = attrs: bootDesc:
nixpkgs.runCommand "image.elf" attrs
''XDG_CACHE_HOME=$TMPDIR ${drv}/bin/hw-image "${bootDesc}" > $out'';
};
hw-iso = let
@ -107,6 +108,17 @@ in dhallApps // {
''XDG_CACHE_HOME=$TMPDIR ${drv}/bin/hw-iso "${bootDesc}" > $out'';
};
nova-image = let
drv = import ./nova-image {
stdenv = packages.stdenv;
apps = self;
inherit nixpkgs packages;
};
in {
type = "app";
program = "${drv}/bin/nova-image";
};
nova-iso = let
drv = import ./nova-iso {
stdenv = packages.stdenv;
@ -121,14 +133,5 @@ in dhallApps // {
''XDG_CACHE_HOME=$TMPDIR ${drv}/bin/nova-iso "${bootDesc}" > $out'';
};
render-init = let
drv = import ./render-init {
apps = self;
inherit nixpkgs packages;
};
in {
type = "app";
program = "${drv}/bin/render-init";
};
}
} else
{ })

1
apps/hw-iso/default.nix

@ -21,7 +21,6 @@ nixpkgs.writeScriptBin "hw-iso" (with nixpkgs.buildPackages;
out="hw.iso"
# build ISO layout
cp ${packages.NOVA}/hypervisor* boot/hypervisor
cp ${./isolinux.cfg} boot/syslinux/isolinux.cfg
cp \
$SYSLINUX/isolinux.bin \

12
flake.nix

@ -10,7 +10,7 @@
outputs = { self, nixpkgs }:
let
localSystems = [ "x86_64-linux" ];
crossSystems = [ "x86_64-genode" ];
crossSystems = [ "aarch64-genode" "x86_64-genode" ];
forAllLocalSystems = f:
nixpkgs.lib.genAttrs localSystems (system: f system);
@ -70,6 +70,7 @@
# pass thru Nixpkgs
packages = forAllCrossSystems ({ system, localSystem, crossSystem }:
nixpkgs.lib.filterAttrs (n: v: v != null)
nixpkgsFor.${system}.genodePackages);
devShell = forAllLocalSystems (system:
@ -87,6 +88,7 @@
glibc.dev
gnumake
libxml2
qemu
tcl
which
xorriso
@ -109,6 +111,7 @@
apps = let
apps' = forAllCrossSystems ({ system, localSystem, crossSystem }:
import ./apps {
system = crossSystem;
self = self.apps.${system};
nixpkgs = nixpkgsFor.${system};
nixpkgsLocal = nixpkgsFor.${localSystem};
@ -121,12 +124,15 @@
import ./tests {
inherit self;
apps = self.apps.${system};
buildPackages = nixpkgsFor.${localSystem};
localPackages = nixpkgsFor.${localSystem};
genodepkgs = self.packages.${system};
lib = self.lib.${system};
nixpkgs = nixpkgsFor.${system};
legacyPackages = self.legacyPackages.${system};
});
in { x86_64-linux = checks'.x86_64-linux-x86_64-genode; };
in checks' // {
x86_64-linux = with builtins;
foldl' (x: y: x // y) { } (attrValues checks');
};
};
}

10
lib/default.nix

@ -39,7 +39,7 @@ in rec {
> $out/config.dhall.bin
'';
hwImage = name: env: boot:
hwImage = coreLinkAddr: bootstrapLinkAddr: basePkg: name: env: boot:
nixpkgs.stdenv.mkDerivation {
name = name + "-hw-image";
build = compileBoot name env boot;
@ -80,9 +80,9 @@ in rec {
}
build_core \
"${testPkgs.base-hw-pc.coreObj}" \
"${basePkg.coreObj}" \
"$build/modules_asm" \
0xffffffc000000000 \
${coreLinkAddr} \
core.elf
dhall to-directory-tree --output bootstrap \
@ -90,9 +90,9 @@ in rec {
mkdir -p $out
build_core \
"${testPkgs.base-hw-pc.bootstrapObj}" \
"${basePkg.bootstrapObj}" \
bootstrap/modules_asm \
0x00200000 \
${bootstrapLinkAddr} \
$out/image.elf
'';
};

46
overlay/binutils/support-genode.patch

@ -1,11 +1,26 @@
commit 848a25e8c97075ddead404beff15f122fd0fd624
Author: Emery Hemingway <ehmry@posteo.net>
Date: Tue Jun 2 11:37:03 2020 +0530
Genode support
diff --git a/bfd/config.bfd b/bfd/config.bfd
index 6391f35684..f2ab802fb5 100644
index 6391f35684..fba459d066 100644
--- a/bfd/config.bfd
+++ b/bfd/config.bfd
@@ -229,7 +229,7 @@ case "${targ}" in
targ_archs="$targ_archs bfd_i386_arch bfd_powerpc_arch bfd_rs6000_arch"
want64=true
;;
- aarch64-*-elf | aarch64-*-rtems*)
+ aarch64-*-elf | aarch64-*-rtems* | aarch64-*-genode*)
targ_defvec=aarch64_elf64_le_vec
targ_selvecs="aarch64_elf64_be_vec aarch64_elf32_le_vec aarch64_elf32_be_vec arm_elf32_le_vec arm_elf32_be_vec"
want64=true
@@ -554,7 +554,7 @@ case "${targ}" in
targ_selvecs=hppa_elf32_vec
;;
- i[3-7]86-*-elf* | i[3-7]86-*-rtems*)
+ i[3-7]86-*-elf* | i[3-7]86-*-rtems* | i[3-7]86-*-genode*)
targ_defvec=i386_elf32_vec
@ -34,11 +49,19 @@ index c95acc681d..388c305636 100755
;;
qnx*)
diff --git a/gas/configure.tgt b/gas/configure.tgt
index 3d0415c1aa..7cd96b6be4 100644
index 3d0415c1aa..177a82876f 100644
--- a/gas/configure.tgt
+++ b/gas/configure.tgt
@@ -139,7 +139,8 @@ case ${generic_target} in
@@ -123,6 +123,7 @@ generic_target=${cpu_type}-$vendor-$os
case ${generic_target} in
aarch64*-*-elf*) fmt=elf;;
aarch64*-*-fuchsia*) fmt=elf;;
+ aarch64*-*-genode*) fmt=elf;;
aarch64*-*-linux*) fmt=elf em=linux
case ${cpu}-${os} in
aarch64*-linux-gnu_ilp32) arch=aarch64:32 ;;
@@ -139,7 +140,8 @@ case ${generic_target} in
arm-*-phoenix*) fmt=elf ;;
arm-*-elf) fmt=elf ;;
- arm-*-eabi* | arm-*-rtems*) fmt=elf em=armeabi ;;
@ -47,7 +70,7 @@ index 3d0415c1aa..7cd96b6be4 100644
arm-*-symbianelf*) fmt=elf em=symbian ;;
arm-*-kaos*) fmt=elf ;;
arm-*-conix*) fmt=elf ;;
@@ -213,6 +214,7 @@ case ${generic_target} in
@@ -213,6 +215,7 @@ case ${generic_target} in
i386-*-elfiamcu) fmt=elf arch=iamcu ;;
i386-*-elf*) fmt=elf ;;
i386-*-fuchsia*) fmt=elf ;;
@ -56,9 +79,18 @@ index 3d0415c1aa..7cd96b6be4 100644
i386-*-bsd*) fmt=aout em=386bsd ;;
i386-*-nacl*) fmt=elf em=nacl
diff --git a/ld/configure.tgt b/ld/configure.tgt
index fad8b2e5c8..04f7fa0e70 100644
index fad8b2e5c8..7179dbff3a 100644
--- a/ld/configure.tgt
+++ b/ld/configure.tgt
@@ -47,7 +47,7 @@ targ64_extra_libpath=
case "${targ}" in
aarch64_be-*-elf) targ_emul=aarch64elfb
targ_extra_emuls="aarch64elf aarch64elf32 aarch64elf32b armelfb armelf" ;;
-aarch64-*-elf | aarch64-*-rtems*)
+aarch64-*-elf | aarch64-*-rtems* | aarch64-*-genode*)
targ_emul=aarch64elf
targ_extra_emuls="aarch64elf32 aarch64elf32b aarch64elfb armelf armelfb" ;;
aarch64-*-cloudabi*) targ_emul=aarch64cloudabi
@@ -115,7 +115,7 @@ arm-*-nto*) targ_emul=armnto ;;
arm-*-phoenix*) targ_emul=armelf ;;
armeb-*-elf | armeb-*-eabi*)

11
overlay/default.nix

@ -20,8 +20,10 @@ in {
++ [ "--without-bash-malloc" ]; # no sbrk please
});
binutils-unwrapped =
addPatches binutils-unwrapped [ ./binutils/support-genode.patch ];
binutils-unwrapped = overrideTargetAttrs binutils-unwrapped (attrs: {
patches = attrs.patches ++ [ ./binutils/support-genode.patch ];
nativeBuildInputs = [ final.updateAutotoolsGnuConfigScriptsHook ];
});
cmake = overrideTargetAttrs cmake (attrs: {
postInstall = with stdenv; ''
@ -56,8 +58,6 @@ in {
gdb = addPatches gdb [ ./gdb/genode.patch ];
inherit (final.genodeSources) genodeBase;
genodeLibcCross = callPackage ./libc { };
genodePackages = import ../packages { nixpkgs = final; };
@ -66,12 +66,13 @@ in {
libcCrossChooser = name:
if stdenv.targetPlatform.isGenode then
targetPackages.genodeLibcCross or genodeLibcCross
targetPackages.genodeLibcCross
else
prev.libcCrossChooser name;
llvmPackages_8 = callPackage ./llvm-8 ({
inherit (stdenvAdapters) overrideCC;
inherit (targetPackages.genodeSources) genodeBase;
buildLlvmTools = buildPackages.llvmPackages_8.tools;
targetLlvmLibraries = targetPackages.llvmPackages_8.libraries;
});

2
overlay/libc/default.nix

@ -1,6 +1,6 @@
# SPDX-License-Identifier: CC0-1.0
{ genodeSources, genodeBase, symlinkJoin }:
{ genodeSources, symlinkJoin }:
symlinkJoin {
name = "posix";

4
packages/NOVA/default.nix

@ -36,9 +36,9 @@ else
meta = with stdenv.lib;
src.meta // {
description =
"The NOVA OS Virtualization Architecture is a project aimed at constructing a secure virtualization environment with a small trusted computing base.";
description = "Microhypervisor";
homepage = "http://hypervisor.org/";
platforms = platforms.x86;
license = licenses.gpl2;
maintainers = [ maintainers.ehmry ];
};

25
packages/default.nix

@ -35,6 +35,8 @@ let
};
in listToAttrs (map f names);
basePatches = [ ./genodelabs/cxx-align.patch ];
in depotPkgs // {
inherit stdenv genodeSources;
@ -44,20 +46,37 @@ in depotPkgs // {
KERNEL = "hw";
BOARD = "pc";
targets = [ "bootstrap" "core" "timer" "lib/ld" ];
patches = [ ./genodelabs/cxx-align.patch ];
patches = basePatches;
postInstall = ''
mv $out/core-hw-pc.o $coreObj
mv $out/bootstrap-hw-pc.o $bootstrapObj
mv $out/ld-hw.lib.so $out/ld.lib.so
mv $out/hw_timer_drv $out/timer_drv
'';
meta.platforms = [ "x86_64-genode" ];
};
base-hw-virt_qemu = buildUpstream {
name = "base-hw-virt_qemu";
outputs = [ "out" "coreObj" "bootstrapObj" ];
KERNEL = "hw";
BOARD = "virt_qemu";
targets = [ "bootstrap" "core" "timer" "lib/ld" ];
patches = basePatches;
postInstall = ''
mv $out/core-hw-virt_qemu.o $coreObj
mv $out/bootstrap-hw-virt_qemu.o $bootstrapObj
mv $out/ld-hw.lib.so $out/ld.lib.so
mv $out/hw_timer_drv $out/timer_drv
'';
meta.platforms = [ "aarch64-genode" ];
};
base-linux = buildUpstream {
name = "base-linux";
KERNEL = "linux";
targets = [ "core" "timer" "lib/ld" ];
patches = [ ./genodelabs/cxx-align.patch ];
patches = basePatches;
postInstall = ''
mkdir -p $out/lib
mv $out/ld-linux.lib.so $out/lib/ld.lib.so
@ -71,7 +90,7 @@ in depotPkgs // {
outputs = [ "out" "coreObj" ];
KERNEL = "nova";
targets = [ "core" "timer" "lib/ld" ];
patches = [ ./genodelabs/cxx-align.patch ];
patches = basePatches;
postInstall = ''
mv $out/core-nova.o $coreObj
mv $out/ld-nova.lib.so $out/ld.lib.so

36
packages/genodelabs/default.nix

@ -5,17 +5,23 @@ with buildPackages;
let
version = "20.05";
genodeSources = let
platform = targetPackages.targetPlatform;
arch = with platform;
if isx86_64 then
"x86_64"
else
throw "unknown Genode arch for platform ${platform.system}";
platform = targetPackages.targetPlatform;
arch = with platform;
if isx86_64 then
"x86_64"
else if isAarch64 then
"arm_v8a"
else
throw "unknown Genode arch for platform ${platform.system}";
genodeSources = let
toolPrefix = if platform.isx86 then
"genode-x86-"
else if platform.isAarch64 then
"genode-aarch64-"
else
throw "unknown tool prefix for Genode arch ${arch}";
in stdenvNoCC.mkDerivation {
@ -43,14 +49,6 @@ let
stdenv' =
targetPackages.stdenvAdapters.overrideCC targetPackages.stdenv toolchain;
platform = stdenv'.targetPlatform;
arch = with platform;
if isx86_64 then
"x86_64"
else
throw "unknown Genode arch for platform ${platform.system}";
preparePort = name:
{ hash ? "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
, patches ? [ ], ... }@args:
@ -109,7 +107,8 @@ let
(import ./ports.nix { inherit buildPackages; });
buildUpstream = { name, targets, portInputs ? [ ], nativeBuildInputs ? [ ]
, patches ? [ ], enableParallelBuilding ? true, ... }@extraAttrs:
, patches ? [ ], enableParallelBuilding ? true, meta ? { }, ...
}@extraAttrs:
let havePatches = patches != [ ];
in stdenv'.mkDerivation (extraAttrs // {
@ -149,10 +148,12 @@ let
find build/bin -follow -type f -exec install -Dt $out '{}' \;
runHook postInstall
'';
meta = { platforms = stdenv.lib.platforms.genode; } // meta;
});
buildDepot = { name, apiOnly ? false, portInputs ? [ ]
, nativeBuildInputs ? [ ], ... }@extraAttrs:
, nativeBuildInputs ? [ ], meta ? { }, ... }@extraAttrs:
stdenv'.mkDerivation (extraAttrs // {
pname = name;
@ -202,6 +203,7 @@ let
runHook postInstall
'';
meta = { platforms = stdenv.lib.platforms.genode; } // meta;
});
buildOverrides = callPackage ./targets.nix { inherit ports; };

5
packages/genodelabs/toolchain.nix

@ -65,7 +65,10 @@ let
'';
} // {
isGNU = true;
targetPrefix = "genode-x86-";
targetPrefix = {
aarch64-genode = "genode-arm-";
x86_64-genode = "genode-x86-";
}.${stdenv.targetPlatform.system} or null;
};
wrapped = wrapCC cc;

3
packages/solo5/default.nix

@ -22,9 +22,10 @@ in stdenv.mkDerivation {
patches = [ ./genode.patch ./elftool.patch ./time.patch ];
configurePhase = ''
configurePhase = with stdenv; ''
runHook preConfigure
sh configure.sh
${lib.optionalString (hostPlatform.isAarch64) "rm -fr tests/test_fpu"}
rm -fr tests/test_tls
runHook postConfigure
'';

28
packages/solo5/genode.patch

@ -80,7 +80,7 @@ index 147c245..d3efb36 100644
GENODE_LDFLAGS := -nostdlib -z max-page-size=$(CONFIG_GUEST_PAGE_SIZE) -shared \
-gc-sections --eh-frame-hdr --entry=0x0 -T genode/genode_rel.ld
diff --git a/bindings/genode/bindings.cc b/bindings/genode/bindings.cc
index 5785ae5..2b7db70 100644
index a4a4a34..6f439c6 100644
--- a/bindings/genode/bindings.cc
+++ b/bindings/genode/bindings.cc
@@ -44,8 +44,6 @@ extern struct mft1_note __solo5_mft1_note;
@ -92,7 +92,7 @@ index 5785ae5..2b7db70 100644
#include "../../tenders/common/mft.c"
namespace Solo5
@@ -111,32 +109,32 @@ struct Solo5::Device
@@ -117,32 +115,32 @@ struct Solo5::Device
{
virtual
solo5_result_t
@ -131,7 +131,7 @@ index 5785ae5..2b7db70 100644
return SOLO5_R_EINVAL; }
};
@@ -610,11 +608,44 @@ solo5_block_read(solo5_handle_t handle, solo5_off_t offset,
@@ -615,11 +613,44 @@ solo5_block_read(solo5_handle_t handle, solo5_off_t offset,
solo5_result_t
@ -177,7 +177,7 @@ index 5785ae5..2b7db70 100644
} // extern "C"
@@ -632,7 +663,7 @@ void Component::construct(Genode::Env &env)
@@ -637,7 +668,7 @@ void Component::construct(Genode::Env &env)
mft_get_builtin_mft1(&__solo5_mft1_note, &mft, &mft_size);
if (mft_validate(mft, mft_size) != 0) {
@ -216,18 +216,16 @@ index 0f1ca5c..0000000
-uintptr_t SSP_GUARD;
-void SSP_FAIL (void) { }
diff --git a/configure.sh b/configure.sh
index f762933..e75f41a 100755
index 0828409..61fa885 100755
--- a/configure.sh
+++ b/configure.sh
@@ -233,6 +233,23 @@ config_host_openbsd()
@@ -254,6 +254,21 @@ config_host_openbsd()
CONFIG_GENODE=
}
+config_host_genode()
+{
+ cc_is_clang || die "Only Clang is supported on Genode"
+ [ "${CONFIG_ARCH}" = "x86_64" ] ||
+ die "Only 'x86_64' is supported on Genode"
+
+ MAKECONF_CXXFLAGS="-mno-retpoline -Wno-mismatched-tags -Wno-undefined-bool-conversion -Wno-uninitialized -Wno-unknown-attributes -Wno-unused-variable -Wno-unused-parameter"
+ MAKECONF_LDFLAGS="-nopie"
@ -243,7 +241,7 @@ index f762933..e75f41a 100755
# Check for a tools-only build.
OPT_ONLY_TOOLS=
if [ -n "$1" ]; then
@@ -245,6 +262,7 @@ fi
@@ -266,6 +281,7 @@ fi
# Allow external override of CC.
CC=${CC:-cc}
@ -251,18 +249,22 @@ index f762933..e75f41a 100755
LD=${LD:-ld}
CC_MACHINE=$(${CC} -dumpmachine)
@@ -272,6 +290,10 @@ case ${CC_MACHINE} in
@@ -293,6 +309,14 @@ case ${CC_MACHINE} in
CONFIG_ARCH=x86_64 CONFIG_HOST=OpenBSD
CONFIG_GUEST_PAGE_SIZE=0x1000
;;
+ x86_64-*genode*)
+ CONFIG_ARCH=x86_64 CONFIG_HOST=Genode
+ CONFIG_GUEST_PAGE_SIZE=0x1000
+ ;;
+ aarch64-*genode*)
+ CONFIG_ARCH=aarch64 CONFIG_HOST=Genode
+ CONFIG_GUEST_PAGE_SIZE=0x1000
+ ;;
*)
die "Unsupported toolchain target: ${CC_MACHINE}"
;;
@@ -303,6 +325,9 @@ case "${CONFIG_HOST}" in
@@ -325,6 +349,9 @@ case "${CONFIG_HOST}" in
OpenBSD)
config_host_openbsd
;;
@ -272,7 +274,7 @@ index f762933..e75f41a 100755
*)
die "Unsupported build OS: ${CONFIG_HOST}"
;;
@@ -315,7 +340,7 @@ esac
@@ -337,7 +364,7 @@ esac
# GNU make. Given the differences in quoting rules between the two
# (unable to sensibly use VAR="VALUE"), our convention is as follows:
#
@ -281,7 +283,7 @@ index f762933..e75f41a 100755
# available to Makefiles.
#
# 2. Shell scripts parse the subset of *lines* starting with "CONFIG_". I.e.
@@ -333,11 +358,13 @@ CONFIG_VIRTIO=${CONFIG_VIRTIO}
@@ -355,11 +382,13 @@ CONFIG_VIRTIO=${CONFIG_VIRTIO}
CONFIG_MUEN=${CONFIG_MUEN}
CONFIG_GENODE=${CONFIG_GENODE}
MAKECONF_CFLAGS=${MAKECONF_CFLAGS}

4
packages/stdcxx/default.nix

@ -1,6 +1,6 @@
# SPDX-License-Identifier: CC0-1.0
{ genodeSources, genodeBase }:
{ genodeSources }:
let port = genodeSources.ports.stdcxx;
in genodeSources.buildUpstream {
@ -8,7 +8,7 @@ in genodeSources.buildUpstream {
outputs = [ "out" "dev" ];
targets = [ "LIB=stdcxx" ];
portInputs = [ genodeSources.ports.libc port ];
propagatedBuildInputs = [ genodeBase ];
propagatedBuildInputs = [ genodeSources.genodeBase ];
STDCXX_PORT = port;
postInstall = ''

94
tests/default.nix

@ -1,25 +1,21 @@
# SPDX-License-Identifier: CC0-1.0
{ self, apps, buildPackages, genodepkgs, lib, nixpkgs, legacyPackages }:
{ self, apps, localPackages, genodepkgs, lib, nixpkgs, legacyPackages }:
let
callTest = path:
import path {
pkgs = testPkgs;
inherit nixpkgs buildPackages legacyPackages;
inherit nixpkgs localPackages legacyPackages;
};
testFiles = map callTest [
./log.nix
./posix.nix
./vmm_x86.nix
./x86.nix
] ++ (callTest ./solo5);
testFiles = map callTest [ ./log.nix ./posix.nix ./vmm_x86.nix ./x86.nix ]
++ (callTest ./solo5);
testPkgs = genodepkgs;
qemu' = buildPackages.qemu_test;
qemu' = localPackages.qemu;
qemuBinary = qemuPkg:
{
@ -27,14 +23,17 @@ let
x86_64-genode = "${qemuPkg}/bin/qemu-system-x86_64";
}.${genodepkgs.stdenv.hostPlatform.system};
platforms = [
cores = [
{
prefix = "hw-pc-";
specs = [ "x86" "hw" ];
basePkg = testPkgs.base-hw-pc;
makeImage = lib.hwImage;
platforms = [ "x86_64-genode" ];
basePackages = [ testPkgs.base-hw-pc ]
++ map testPkgs.genodeSources.depot [ "rtc_drv" ];
makeImage =
lib.hwImage "0xffffffc000000000" "0x00200000" testPkgs.base-hw-pc;
startVM = vmName: image: ''
#! ${buildPackages.runtimeShell}
#! ${localPackages.runtimeShell}
exec ${qemuBinary qemu'} \
-name ${vmName} \
-machine q35 \
@ -45,13 +44,35 @@ let
"$@"
'';
}
{
prefix = "hw-virt_qemu-";
specs = [ "aarch64" "hw" ];
platforms = [ "aarch64-genode" ];
basePackages = with testPkgs; [ base-hw-virt_qemu rtc-dummy ];
makeImage = lib.hwImage "0xffffffc000000000" "0x40000000"
testPkgs.base-hw-virt_qemu;
startVM = vmName: image: ''
#! ${localPackages.runtimeShell}
exec ${qemuBinary qemu'} \
-name ${vmName} \
-M virt,virtualization=true,gic_version=3 \
-cpu cortex-a53 \
-smp 4 \
-m 384 \
-kernel "${image}/image.elf" \
$QEMU_OPTS \
"$@"
'';
}
{
prefix = "nova-";
specs = [ "x86" "nova" ];
basePkg = testPkgs.base-nova;
platforms = [ "x86_64-genode" ];
basePackages = [ testPkgs.base-nova ]
++ map testPkgs.genodeSources.depot [ "rtc_drv" ];
makeImage = lib.novaImage;
startVM = vmName: image: ''
#! ${buildPackages.runtimeShell}
#! ${localPackages.runtimeShell}
exec ${qemuBinary qemu'} \
-name ${vmName} \
-machine q35 \
@ -64,7 +85,11 @@ let
}
];
testDriver = with buildPackages;
cores' = builtins.filter (core:
builtins.any (x: x == genodepkgs.stdenv.hostPlatform.system) core.platforms)
cores;
testDriver = with localPackages;
let testDriverScript = ./test-driver/test-driver.py;
in stdenv.mkDerivation {
name = "nixos-test-driver";
@ -101,8 +126,8 @@ let
machine.wait_until_serial_output('child "init" exited with exit value 0')
'';
makeTest = with buildPackages;
{ prefix, specs, basePkg, makeImage, startVM }:
makeTest = with localPackages;
{ prefix, specs, platforms, basePackages, makeImage, startVM }:
{ name ? "unnamed", testScript ? defaultTestScript,
# Skip linting (mainly intended for faster dev cycles)
skipLint ? false, ... }@t:
@ -113,7 +138,7 @@ let
buildVM = vmName:
{ config, inputs, env ? { }, extraPaths ? [ ] }:
let
storeTarball = buildPackages.runCommand "store" { } ''
storeTarball = localPackages.runCommand "store" { } ''
mkdir -p $out
tar cf "$out/store.tar" --absolute-names ${toString inputs} ${
toString extraPaths
@ -136,14 +161,13 @@ let
};
storeManifest = lib.mergeManifests (map addManifest inputs);
manifest = lib.mergeManifests (map addManifest
([ basePkg testPkgs.sotest-producer storeTarball ]
++ map testPkgs.genodeSources.depot [
"init"
"rtc_drv"
"vfs"
"cached_fs_rom"
]));
manifest = lib.mergeManifests (map addManifest (basePackages
++ [ testPkgs.sotest-producer storeTarball ]
++ map testPkgs.genodeSources.depot [
"init"
"vfs"
"cached_fs_rom"
]));
config' = "${
./test-wrapper.dhall
} (${config}) $(stat --format '%s' ${storeTarball}/store.tar) ${storeManifest} ${manifest}";
@ -155,7 +179,7 @@ let
image = makeImage vmName env' config';
startVM' = startVM vmName image;
in {
script = buildPackages.writeScriptBin "run-${vmName}-vm" startVM';
script = localPackages.writeScriptBin "run-${vmName}-vm" startVM';
config = lib.runDhallCommand (name + ".dhall") env' ''
${apps.dhall.program} <<< "${config'}" > $out
@ -246,16 +270,16 @@ let
test // { inherit nodes driver test; };
testList = let
f = platform:
let makeTest' = makeTest platform;
f = core:
let makeTest' = makeTest core;
in test:
if (test.constraints or (_: true)) platform.specs then {
name = platform.prefix + test.name;
if (test.constraints or (_: true)) core.specs then {
name = core.prefix + test.name;
value = makeTest' test;
} else
null;
in lib.lists.crossLists f [ platforms testFiles ];
in lib.lists.crossLists f [ cores' testFiles ];
in builtins.listToAttrs (builtins.filter (_: _ != null) testList)
@ -278,7 +302,7 @@ in builtins.listToAttrs (builtins.filter (_: _ != null) testList)
load = [ "hypervisor serial novga iommu" test.image.name ];
}) novaTests);
in buildPackages.stdenv.mkDerivation {
in localPackages.stdenv.mkDerivation {
name = "sotest";
buildCommand = ''
mkdir zip; cd zip
@ -288,7 +312,7 @@ in builtins.listToAttrs (builtins.filter (_: _ != null) testList)
(map (test: "cp ${test.image}/image.elf ${test.name}.image.elf")
allTests)}
mkdir -p $out/nix-support
${buildPackages.zip}/bin/zip "$out/binaries.zip" *
${localPackages.zip}/bin/zip "$out/binaries.zip" *
cat << EOF > "$out/project.json"
${builtins.toJSON projectCfg}
EOF

4
tests/solo5/default.nix

@ -19,7 +19,9 @@ in map solo5Test [
{
name = "multi";
machine = {
config = "${./.}/solo5.dhall";
config = "${./.}/solo5.dhall { isAarch64 = ${
if pkgs.stdenv.hostPlatform.isAarch64 then "True" else "False"
} }";
inputs = map genodeMake [ "app/ping" ] ++ (map genodeDepot [
"ram_block"
"nic_bridge"

33
tests/solo5/solo5.dhall

@ -29,16 +29,23 @@ let toSimple =
}
}
let tests
: Prelude.Map.Type Text Child.Type
= [ { mapKey = "quiet", mapValue = toSimple "quiet" }
, { mapKey = "hello", mapValue = toSimple "hello" }
, { mapKey = "globals", mapValue = toSimple "globals" }
, { mapKey = "fpu", mapValue = toSimple "fpu" }
, { mapKey = "time", mapValue = ./time.dhall }
, { mapKey = "blk", mapValue = ./blk.dhall }
, { mapKey = "net", mapValue = ./net.dhall }
, { mapKey = "net_2if", mapValue = ./net_2if.dhall }
]
in Test::{ children = tests }
in λ(params : { isAarch64 : Bool })
→ let tests
: Prelude.Map.Type Text Child.Type
= toMap
{ quiet = toSimple "quiet"
, hello = toSimple "hello"
, globals = toSimple "globals"
, time = ./time.dhall
, blk = ./blk.dhall
, net = ./net.dhall
, net_2if = ./net_2if.dhall
}
# ( if params.isAarch64
then Prelude.Map.empty Text Child.Type
else toMap { fpu = toSimple "fpu" }
)
in Test::{ children = tests }

Loading…
Cancel
Save