set -e
LOG=/tmp/qemu.log
LOCK=/tmp/qemu.lock
if [ -n "$CROSS_DEBUG" ]; then
set -x
fi
arch=$1
shift
qarch=$arch
case "$arch" in
armv7)
qarch="arm"
;;
i686)
qarch="i386"
;;
powerpc)
qarch="ppc"
;;
powerpc64)
qarch="ppc64"
;;
powerpc64le)
if [ "$CROSS_RUNNER" = "qemu-user" ]; then
qarch="ppc64le"
else
qarch="ppc64"
fi
;;
esac
case "$CROSS_RUNNER" in
native)
exec "${@}"
;;
qemu-user | "")
exec qemu-$qarch "${@}"
;;
qemu-system)
true
;;
*)
echo "Invalid runner: \"$CROSS_RUNNER\"";
echo "Valid runners are: native, qemu-user and qemu-system"
exit 1
;;
esac
n=$(nproc)
memory=1G
driver9p="virtio-9p-pci"
drivernet="virtio-net-pci"
case "$arch" in
aarch64)
n=$(( n > 8 ? 8 : n ))
opt="-machine virt -cpu cortex-a57"
;;
armv7)
opt="-machine virt"
driver9p="virtio-9p-device"
drivernet="virtio-net-device"
;;
i686)
opt="-append console=ttyS0"
;;
mips|mipsel)
opt="-append nokaslr"
n=1
;;
mips64el)
opt="-append nokaslr -cpu MIPS64R2-generic"
n=1
;;
powerpc)
opt="-append console=ttyPZ0"
n=1
;;
powerpc64|powerpc64le)
opt="-append console=hvc0 --nodefaults -serial stdio"
;;
s390x)
n=1
driver9p="virtio-9p-ccw"
drivernet="virtio-net-ccw"
;;
sparc64)
n=1
driver9p+=",bus=pciB"
drivernet+=",bus=pciB"
;;
x86_64)
opt="-append console=ttyS0"
;;
esac
(
flock -n 200 || exit 0
echo Booting QEMU virtual machine with $n cpus...
QEMU_CMD="qemu-system-$qarch \
-m $memory \
-smp $n \
-nographic \
-monitor none \
-netdev user,id=net0,hostfwd=tcp::10022-:22 \
-device $drivernet,netdev=net0 \
-kernel /qemu/kernel \
-initrd /qemu/initrd.gz \
$opt \
-fsdev local,id=fs0,path=/target,security_model=mapped \
-device $driver9p,fsdev=fs0,mount_tag=target"
touch $LOG
if [ -n "$CROSS_DEBUG" ]; then
($QEMU_CMD 2>&1 | tee -a $LOG) &
else
$QEMU_CMD 2>&1 >> $LOG &
fi
for i in $(seq 240); do
if grep -q "Not backgrounding" $LOG; then
READY=1
break
fi
sleep 0.5s
done
if [ -z "$READY" ]; then
if [ -n "$CROSS_DEBUG" ]; then
echo "Not ready but continuing because CROSS_DEBUG is set"
else
echo "Qemu is not ready..."
echo "Set the environment variable CROSS_DEBUG=1 to debug"
exit 1
fi
fi
echo Booted in $SECONDS seconds
) 200>$LOCK
if [ -t 1 ] && [ -t 2]; then
tty_flag='-t'
fi
exec dbclient ${tty_flag} -p 10022 -y -y root@localhost "${@}"