test: Add userspace tests
This commit is contained in:
@@ -0,0 +1,121 @@
|
||||
fs = import('fs')
|
||||
|
||||
assert(
|
||||
kconfig.get('CONFIG_BOOT_EFISTUB', 'n') == 'y',
|
||||
'CONFIG_KTEST depends on CONFIG_BOOT_EFISTUB',
|
||||
)
|
||||
|
||||
assert(
|
||||
target_machine.cpu_family() == 'x86_64',
|
||||
'CONFIG_KTEST is only supported on x86_64',
|
||||
)
|
||||
|
||||
# All userspace tests are a single executable, so they have to be idempotent.
|
||||
utest_init = executable(
|
||||
'init',
|
||||
sources: files(
|
||||
'user/lib/crt0.S',
|
||||
'user/lib/utest.c',
|
||||
'user/memory.c',
|
||||
'user/system.c',
|
||||
),
|
||||
include_directories: include_directories('../include'),
|
||||
c_args: [
|
||||
'-ffreestanding',
|
||||
'-nostdinc',
|
||||
'-fno-pic',
|
||||
'-fno-stack-protector',
|
||||
'-masm=intel',
|
||||
],
|
||||
link_args: [
|
||||
'-nostdlib',
|
||||
'-static',
|
||||
'-Wl,--no-dynamic-linker',
|
||||
'-Wl,-z,max-page-size=0x1000',
|
||||
'-Wl,-z,noexecstack',
|
||||
'-Wl,--build-id=none',
|
||||
],
|
||||
pie: false,
|
||||
)
|
||||
|
||||
test_initramfs = custom_target(
|
||||
'initramfs.tar',
|
||||
input: utest_init,
|
||||
output: 'initramfs.tar',
|
||||
command: [
|
||||
find_program('tar'),
|
||||
'--format=ustar',
|
||||
'-cf', '@OUTPUT@',
|
||||
'-C', '@OUTDIR@',
|
||||
'init',
|
||||
],
|
||||
)
|
||||
|
||||
# Try to find an OVMF.
|
||||
ovmf = get_option('ovmf')
|
||||
if ovmf == ''
|
||||
foreach path : [
|
||||
'/usr/share/qemu/ovmf-x86_64-4m.bin',
|
||||
'/usr/share/qemu/ovmf-x86_64.bin',
|
||||
'/usr/share/ovmf/OVMF.fd',
|
||||
'/usr/share/edk2/x64/OVMF.4m.fd',
|
||||
'/usr/share/edk2/x64/OVMF.fd',
|
||||
'/usr/share/edk2/ovmf/OVMF.fd',
|
||||
]
|
||||
if ovmf == '' and fs.is_file(path)
|
||||
ovmf = path
|
||||
endif
|
||||
endforeach
|
||||
endif
|
||||
assert(ovmf != '', 'CONFIG_KTEST needs an OVMF image, set it with -Dovmf=')
|
||||
|
||||
qemu = [
|
||||
find_program('qemu-system-x86_64'),
|
||||
'-M', 'q35',
|
||||
'-m', '512M',
|
||||
'-smp', '4',
|
||||
'-accel', 'kvm',
|
||||
'-accel', 'tcg',
|
||||
'-cpu', 'max',
|
||||
'-nic', 'none',
|
||||
'-display', 'none',
|
||||
'-monitor', 'none',
|
||||
'-serial', 'stdio',
|
||||
'-no-reboot',
|
||||
'-bios', ovmf,
|
||||
]
|
||||
|
||||
test_images = {
|
||||
'user': {
|
||||
'cmdline': 'init=/init initrd=/initramfs.tar',
|
||||
'files': [test_initramfs],
|
||||
},
|
||||
}
|
||||
|
||||
# Build an ESP with the cmdline file and an initramfs.
|
||||
foreach name, image : test_images
|
||||
conf = configure_file(
|
||||
input: 'cmdline.in',
|
||||
output: name + '.cmdline',
|
||||
configuration: {'CMDLINE': image['cmdline']},
|
||||
)
|
||||
|
||||
esp = [
|
||||
zinnia_efi.full_path() + '=EFI/BOOT/BOOTX64.EFI',
|
||||
conf.full_path() + '=EFI/zinnia/cmdline',
|
||||
]
|
||||
|
||||
foreach file : image['files']
|
||||
esp += file.full_path() + '=' + fs.name(file.full_path())
|
||||
endforeach
|
||||
|
||||
test(
|
||||
name,
|
||||
python,
|
||||
args: [files('run.py'), esp, '--', qemu],
|
||||
depends: [zinnia_efi, image['files']],
|
||||
protocol: 'tap',
|
||||
suite: 'qemu',
|
||||
timeout: 60,
|
||||
)
|
||||
endforeach
|
||||
Reference in New Issue
Block a user