123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- import os
- import time
- import infra.basetest
- class TestJailhouse(infra.basetest.BRTest):
- # This test uses a specific configuration, mainly for matching the
- # requirements of the Jailhouse Qemu inmate demo. We also use the
- # Linux kernel from Siemens, which includes patches for
- # Jailhouse. Finally, we use the kernel config from
- # board/qemu/aarch64-virt rather than the Kernel defconfig, for
- # faster build (as it enable less components, but includes
- # everything needed for this test).
- kernel_ver = "eb6927f7eea77f823b96c0c22ad9d4a2d7ffdfce"
- kernel_url = \
- f"$(call github,siemens,linux,{kernel_ver})/linux-{kernel_ver}.tar.gz"
- config = \
- f"""
- BR2_aarch64=y
- BR2_TOOLCHAIN_EXTERNAL=y
- BR2_TARGET_GENERIC_GETTY_PORT="ttyAMA0"
- BR2_LINUX_KERNEL=y
- BR2_LINUX_KERNEL_CUSTOM_TARBALL=y
- BR2_LINUX_KERNEL_CUSTOM_TARBALL_LOCATION="{kernel_url}"
- BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y
- BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="board/qemu/aarch64-virt/linux.config"
- BR2_PACKAGE_JAILHOUSE=y
- BR2_TARGET_ROOTFS_EXT2=y
- BR2_TARGET_ROOTFS_EXT2_4=y
- # BR2_TARGET_ROOTFS_TAR is not set
- """
- def test_run(self):
- drive = os.path.join(self.builddir, "images", "rootfs.ext4")
- kern = os.path.join(self.builddir, "images", "Image")
- # Qemu option and Kernel args are taken from Jailhouse demo. See:
- # https://github.com/siemens/jailhouse/blob/master/README.md
- # We also add oops=panic to improve the test coverage.
- self.emulator.boot(arch="aarch64",
- kernel=kern,
- kernel_cmdline=["root=/dev/vda console=ttyAMA0 mem=768M oops=panic"],
- options=["-M", "virt,gic-version=3,virtualization=on,its=off",
- "-cpu", "cortex-a57",
- "-m", "1G",
- "-smp", "16",
- "-drive", f"file={drive},if=none,format=raw,id=hd0",
- "-device", "virtio-blk-device,drive=hd0"])
- self.emulator.login()
- # Check the program can execute.
- self.assertRunOk("jailhouse --version")
- # Load the kernel module.
- self.assertRunOk("modprobe jailhouse")
- # Check the device is present.
- self.assertRunOk("ls -al /dev/jailhouse")
- # Load the cell config this this qemu test.
- self.assertRunOk("jailhouse enable /etc/jailhouse/qemu-arm64.cell")
- # Dump the jailhouse console, and check we see its
- # initialization string.
- out, ret = self.emulator.run("jailhouse console")
- self.assertEqual(ret, 0)
- self.assertIn("Initializing Jailhouse hypervisor", "\n".join(out))
- # Create the cell.
- cell_cfg = "/etc/jailhouse/qemu-arm64-inmate-demo.cell"
- cmd = f"jailhouse cell create {cell_cfg}"
- self.assertRunOk(cmd)
- # Load the demo image.
- cell_name = "inmate-demo"
- img = "/usr/libexec/jailhouse/demos/gic-demo.bin"
- cmd = f"jailhouse cell load {cell_name} {img}"
- self.assertRunOk(cmd)
- # List Jailhouse cells and check we see the one we loaded.
- out, ret = self.emulator.run("jailhouse cell list")
- self.assertEqual(ret, 0)
- self.assertIn(cell_name, "\n".join(out))
- # We should also see our cell in sysfs.
- cmd = "cat /sys/devices/jailhouse/cells/1/name"
- out, ret = self.emulator.run(cmd)
- self.assertEqual(ret, 0)
- self.assertEqual(out[0], cell_name)
- # Start the cell.
- self.assertRunOk(f"jailhouse cell start {cell_name}")
- # Let the demo cell run for few seconds...
- time.sleep(3)
- # Stop and unload the cell.
- self.assertRunOk(f"jailhouse cell shutdown {cell_name}")
- self.assertRunOk(f"jailhouse cell destroy {cell_name}")
- # Stop and unload jailhouse.
- self.assertRunOk("jailhouse disable")
- self.assertRunOk("modprobe -r jailhouse")
|