xref: /kvm-unit-tests/riscv/efi/run (revision 734fe13536d0fc41185723c63bde17ec6364fa1d)
1a755990cSAndrew Jones#!/bin/bash
2a755990cSAndrew Jones
3a755990cSAndrew Jonesif [ $# -eq 0 ]; then
4a755990cSAndrew Jones	echo "Usage $0 TEST_CASE [QEMU_ARGS]"
5a755990cSAndrew Jones	exit 2
6a755990cSAndrew Jonesfi
7a755990cSAndrew Jones
8a755990cSAndrew Jonesif [ ! -f config.mak ]; then
9a755990cSAndrew Jones	echo "run './configure --enable-efi && make' first. See ./configure -h"
10a755990cSAndrew Jones	exit 2
11a755990cSAndrew Jonesfi
12a755990cSAndrew Jonessource config.mak
13a755990cSAndrew Jonessource scripts/arch-run.bash
14*734fe135SAndrew Jonessource scripts/vmm.bash
15*734fe135SAndrew Jones
16*734fe135SAndrew Jonesif [[ $(vmm_get_target) == "kvmtool" ]]; then
17*734fe135SAndrew Jones	echo "kvmtool does not support EFI tests."
18*734fe135SAndrew Jones	exit 2
19*734fe135SAndrew Jonesfi
20a755990cSAndrew Jones
21a755990cSAndrew Jonesif [ -f RISCV_VIRT_CODE.fd ]; then
22a755990cSAndrew Jones	DEFAULT_UEFI=RISCV_VIRT_CODE.fd
23a755990cSAndrew Jonesfi
24a755990cSAndrew Jones
25a755990cSAndrew JonesKERNEL_NAME=$1
26a755990cSAndrew Jones
27a755990cSAndrew Jones: "${EFI_SRC:=$TEST_DIR}"
28a755990cSAndrew Jones: "${EFI_UEFI:=$DEFAULT_UEFI}"
29a755990cSAndrew Jones: "${EFI_TEST:=efi-tests}"
30a755990cSAndrew Jones: "${EFI_CASE:=$(basename $KERNEL_NAME .efi)}"
31a755990cSAndrew Jones: "${EFI_TESTNAME:=$TESTNAME}"
32a755990cSAndrew Jones: "${EFI_TESTNAME:=$EFI_CASE}"
33a755990cSAndrew Jones: "${EFI_CASE_DIR:="$EFI_TEST/$EFI_TESTNAME"}"
34a755990cSAndrew Jones: "${EFI_VAR_GUID:=97ef3e03-7329-4a6a-b9ba-6c1fdcc5f823}"
35a755990cSAndrew Jones
36a755990cSAndrew Jonesif [ ! -f "$EFI_UEFI" ]; then
37a755990cSAndrew Jones	echo "UEFI firmware not found."
38a755990cSAndrew Jones	echo "Please specify the path with the env variable EFI_UEFI"
39a755990cSAndrew Jones	exit 2
40a755990cSAndrew Jonesfi
41a755990cSAndrew Jones
42a755990cSAndrew Jonesif [ "$EFI_USE_ACPI" = "y" ]; then
43a755990cSAndrew Jones	echo "ACPI not available"
44a755990cSAndrew Jones	exit 2
45a755990cSAndrew Jonesfi
46a755990cSAndrew Jones
47a755990cSAndrew Jones# Remove the TEST_CASE from $@
48a755990cSAndrew Jonesshift 1
49a755990cSAndrew Jones
50a755990cSAndrew Jones# Fish out the arguments for the test, they should be the next string
51a755990cSAndrew Jones# after the "-append" option
52a755990cSAndrew Jonesqemu_args=()
53a755990cSAndrew Jonescmd_args=()
54a755990cSAndrew Joneswhile (( "$#" )); do
55a755990cSAndrew Jones	if [ "$1" = "-append" ]; then
560ebc1af6SNicholas Piggin		cmd_args=("$2")
57a755990cSAndrew Jones		shift 2
58a755990cSAndrew Jones	else
59a755990cSAndrew Jones		qemu_args+=("$1")
60a755990cSAndrew Jones		shift 1
61a755990cSAndrew Jones	fi
62a755990cSAndrew Jonesdone
63a755990cSAndrew Jones
64a755990cSAndrew Jonesif [ "$EFI_CASE" = "_NO_FILE_4Uhere_" ]; then
65a755990cSAndrew Jones	EFI_CASE_DIR="$EFI_TEST/dummy"
66a755990cSAndrew Jones	mkdir -p "$EFI_CASE_DIR"
67a755990cSAndrew Jones	$TEST_DIR/run \
68a755990cSAndrew Jones		$EFI_CASE \
69a755990cSAndrew Jones		-machine pflash0=pflash0 \
70a755990cSAndrew Jones		-blockdev node-name=pflash0,driver=file,read-only=on,filename="$EFI_UEFI" \
71a755990cSAndrew Jones		-drive file.dir="$EFI_CASE_DIR/",file.driver=vvfat,file.rw=on,format=raw,if=virtio \
72a755990cSAndrew Jones		"${qemu_args[@]}"
73a755990cSAndrew Jones	exit
74a755990cSAndrew Jonesfi
75a755990cSAndrew Jones
76a755990cSAndrew Jonesuefi_shell_run()
77a755990cSAndrew Jones{
78a755990cSAndrew Jones	mkdir -p "$EFI_CASE_DIR"
79a755990cSAndrew Jones	cp "$EFI_SRC/$EFI_CASE.efi" "$EFI_CASE_DIR/"
80a755990cSAndrew Jones	echo "@echo -off" > "$EFI_CASE_DIR/startup.nsh"
81a755990cSAndrew Jones	if [ "$EFI_USE_ACPI" != "y" ]; then
82a755990cSAndrew Jones		qemu_args+=(-machine acpi=off)
83a755990cSAndrew Jones		FDT_BASENAME="dtb"
84a755990cSAndrew Jones		UEFI_SHELL_RUN=y $TEST_DIR/run \
85a755990cSAndrew Jones			-machine pflash0=pflash0 \
86a755990cSAndrew Jones			-blockdev node-name=pflash0,driver=file,read-only=on,filename="$EFI_UEFI" \
87a755990cSAndrew Jones			-machine dumpdtb="$EFI_CASE_DIR/$FDT_BASENAME" \
88a755990cSAndrew Jones			"${qemu_args[@]}"
89a755990cSAndrew Jones		echo "setvar fdtfile -guid $EFI_VAR_GUID -rt =L\"$FDT_BASENAME\""  >> "$EFI_CASE_DIR/startup.nsh"
90a755990cSAndrew Jones	fi
91a755990cSAndrew Jones	echo "$EFI_CASE.efi" "${cmd_args[@]}" >> "$EFI_CASE_DIR/startup.nsh"
92a755990cSAndrew Jones
93a755990cSAndrew Jones	UEFI_SHELL_RUN=y $TEST_DIR/run \
94a755990cSAndrew Jones		-machine pflash0=pflash0 \
95a755990cSAndrew Jones		-blockdev node-name=pflash0,driver=file,read-only=on,filename="$EFI_UEFI" \
96a755990cSAndrew Jones		-drive file.dir="$EFI_CASE_DIR/",file.driver=vvfat,file.rw=on,format=raw,if=virtio \
97a755990cSAndrew Jones		"${qemu_args[@]}"
98a755990cSAndrew Jones}
99a755990cSAndrew Jones
100a755990cSAndrew Jonesif [ "$EFI_DIRECT" = "y" ]; then
101a755990cSAndrew Jones	if [ "$EFI_USE_ACPI" != "y" ]; then
102a755990cSAndrew Jones		qemu_args+=(-machine acpi=off)
103a755990cSAndrew Jones	fi
104a755990cSAndrew Jones	$TEST_DIR/run \
105a755990cSAndrew Jones		$KERNEL_NAME \
1067f01fa71SNicholas Piggin		-append "$(basename $KERNEL_NAME) ${cmd_args[*]}" \
107a755990cSAndrew Jones		-machine pflash0=pflash0 \
108a755990cSAndrew Jones		-blockdev node-name=pflash0,driver=file,read-only=on,filename="$EFI_UEFI" \
109a755990cSAndrew Jones		"${qemu_args[@]}"
110a755990cSAndrew Joneselse
111a755990cSAndrew Jones	uefi_shell_run
112a755990cSAndrew Jonesfi
113