*[PATCH v2 0/5] linux-user: Implement x86_64 vsyscalls@ 2020-01-16 19:43 Richard Henderson
2020-01-16 19:43 ` [PATCH v2 1/5] target/i386: Renumber EXCP_SYSCALL Richard Henderson
` (6 more replies)0 siblings, 7 replies; 18+ messages in thread
From: Richard Henderson @ 2020-01-16 19:43 UTC (permalink / raw)
To: qemu-devel; +Cc: alex.bennee, laurent
Changes since v2:
* Add /proc/self/maps line
I'm not sure this is really necessary. The linux kernel
self-test checks for it, and modifies the set of tests that
it runs based on it. But otherwise I think it's unused.
* Fix errors in base gettimeofday syscall
This is also checked by test_vsyscall, as noticed by AJB.
r~
Original blurb:
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.
Richard Henderson (5):
target/i386: Renumber EXCP_SYSCALL
linux-user/i386: Split out gen_signal
linux-user/i386: Emulate x86_64 vsyscalls
linux-user: Add x86_64 vsyscall page to /proc/self/maps
linux-user: Flush out implementation of gettimeofday
target/i386/cpu.h | 6 +-
linux-user/i386/cpu_loop.c | 198 ++++++++++++++++++++++++++-----------
linux-user/syscall.c | 36 ++++++-
target/i386/translate.c | 16 ++-
4 files changed, 190 insertions(+), 66 deletions(-)
--
2.20.1
^permalinkrawreply [flat|nested] 18+ messages in thread