[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] AArch64: QEMU fails in swapcontext
From: |
Richard Henderson |
Subject: |
Re: [Qemu-devel] AArch64: QEMU fails in swapcontext |
Date: |
Fri, 18 Apr 2014 07:44:20 -0700 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 |
On 04/18/2014 07:00 AM, Mian M. Hamayun wrote:
> Hello Peter & All,
>
> I am trying to figure out a problem in qemu on aarch64 (with kvm enabled). I
> have found this problem in many different versions of qemu
> (v2.0.0-rc3/rc2/rc1/rc0, master 2d03b49), and I believe that either I am
> missing something common in all of these versions or its a genuine bug in qemu
> on aarch64.
>
> The problem is triggered by virtqueue_notify() function (in virtio_ring.c)
> from
> the guest kernel and fails in the qemu_coroutine_new() while trying to do the
> swapcontext(&old_uc, &uc) (see coroutine-ucontext.c:164). The
> sigsetjmp(old_env, 0) just before the swapcontext() call seems to work fine,
> as
> it returns 0, and then we invoke the swapcontext().
>
> The host kernel reports:
> "qemu-system-aar[596]: bad frame in sys_rt_sigreturn: pc=004462e0
> sp=7f8020f000" and kills the qemu process due to segmentation fault. The
> pc=004462e0 is for the coroutine_trampoline() but we don't actually reach it,
> when this particular crash happens.
>
> Just to give you an idea of the code I am talking about:
>
> $~/qemu[master]$ git blame -L 159,166 coroutine-ucontext.c
> 00dccaf1 (Kevin Wolf 2011-01-17 16:08:14 +0000 159) makecontext(&uc,
> (void (*)(void))coroutine_trampoline,
> 00dccaf1 (Kevin Wolf 2011-01-17 16:08:14 +0000 160) 2,
> arg.i[0], arg.i[1]);
> 00dccaf1 (Kevin Wolf 2011-01-17 16:08:14 +0000 161)
> 6ab7e546 (Peter Maydell 2013-02-20 15:21:09 +0000 162) /* swapcontext()
> in,
> siglongjmp() back out */
> 6ab7e546 (Peter Maydell 2013-02-20 15:21:09 +0000 163) if
> (!sigsetjmp(old_env, 0)) {
> 00dccaf1 (Kevin Wolf 2011-01-17 16:08:14 +0000 164)
> swapcontext(&old_uc, &uc);
> 00dccaf1 (Kevin Wolf 2011-01-17 16:08:14 +0000 165) }
> 00dccaf1 (Kevin Wolf 2011-01-17 16:08:14 +0000 166) return &co->base;
>
> My qemu configure/run commands are:
>
> ./configure --target-list=aarch64-softmmu \
> --cross-prefix=aarch64-linux-gnu- \
> --enable-fdt *--enable-kvm* --disable-werror \
> --audio-drv-list="" --static
>
> ./qemu-system-aarch64 \
> *-enable-kvm* -nographic -kernel Image \
> -drive if=none,file=disk_oe64.img,id=fs \
> -device virtio-blk-device,drive=fs \
> -m 1024 -M virt -cpu host \
> -append "earlyprintk console=ttyAMA0 mem=1024M rootwait root=/dev/vda rw
> init=/bin/sh"
>
> Any ideas/comments on how to resolve this issue?
Note that a patch has just gone into glibc to rewrite setcontext et al for
aarch64. I'd try using git glibc before looking too much deeper.
r~