#!/bin/sh
# minc-moult: MINC-container run in cross arch by qemu-system
#
# Copyright (C) 2016 Masami Hiramatsu <masami.hiramatsu@gmail.com>
# This program is released under the MIT License, see LICENSE.

# Normalize ARCH and setup qemu related variables
prepare_arch() { # arch
  ARCH=$1
  HOSTARCH=`uname -m`
  [ -z "$ARCH" ] && ARCH=$HOSTARCH
  NR_CPUS=`nproc` || NR_CPUS=1
  case "$ARCH" in
  x86_64|amd64)
    ARCH=x86_64
    QEMU_TTY=ttyS0
    QEMU_ARCH=$ARCH
    QEMU_OPT="$QEMU_OPT -M pc -enable-kvm"
    ;;
  i[3456]86)
    ARCH=i386
    QEMU_TTY=ttyS0
    QEMU_ARCH=$ARCH
    QEMU_OPT="$QEMU_OPT -M pc -enable-kvm"
    ;;
  arm|armv7l)
    ARCH=arm
    QEMU_TTY=ttyAMA0
    QEMU_ARCH=$ARCH
    QEMU_OPT="$QEMU_OPT -M virt"
    [ $NR_CPUS -gt 3 ] && NR_CPUS=2 ||:
    ;;
  aarch64|arm64)
    ARCH=arm64
    QEMU_TTY=ttyAMA0
    QEMU_ARCH=aarch64
    QEMU_OPT="$QEMU_OPT -M virt -M gic-version=3 -cpu cortex-a57"
    ;;
  um|uml)
    ARCH=um
    QEMU_TTY=tty0
    UM_OPT=""
    ;;
  *)
    echo "Sorry, $ARCH is not supported yet."
    exit 1
    ;;
  esac
}

# Launch qemu for given arch. If you'd like initrd, you need to pass
# "root=/dev/ram0 rootfstype=ext2" to kernel_opt
minc_moult() { # arch virtdir kernel_opt
  ERMINEDIR=$LIBEXEC/ermine
  prepare_arch $1
  [ $ARCH = "um" ] && exec $ERMINEDIR/vmlinuz.$ARCH mem=2G \
	  initrd=$ERMINEDIR/initramfs.$ARCH hostfs=$2 con0=fd:0,fd:1 con1=null con=pts $3 console=ttyS0
  if [ "$MINC_IP" ]; then
    :;: 'Setup qemu network option with scripts';:
    [ ! -c /dev/net/tun ] && mknod /dev/net/tun c 10 200
    QEMU_OPT="$QEMU_OPT \
	    -netdev type=tap,script=$LIBEXEC/ermine-ifup,downscript=no,id=net0 \
	    -device virtio-net-pci,netdev=net0"
  fi
  exec qemu-system-${QEMU_ARCH} $QEMU_OPT -m 2G \
    -kernel $ERMINEDIR/vmlinuz.$ARCH -initrd $ERMINEDIR/initramfs.$ARCH \
    -smp $NR_CPUS -nographic -append "$3 console=tty0" \
    -virtfs local,id=minc,path=$2,security_model=none,mount_tag=minc
}

