| #!/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 |
| |
| if [ -f RISCV_VIRT_CODE.fd ]; then |
| DEFAULT_UEFI=RISCV_VIRT_CODE.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 |
| |
| if [ "$EFI_USE_ACPI" = "y" ]; then |
| echo "ACPI not available" |
| 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_CASE" = "_NO_FILE_4Uhere_" ]; then |
| EFI_CASE_DIR="$EFI_TEST/dummy" |
| mkdir -p "$EFI_CASE_DIR" |
| $TEST_DIR/run \ |
| $EFI_CASE \ |
| -machine pflash0=pflash0 \ |
| -blockdev node-name=pflash0,driver=file,read-only=on,filename="$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 |
| qemu_args+=(-machine acpi=off) |
| FDT_BASENAME="dtb" |
| UEFI_SHELL_RUN=y $TEST_DIR/run \ |
| -machine pflash0=pflash0 \ |
| -blockdev node-name=pflash0,driver=file,read-only=on,filename="$EFI_UEFI" \ |
| -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 \ |
| -machine pflash0=pflash0 \ |
| -blockdev node-name=pflash0,driver=file,read-only=on,filename="$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 |
| if [ "$EFI_USE_ACPI" != "y" ]; then |
| qemu_args+=(-machine acpi=off) |
| fi |
| $TEST_DIR/run \ |
| $KERNEL_NAME \ |
| -append "$(basename $KERNEL_NAME) ${cmd_args[*]}" \ |
| -machine pflash0=pflash0 \ |
| -blockdev node-name=pflash0,driver=file,read-only=on,filename="$EFI_UEFI" \ |
| "${qemu_args[@]}" |
| else |
| uefi_shell_run |
| fi |