#!/usr/bin/env bash

L4IMAGE="${OBJ_BASE}/source/tool/bin/l4image"
MAKECONF="${OBJ_BASE}/source/tool/bin/makeconf"

. <("$MAKECONF" "$OBJ_BASE" ARCH CPU BITS)

: ${ARCH:=${MAKECONF_ARCH}}; export ARCH
: ${CPU:=${MAKECONF_CPU}}; export CPU
: ${BITS:=${MAKECONF_BITS}}; export BITS

L4_SYSTEM="${ARCH}_${CPU}"

if [[ ( "${ARCH}" == "amd64" || "${ARCH}" == "x86" ) && -z "${QEMU_IMAGE_TYPE}" ]] ; then

    # Trigger rebuild on binary "bootstrap" if necessary
    BOOTSTRAP_BIN="${OBJ_BASE}/bin/${L4_SYSTEM}/plain/bootstrap"
    "$(dirname $0)/_platform_rebuild.pl" "$BOOTSTRAP_BIN" || exit 1

    source <("$MAKECONF" "$OBJ_BASE" QEMU_PATH QEMU_OPTIONS MODULE_SEARCH_PATH BUILDDIR_SEARCHPATH)
    export QEMU="$MAKECONF_QEMU_PATH"
    export QEMU_OPTIONS="$MAKECONF_QEMU_OPTIONS"
    export SEARCHPATH="${MODULE_SEARCH_PATH}:${SEARCHPATH}:${MAKECONF_MODULE_SEARCH_PATH}:${MAKECONF_BUILDDIR_SEARCHPATH}"
    export L4DIR="$(realpath "${OBJ_BASE}/source")"

    exec "${L4DIR}/tool/bin/qemu-x86-launch" "${MODULES_LIST}" "${ENTRY:-${E}}"
fi

. <("$MAKECONF" "$OBJ_BASE" QEMU_IMAGE_TYPE)

: ${QEMU_IMAGE_TYPE:=${MAKECONF_QEMU_IMAGE_TYPE:-elfimage}}

if [[ -z "$TARGET_IMAGE" ]]; then
    case "$QEMU_IMAGE_TYPE" in
      rawimage) suffix=.raw;;
      elfimage) suffix=.elf;;
      efiimage) suffix=.efi;;
      uimage) suffix=.uimage;;
      *) suffix=;;
    esac
    export TARGET_IMAGE="$(mktemp --tmpdir "bootstrap-qemu-XXXXXXXXXX$suffix")"
    trap 'rm $TARGET_IMAGE' EXIT
fi

"$(dirname $0)"/"$QEMU_IMAGE_TYPE" || exit $?

# Workaround: L4image can't read qemu cmdline from efidisk
if [[ "$QEMU_IMAGE_TYPE" == "efidisk" ]]; then
    # Find efiimage
    efiimage="${TARGET_IMAGE%.efidisk}.efi"

    # Set L4IMAGE_FILE to efidisk
    export L4IMAGE_FILE="$TARGET_IMAGE"

    # Boot with cmdline from efi image
    eval "$($L4IMAGE -i $efiimage launch --show-cmd-raw)"; exit $?
fi

$L4IMAGE --verbose -i "$TARGET_IMAGE" launch; exit $?
