#!/bin/bash

if [ $# -eq 0 ]; then
	echo "Usage $0 TEST_CASE [QEMU_ARGS]"
	exit 2
fi

if [ ! -f config.mak ]; then
	echo "run './configure --enable-efi && make' first. See ./configure -h"
	exit 2
fi
source config.mak
source scripts/arch-run.bash
source scripts/vmm.bash

vmm_check_supported

if [[ $(vmm_get_target) == "kvmtool" ]]; then
	echo "kvmtool does not support EFI tests."
	exit 2
fi

if [ -f /usr/share/qemu-efi-aarch64/QEMU_EFI.fd ]; then
	DEFAULT_UEFI=/usr/share/qemu-efi-aarch64/QEMU_EFI.fd
elif [ -f /usr/share/edk2/aarch64/QEMU_EFI.silent.fd ]; then
	DEFAULT_UEFI=/usr/share/edk2/aarch64/QEMU_EFI.silent.fd
fi

KERNEL_NAME=$1

: "${EFI_SRC:=$TEST_DIR}"
: "${EFI_UEFI:=$DEFAULT_UEFI}"
: "${EFI_TEST:=efi-tests}"
: "${EFI_CASE:=$(basename $KERNEL_NAME .efi)}"
: "${EFI_TESTNAME:=$TESTNAME}"
: "${EFI_TESTNAME:=$EFI_CASE}"
: "${EFI_CASE_DIR:="$EFI_TEST/$EFI_TESTNAME"}"
: "${EFI_VAR_GUID:=97ef3e03-7329-4a6a-b9ba-6c1fdcc5f823}"

if [ ! -f "$EFI_UEFI" ]; then
	echo "UEFI firmware not found."
	echo "Please specify the path with the env variable EFI_UEFI"
	exit 2
fi

# Remove the TEST_CASE from $@
shift 1

# Fish out the arguments for the test, they should be the next string
# after the "-append" option
qemu_args=()
cmd_args=()
while (( "$#" )); do
	if [ "$1" = "-append" ]; then
		cmd_args=("$2")
		shift 2
	else
		qemu_args+=("$1")
		shift 1
	fi
done
if [ "$EFI_USE_ACPI" != "y" ]; then
	qemu_args+=(-machine acpi=off)
fi

if [ "$EFI_CASE" = "_NO_FILE_4Uhere_" ]; then
	EFI_CASE_DIR="$EFI_TEST/dummy"
	mkdir -p "$EFI_CASE_DIR"
	$TEST_DIR/run \
		$EFI_CASE \
		-bios "$EFI_UEFI" \
		-drive file.dir="$EFI_CASE_DIR/",file.driver=vvfat,file.rw=on,format=raw,if=virtio \
		"${qemu_args[@]}"
	exit
fi

uefi_shell_run()
{
	mkdir -p "$EFI_CASE_DIR"
	cp "$EFI_SRC/$EFI_CASE.efi" "$EFI_CASE_DIR/"
	echo "@echo -off" > "$EFI_CASE_DIR/startup.nsh"
	if [ "$EFI_USE_ACPI" != "y" ]; then
		FDT_BASENAME="dtb"
		UEFI_SHELL_RUN=y $TEST_DIR/run -machine dumpdtb="$EFI_CASE_DIR/$FDT_BASENAME" "${qemu_args[@]}"
		echo "setvar fdtfile -guid $EFI_VAR_GUID -rt =L\"$FDT_BASENAME\""  >> "$EFI_CASE_DIR/startup.nsh"
	fi
	echo "$EFI_CASE.efi" "${cmd_args[@]}" >> "$EFI_CASE_DIR/startup.nsh"

	UEFI_SHELL_RUN=y $TEST_DIR/run \
		-bios "$EFI_UEFI" \
		-drive file.dir="$EFI_CASE_DIR/",file.driver=vvfat,file.rw=on,format=raw,if=virtio \
		"${qemu_args[@]}"
}

if [ "$EFI_DIRECT" = "y" ]; then
	$TEST_DIR/run \
		$KERNEL_NAME \
		-append "$(basename $KERNEL_NAME) ${cmd_args[*]}" \
		-bios "$EFI_UEFI" \
		"${qemu_args[@]}"
else
	uefi_shell_run
fi
