
This makes it possible to boot images with multiple partitions (the ones ending in .hddimg or .hdddirect) in several ways: runqemu qemux86 core-image-minimal hddimg runqemu tmp/deploy/images/qemux86/core-image-minimal-qemux86.hddimg VM=tmp-glibc/deploy/images/qemux86/iot-os-image-qemux86.hddimg FSTYPE=hddimg runqemu Same for hdddirect. This is useful for testing initramfs scripts, secure boot (when switching to UEFI), or boot loaders like syslinux. For testing the content of the rootfs, the ext4 image is better because that approach is faster (no need to create another large image during build, rootfs can be read directly instead of reading boot.img through loop device). When booting a live image, the kernel, initramfs (if any) and kernel parameters are taken from the image by the virtual machine's BIOS, so any additional kernel parameters given to runqemu are ignored. This can be avoided (already without this change) in a slightly hacky runqemu setup: ROOTFS=tmp/deploy/images/qemux86/core-image-minimal-qemux86.hddimg \ FSTYPE=ext4 \ KERNEL=tmp/deploy/images/qemux86/bzImage-initramfs-qemux86.bin \ MACHINE=qemux86 \ runqemu serial kvm nographic 'bootparams=root=/dev/ram0' The additional bzImage-initramfs-qemux86.bin kernel here was created by adding this to local.conf: INITRAMFS_IMAGE = "core-image-minimal-initramfs" INITRAMFS_IMAGE_BUNDLE = "1" In the code, the new FSTYPE=hddimg resp. hdddirect behaves almost exactly like the older vmdk FSTYPE. New types were chosen because it seemed cleaner than using FSTYPE=vmdk when the actual image pointed to by VM is not in that format. The downside is that several checks for FSTYPE=vmdk had to be duplicated for FSTYPE=hddimg. The VM variable now gets interpreted as "virtual machine disk image" instead of "vmdk image". (From OE-Core rev: 37741c539f5d3021e59828b49e968cd42b89a368) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
25 KiB
Executable File
#!/bin/bash -x
Handle running OE images under 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.
Call setting:
QEMU_MEMORY (optional) - set the amount of memory in the emualted system.
SERIAL_LOGFILE (optional) - log the serial port output to a file
Image options:
MACHINE - the machine to run
FSTYPE - the image type to run
KERNEL - the kernel image file to use
ROOTFS - the disk image file to use
mem_size=-1
#Get rid of <> and get the contents of extra qemu running params
SCRIPT_QEMU_EXTRA_OPT=echo $SCRIPT_QEMU_EXTRA_OPT | sed -e 's/<//' -e 's/>//'
#if user set qemu memory, eg: -m 256 in qemu extra params, we need to do some
validation check
mem_set=expr "$SCRIPT_QEMU_EXTRA_OPT" : '.*\(-m[[:space:]] *[0-9]*\)'
if [ ! -z "$mem_set" ] ; then
#Get memory setting size from user input
mem_size=echo $mem_set | sed 's/-m[[:space:]] *//'
else
case "$MACHINE" in
"qemux86")
mem_size=256
;;
"qemux86-64")
mem_size=256
;;
"qemuarm")
mem_size=128
;;
"qemuarm64")
mem_size=512
;;
"qemumicroblaze")
mem_size=64
;;
"qemumips"|"qemumips64")
mem_size=256
;;
"qemuppc")
mem_size=256
;;
"qemush4")
mem_size=1024
;;
"qemuzynq")
mem_size=1024
;;
*)
mem_size=64
;;
esac
fi
QEMU_MEMORY has 'M' appended to mem_size
QEMU_MEMORY="$mem_size"M
Bug 433: qemuarm cannot use > 256 MB RAM
if [ "$MACHINE" = "qemuarm" ]; then
if [ -z "$mem_size" -o $mem_size -gt 256 ]; then
echo "WARNING: qemuarm does not support > 256M of RAM."
echo "Changing QEMU_MEMORY to default of 256M."
QEMU_MEMORY="256M"
mem_size="256"
SCRIPT_QEMU_EXTRA_OPT=echo $SCRIPT_QEMU_EXTRA_OPT | sed -e "s/$mem_set/-m 256/"
fi
fi
We need to specify -m <mem_size> to overcome a bug in qemu 0.14.0
https://bugs.launchpad.net/ubuntu/+source/qemu-kvm/+bug/584480
if [ -z "$mem_set" ] ; then SCRIPT_QEMU_EXTRA_OPT="$SCRIPT_QEMU_EXTRA_OPT -m $mem_size" fi
This file is created when runqemu-gen-tapdevs creates a bank of tap
devices, indicating that the user should not bring up new ones using
sudo.
NOSUDO_FLAG="/etc/runqemu-nosudo"
QEMUIFUP=which runqemu-ifup 2> /dev/null
QEMUIFDOWN=which runqemu-ifdown 2> /dev/null
if [ -z "$QEMUIFUP" -o ! -x "$QEMUIFUP" ]; then
echo "runqemu-ifup cannot be found or executed"
exit 1
fi
if [ -z "$QEMUIFDOWN" -o ! -x "$QEMUIFDOWN" ]; then
echo "runqemu-ifdown cannot be found or executed"
exit 1
fi
NFSRUNNING="false"
#capture original stty values ORIG_STTY=$(stty -g)
if [ "$SLIRP_ENABLED" = "yes" ]; then KERNEL_NETWORK_CMD="ip=dhcp" QEMU_TAP_CMD="" QEMU_UI_OPTIONS="-show-cursor -usb -usbdevice wacom-tablet" if [ "$KVM_ACTIVE" = "yes" ]; then QEMU_NETWORK_CMD="" DROOT="/dev/vda" ROOTFS_OPTIONS="-drive file=$ROOTFS,if=virtio,format=raw" else QEMU_NETWORK_CMD="" DROOT="/dev/hda" ROOTFS_OPTIONS="-drive file=$ROOTFS,if=ide,format=raw" fi
else acquire_lock() { lockfile=$1 if [ -z "$lockfile" ]; then echo "Error: missing lockfile arg passed to acquire_lock()" return 1 fi
touch $lockfile.lock 2>/dev/null
if [ $? -ne 0 ]; then
echo "Acquiring lockfile for $lockfile.lock failed"
return 1
fi
exec 8>$lockfile.lock
flock -n -x 8
if [ $? -ne 0 ]; then
exec 8>&-
return 1
fi
return 0
}
release_lock() {
lockfile=$1
if [ -z "$lockfile" ]; then
echo "Error: missing lockfile arg passed to release_lock()"
return 1
fi
rm -f $lockfile.lock
exec 8>&-
}
LOCKDIR="/tmp/qemu-tap-locks"
if [ ! -d "$LOCKDIR" ]; then
mkdir $LOCKDIR
chmod 777 $LOCKDIR
fi
IFCONFIG=`which ip 2> /dev/null`
if [ -z "$IFCONFIG" ]; then
IFCONFIG=/sbin/ip
fi
if [ ! -x "$IFCONFIG" ]; then
echo "$IFCONFIG cannot be executed"
exit 1
fi
POSSIBLE=`$IFCONFIG link | grep 'tap' | awk '{print $2}' | sed -e 's/://' -e 's/@.*//'`
TAP=""
LOCKFILE=""
USE_PRECONF_TAP="no"
for tap in $POSSIBLE; do
LOCKFILE="$LOCKDIR/$tap"
if [ -e "$LOCKFILE.skip" ]; then
echo "Found $LOCKFILE.skip, skipping $tap"
continue
fi
echo "Acquiring lockfile for $tap..."
acquire_lock $LOCKFILE
if [ $? -eq 0 ]; then
TAP=$tap
USE_PRECONF_TAP="yes"
break
fi
done
if [ "$TAP" = "" ]; then
if [ -e "$NOSUDO_FLAG" ]; then
echo "Error: There are no available tap devices to use for networking,"
echo "and I see $NOSUDO_FLAG exists, so I am not going to try creating"
echo "a new one with sudo."
exit 1
fi
GROUPID=`id -g`
USERID=`id -u`
echo "Setting up tap interface under sudo"
# Redirect stderr since we could see a LD_PRELOAD warning here if pseudo is loaded
# but inactive. This looks scary but is harmless
tap=`sudo $QEMUIFUP $USERID $GROUPID $OECORE_NATIVE_SYSROOT 2> /dev/null`
if [ $? -ne 0 ]; then
# Re-run standalone to see verbose errors
sudo $QEMUIFUP $USERID $GROUPID $OECORE_NATIVE_SYSROOT
return 1
fi
LOCKFILE="$LOCKDIR/$tap"
echo "Acquiring lockfile for $tap..."
acquire_lock $LOCKFILE
if [ $? -eq 0 ]; then
TAP=$tap
fi
else
echo "Using preconfigured tap device '$TAP'"
echo "If this is not intended, touch $LOCKFILE.skip to make runqemu skip $TAP."
fi
cleanup() {
if [ ! -e "$NOSUDO_FLAG" -a "$USE_PRECONF_TAP" = "no" ]; then
# Redirect stderr since we could see a LD_PRELOAD warning here if pseudo is loaded
# but inactive. This looks scary but is harmless
sudo $QEMUIFDOWN $TAP $OECORE_NATIVE_SYSROOT 2> /dev/null
fi
echo "Releasing lockfile of preconfigured tap device '$TAP'"
release_lock $LOCKFILE
if [ "$NFSRUNNING" = "true" ]; then
echo "Shutting down the userspace NFS server..."
echo "runqemu-export-rootfs stop $ROOTFS"
runqemu-export-rootfs stop $ROOTFS
fi
# If QEMU crashes or somehow tty properties are not restored
# after qemu exits, we need to run stty sane
#stty sane
#instead of using stty sane we set the original stty values
stty ${ORIG_STTY}
}
n0=$(echo $TAP | sed 's/tap//')
case $n0 in
''|*[!0-9]*)
echo "Error Couldn't turn $TAP into an interface number?"
exit 1
;;
esac
n1=$(($n0 * 2 + 1))
n2=$(($n1 + 1))
KERNEL_NETWORK_CMD="ip=192.168.7.$n2::192.168.7.$n1:255.255.255.0"
QEMU_TAP_CMD="-net tap,vlan=0,ifname=$TAP,script=no,downscript=no"
if [ "$KVM_ACTIVE" = "yes" ]; then
QEMU_NETWORK_CMD="-net nic,model=virtio $QEMU_TAP_CMD,vhost=on"
DROOT="/dev/vda"
ROOTFS_OPTIONS="-drive file=$ROOTFS,if=virtio,format=raw"
else
QEMU_NETWORK_CMD="-net nic,vlan=0 $QEMU_TAP_CMD"
DROOT="/dev/hda"
ROOTFS_OPTIONS="-drive file=$ROOTFS,if=ide,format=raw"
fi
if [ "$MACHINE" = "qemuarm64" ]; then
QEMU_NETWORK_CMD="-netdev tap,id=net0,ifname=$TAP,script=no,downscript=no -device virtio-net-device,netdev=net0 "
DROOT="/dev/vda"
ROOTFS_OPTIONS="-drive id=disk0,file=$ROOTFS,if=none,format=raw -device virtio-blk-device,drive=disk0"
fi
KERNCMDLINE="mem=$QEMU_MEMORY"
QEMU_UI_OPTIONS="-show-cursor -usb -usbdevice wacom-tablet"
NFS_INSTANCE=`echo $TAP | sed 's/tap//'`
export NFS_INSTANCE
SERIALOPTS=""
if [ "x$SERIAL_LOGFILE" != "x" ]; then
SERIALOPTS="-serial file:$SERIAL_LOGFILE"
fi
fi
case "$MACHINE" in "qemuarm") ;; "qemuarm64") ;; "qemumicroblaze") ;; "qemumips") ;; "qemumipsel") ;; "qemumips64") ;; "qemush4") ;; "qemuppc") ;; "qemuarmv6") ;; "qemuarmv7") ;; "qemux86") ;; "qemux86-64") ;; "qemuzynq") ;; "akita") ;; "spitz") ;; *) echo "Error: Unsupported machine type $MACHINE" return 1 ;; esac
if [ ! -f "$KERNEL" -a "x$FSTYPE" != "xvmdk" -a "x$FSTYPE" != "xhddimg" -a "x$FSTYPE" != "xhdddirect" ]; then echo "Error: Kernel image file $KERNEL doesn't exist" cleanup return 1 fi
if [ "$FSTYPE" != "nfs" -a "$FSTYPE" != "vmdk" -a "$FSTYPE" != "hddimg" -a "$FSTYPE" != "hdddirect" -a ! -f "$ROOTFS" ]; then echo "Error: Image file $ROOTFS doesn't exist" cleanup return 1 fi
if [ "$NFS_SERVER" = "" ]; then NFS_SERVER="192.168.7.1" if [ "$SLIRP_ENABLED" = "yes" ]; then NFS_SERVER="10.0.2.2" fi fi
if [ "$FSTYPE" = "nfs" ]; then
NFS_DIR=echo $ROOTFS | sed 's/^[^:]*:\(.*\)/\1/'
if [ "$NFS_INSTANCE" = "" ] ; then
NFS_INSTANCE=0
fi
MOUNTD_RPCPORT=$[ 21111 + $NFS_INSTANCE ]
NFSD_RPCPORT=$[ 11111 + $NFS_INSTANCE ]
NFSD_PORT=$[ 3049 + 2 * $NFS_INSTANCE ]
MOUNTD_PORT=$[ 3048 + 2 * $NFS_INSTANCE ]
UNFS_OPTS="nfsvers=3,port=$NFSD_PORT,mountprog=$MOUNTD_RPCPORT,nfsprog=$NFSD_RPCPORT,udp,mountport=$MOUNTD_PORT"
PSEUDO_LOCALSTATEDIR=~/.runqemu-sdk/pseudo
export PSEUDO_LOCALSTATEDIR
# Start the userspace NFS server
echo "runqemu-export-rootfs restart $ROOTFS"
runqemu-export-rootfs restart $ROOTFS
if [ $? != 0 ]; then
return 1
fi
NFSRUNNING="true"
fi
if [ "$MACHINE" = "qemuarm" -o "$MACHINE" = "qemuarmv6" -o "$MACHINE" = "qemuarmv7" ]; then QEMU=qemu-system-arm MACHINE_SUBTYPE=versatilepb export QEMU_AUDIO_DRV="none" QEMU_UI_OPTIONS="$QEMU_UI_OPTIONS" # QEMU_UI_OPTIONS="$QEMU_UI_OPTIONS -force-pointer" if [ "${FSTYPE:0:3}" = "ext" -o "$FSTYPE" = "btrfs" ]; then KERNCMDLINE="root=/dev/sda rw console=ttyAMA0,115200 console=tty $KERNEL_NETWORK_CMD mem=$QEMU_MEMORY highres=off" QEMUOPTIONS="$QEMU_NETWORK_CMD -M ${MACHINE_SUBTYPE} -drive file=$ROOTFS,format=raw -no-reboot $QEMU_UI_OPTIONS" fi if [ "$FSTYPE" = "nfs" ]; then if [ "$NFS_SERVER" = "192.168.7.1" -a ! -d "$NFS_DIR" ]; then echo "Error: NFS mount point $ROOTFS doesn't exist" cleanup return 1 fi KERNCMDLINE="root=/dev/nfs nfsroot=$NFS_SERVER:$NFS_DIR,$UNFS_OPTS rw console=ttyAMA0,115200 $KERNEL_NETWORK_CMD mem=$QEMU_MEMORY" QEMUOPTIONS="$QEMU_NETWORK_CMD -M ${MACHINE_SUBTYPE} --no-reboot $QEMU_UI_OPTIONS" fi if [ "$MACHINE" = "qemuarmv6" ]; then QEMUOPTIONS="$QEMUOPTIONS -cpu arm1136" fi if [ "$MACHINE" = "qemuarmv7" ]; then QEMUOPTIONS="$QEMUOPTIONS -cpu cortex-a8" fi fi
if [ "$MACHINE" = "qemuarm64" ]; then QEMU=qemu-system-aarch64
export QEMU_AUDIO_DRV="none"
if [ "x$SERIALSTDIO" = "x" ] ; then
QEMU_UI_OPTIONS="-nographic"
else
QEMU_UI_OPTIONS=""
fi
if [ "${FSTYPE:0:3}" = "ext" -o "$FSTYPE" = "btrfs" ]; then
KERNCMDLINE="root=/dev/vda rw console=ttyAMA0,38400 mem=$QEMU_MEMORY highres=off $KERNEL_NETWORK_CMD"
# qemu-system-aarch64 only support '-machine virt -cpu cortex-a57' for now
QEMUOPTIONS="$QEMU_NETWORK_CMD -machine virt -cpu cortex-a57 $ROOTFS_OPTIONS $QEMU_UI_OPTIONS"
fi
if [ "$FSTYPE" = "nfs" ]; then
if [ "$NFS_SERVER" = "192.168.7.1" -a ! -d "$NFS_DIR" ]; then
echo "Error: NFS mount point $ROOTFS doesn't exist"
cleanup
return 1
fi
KERNCMDLINE="root=/dev/nfs nfsroot=$NFS_SERVER:$NFS_DIR,$UNFS_OPTS rw console=ttyAMA0,38400 mem=$QEMU_MEMORY highres=off $KERNEL_NETWORK_CMD"
QEMUOPTIONS="$QEMU_NETWORK_CMD -machine virt -cpu cortex-a57 $QEMU_UI_OPTIONS"
fi
fi
if [ "$MACHINE" = "qemux86" ]; then QEMU=qemu-system-i386 if [ "$KVM_ACTIVE" = "yes" ]; then CPU_SUBTYPE=kvm32 else CPU_SUBTYPE=qemu32 fi if [ ! -z "$vga_option" ]; then QEMU_UI_OPTIONS="$QEMU_UI_OPTIONS" else QEMU_UI_OPTIONS="$QEMU_UI_OPTIONS -vga vmware" fi if [ "${FSTYPE:0:3}" = "ext" -o "$FSTYPE" = "btrfs" ]; then KERNCMDLINE="vga=0 uvesafb.mode_option=640x480-32 root=$DROOT rw mem=$QEMU_MEMORY $KERNEL_NETWORK_CMD" QEMUOPTIONS="$QEMU_NETWORK_CMD -cpu $CPU_SUBTYPE $ROOTFS_OPTIONS $QEMU_UI_OPTIONS" fi if [ "${FSTYPE:0:4}" = "cpio" ]; then KERNCMDLINE="vga=0 uvesafb.mode_option=640x480-32 root=/dev/ram0 rw mem=$QEMU_MEMORY $KERNEL_NETWORK_CMD" QEMUOPTIONS="$QEMU_NETWORK_CMD -cpu $CPU_SUBTYPE -initrd $ROOTFS $QEMU_UI_OPTIONS" fi
if [ "$FSTYPE" = "nfs" ]; then
if [ "$NFS_SERVER" = "192.168.7.1" -a ! -d "$NFS_DIR" ]; then
echo "Error: NFS mount point $ROOTFS doesn't exist."
cleanup
return 1
fi
KERNCMDLINE="root=/dev/nfs nfsroot=$NFS_SERVER:$NFS_DIR,$UNFS_OPTS rw $KERNEL_NETWORK_CMD mem=$QEMU_MEMORY"
QEMUOPTIONS="$QEMU_NETWORK_CMD $QEMU_UI_OPTIONS"
fi
if [ "$FSTYPE" = "vmdk" -o "$FSTYPE" = "hddimg" -o "$FSTYPE" = "hdddirect" ]; then
QEMUOPTIONS="$QEMU_NETWORK_CMD $QEMU_UI_OPTIONS"
fi
# Currently oprofile's event based interrupt mode doesn't work(Bug #828) in
# qemux86 and qemux86-64. We can use timer interrupt mode for now.
KERNCMDLINE="$KERNCMDLINE oprofile.timer=1"
fi
if [ "$MACHINE" = "qemux86-64" ]; then QEMU=qemu-system-x86_64 if [ "$KVM_ACTIVE" = "yes" ]; then CPU_SUBTYPE=kvm64 else CPU_SUBTYPE=core2duo fi if [ ! -z "$vga_option" ]; then QEMU_UI_OPTIONS="$QEMU_UI_OPTIONS" else QEMU_UI_OPTIONS="$QEMU_UI_OPTIONS -vga vmware" fi if [ "${FSTYPE:0:3}" = "ext" -o "$FSTYPE" = "btrfs" ]; then KERNCMDLINE="vga=0 uvesafb.mode_option=640x480-32 root=$DROOT rw mem=$QEMU_MEMORY $KERNEL_NETWORK_CMD" QEMUOPTIONS="$QEMU_NETWORK_CMD -cpu $CPU_SUBTYPE $ROOTFS_OPTIONS $QEMU_UI_OPTIONS" fi if [ "$FSTYPE" = "nfs" ]; then if [ "x$ROOTFS" = "x" ]; then ROOTFS=/srv/nfs/qemux86-64 fi if [ ! -d "$ROOTFS" ]; then echo "Error: NFS mount point $ROOTFS doesn't exist." cleanup return 1 fi KERNCMDLINE="root=/dev/nfs nfsroot=$NFS_SERVER:$NFS_DIR,$UNFS_OPTS rw $KERNEL_NETWORK_CMD mem=$QEMU_MEMORY" QEMUOPTIONS="$QEMU_NETWORK_CMD -cpu $CPU_SUBTYPE $QEMU_UI_OPTIONS" fi if [ "$FSTYPE" = "vmdk" -o "$FSTYPE" = "hddimg" -o "$FSTYPE" = "hdddirect" ]; then QEMUOPTIONS="$QEMU_NETWORK_CMD -cpu $CPU_SUBTYPE $QEMU_UI_OPTIONS" fi # Currently oprofile's event based interrupt mode doesn't work(Bug #828) in # qemux86 and qemux86-64. We can use timer interrupt mode for now. KERNCMDLINE="$KERNCMDLINE oprofile.timer=1" fi
if [ "$MACHINE" = "spitz" ]; then
QEMU=qemu-system-arm
if [ "${FSTYPE:0:3}" = "ext" -o "$FSTYPE" = "btrfs" ]; then
echo $ROOTFS
ROOTFS=readlink -f $ROOTFS
echo $ROOTFS
if [ ! -e "$ROOTFS.qemudisk" ]; then
echo "Adding a partition table to the ext3 image for use by QEMU, please wait..."
runqemu-addptable2image $ROOTFS $ROOTFS.qemudisk
fi
QEMUOPTIONS="$QEMU_NETWORK_CMD -M spitz -hda $ROOTFS.qemudisk -portrait"
fi
fi
if [ "$MACHINE" = "qemumips" -o "$MACHINE" = "qemumipsel" -o "$MACHINE" = "qemumips64" ]; then case "$MACHINE" in qemumips) QEMU=qemu-system-mips ;; qemumipsel) QEMU=qemu-system-mipsel ;; qemumips64) QEMU=qemu-system-mips64 ;; esac MACHINE_SUBTYPE=malta QEMU_UI_OPTIONS="-vga cirrus $QEMU_UI_OPTIONS" if [ "${FSTYPE:0:3}" = "ext" -o "$FSTYPE" = "btrfs" ]; then #KERNCMDLINE="root=/dev/hda console=ttyS0 console=tty0 $KERNEL_NETWORK_CMD mem=$QEMU_MEMORY" KERNCMDLINE="root=/dev/hda rw console=ttyS0 console=tty $KERNEL_NETWORK_CMD mem=$QEMU_MEMORY" QEMUOPTIONS="$QEMU_NETWORK_CMD -M $MACHINE_SUBTYPE -drive file=$ROOTFS,format=raw -no-reboot $QEMU_UI_OPTIONS" fi if [ "$FSTYPE" = "nfs" ]; then if [ "$NFS_SERVER" = "192.168.7.1" -a ! -d "$NFS_DIR" ]; then echo "Error: NFS mount point $ROOTFS doesn't exist" cleanup return 1 fi KERNCMDLINE="root=/dev/nfs console=ttyS0 console=tty nfsroot=$NFS_SERVER:$NFS_DIR,$UNFS_OPTS rw $KERNEL_NETWORK_CMD mem=$QEMU_MEMORY" QEMUOPTIONS="$QEMU_NETWORK_CMD -M $MACHINE_SUBTYPE -no-reboot $QEMU_UI_OPTIONS" fi fi
if [ "$MACHINE" = "qemuppc" ]; then QEMU=qemu-system-ppc MACHINE_SUBTYPE=mac99 CPU_SUBTYPE=G4 QEMU_UI_OPTIONS="$QEMU_UI_OPTIONS" if [ "$SLIRP_ENABLED" = "yes" ]; then QEMU_NETWORK_CMD="" else QEMU_NETWORK_CMD="-net nic,model=pcnet $QEMU_TAP_CMD" fi if [ "${FSTYPE:0:3}" = "ext" -o "$FSTYPE" = "btrfs" ]; then KERNCMDLINE="root=/dev/hda rw console=ttyS0 console=tty $KERNEL_NETWORK_CMD mem=$QEMU_MEMORY" QEMUOPTIONS="$QEMU_NETWORK_CMD -cpu $CPU_SUBTYPE -M $MACHINE_SUBTYPE -drive file=$ROOTFS,format=raw -no-reboot $QEMU_UI_OPTIONS" fi if [ "$FSTYPE" = "nfs" ]; then if [ "$NFS_SERVER" = "192.168.7.1" -a ! -d "$NFS_DIR" ]; then echo "Error: NFS mount point $ROOTFS doesn't exist" cleanup return 1 fi KERNCMDLINE="root=/dev/nfs console=ttyS0 console=tty nfsroot=$NFS_SERVER:$NFS_DIR,$UNFS_OPTS rw $KERNEL_NETWORK_CMD mem=$QEMU_MEMORY" QEMUOPTIONS="$QEMU_NETWORK_CMD -cpu $CPU_SUBTYPE -M $MACHINE_SUBTYPE -no-reboot $QEMU_UI_OPTIONS" fi fi
if [ "$MACHINE" = "qemush4" ]; then QEMU=qemu-system-sh4 MACHINE_SUBTYPE=r2d QEMU_UI_OPTIONS="$QEMU_UI_OPTIONS" if [ "${FSTYPE:0:3}" = "ext" -o "$FSTYPE" = "btrfs" ]; then #KERNCMDLINE="root=/dev/hda console=ttyS0 console=tty0 $KERNEL_NETWORK_CMD mem=$QEMU_MEMORY" KERNCMDLINE="root=/dev/hda rw console=ttySC1 noiotrap earlyprintk=sh-sci.1 console=tty $KERNEL_NETWORK_CMD mem=$QEMU_MEMORY" QEMUOPTIONS="$QEMU_NETWORK_CMD -M $MACHINE_SUBTYPE -hda $ROOTFS -no-reboot $QEMU_UI_OPTIONS -monitor null -serial vc -serial stdio" SERIALSTDIO="1" fi if [ "$FSTYPE" = "nfs" ]; then if [ "$NFS_SERVER" = "192.168.7.1" -a ! -d "$NFS_DIR" ]; then echo "Error: NFS mount point $ROOTFS doesn't exist" cleanup return 1 fi KERNCMDLINE="root=/dev/nfs console=ttySC1 noiotrap earlyprintk=sh-sci.1 console=tty nfsroot=$NFS_SERVER:$NFS_DIR,$UNFS_OPTS rw $KERNEL_NETWORK_CMD mem=$QEMU_MEMORY" QEMUOPTIONS="$QEMU_NETWORK_CMD -M $MACHINE_SUBTYPE -no-reboot $QEMU_UI_OPTIONS -monitor null -serial vc -serial stdio" SERIALSTDIO="1" fi fi
if [ "${FSTYPE:0:3}" = "ext" ]; then KERNCMDLINE="$KERNCMDLINE rootfstype=$FSTYPE" fi
if [ "$MACHINE" = "akita" ]; then
QEMU=qemu-system-arm
if [ "$FSTYPE" = "jffs2" ]; then
ROOTFS=readlink -f $ROOTFS
if [ ! -e "$ROOTFS.qemuflash" ]; then
echo "Converting raw image into flash image format for use by QEMU, please wait..."
raw2flash.akita < $ROOTFS > $ROOTFS.qemuflash
fi
QEMUOPTIONS="$QEMU_NETWORK_CMD -M akita -mtdblock $ROOTFS.qemuflash -portrait"
fi
fi
if [ "$MACHINE" = "qemumicroblaze" ]; then QEMU=qemu-system-microblazeel QEMU_SYSTEM_OPTIONS="-M petalogix-ml605 -serial mon:stdio -dtb $KERNEL-$MACHINE.dtb" if [ "${FSTYPE:0:3}" = "ext" -o "${FSTYPE:0:4}" = "cpio" ]; then KERNCMDLINE="earlyprintk root=/dev/ram rw" QEMUOPTIONS="$QEMU_SYSTEM_OPTIONS -initrd $ROOTFS" fi fi
if [ "$MACHINE" = "qemuzynq" ]; then QEMU=qemu-system-arm QEMU_SYSTEM_OPTIONS="-M xilinx-zynq-a9 -serial null -serial mon:stdio -dtb $KERNEL-$MACHINE.dtb" # zynq serial ports are named 'ttyPS0' and 'ttyPS1', fixup the default values SCRIPT_KERNEL_OPT=$(echo "$SCRIPT_KERNEL_OPT" | sed 's/console=ttyS/console=ttyPS/g') if [ "${FSTYPE:0:3}" = "ext" -o "${FSTYPE:0:4}" = "cpio" ]; then KERNCMDLINE="earlyprintk root=/dev/ram rw" QEMUOPTIONS="$QEMU_SYSTEM_OPTIONS -initrd $ROOTFS" fi fi
if [ "x$RAMFS" = "xtrue" ]; then QEMUOPTIONS="-initrd $ROOTFS -nographic" KERNCMDLINE="root=/dev/ram0 console=ttyS0 debugshell" fi
if [ "x$ISOFS" = "xtrue" ]; then QEMUOPTIONS="$QEMU_NETWORK_CMD -cdrom $ROOTFS $QEMU_UI_OPTIONS" fi
if [ "x$QEMUOPTIONS" = "x" ]; then echo "Error: Unable to support this combination of options" cleanup return 1 fi
if [ "$TCPSERIAL_PORTNUM" != "" ]; then if [ "$MACHINE" = "qemuarm64" ]; then SCRIPT_QEMU_EXTRA_OPT="$SCRIPT_QEMU_EXTRA_OPT -device virtio-serial-device -chardev socket,id=virtcon,port=$TCPSERIAL_PORTNUM,host=127.0.0.1 -device virtconsole,chardev=virtcon" else SCRIPT_QEMU_EXTRA_OPT="$SCRIPT_QEMU_EXTRA_OPT -serial tcp:127.0.0.1:$TCPSERIAL_PORTNUM" fi fi
PATH=$OECORE_NATIVE_SYSROOT/usr/bin:$PATH
QEMUBIN=which $QEMU 2> /dev/null
if [ ! -x "$QEMUBIN" ]; then
echo "Error: No QEMU binary '$QEMU' could be found."
cleanup
return 1
fi
NEED_GL=ldd $QEMUBIN/$QEMU 2>&1 | grep libGLU
We can't run without a libGL.so
if [ "$NEED_GL" != "" ]; then libgl='no'
[ -e /usr/lib/libGL.so -a -e /usr/lib/libGLU.so ] && libgl='yes'
[ -e /usr/lib64/libGL.so -a -e /usr/lib64/libGLU.so ] && libgl='yes'
[ -e /usr/lib/*-linux-gnu/libGL.so -a -e /usr/lib/*-linux-gnu/libGLU.so ] && libgl='yes'
if [ "$libgl" != 'yes' ]; then
echo "You need libGL.so and libGLU.so to exist in your library path to run the QEMU emulator.
Ubuntu package names are: libgl1-mesa-dev and libglu1-mesa-dev.
Fedora package names are: mesa-libGL-devel mesa-libGLU-devel."
return 1;
fi
fi
do_quit() { cleanup return 1 }
trap do_quit INT TERM QUIT
qemu got segfault if linked with nVidia's libgl
GL_LD_PRELOAD=$LD_PRELOAD
if ldd $QEMUBIN | grep -i nvidia &> /dev/null then cat << EOM WARNING: nVidia proprietary OpenGL libraries detected. nVidia's OpenGL libraries are known to have compatibility issues with qemu, resulting in a segfault. Please uninstall these drivers or ensure the mesa libGL libraries precede nvidia's via LD_PRELOAD(Already do it on Ubuntu 10). EOM
Automatically use Ubuntu system's mesa libGL, other distro can add its own path
if grep -i ubuntu /etc/lsb-release &> /dev/null
then
# precede nvidia's driver on Ubuntu 10
UBUNTU_MAIN_VERSION=cat /etc/lsb-release |grep DISTRIB_RELEASE |cut -d= -f 2| cut -d. -f 1
if [ "$UBUNTU_MAIN_VERSION" = "10" ];
then
GL_PATH=""
if test -e /usr/lib/libGL.so
then
GL_PATH="/usr/lib/libGL.so"
elif test -e /usr/lib/x86_64-linux-gnu/libGL.so
then
GL_PATH="/usr/lib/x86_64-linux-gnu/libGL.so"
fi
echo "Skip nVidia's libGL on Ubuntu 10!"
GL_LD_PRELOAD="$GL_PATH $LD_PRELOAD"
fi
fi fi
if [ "x$SERIALSTDIO" = "x1" ]; then echo "Interrupt character is '^]'" stty intr ^] fi
echo "Running $QEMU..."
-no-reboot is a mandatory option - see bug #100
if [ "$FSTYPE" = "vmdk" -o "$FSTYPE" = "hddimg" -o "$FSTYPE" = "hdddirect" ]; then echo $QEMUBIN $VM $QEMUOPTIONS $SERIALOPTS -no-reboot $SCRIPT_QEMU_OPT $SCRIPT_QEMU_EXTRA_OPT LD_PRELOAD="$GL_LD_PRELOAD" $QEMUBIN $VM $QEMUOPTIONS $SERIALOPTS -no-reboot $SCRIPT_QEMU_OPT $SCRIPT_QEMU_EXTRA_OPT elif [ "$FSTYPE" = "iso" ]; then echo $QEMUBIN $QEMUOPTIONS $SERIALOPTS -no-reboot $SCRIPT_QEMU_OPT $SCRIPT_QEMU_EXTRA_OPT LD_PRELOAD="$GL_LD_PRELOAD" $QEMUBIN $QEMUOPTIONS $SERIALOPTS -no-reboot $SCRIPT_QEMU_OPT $SCRIPT_QEMU_EXTRA_OPT else echo $QEMUBIN -kernel $KERNEL $QEMUOPTIONS $SLIRP_CMD $SERIALOPTS -no-reboot $SCRIPT_QEMU_OPT $SCRIPT_QEMU_EXTRA_OPT --append '"'$KERNCMDLINE $SCRIPT_KERNEL_OPT'"' LD_PRELOAD="$GL_LD_PRELOAD" $QEMUBIN -kernel $KERNEL $QEMUOPTIONS $SERIALOPTS -no-reboot $SCRIPT_QEMU_OPT $SCRIPT_QEMU_EXTRA_OPT --append "$KERNCMDLINE $SCRIPT_KERNEL_OPT" fi ret=$? if [ "$SLIRP_ENABLED" != "yes" ]; then cleanup fi
#set the original stty values before exit stty ${ORIG_STTY} trap - INT TERM QUIT
return $ret