poky/scripts/runqemu-internal
Laurentiu Palcu 405be52d26 runqemu: set qemuarm memory size back to 128MB
The following commit, 6ccd4d6, increased the RAM size for qemu machines
to 256MB due to some smart sanity tests failing on autobuilder because
more memory was needed.

Unfortunately this leads to various, potentially dangerous, issues like
the one observed during sudoku-savant project compilation:

collect: relinking
collect2: error: '_ZNK6sudoku5ClearINS_6SquareEEclERS1_' was assigned to
'board.rpo', but was not defined during recompilation, or vice versa
board.o:(.rodata+0x8): undefined reference to
`sudoku::Clear<sudoku::Square>::operator()(sudoku::Square&) const'
board.o:(.rodata+0x20): undefined reference to
`sudoku::Clear<sudoku::Sequence>::operator()(sudoku::Sequence&) const'
board.o:(.rodata+0x34): undefined reference to `typeinfo for
sudoku::Action<sudoku::Sequence>'
...AND THE LIST CONTINUES...
collect2: error: ld returned 1 exit status
make: *** [sudoku-savant] Error 1

After some tests, I found that the maximum amount of memory needed for
sudoku to compile properly is 146MB(!?!).

My attempts to create a simpler test case (using templates), in order to
replicate and isolate the issue failed. All the tests compiled just
fine.

So, my guess is that this problem is certainly memory related but the
cause might be hidden in any of the following: qemu versatile hw model,
in the kernel or, highly unlikely but not impossible, the toolchain
itself. The reason I don't really think the cause is in the toolchain is
the fact that the compilation completes just fine for 128MB on qemuarm but
also on other qemu machines (with 256MB of memory).

Since this issue might need lots of time to have a proper fix, I'll revert back
to using 128MB for qemuarm for the time being.

[YOCTO #5133]

(From OE-Core rev: 06605bd6ddd4d6a788e1a107dcf15dde1027c094)

Signed-off-by: Laurentiu Palcu <laurentiu.palcu@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
2013-09-22 12:19:41 +01:00

22 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 ;; "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="" 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" else QEMU_NETWORK_CMD="" DROOT="/dev/hda" ROOTFS_OPTIONS="-hda $ROOTFS" 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
        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 s/://`
    TAP=""
    LOCKFILE=""
    USE_PRECONF_TAP="no"
    for tap in $POSSIBLE; do
        LOCKFILE="$LOCKDIR/$tap"
        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, use flock on $LOCKFILE.lock 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//')
    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"
    else
        QEMU_NETWORK_CMD="-net nic,vlan=0 $QEMU_TAP_CMD"
        DROOT="/dev/hda"
        ROOTFS_OPTIONS="-hda $ROOTFS"
    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") ;; "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" ]; then echo "Error: Kernel image file $KERNEL doesn't exist" cleanup return 1 fi

if [ "$FSTYPE" != "nfs" -a "$FSTYPE" != "vmdk" -a ! -f "$ROOTFS" ]; then echo "Error: Image file $ROOTFS doesn't exist" cleanup return 1 fi

if [ "$FSTYPE" = "nfs" ]; then NFS_SERVER="192.168.7.1" NFS_DIR=echo $ROOTFS | sed 's/^[^:]*:\(.*\)/\1/' 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=2,mountprog=$MOUNTD_RPCPORT,nfsprog=$NFSD_RPCPORT,udp,port=$NFSD_PORT,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
    cleanup
    return 1
fi
NFSRUNNING="true"

fi

if [ "$NFS_SERVER" = "" ]; then NFS_SERVER="192.168.7.1" NFS_DIR=$ROOTFS 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} -hda $ROOTFS -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 $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" = "qemux86" ]; then QEMU=qemu-system-i386 QEMU_UI_OPTIONS="$QEMU_UI_OPTIONS -vga vmware" 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 $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 $KERNEL_NETWORK_CMD mem=$QEMU_MEMORY" QEMUOPTIONS="$QEMU_NETWORK_CMD $QEMU_UI_OPTIONS" fi if [ "$FSTYPE" = "vmdk" ]; 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 QEMU_UI_OPTIONS="$QEMU_UI_OPTIONS -vga vmware" 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 $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 $QEMU_UI_OPTIONS" fi if [ "$FSTYPE" = "vmdk" ]; 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" = "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 -hda $ROOTFS -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 -hda $ROOTFS -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 [ "$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 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

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" ]; 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