poky/meta/lib/oeqa/selftest/cases/uki.py
Mikko Rapeli 5fe59b3144 oeqa selftest uki.py: add tests for uki.bbclass
Tests builds and boots qemu into uki binary with systemd and sysvinit.
Due to depedency to x86 specific ovmf UEFI firmware, tests
are specific to x86 curently. UEFI firmware for ARM can be generated
via qemuarm64-secureboot machine in meta-arm and similar tests
on qemu will pass.

(From OE-Core rev: 8a3cb17876dbcaf07696a4bcd454e2f9a444fb1b)

Signed-off-by: Mikko Rapeli <mikko.rapeli@linaro.org>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
2024-10-25 15:12:22 +01:00

143 lines
6.1 KiB
Python

# Based on runqemu.py test file
#
# Copyright (c) 2017 Wind River Systems, Inc.
#
# SPDX-License-Identifier: MIT
#
from oeqa.selftest.case import OESelftestTestCase
from oeqa.utils.commands import bitbake, runqemu, get_bb_var
from oeqa.core.decorator.data import skipIfNotArch
from oeqa.core.decorator import OETestTag
import oe.types
class UkiTest(OESelftestTestCase):
"""Boot Unified Kernel Image (UKI) generated with uki.bbclass on UEFI firmware (omvf/edk2)"""
@skipIfNotArch(['i586', 'i686', 'x86_64'])
@OETestTag("runqemu")
def test_uki_boot_systemd(self):
"""Build and boot into UEFI firmware (omvf/edk2), systemd-boot, initrd without systemd, rootfs with systemd"""
image = "core-image-minimal"
runqemu_params = get_bb_var('TEST_RUNQEMUPARAMS', image) or ""
cmd = "runqemu %s nographic serial wic ovmf" % (runqemu_params)
if oe.types.qemu_use_kvm(self.td.get('QEMU_USE_KVM', 0), self.td["TARGET_ARCH"]):
cmd += " kvm"
self.write_config("""
# efi firmware must load systemd-boot, not grub
EFI_PROVIDER = "systemd-boot"
# image format must be wic, needs esp partition for firmware etc
IMAGE_FSTYPES:pn-%s:append = " wic"
WKS_FILE = "efi-uki-bootdisk.wks.in"
# efi, uki and systemd features must be enabled
INIT_MANAGER = "systemd"
MACHINE_FEATURES:append = " efi"
IMAGE_CLASSES:append:pn-core-image-minimal = " uki"
# uki embeds also an initrd
INITRAMFS_IMAGE = "core-image-minimal-initramfs"
# runqemu must not load kernel separately, it's in the uki
QB_KERNEL_ROOT = ""
QB_DEFAULT_KERNEL = "none"
# boot command line provided via uki, not via bootloader
UKI_CMDLINE = "rootwait root=LABEL=root console=${KERNEL_CONSOLE}"
# disable kvm, breaks boot
QEMU_USE_KVM = ""
IMAGE_CLASSES:remove = 'testimage'
""" % (image))
uki_filename = get_bb_var('UKI_FILENAME', image)
bitbake(image + " ovmf")
with runqemu(image, ssh=False, launch_cmd=cmd) as qemu:
self.assertTrue(qemu.runner.logged, "Failed: %s" % cmd)
# Verify from efivars that firmware was:
# x86_64, qemux86_64, ovmf = edk2
cmd = "echo $( cat /sys/firmware/efi/efivars/LoaderFirmwareInfo-4a67b082-0a4c-41cf-b6c7-440b29bb8c4f ) | grep 'EDK II'"
status, output = qemu.run_serial(cmd)
self.assertEqual(1, status, 'Failed to run command "%s": %s' % (cmd, output))
# Check that systemd-boot was the loader
cmd = "echo $( cat /sys/firmware/efi/efivars/LoaderInfo-4a67b082-0a4c-41cf-b6c7-440b29bb8c4f ) | grep systemd-boot"
status, output = qemu.run_serial(cmd)
self.assertEqual(1, status, 'Failed to run command "%s": %s' % (cmd, output))
# Check that systemd-stub was used
cmd = "echo $( cat /sys/firmware/efi/efivars/StubInfo-4a67b082-0a4c-41cf-b6c7-440b29bb8c4f ) | grep systemd-stub"
status, output = qemu.run_serial(cmd)
self.assertEqual(1, status, 'Failed to run command "%s": %s' % (cmd, output))
# Check that the compiled uki file was booted into
cmd = "echo $( cat /sys/firmware/efi/efivars/LoaderEntrySelected-4a67b082-0a4c-41cf-b6c7-440b29bb8c4f ) | grep '%s'" % (uki_filename)
status, output = qemu.run_serial(cmd)
self.assertEqual(1, status, 'Failed to run command "%s": %s' % (cmd, output))
@skipIfNotArch(['i586', 'i686', 'x86_64'])
@OETestTag("runqemu")
def test_uki_sysvinit(self):
"""Build and boot into UEFI firmware (omvf/edk2), systemd-boot, initrd with sysvinit, rootfs with sysvinit"""
config = """
# efi firmware must load systemd-boot, not grub
EFI_PROVIDER = "systemd-boot"
# image format must be wic, needs esp partition for firmware etc
IMAGE_FSTYPES:pn-core-image-base:append = " wic"
WKS_FILE = "efi-uki-bootdisk.wks.in"
# efi, uki and systemd features must be enabled
MACHINE_FEATURES:append = " efi"
DISTRO_FEATURES_NATIVE:append = " systemd"
IMAGE_CLASSES:append:pn-core-image-base = " uki"
# uki embeds also an initrd, no systemd or udev
INITRAMFS_IMAGE = "core-image-initramfs-boot"
# runqemu must not load kernel separately, it's in the uki
QB_KERNEL_ROOT = ""
QB_DEFAULT_KERNEL = "none"
# boot command line provided via uki, not via bootloader
UKI_CMDLINE = "rootwait root=LABEL=root console=${KERNEL_CONSOLE}"
# disable kvm, breaks boot
QEMU_USE_KVM = ""
IMAGE_CLASSES:remove = 'testimage'
"""
self.append_config(config)
bitbake('core-image-base ovmf')
runqemu_params = get_bb_var('TEST_RUNQEMUPARAMS', 'core-image-base') or ""
uki_filename = get_bb_var('UKI_FILENAME', 'core-image-base')
self.remove_config(config)
with runqemu('core-image-base', ssh=False,
runqemuparams='%s slirp nographic ovmf' % (runqemu_params), image_fstype='wic') as qemu:
# Verify from efivars that firmware was:
# x86_64, qemux86_64, ovmf = edk2
cmd = "echo $( cat /sys/firmware/efi/efivars/LoaderFirmwareInfo-4a67b082-0a4c-41cf-b6c7-440b29bb8c4f ) | grep 'EDK II'"
status, output = qemu.run_serial(cmd)
self.assertEqual(1, status, 'Failed to run command "%s": %s' % (cmd, output))
# Check that systemd-boot was the loader
cmd = "echo $( cat /sys/firmware/efi/efivars/LoaderInfo-4a67b082-0a4c-41cf-b6c7-440b29bb8c4f ) | grep systemd-boot"
status, output = qemu.run_serial(cmd)
self.assertEqual(1, status, 'Failed to run command "%s": %s' % (cmd, output))
# Check that systemd-stub was used
cmd = "echo $( cat /sys/firmware/efi/efivars/StubInfo-4a67b082-0a4c-41cf-b6c7-440b29bb8c4f ) | grep systemd-stub"
status, output = qemu.run_serial(cmd)
self.assertEqual(1, status, 'Failed to run command "%s": %s' % (cmd, output))
# Check that the compiled uki file was booted into
cmd = "echo $( cat /sys/firmware/efi/efivars/LoaderEntrySelected-4a67b082-0a4c-41cf-b6c7-440b29bb8c4f ) | grep '%s'" % (uki_filename)
status, output = qemu.run_serial(cmd)
self.assertEqual(1, status, 'Failed to run command "%s": %s' % (cmd, output))