[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] User mode: Handle x86_64 vsyscall
From: |
Laurent Desnogues |
Subject: |
Re: [Qemu-devel] [PATCH] User mode: Handle x86_64 vsyscall |
Date: |
Sun, 18 Oct 2009 02:16:33 +0200 |
Hi Edgar,
On Sat, Oct 17, 2009 at 9:57 PM, Edgar E. Iglesias
<address@hidden> wrote:
>
> It feels a bit strange to have the CPU model know about linux vsyscalls.
> Did you consider having the linux-user loader pass a qemu version of the
> x86_64 vdso to the guest through the auxvector? That version could probably
> implement the vsyscalls by translating them into syscalls with x86_64 code.
> It probably doesn't even need to do that btw, just make sure to fill it
> with syscall insns to raise exceptions and then have the linux-user/ code
> treat syscalls with eip from vdso page differently. That way the CPU model
> doesn't need to know about vdso and you can implement vsyscalls that may
> need magic interactions with qemu.
>
> Or does that not work for some reason? Performance?
> Are there maybe old binaries that don't look in the auxvector and just assume
> a fixed address for the vdso?
A recent compiler (gcc 4.4.0) produces this code for a statically
compiled program:
00000000005779e0 <time>:
5779e0: 48 83 ec 08 sub $0x8,%rsp
5779e4: 48 c7 c0 00 04 60 ff mov $0xffffffffff600400,%rax
5779eb: ff d0 callq *%rax
5779ed: 48 83 c4 08 add $0x8,%rsp
5779f1: c3 retq
I never heard of "auxvector" before. Is this related to what is
discussed here?
http://manugarg.googlepages.com/aboutelfauxiliaryvectors
I dumped 4KB mapped at AT_SYSINFO_EHDR and processed
it through readelf. Nothing matches the address above:
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: ffffffffff70030c 0 SECTION LOCAL DEFAULT 7
2: ffffffffff700800 74 FUNC WEAK DEFAULT 12
clock_gettime@@LINUX_2.6
3: 0000000000000000 0 OBJECT GLOBAL DEFAULT ABS LINUX_2.6
4: ffffffffff7006c0 137 FUNC GLOBAL DEFAULT 12
__vdso_gettimeofday@@LINUX_2.6
5: ffffffffff700850 61 FUNC GLOBAL DEFAULT 12
__vdso_getcpu@@LINUX_2.6
6: ffffffffff7006c0 137 FUNC WEAK DEFAULT 12
gettimeofday@@LINUX_2.6
7: ffffffffff700850 61 FUNC WEAK DEFAULT 12 getcpu@@LINUX_2.6
8: ffffffffff700800 74 FUNC GLOBAL DEFAULT 12
__vdso_clock_gettime@@LINUX_2.6
I probably missed your point :-)
Thanks,
Laurent