xref: /kvm-unit-tests/arm/efi/run (revision bd93a9c615137ea5f6fea8d57b09ab69b57e05b2)
1#!/bin/bash
2
3if [ $# -eq 0 ]; then
4	echo "Usage $0 TEST_CASE [QEMU_ARGS]"
5	exit 2
6fi
7
8if [ ! -f config.mak ]; then
9	echo "run './configure --enable-efi && make' first. See ./configure -h"
10	exit 2
11fi
12source config.mak
13source scripts/arch-run.bash
14source scripts/vmm.bash
15
16vmm_check_supported
17
18if [ -f /usr/share/qemu-efi-aarch64/QEMU_EFI.fd ]; then
19	DEFAULT_UEFI=/usr/share/qemu-efi-aarch64/QEMU_EFI.fd
20elif [ -f /usr/share/edk2/aarch64/QEMU_EFI.silent.fd ]; then
21	DEFAULT_UEFI=/usr/share/edk2/aarch64/QEMU_EFI.silent.fd
22fi
23
24KERNEL_NAME=$1
25
26: "${EFI_SRC:=$TEST_DIR}"
27: "${EFI_UEFI:=$DEFAULT_UEFI}"
28: "${EFI_TEST:=efi-tests}"
29: "${EFI_CASE:=$(basename $KERNEL_NAME .efi)}"
30: "${EFI_TESTNAME:=$TESTNAME}"
31: "${EFI_TESTNAME:=$EFI_CASE}"
32: "${EFI_CASE_DIR:="$EFI_TEST/$EFI_TESTNAME"}"
33: "${EFI_VAR_GUID:=97ef3e03-7329-4a6a-b9ba-6c1fdcc5f823}"
34
35if [ ! -f "$EFI_UEFI" ]; then
36	echo "UEFI firmware not found."
37	echo "Please specify the path with the env variable EFI_UEFI"
38	exit 2
39fi
40
41# Remove the TEST_CASE from $@
42shift 1
43
44# Fish out the arguments for the test, they should be the next string
45# after the "-append" option
46qemu_args=()
47cmd_args=()
48while (( "$#" )); do
49	if [ "$1" = "-append" ]; then
50		cmd_args=("$2")
51		shift 2
52	else
53		qemu_args+=("$1")
54		shift 1
55	fi
56done
57if [ "$EFI_USE_ACPI" != "y" ]; then
58	qemu_args+=(-machine acpi=off)
59fi
60
61if [ "$EFI_CASE" = "_NO_FILE_4Uhere_" ]; then
62	EFI_CASE_DIR="$EFI_TEST/dummy"
63	mkdir -p "$EFI_CASE_DIR"
64	$TEST_DIR/run \
65		$EFI_CASE \
66		-bios "$EFI_UEFI" \
67		-drive file.dir="$EFI_CASE_DIR/",file.driver=vvfat,file.rw=on,format=raw,if=virtio \
68		"${qemu_args[@]}"
69	exit
70fi
71
72uefi_shell_run()
73{
74	mkdir -p "$EFI_CASE_DIR"
75	cp "$EFI_SRC/$EFI_CASE.efi" "$EFI_CASE_DIR/"
76	echo "@echo -off" > "$EFI_CASE_DIR/startup.nsh"
77	if [ "$EFI_USE_ACPI" != "y" ]; then
78		FDT_BASENAME="dtb"
79		UEFI_SHELL_RUN=y $TEST_DIR/run -machine dumpdtb="$EFI_CASE_DIR/$FDT_BASENAME" "${qemu_args[@]}"
80		echo "setvar fdtfile -guid $EFI_VAR_GUID -rt =L\"$FDT_BASENAME\""  >> "$EFI_CASE_DIR/startup.nsh"
81	fi
82	echo "$EFI_CASE.efi" "${cmd_args[@]}" >> "$EFI_CASE_DIR/startup.nsh"
83
84	UEFI_SHELL_RUN=y $TEST_DIR/run \
85		-bios "$EFI_UEFI" \
86		-drive file.dir="$EFI_CASE_DIR/",file.driver=vvfat,file.rw=on,format=raw,if=virtio \
87		"${qemu_args[@]}"
88}
89
90if [ "$EFI_DIRECT" = "y" ]; then
91	$TEST_DIR/run \
92		$KERNEL_NAME \
93		-append "$(basename $KERNEL_NAME) ${cmd_args[*]}" \
94		-bios "$EFI_UEFI" \
95		"${qemu_args[@]}"
96else
97	uefi_shell_run
98fi
99