qemu-user compiled static for ppc fails on 64bit hosts

Bug #1052857 reported by Erik de Castro Lopo
12
This bug affects 2 people
Affects Status Importance Assigned to Milestone
QEMU
Fix Released
Undecided
Unassigned

Bug Description

On debian I used debootstrap to set up a powerpc chroot. If I then copy in a statically linked qemu-user ppc binary it will work for some commands in the chroot and fail for others. Steps to reproduce:

host$ mkdir powerpc
host$ sudo debootstrap --arch=powerpc --foreign wheezy powerpc http://ftp.debian.org/debian
host$ sudo cp /usr/bin/qemu-ppc-static powerpc/usr/bin/
host$ LANG=C sudo chroot powerpc /usr/bin/qemu-ppc-static /bin/bash
I have no name!@guest:/# pwd
/
I have no name!@guest:/# cd home/
I have no name!@guest:/home# ls
qemu-ppc-static: /tmp/buildd/qemu-1.1.2+dfsg/linux-user/signal.c:4341: setup_frame: Assertion `({ unsigned long __guest = (unsigned long)(ka->_sa_handler) - guest_base; (__guest < (1ul << 32)) && (!reserved_va || (__guest < reserved_va)); })' failed.

I have also built this from the git HEAD sources (hash 6b80f7db8a7f84d21e46d01e30c8497733bb23a0) and I get the same result.

Revision history for this message
Samuel Seay (lightningth) wrote :

I ran into this issue also and did a bit of investigating. This is only an issue when ran on a 64bit host. The actual problem line is

err |= __put_user(h2g(ka->_sa_handler), &sc->handler);

inside of linux_user/signal.c. What I am unsure of is when the h2g() macro, the cause of the assert, is valid to be used. In this case, under 64bit, GUEST_BASE has a value (32bit it is 0) but ka->_sa_handler has a low value. Assuming that the low value is a direct result of being a guest address and not a host address then the h2g() shouldn't be called.

I removed the macro from that line which kept the assert from appearing but qemu still died after running 'ls'. I am attempting to fix this bug but I have limited understanding of qemu itself so no promises of me doing a fix, let alone a proper fix.

summary: - qemu-user compiled static for ppc fails
+ qemu-user compiled static for ppc fails on 64bit hosts
Revision history for this message
Peter Maydell (pmaydell) wrote : Re: [Qemu-devel] [Bug 1052857] Re: qemu-user compiled static for ppc fails

On 1 January 2013 06:56, Samuel Seay <email address hidden> wrote:
> I ran into this issue also and did a bit of investigating. This is only
> an issue when ran on a 64bit host. The actual problem line is
>
> err |= __put_user(h2g(ka->_sa_handler), &sc->handler);
>
> inside of linux_user/signal.c. What I am unsure of is when the h2g()
> macro, the cause of the assert, is valid to be used.

Strongly suspect that (PPC-specific) code is just busted -- no other guest
architecture's signal handling code does an h2g on ka->_sa_handler,
because it's a guest address already.

cc'ing our PPC maintainer :-)

-- PMM

Revision history for this message
Samuel Seay (lightningth) wrote :

I just submitted a patch to the dev mailing list. Just in case there is an issue with the submitted patch, or if Erik wants it sooner, I attached the patch I submitted.

Revision history for this message
Thomas Huth (th-huth) wrote :

As far as I can see, the fix has been included here:
http://git.qemu.org/?p=qemu.git;a=commitdiff;h=beb526b12134a6b674
... so closing this ticket now.

Changed in qemu:
status: New → Fix Released
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.