qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 0/3] linux-user: Implement x86_64 vsyscalls


From: Alex Bennée
Subject: Re: [PATCH 0/3] linux-user: Implement x86_64 vsyscalls
Date: Thu, 16 Jan 2020 14:30:28 +0000
User-agent: mu4e 1.3.6; emacs 28.0.50

Richard Henderson <address@hidden> writes:

> The x86_64 abi has a legacy vsyscall page.  The kernel folk
> have been trying to deprecate this since at least v3.1, but
>
> (1) We don't implement the vdso that replaces vsyscalls,
> (2) As of v5.5, the vsyscall page is still enabled by default.
>
> This lack is affecting Peter's linux-user testing.
>
> The dependency is not obvious because Peter is running the tests
> on x86_64, so the host is providing a vsyscall page to qemu.
>
> Because of how user-only memory operations are handled, with no
> validation of guest vs host pages, so long as qemu chooses to
> run with guest_base == 0, the guest may Just So Happen to read
> the host's vsyscall page.
>
> Complicating this, new OS releases may use a kernel configured
> with CONFIG_LEGACY_VSYSCALL_XONLY=y, which means the the vsyscall
> page cannot be read, only executed.  Which means that the guest
> then cannot read the host vsyscall page during translation and
> will SIGSEGV.
>
> Exactly which of these many variables is affecting Peter's testing
> with Ubuntu 18.04 of my TCG merge, I'm not exactly sure.  I suspect
> that it is the change to drop the textseg_addr adjustment to user-only
> static binaries.  IIRC bionic does not support -static-pie, which is
> the preferred replacement.  This could mean that the host and guest
> binaries overlap, which leads to guest_base != 0.
>
> I vaguely remember someone (Paolo?) implementing something like
> this many years ago, but clearly it never got merged.
>
> In any case, this emulation has been missing for too long.
>
>
> r~
>
>
> Richard Henderson (3):
>   target/i386: Renumber EXCP_SYSCALL
>   linux-user/i386: Split out gen_signal
>   linux-user/i386: Emulate x86_64 vsyscalls

And realising I didn't read it properly:

/x86_64-linux-user/qemu-x86_64 
~/lsrc/linux.git/tools/testing/selftests/x86/test_vsyscall_64
[WARN]  failed to find vDSO
        no vsyscall map in /proc/self/maps
[RUN]   test gettimeofday()
[RUN]   test time()
[RUN]   getcpu() on CPU 0
[RUN]   getcpu() on CPU 1
[RUN]   Checking read access to the vsyscall page
[OK]    We do not have read access: #PF(0x4)
[RUN]   Make sure that vsyscalls really page fault
**
ERROR:/home/alex/lsrc/qemu.git/linux-user/x86_64/../i386/cpu_loop.c:185:emulate_vsyscall:
 assertion failed: (ret != -TARGET_EFAULT)
qemu:handle_cpu_signal received signal outside vCPU context @ pc=0x7f6eed31b613

-- 
Alex Bennée



reply via email to

[Prev in Thread] Current Thread [Next in Thread]