From: Richard Henderson <richard.henderson@linaro.org>
To: qemu-devel@nongnu.org
Cc: peter.maydell@linaro.org, laurent@vivier.eu, imp@bsdimp.com
Subject: [RFC PATCH 0/7] linux-user: Streamline handling of SIGSEGV/SIGBUS
Date: Mon, 13 Sep 2021 15:05:45 -0700 [thread overview]
Message-ID: <20210913220552.604064-1-richard.henderson@linaro.org> (raw)
Our current setup is:
host_signal_handler
cpu_signal_handler
handle_cpu_signal
cc->tcg_ops->tlb_fill
raise_exception
cpu_loop
queue_signal
and in the process lose information from the host siginfo_t,
which we (mostly) do not recreate properly. Moreover, the
intermediate cpu_signal_handler handles the host-specific
portions of extracting pc + is_write from the ucontext_t.
I'm replacing this with
host_signal_handler
host_signal_pc
host_sigsegv_write
adjust_signal_pc
handle_sigsegv_accerr_write
queue_signal
raise_exception
cpu_loop
All of the really tcg-specific portions are still in user-exec.c,
and all of the really host-specific portions are now ditributed
across linux-user/host/<arch>/. Importantly, SEGV_MAPERR and
SEGV_ACCERR are now passed through from the host kernel -- or at
least there's a single place from which to manage it [1].
Note that I've dropped all of the BSD (and Solaris!) code from
user-exec.c. I thought about moving it similar to linux-user,
but I've caught Warner in the middle of his re-org and the whole
of bsd-user/signal.c is currently empty. I think it will be
easier to create the new interfaces from scratch when ready.
Still to-do:
* Make cc->tcg_ops->tlb_fill sysemu only (once again).
* Drop all of the code from cpu_loop that interfaced with tlb_fill.
r~
[1] I've just this minute realized that the reserved_va mapping that we
do for emulating 32-bit guests will incorrectly give SEGV_ACCERR for pages
that are not mapped by the guest, and should result in SEGV_MAPERR.
Richard Henderson (7):
include/exec: Move cpu_signal_handler declaration
accel/tcg: Split out adjust_signal_pc
accel/tcg: Split out handle_sigsegv_accerr_write
accel/tcg: Move clear_helper_retaddr to cpu loop
accel/tcg: Fold cpu_exit_tb_from_sighandler into caller
linux-user: Handle SIGSEGV/SIGBUS in host_to_target_siginfo_noswap
linux-user: Reorg cpu_signal_handler
include/exec/exec-all.h | 21 +
linux-user/host/aarch64/host-signal.h | 73 +++
linux-user/host/alpha/host-signal.h | 41 ++
linux-user/host/arm/host-signal.h | 30 +
linux-user/host/i386/host-signal.h | 24 +
linux-user/host/mips/host-signal.h | 61 ++
linux-user/host/ppc/host-signal.h | 24 +
linux-user/host/ppc64/host-signal.h | 1 +
linux-user/host/riscv32/host-signal.h | 57 ++
linux-user/host/riscv64/host-signal.h | 1 +
linux-user/host/s390/host-signal.h | 92 +++
linux-user/host/s390x/host-signal.h | 1 +
linux-user/host/sparc/host-signal.h | 53 ++
linux-user/host/sparc64/host-signal.h | 1 +
linux-user/host/x86_64/host-signal.h | 24 +
target/alpha/cpu.h | 6 -
target/arm/cpu.h | 7 -
target/avr/cpu.h | 2 -
target/cris/cpu.h | 8 -
target/hexagon/cpu.h | 3 -
target/hppa/cpu.h | 3 -
target/i386/cpu.h | 7 -
target/m68k/cpu.h | 8 -
target/microblaze/cpu.h | 7 -
target/mips/cpu.h | 3 -
target/mips/internal.h | 2 -
target/nios2/cpu.h | 2 -
target/openrisc/cpu.h | 2 -
target/ppc/cpu.h | 7 -
target/riscv/cpu.h | 2 -
target/rx/cpu.h | 4 -
target/s390x/cpu.h | 7 -
target/sh4/cpu.h | 3 -
target/sparc/cpu.h | 2 -
target/tricore/cpu.h | 2 -
target/xtensa/cpu.h | 2 -
accel/tcg/cpu-exec.c | 3 +-
accel/tcg/user-exec.c | 807 ++------------------------
linux-user/signal.c | 102 ++--
39 files changed, 635 insertions(+), 870 deletions(-)
create mode 100644 linux-user/host/aarch64/host-signal.h
create mode 100644 linux-user/host/alpha/host-signal.h
create mode 100644 linux-user/host/arm/host-signal.h
create mode 100644 linux-user/host/i386/host-signal.h
create mode 100644 linux-user/host/mips/host-signal.h
create mode 100644 linux-user/host/ppc/host-signal.h
create mode 100644 linux-user/host/ppc64/host-signal.h
create mode 100644 linux-user/host/riscv32/host-signal.h
create mode 100644 linux-user/host/riscv64/host-signal.h
create mode 100644 linux-user/host/s390/host-signal.h
create mode 100644 linux-user/host/s390x/host-signal.h
create mode 100644 linux-user/host/sparc/host-signal.h
create mode 100644 linux-user/host/sparc64/host-signal.h
create mode 100644 linux-user/host/x86_64/host-signal.h
--
2.25.1
next reply other threads:[~2021-09-13 22:10 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-09-13 22:05 Richard Henderson [this message]
2021-09-13 22:05 ` [RFC PATCH 1/7] include/exec: Move cpu_signal_handler declaration Richard Henderson
2021-09-14 6:03 ` Philippe Mathieu-Daudé
2021-09-15 16:09 ` Warner Losh
2021-09-13 22:05 ` [RFC PATCH 2/7] accel/tcg: Split out adjust_signal_pc Richard Henderson
2021-09-14 6:07 ` Philippe Mathieu-Daudé
2021-09-13 22:05 ` [RFC PATCH 3/7] accel/tcg: Split out handle_sigsegv_accerr_write Richard Henderson
2021-09-14 6:58 ` Philippe Mathieu-Daudé
2021-09-13 22:05 ` [RFC PATCH 4/7] accel/tcg: Move clear_helper_retaddr to cpu loop Richard Henderson
2021-09-13 22:05 ` [RFC PATCH 5/7] accel/tcg: Fold cpu_exit_tb_from_sighandler into caller Richard Henderson
2021-09-13 22:05 ` [RFC PATCH 6/7] linux-user: Handle SIGSEGV/SIGBUS in host_to_target_siginfo_noswap Richard Henderson
2021-09-15 16:23 ` Warner Losh
2021-09-15 16:27 ` Richard Henderson
2021-09-13 22:05 ` [RFC PATCH 7/7] linux-user: Reorg cpu_signal_handler Richard Henderson
2021-09-15 16:43 ` Warner Losh
2021-09-15 16:52 ` Richard Henderson
2021-09-16 8:51 ` Philippe Mathieu-Daudé
2021-09-14 1:18 ` [RFC PATCH 0/7] linux-user: Streamline handling of SIGSEGV/SIGBUS Richard Henderson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210913220552.604064-1-richard.henderson@linaro.org \
--to=richard.henderson@linaro.org \
--cc=imp@bsdimp.com \
--cc=laurent@vivier.eu \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).