#!/bin/bash
#
# Handle running OE images standalone with QEMU
#
# Copyright (C) 2006-2011 Linux Foundation
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

usage() {
    MYNAME=`basename $0`
    echo ""
    echo "Usage: you can run this script with any valid combination"
    echo "of the following environment variables (in any order):"
    echo "  QEMUARCH - the qemu machine architecture to use"
    echo "  KERNEL - the kernel image file to use"
    echo "  ROOTFS - the rootfs image file or nfsroot directory to use"
    echo "  MACHINE - the machine name (optional, autodetected from KERNEL filename if unspecified)"
    echo "  RAMFS - boot a ramfs-based image"
    echo "  ISO - boot an ISO image"
    echo "  VM - boot a virtual machine image (= a file representing a full disk with boot loader)"
    echo "  Simplified QEMU command-line options can be passed with:"
    echo "    nographic - disables video console"
    echo "    serial - enables a serial console on /dev/ttyS0"
    echo "    kvm - enables KVM when running qemux86/qemux86-64 (VT-capable CPU required)"
    echo "    kvm-vhost - enables KVM with vhost support when running qemux86/qemux86-64 (VT-capable CPU required)"
    echo "    publicvnc - enable a VNC server open to all hosts"
    echo "  qemuparams=\"xyz\" - specify custom parameters to QEMU"
    echo "  bootparams=\"xyz\" - specify custom kernel parameters during boot"
    echo ""
    echo "Examples:"
    echo "  $MYNAME qemuarm"
    echo "  $MYNAME qemux86-64 core-image-sato ext4"
    echo "  $MYNAME path/to/bzImage-qemux86.bin path/to/nfsrootdir/ serial"
    echo "  $MYNAME qemux86 ramfs"
    echo "  $MYNAME qemux86 iso"
    echo "  $MYNAME qemux86 qemuparams=\"-m 256\""
    echo "  $MYNAME qemux86 bootparams=\"psplash=false\""
    echo "  $MYNAME path/to/<image>-<machine>.vmdk"
    exit 1
}

if [ "x$1" = "x" ]; then
    usage
fi

error() {
    echo "Error: "$*
    usage
}

MACHINE=${MACHINE:=""}
KERNEL=${KERNEL:=""}
ROOTFS=${ROOTFS:=""}
VM=${VM:=""}
FSTYPE=${FSTYPE:=""}
LAZY_ROOTFS=""
SCRIPT_QEMU_OPT=""
SCRIPT_QEMU_EXTRA_OPT=""
SCRIPT_KERNEL_OPT=""
SERIALSTDIO=""
TCPSERIAL_PORTNUM=""
KVM_ENABLED="no"
KVM_ACTIVE="no"
VHOST_ENABLED="no"
VHOST_ACTIVE="no"

# Determine whether the file is a kernel or QEMU image, and set the
# appropriate variables
process_filename() {
    filename=$1

    # Extract the filename extension
    EXT=`echo $filename | awk -F . '{ print \$NF }'`
    case /$EXT/ in
	/bin/)
		# A file ending in .bin is a kernel
		[ -z "$KERNEL" ] && KERNEL=$filename || \
		    error "conflicting KERNEL args [$KERNEL] and [$filename]"
		;;
	/ext[234]/|/jffs2/|/btrfs/)
		# A file ending in a supportted fs type is a rootfs image
		if [ -z "$FSTYPE" -o "$FSTYPE" = "$EXT" ]; then
		    FSTYPE=$EXT
		    ROOTFS=$filename
		else
		    error "conflicting FSTYPE types [$FSTYPE] and [$EXT]"
		fi
		;;
	/hddimg/|/hdddirect/|/vmdk/)
		FSTYPE=$EXT
		VM=$filename
		;;
	*)
		error "unknown file arg [$filename]"
		;;
    esac
}

# Parse command line args without requiring specific ordering. It's a
# bit more complex, but offers a great user experience.
while true; do
    arg=${1}
    case "$arg" in
        "qemux86" | "qemux86-64" | "qemuarm" | "qemuarm64" | "qemumips" | "qemumipsel" | \
        "qemumips64" | "qemush4"  | "qemuppc" | "qemumicroblaze" | "qemuzynq")
            [ -z "$MACHINE" -o "$MACHINE" = "$arg" ] && MACHINE=$arg || \
                error "conflicting MACHINE types [$MACHINE] and [$arg]"
            ;;
        "ext2" | "ext3" | "ext4" | "jffs2" | "nfs" | "btrfs" | "hddimg" | "hdddirect" )
            [ -z "$FSTYPE" -o "$FSTYPE" = "$arg" ] && FSTYPE=$arg || \
                error "conflicting FSTYPE types [$FSTYPE] and [$arg]"
            ;;
        "ramfs")
            FSTYPE=cpio.gz
            RAMFS=true
            ;;
        "iso")
	    FSTYPE=iso
	    ISOFS=true
	    ;;
        "nographic")
            SCRIPT_QEMU_OPT="$SCRIPT_QEMU_OPT -nographic"
            SCRIPT_KERNEL_OPT="$SCRIPT_KERNEL_OPT console=ttyS0"
            ;;
        "serial")
            SCRIPT_QEMU_OPT="$SCRIPT_QEMU_OPT -serial stdio"
            SCRIPT_KERNEL_OPT="$SCRIPT_KERNEL_OPT console=ttyS0"
            SERIALSTDIO="1"
            ;;
        "tcpserial="*)
            TCPSERIAL_PORTNUM=${arg##tcpserial=}
            ;;
	"biosdir="*)
            CUSTOMBIOSDIR="${arg##biosdir=}"
	    ;;
        "biosfilename="*)
            SCRIPT_QEMU_OPT="$SCRIPT_QEMU_OPT -bios ${arg##biosfilename=}"
            ;;
        "qemuparams="*)
            SCRIPT_QEMU_EXTRA_OPT="${arg##qemuparams=}"

            # Warn user if they try to specify serial or kvm options
            # to use simplified options instead
            serial_option=`expr "$SCRIPT_QEMU_EXTRA_OPT" : '.*\(-serial\)'`
            kvm_option=`expr "$SCRIPT_QEMU_EXTRA_OPT" : '.*\(-enable-kvm\)'`
            vga_option=`expr "$SCRIPT_QEMU_EXTRA_OPT" : '.*\(-vga\)'`
            [ ! -z "$serial_option" -o ! -z "$kvm_option" ] && \
                echo "Please use simplified serial or kvm options instead"
            ;;
        "bootparams="*)
            SCRIPT_KERNEL_OPT="$SCRIPT_KERNEL_OPT ${arg##bootparams=}"
            ;;
        "audio")
            if [ "x$MACHINE" = "xqemux86" -o "x$MACHINE" = "xqemux86-64" ]; then
                echo "Enabling audio in qemu."
                echo "Please install snd_intel8x0 or snd_ens1370 driver in linux guest."
                QEMU_AUDIO_DRV="alsa"
                SCRIPT_QEMU_OPT="$SCRIPT_QEMU_OPT -soundhw ac97,es1370"
            fi
            ;;
        "kvm")
            KVM_ENABLED="yes"
            KVM_CAPABLE=`grep -q 'vmx\|svm' /proc/cpuinfo && echo 1`
            ;;
        "kvm-vhost")
            KVM_ENABLED="yes"
            KVM_CAPABLE=`grep -q 'vmx\|svm' /proc/cpuinfo && echo 1`
            VHOST_ENABLED="yes"
            ;;
        "slirp")
            SLIRP_ENABLED="yes"
            ;;
        "publicvnc")
            SCRIPT_QEMU_OPT="$SCRIPT_QEMU_OPT -vnc 0.0.0.0:0"
            ;;
        *-image*)
            [ -z "$ROOTFS" ] || \
		error "conflicting ROOTFS args [$ROOTFS] and [$arg]"
            if [ -f "$arg" ]; then
                process_filename $arg
            elif [ -d "$arg" ]; then
                # Handle the case where the nfsroot dir has -image-
                # in the pathname
                echo "Assuming $arg is an nfs rootfs"
                FSTYPE=nfs
                ROOTFS=$arg
            else
                ROOTFS=$arg
                LAZY_ROOTFS="true"
            fi
            ;;
        "") break ;;
        *)
            # A directory name is an nfs rootfs
            if [ -d "$arg" ]; then
                echo "Assuming $arg is an nfs rootfs"
                if [ -z "$FSTYPE" -o "$FSTYPE" = "nfs" ]; then
                    FSTYPE=nfs
                else
                    error "conflicting FSTYPE types [$arg] and nfs"
                fi

                if [ -z "$ROOTFS" ]; then
                    ROOTFS=$arg
                else
                    error "conflicting ROOTFS args [$ROOTFS] and [$arg]"
                fi
            elif [ -f "$arg" ]; then
                process_filename $arg
            else
                error "unable to classify arg [$arg]"
            fi
            ;;
    esac
    shift
done

if [ ! -c /dev/net/tun ] ; then
	echo "TUN control device /dev/net/tun is unavailable; you may need to enable TUN (e.g. sudo modprobe tun)"
	exit 1
elif [ ! -w /dev/net/tun ] ; then
	echo "TUN control device /dev/net/tun is not writable, please fix (e.g. sudo chmod 666 /dev/net/tun)"
	exit 1
fi

# Report errors for missing combinations of options
if [ -z "$MACHINE" -a -z "$KERNEL" -a -z "$VM" ]; then
    error "you must specify at least a MACHINE, VM, or KERNEL argument"
fi
if [ "$FSTYPE" = "nfs" -a -z "$ROOTFS" ]; then
    error "NFS booting without an explicit ROOTFS path is not yet supported"
fi

if [ -z "$MACHINE" ]; then
    if [ "x$FSTYPE" = "xvmdk" ] || [ "x$FSTYPE" = "xhddimg" ] || [ "x$FSTYPE" = "xhdddirect" ]; then
        MACHINE=`basename $VM | sed -n 's/.*\(qemux86-64\|qemux86\|qemuarm64\|qemuarm\|qemumips64\|qemumips\|qemuppc\|qemush4\).*/\1/p'`
        if [ -z "$MACHINE" ]; then
            error "Unable to set MACHINE from image filename [$VM]"
        fi
        echo "Set MACHINE to [$MACHINE] based on image [$VM]"
    else
        MACHINE=`basename $KERNEL | sed -n 's/.*\(qemux86-64\|qemux86\|qemuarm64\|qemuarm\|qemumips64\|qemumips\|qemuppc\|qemush4\).*/\1/p'`
        if [ -z "$MACHINE" ]; then
            error "Unable to set MACHINE from kernel filename [$KERNEL]"
        fi
        echo "Set MACHINE to [$MACHINE] based on kernel [$KERNEL]"
    fi
fi

YOCTO_KVM_WIKI="https://wiki.yoctoproject.org/wiki/How_to_enable_KVM_for_Poky_qemu"
YOCTO_PARAVIRT_KVM_WIKI="https://wiki.yoctoproject.org/wiki/Running_an_x86_Yocto_Linux_image_under_QEMU_KVM"
# Detect KVM configuration
if [ "x$KVM_ENABLED" = "xyes" ]; then
    if [ -z "$KVM_CAPABLE" ]; then
        echo "You are trying to enable KVM on a cpu without VT support."
        echo "Remove kvm from the command-line, or refer"
        echo "$YOCTO_KVM_WIKI";
        exit 1;
    fi
    if [ "x$MACHINE" != "xqemux86" -a "x$MACHINE" != "xqemux86-64" ]; then
        echo "KVM only support x86 & x86-64. Remove kvm from the command-line";
        exit 1;
    fi
    if [ ! -e /dev/kvm ]; then
        echo "Missing KVM device. Have you inserted kvm modules?"
        echo "For further help see:"
        echo "$YOCTO_KVM_WIKI";
        exit 1;
    fi
    if [ -w /dev/kvm -a -r /dev/kvm ]; then
        SCRIPT_QEMU_OPT="$SCRIPT_QEMU_OPT -enable-kvm"
        KVM_ACTIVE="yes"
    else
        echo "You have no rights on /dev/kvm."
        echo "Please change the ownership of this file as described at:"
        echo "$YOCTO_KVM_WIKI";
        exit 1;
    fi
    if [ "x$VHOST_ENABLED" = "xyes" ]; then
        if [ ! -e /dev/vhost-net ]; then
            echo "Missing virtio net device. Have you inserted vhost-net module?"
            echo "For further help see:"
            echo "$YOCTO_PARAVIRT_KVM_WIKI";
            exit 1;
        fi

        if [ -w /dev/vhost-net -a -r /dev/vhost-net ]; then
            VHOST_ACTIVE="yes"
        else
            echo "You have no rights on /dev/vhost-net."
            echo "Please change the ownership of this file as described at:"
            echo "$YOCTO_KVM_WIKI";
            exit 1;
        fi
    fi
fi

machine2=`echo $MACHINE | tr 'a-z' 'A-Z' | sed 's/-/_/'`
# MACHINE is now set for all cases

# Defaults used when these vars need to be inferred
QEMUX86_DEFAULT_KERNEL=bzImage-qemux86.bin
QEMUX86_DEFAULT_FSTYPE=ext4

QEMUX86_64_DEFAULT_KERNEL=bzImage-qemux86-64.bin
QEMUX86_64_DEFAULT_FSTYPE=ext4

QEMUARM_DEFAULT_KERNEL=zImage-qemuarm.bin
QEMUARM_DEFAULT_FSTYPE=ext4

QEMUARM64_DEFAULT_KERNEL=Image-qemuarm64.bin
QEMUARM64_DEFAULT_FSTYPE=ext4

QEMUMIPS_DEFAULT_KERNEL=vmlinux-qemumips.bin
QEMUMIPS_DEFAULT_FSTYPE=ext4

QEMUMIPSEL_DEFAULT_KERNEL=vmlinux-qemumipsel.bin
QEMUMIPSEL_DEFAULT_FSTYPE=ext4

QEMUMIPS64_DEFAULT_KERNEL=vmlinux-qemumips64.bin
QEMUMIPS64_DEFAULT_FSTYPE=ext4

QEMUSH4_DEFAULT_KERNEL=vmlinux-qemumips.bin
QEMUSH4_DEFAULT_FSTYPE=ext4

QEMUPPC_DEFAULT_KERNEL=vmlinux-qemuppc.bin
QEMUPPC_DEFAULT_FSTYPE=ext4

QEMUMICROBLAZE_DEFAULT_KERNEL=linux.bin.ub
QEMUMICROBLAZE_DEFAULT_FSTYPE=cpio

QEMUZYNQ_DEFAULT_KERNEL=uImage
QEMUZYNQ_DEFAULT_FSTYPE=cpio

AKITA_DEFAULT_KERNEL=zImage-akita.bin
AKITA_DEFAULT_FSTYPE=jffs2

SPITZ_DEFAULT_KERNEL=zImage-spitz.bin
SPITZ_DEFAULT_FSTYPE=ext3

setup_path_vars() {
    if [ -z "$OE_TMPDIR" ] ; then
        PATHS_REQUIRED=true
    elif [ "$1" = "1" -a -z "$DEPLOY_DIR_IMAGE" ] ; then
        PATHS_REQUIRED=true
    else
        PATHS_REQUIRED=false
    fi

    if [ "$PATHS_REQUIRED" = "true" ]; then
        # Try to get the variable values from bitbake
        type -P bitbake &>/dev/null || {
            echo "In order for this script to dynamically infer paths";
            echo "to kernels or filesystem images, you either need";
            echo "bitbake in your PATH or to source oe-init-build-env";
            echo "before running this script" >&2;
            exit 1; }

        # We have bitbake in PATH, get the variable values from bitbake
        BITBAKE_ENV_TMPFILE=`mktemp --tmpdir runqemu.XXXXXXXXXX`
        if [ "$?" != "0" ] ; then
            echo "Error: mktemp failed for bitbake environment output"
            exit 1
        fi

        MACHINE=$MACHINE bitbake -e > $BITBAKE_ENV_TMPFILE
        if [ -z "$OE_TMPDIR" ] ; then
            OE_TMPDIR=`sed -n 's/^TMPDIR=\"\(.*\)\"/\1/p' $BITBAKE_ENV_TMPFILE`
        fi
        if [ -z "$DEPLOY_DIR_IMAGE" ] ; then
            DEPLOY_DIR_IMAGE=`sed -n 's/^DEPLOY_DIR_IMAGE=\"\(.*\)\"/\1/p' $BITBAKE_ENV_TMPFILE`
        fi
        if [ -z "$OE_TMPDIR" ]; then
            # Check for errors from bitbake that the user needs to know about
            BITBAKE_OUTPUT=`cat $BITBAKE_ENV_TMPFILE | wc -l`
            if [ "$BITBAKE_OUTPUT" -eq "0" ]; then
                echo "Error: this script needs to be run from your build directory, or you need"
                echo "to explicitly set OE_TMPDIR and DEPLOY_DIR_IMAGE in your environment"
            else
                echo "There was an error running bitbake to determine TMPDIR"
                echo "Here is the output from 'bitbake -e':"
                cat $BITBAKE_ENV_TMPFILE
            fi
            rm $BITBAKE_ENV_TMPFILE
            exit 1
        fi
        rm $BITBAKE_ENV_TMPFILE
    fi
}

setup_sysroot() {
    # Toolchain installs set up $OECORE_NATIVE_SYSROOT in their
    # environment script. If that variable isn't set, we're
    # either in an in-tree build scenario or the environment
    # script wasn't source'd.
    if [ -z "$OECORE_NATIVE_SYSROOT" ]; then
        setup_path_vars
        BUILD_ARCH=`uname -m`
        BUILD_OS=`uname | tr '[A-Z]' '[a-z]'`
        BUILD_SYS="$BUILD_ARCH-$BUILD_OS"

        OECORE_NATIVE_SYSROOT=$OE_TMPDIR/sysroots/$BUILD_SYS
    fi 

    # Some recipes store the BIOS under $OE_TMPDIR/sysroots/$MACHINE,
    # now defined as OECORE_MACHINE_SYSROOT. The latter is used when searching
    # BIOS, VGA BIOS and keymaps.
    if [ -z "$OECORE_MACHINE_SYSROOT" ]; then
        OECORE_MACHINE_SYSROOT=$OE_TMPDIR/sysroots/$MACHINE
    fi
}

# Locate a rootfs image to boot which matches our expected
# machine and fstype. 
findimage() {
    where=$1
    machine=$2
    extension=$3

    # Sort rootfs candidates by modification time - the most
    # recently created one is the one we most likely want to boot.
    filename=`ls -t1 $where/*-image*$machine.$extension 2>/dev/null | head -n1`
    if [ "x$filename" != "x" ]; then
        ROOTFS=$filename
        return
    fi

    echo "Couldn't find a $machine rootfs image in $where."
    exit 1
}

if [ -e "$ROOTFS" -a -z "$FSTYPE" ]; then
    # Extract the filename extension
    EXT=`echo $ROOTFS | awk -F . '{ print \$NF }'`
    if [ "x$EXT" = "xext2" -o "x$EXT" = "xext3" -o \
          "x$EXT" = "xjffs2" -o "x$EXT" = "xbtrfs" -o \
          "x$EXT" = "xext4" ]; then
        FSTYPE=$EXT
    else
        echo "Note: Unable to determine filesystem extension for $ROOTFS"
        echo "We will use the default FSTYPE for $MACHINE"
        # ...which is done further below...
    fi
fi

if [ -z "$KERNEL" -a "x$FSTYPE" != "xvmdk" -a "x$FSTYPE" != "xhddimg" -a "x$FSTYPE" != "xhdddirect" ]; then
    setup_path_vars 1
    eval kernel_file=\$${machine2}_DEFAULT_KERNEL
    KERNEL=$DEPLOY_DIR_IMAGE/$kernel_file

    if [ -z "$KERNEL" ]; then
        error "Unable to determine default kernel for MACHINE [$MACHINE]"
    fi
fi
# KERNEL is now set for all cases

if [ -z "$FSTYPE" ]; then
    eval FSTYPE=\$${machine2}_DEFAULT_FSTYPE

    if [ -z "$FSTYPE" ]; then
        error "Unable to determine default fstype for MACHINE [$MACHINE]"
    fi
fi

# FSTYPE is now set for all cases

# Handle cases where a ROOTFS type is given instead of a filename, e.g.
# core-image-sato
if [ "$LAZY_ROOTFS" = "true" ]; then
    setup_path_vars 1
    echo "Assuming $ROOTFS really means $DEPLOY_DIR_IMAGE/$ROOTFS-$MACHINE.$FSTYPE"
    if [ "$FSTYPE" = "hddimg" -o "x$FSTYPE" = "xhdddirect" ]; then
        VM=$DEPLOY_DIR_IMAGE/$ROOTFS-$MACHINE.$FSTYPE
    else
        ROOTFS=$DEPLOY_DIR_IMAGE/$ROOTFS-$MACHINE.$FSTYPE
    fi
fi

if [ -z "$ROOTFS" -a "x$FSTYPE" != "xvmdk" -a "x$FSTYPE" != "xhddimg" -a "x$FSTYPE" != "xhdddirect" ]; then
    setup_path_vars 1
    T=$DEPLOY_DIR_IMAGE
    eval rootfs_list=\$${machine2}_DEFAULT_ROOTFS
    findimage $T $MACHINE $FSTYPE

    if [ -z "$ROOTFS" ]; then
        error "Unable to determine default rootfs for MACHINE [$MACHINE]"
    fi
fi
# ROOTFS is now set for all cases, now expand it to be an absolute path, it should exist at this point

ROOTFS=`readlink -f $ROOTFS`

echo ""
echo "Continuing with the following parameters:"
if [ "x$FSTYPE" != "xvmdk" -a "x$FSTYPE" != "xhddimg" -a "x$FSTYPE" != "xhdddirect" ]; then
    echo "KERNEL: [$KERNEL]"
    echo "ROOTFS: [$ROOTFS]"
else
    echo "VMDK:   [$VM]"
fi
echo "FSTYPE: [$FSTYPE]"

setup_sysroot
# OECORE_NATIVE_SYSROOT and OECORE_MACHINE_SYSROOT are now set for all cases

INTERNAL_SCRIPT="$0-internal"
if [ ! -f "$INTERNAL_SCRIPT" -o ! -r "$INTERNAL_SCRIPT" ]; then
INTERNAL_SCRIPT=`which runqemu-internal`
fi

# Specify directory for BIOS, VGA BIOS and keymaps
if [ ! -z "$CUSTOMBIOSDIR" ]; then
    if [ -d "$OECORE_NATIVE_SYSROOT/$CUSTOMBIOSDIR" ]; then
        echo "Assuming biosdir is $OECORE_NATIVE_SYSROOT/$CUSTOMBIOSDIR"
        SCRIPT_QEMU_OPT="$SCRIPT_QEMU_OPT -L $OECORE_NATIVE_SYSROOT/$CUSTOMBIOSDIR"
    elif [ -d "$OECORE_MACHINE_SYSROOT/$CUSTOMBIOSDIR" ]; then
        echo "Assuming biosdir is $OECORE_MACHINE_SYSROOT/$CUSTOMBIOSDIR"
        SCRIPT_QEMU_OPT="$SCRIPT_QEMU_OPT -L $OECORE_MACHINE_SYSROOT/$CUSTOMBIOSDIR"
    else
        if [ ! -d "$CUSTOMBIOSDIR" ]; then
            echo "Custom BIOS directory not found. Tried: $CUSTOMBIOSDIR"
            echo "and $OECORE_NATIVE_SYSROOT/$CUSTOMBIOSDIR"
            echo "and $OECORE_MACHINE_SYSROOT/$CUSTOMBIOSDIR"
            exit 1;
        fi
        echo "Assuming biosdir is $CUSTOMBIOSDIR"
        SCRIPT_QEMU_OPT="$SCRIPT_QEMU_OPT -L $CUSTOMBIOSDIR"
    fi
fi

. $INTERNAL_SCRIPT
exit $?
