1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
device: 0.801
other: 0.794
PID: 0.789
permissions: 0.780
socket: 0.765
files: 0.753
performance: 0.752
debug: 0.742
graphic: 0.735
semantic: 0.695
network: 0.690
boot: 0.679
vnc: 0.650
KVM: 0.432
qemu-user compiled static for ppc fails on 64bit hosts
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.
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.
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
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.
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.
|