[PATCH for-7.0 v6 00/16] linux-user: simplify safe signal handling

Richard Henderson posted 16 patches 2 weeks ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20211123173759.1383510-1-richard.henderson@linaro.org
Maintainers: Laurent Vivier <laurent@vivier.eu>, Taylor Simpson <tsimpson@quicinc.com>, Warner Losh <imp@bsdimp.com>, Jiaxun Yang <jiaxun.yang@flygoat.com>, Kyle Evans <kevans@freebsd.org>, "Philippe Mathieu-Daudé" <f4bug@amsat.org>, Riku Voipio <riku.voipio@iki.fi>
meson.build                                   |  23 +++-
bsd-user/errno_defs.h                         |   6 +-
bsd-user/special-errno.h                      |  24 ++++
{linux-user => include/user}/safe-syscall.h   |  37 ++---
linux-user/cpu_loop-common.h                  |   1 +
linux-user/generic/target_errno_defs.h        |  17 ---
linux-user/host/aarch64/hostdep.h             |  18 ---
linux-user/host/arm/hostdep.h                 |  18 ---
linux-user/host/i386/hostdep.h                |  18 ---
linux-user/host/ia64/hostdep.h                |  15 ---
linux-user/host/mips/hostdep.h                |  15 ---
linux-user/host/ppc/hostdep.h                 |  15 ---
linux-user/host/ppc64/hostdep.h               |  18 ---
linux-user/host/riscv/hostdep.h               |  14 --
linux-user/host/s390/hostdep.h                |  15 ---
linux-user/host/s390x/hostdep.h               |  18 ---
linux-user/host/sparc/hostdep.h               |  15 ---
linux-user/host/sparc64/hostdep.h             |  15 ---
linux-user/host/x32/hostdep.h                 |  15 ---
linux-user/host/x86_64/hostdep.h              |  18 ---
linux-user/signal-common.h                    |   4 +-
linux-user/special-errno.h                    |  32 +++++
linux-user/user-internals.h                   |   1 -
common-user/safe-syscall-error.c              |  25 ++++
linux-user/aarch64/cpu_loop.c                 |   4 +-
linux-user/aarch64/signal.c                   |   4 +-
linux-user/alpha/cpu_loop.c                   |   4 +-
linux-user/alpha/signal.c                     |   8 +-
linux-user/arm/cpu_loop.c                     |   4 +-
linux-user/arm/signal.c                       |   8 +-
linux-user/cris/cpu_loop.c                    |   4 +-
linux-user/cris/signal.c                      |   4 +-
linux-user/hexagon/cpu_loop.c                 |   4 +-
linux-user/hexagon/signal.c                   |   2 +-
linux-user/hppa/cpu_loop.c                    |   4 +-
linux-user/hppa/signal.c                      |   4 +-
linux-user/i386/cpu_loop.c                    |  12 +-
linux-user/i386/signal.c                      |   8 +-
linux-user/m68k/cpu_loop.c                    |   4 +-
linux-user/m68k/signal.c                      |   8 +-
linux-user/microblaze/cpu_loop.c              |   4 +-
linux-user/microblaze/signal.c                |   4 +-
linux-user/mips/cpu_loop.c                    |   4 +-
linux-user/mips/signal.c                      |   8 +-
linux-user/openrisc/cpu_loop.c                |   4 +-
linux-user/ppc/cpu_loop.c                     |   4 +-
linux-user/ppc/signal.c                       |  10 +-
linux-user/riscv/cpu_loop.c                   |   4 +-
linux-user/riscv/signal.c                     |   2 +-
linux-user/s390x/cpu_loop.c                   |   4 +-
linux-user/s390x/signal.c                     |   8 +-
linux-user/sh4/cpu_loop.c                     |   4 +-
linux-user/sh4/signal.c                       |   8 +-
linux-user/signal.c                           |  10 +-
linux-user/sparc/cpu_loop.c                   |   2 +-
linux-user/sparc/signal.c                     |   8 +-
linux-user/syscall.c                          |  21 +--
thunk.c => linux-user/thunk.c                 |   0
linux-user/xtensa/cpu_loop.c                  |   4 +-
linux-user/xtensa/signal.c                    |   4 +-
MAINTAINERS                                   |   3 +-
bsd-user/meson.build                          |   6 +
common-user/host/aarch64/safe-syscall.inc.S   |  88 ++++++++++++
common-user/host/arm/safe-syscall.inc.S       | 108 +++++++++++++++
common-user/host/i386/safe-syscall.inc.S      | 126 ++++++++++++++++++
common-user/host/mips/safe-syscall.inc.S      | 123 +++++++++++++++++
common-user/host/ppc64/safe-syscall.inc.S     |  90 +++++++++++++
common-user/host/riscv/safe-syscall.inc.S     |  79 +++++++++++
common-user/host/s390x/safe-syscall.inc.S     |  98 ++++++++++++++
common-user/host/sparc64/safe-syscall.inc.S   |  89 +++++++++++++
.../host/x86_64/safe-syscall.inc.S            |  44 +++---
common-user/meson.build                       |   6 +
{linux-user => common-user}/safe-syscall.S    |   5 +-
linux-user/host/aarch64/safe-syscall.inc.S    |  75 -----------
linux-user/host/arm/safe-syscall.inc.S        |  90 -------------
linux-user/host/i386/safe-syscall.inc.S       | 100 --------------
linux-user/host/ppc64/safe-syscall.inc.S      |  96 -------------
linux-user/host/riscv/safe-syscall.inc.S      |  77 -----------
linux-user/host/s390x/safe-syscall.inc.S      |  90 -------------
linux-user/meson.build                        |   9 +-
80 files changed, 1070 insertions(+), 932 deletions(-)
create mode 100644 bsd-user/special-errno.h
rename {linux-user => include/user}/safe-syscall.h (83%)
delete mode 100644 linux-user/host/aarch64/hostdep.h
delete mode 100644 linux-user/host/arm/hostdep.h
delete mode 100644 linux-user/host/i386/hostdep.h
delete mode 100644 linux-user/host/ia64/hostdep.h
delete mode 100644 linux-user/host/mips/hostdep.h
delete mode 100644 linux-user/host/ppc/hostdep.h
delete mode 100644 linux-user/host/ppc64/hostdep.h
delete mode 100644 linux-user/host/riscv/hostdep.h
delete mode 100644 linux-user/host/s390/hostdep.h
delete mode 100644 linux-user/host/s390x/hostdep.h
delete mode 100644 linux-user/host/sparc/hostdep.h
delete mode 100644 linux-user/host/sparc64/hostdep.h
delete mode 100644 linux-user/host/x32/hostdep.h
delete mode 100644 linux-user/host/x86_64/hostdep.h
create mode 100644 linux-user/special-errno.h
create mode 100644 common-user/safe-syscall-error.c
rename thunk.c => linux-user/thunk.c (100%)
create mode 100644 common-user/host/aarch64/safe-syscall.inc.S
create mode 100644 common-user/host/arm/safe-syscall.inc.S
create mode 100644 common-user/host/i386/safe-syscall.inc.S
create mode 100644 common-user/host/mips/safe-syscall.inc.S
create mode 100644 common-user/host/ppc64/safe-syscall.inc.S
create mode 100644 common-user/host/riscv/safe-syscall.inc.S
create mode 100644 common-user/host/s390x/safe-syscall.inc.S
create mode 100644 common-user/host/sparc64/safe-syscall.inc.S
rename {linux-user => common-user}/host/x86_64/safe-syscall.inc.S (81%)
create mode 100644 common-user/meson.build
rename {linux-user => common-user}/safe-syscall.S (91%)
delete mode 100644 linux-user/host/aarch64/safe-syscall.inc.S
delete mode 100644 linux-user/host/arm/safe-syscall.inc.S
delete mode 100644 linux-user/host/i386/safe-syscall.inc.S
delete mode 100644 linux-user/host/ppc64/safe-syscall.inc.S
delete mode 100644 linux-user/host/riscv/safe-syscall.inc.S
delete mode 100644 linux-user/host/s390x/safe-syscall.inc.S

[PATCH for-7.0 v6 00/16] linux-user: simplify safe signal handling

Posted by Richard Henderson 2 weeks ago
Changes for v6:
  * Re-order patches so that the move to common happens after
    all of the changes to linux-user.  Seems less confusing
    this way.  As a consequence, the meson.build changes for
    common-user have to happen at the same time, lest we get
    meson configure errors for missing directories.
  * Use a helper, safe_syscall_set_errno_tail, to set errno
    instead of passing in &errno to safe_syscall_base.
    This avoids the aligned register pairs problem that Peter
    mentioned, as well as being more efficient in the common
    case of syscall success.  As a consequence, some R-B have
    been dropped.
  * New untabify patch (peter).
  * PPC64 cleanup split out of larger change.

Changes for v5:
  * Fix safe-syscall.S FreeBSD typos.
  * Rename special TARGET_EFOO to QEMU_EFOO.
  * Create *-user/special-errno.h.
  * Build safe-syscall.o only once.
  * meson.build cleanups.
  * bsd-user builds without modification on master.

Changes for v4:
  * Move errno handling into the assembly.  While returning the
    raw -errno is handy for x86 linux (and a few others), it is
    in fact more complex for other hosts that return a separate
    error indicator.  At which point we wind up jumping through
    hoops to return -errno, only to have the caller put it right
    back into +errno with -1 result, just like syscall(3).
    Pass in &errno, because the method of calculating this
    varies wildly between glibc, musl, etc.  This means that
    the assembly need only store to a provided pointer.
  * Add mips and sparc safe-syscall implementations.
    Both of which, btw, have separate error indicators.  ;-)
  * All hosts now have it, so remove HAVE_SAFE_SYSCALL.
  * Add meson.build rules for common-user/safe-syscall.S, so
    that we don't have to have weird includes from *-user.

Warner's v3:
  https://patchew.org/QEMU/20211113045603.60391-1-imp@bsdimp.com/

Patches needing review:
  01-linux-user-Untabify-all-safe-syscall.inc.S.patch
  02-linux-user-host-ppc64-Use-r11-for-signal_pending-.patch
  03-linux-user-Move-syscall-error-detection-into-safe.patch
  04-linux-user-host-mips-Add-safe-syscall.inc.S.patch
  05-linux-user-host-sparc64-Add-safe-syscall.inc.S.patch


r~


Richard Henderson (16):
  linux-user: Untabify all safe-syscall.inc.S
  linux-user/host/ppc64: Use r11 for signal_pending address
  linux-user: Move syscall error detection into safe_syscall_base
  linux-user/host/mips: Add safe-syscall.inc.S
  linux-user/host/sparc64: Add safe-syscall.inc.S
  linux-user: Remove HAVE_SAFE_SYSCALL and hostdep.h
  linux-user: Rename TARGET_ERESTARTSYS to QEMU_ERESTARTSYS
  bsd-user: Rename TARGET_ERESTARTSYS to QEMU_ERESTARTSYS
  linux-user: Rename TARGET_QEMU_ESIGRETURN to QEMU_ESIGRETURN
  linux-user: Create special-errno.h
  bsd-user: Create special-errno.h
  common-user: Move safe-syscall.* from linux-user
  common-user: Adjust system call return on FreeBSD
  linux-user: Move thunk.c from top-level
  meson: Move linux_user_ss to linux-user/
  meson: Move bsd_user_ss to bsd-user/

 meson.build                                   |  23 +++-
 bsd-user/errno_defs.h                         |   6 +-
 bsd-user/special-errno.h                      |  24 ++++
 {linux-user => include/user}/safe-syscall.h   |  37 ++---
 linux-user/cpu_loop-common.h                  |   1 +
 linux-user/generic/target_errno_defs.h        |  17 ---
 linux-user/host/aarch64/hostdep.h             |  18 ---
 linux-user/host/arm/hostdep.h                 |  18 ---
 linux-user/host/i386/hostdep.h                |  18 ---
 linux-user/host/ia64/hostdep.h                |  15 ---
 linux-user/host/mips/hostdep.h                |  15 ---
 linux-user/host/ppc/hostdep.h                 |  15 ---
 linux-user/host/ppc64/hostdep.h               |  18 ---
 linux-user/host/riscv/hostdep.h               |  14 --
 linux-user/host/s390/hostdep.h                |  15 ---
 linux-user/host/s390x/hostdep.h               |  18 ---
 linux-user/host/sparc/hostdep.h               |  15 ---
 linux-user/host/sparc64/hostdep.h             |  15 ---
 linux-user/host/x32/hostdep.h                 |  15 ---
 linux-user/host/x86_64/hostdep.h              |  18 ---
 linux-user/signal-common.h                    |   4 +-
 linux-user/special-errno.h                    |  32 +++++
 linux-user/user-internals.h                   |   1 -
 common-user/safe-syscall-error.c              |  25 ++++
 linux-user/aarch64/cpu_loop.c                 |   4 +-
 linux-user/aarch64/signal.c                   |   4 +-
 linux-user/alpha/cpu_loop.c                   |   4 +-
 linux-user/alpha/signal.c                     |   8 +-
 linux-user/arm/cpu_loop.c                     |   4 +-
 linux-user/arm/signal.c                       |   8 +-
 linux-user/cris/cpu_loop.c                    |   4 +-
 linux-user/cris/signal.c                      |   4 +-
 linux-user/hexagon/cpu_loop.c                 |   4 +-
 linux-user/hexagon/signal.c                   |   2 +-
 linux-user/hppa/cpu_loop.c                    |   4 +-
 linux-user/hppa/signal.c                      |   4 +-
 linux-user/i386/cpu_loop.c                    |  12 +-
 linux-user/i386/signal.c                      |   8 +-
 linux-user/m68k/cpu_loop.c                    |   4 +-
 linux-user/m68k/signal.c                      |   8 +-
 linux-user/microblaze/cpu_loop.c              |   4 +-
 linux-user/microblaze/signal.c                |   4 +-
 linux-user/mips/cpu_loop.c                    |   4 +-
 linux-user/mips/signal.c                      |   8 +-
 linux-user/openrisc/cpu_loop.c                |   4 +-
 linux-user/ppc/cpu_loop.c                     |   4 +-
 linux-user/ppc/signal.c                       |  10 +-
 linux-user/riscv/cpu_loop.c                   |   4 +-
 linux-user/riscv/signal.c                     |   2 +-
 linux-user/s390x/cpu_loop.c                   |   4 +-
 linux-user/s390x/signal.c                     |   8 +-
 linux-user/sh4/cpu_loop.c                     |   4 +-
 linux-user/sh4/signal.c                       |   8 +-
 linux-user/signal.c                           |  10 +-
 linux-user/sparc/cpu_loop.c                   |   2 +-
 linux-user/sparc/signal.c                     |   8 +-
 linux-user/syscall.c                          |  21 +--
 thunk.c => linux-user/thunk.c                 |   0
 linux-user/xtensa/cpu_loop.c                  |   4 +-
 linux-user/xtensa/signal.c                    |   4 +-
 MAINTAINERS                                   |   3 +-
 bsd-user/meson.build                          |   6 +
 common-user/host/aarch64/safe-syscall.inc.S   |  88 ++++++++++++
 common-user/host/arm/safe-syscall.inc.S       | 108 +++++++++++++++
 common-user/host/i386/safe-syscall.inc.S      | 126 ++++++++++++++++++
 common-user/host/mips/safe-syscall.inc.S      | 123 +++++++++++++++++
 common-user/host/ppc64/safe-syscall.inc.S     |  90 +++++++++++++
 common-user/host/riscv/safe-syscall.inc.S     |  79 +++++++++++
 common-user/host/s390x/safe-syscall.inc.S     |  98 ++++++++++++++
 common-user/host/sparc64/safe-syscall.inc.S   |  89 +++++++++++++
 .../host/x86_64/safe-syscall.inc.S            |  44 +++---
 common-user/meson.build                       |   6 +
 {linux-user => common-user}/safe-syscall.S    |   5 +-
 linux-user/host/aarch64/safe-syscall.inc.S    |  75 -----------
 linux-user/host/arm/safe-syscall.inc.S        |  90 -------------
 linux-user/host/i386/safe-syscall.inc.S       | 100 --------------
 linux-user/host/ppc64/safe-syscall.inc.S      |  96 -------------
 linux-user/host/riscv/safe-syscall.inc.S      |  77 -----------
 linux-user/host/s390x/safe-syscall.inc.S      |  90 -------------
 linux-user/meson.build                        |   9 +-
 80 files changed, 1070 insertions(+), 932 deletions(-)
 create mode 100644 bsd-user/special-errno.h
 rename {linux-user => include/user}/safe-syscall.h (83%)
 delete mode 100644 linux-user/host/aarch64/hostdep.h
 delete mode 100644 linux-user/host/arm/hostdep.h
 delete mode 100644 linux-user/host/i386/hostdep.h
 delete mode 100644 linux-user/host/ia64/hostdep.h
 delete mode 100644 linux-user/host/mips/hostdep.h
 delete mode 100644 linux-user/host/ppc/hostdep.h
 delete mode 100644 linux-user/host/ppc64/hostdep.h
 delete mode 100644 linux-user/host/riscv/hostdep.h
 delete mode 100644 linux-user/host/s390/hostdep.h
 delete mode 100644 linux-user/host/s390x/hostdep.h
 delete mode 100644 linux-user/host/sparc/hostdep.h
 delete mode 100644 linux-user/host/sparc64/hostdep.h
 delete mode 100644 linux-user/host/x32/hostdep.h
 delete mode 100644 linux-user/host/x86_64/hostdep.h
 create mode 100644 linux-user/special-errno.h
 create mode 100644 common-user/safe-syscall-error.c
 rename thunk.c => linux-user/thunk.c (100%)
 create mode 100644 common-user/host/aarch64/safe-syscall.inc.S
 create mode 100644 common-user/host/arm/safe-syscall.inc.S
 create mode 100644 common-user/host/i386/safe-syscall.inc.S
 create mode 100644 common-user/host/mips/safe-syscall.inc.S
 create mode 100644 common-user/host/ppc64/safe-syscall.inc.S
 create mode 100644 common-user/host/riscv/safe-syscall.inc.S
 create mode 100644 common-user/host/s390x/safe-syscall.inc.S
 create mode 100644 common-user/host/sparc64/safe-syscall.inc.S
 rename {linux-user => common-user}/host/x86_64/safe-syscall.inc.S (81%)
 create mode 100644 common-user/meson.build
 rename {linux-user => common-user}/safe-syscall.S (91%)
 delete mode 100644 linux-user/host/aarch64/safe-syscall.inc.S
 delete mode 100644 linux-user/host/arm/safe-syscall.inc.S
 delete mode 100644 linux-user/host/i386/safe-syscall.inc.S
 delete mode 100644 linux-user/host/ppc64/safe-syscall.inc.S
 delete mode 100644 linux-user/host/riscv/safe-syscall.inc.S
 delete mode 100644 linux-user/host/s390x/safe-syscall.inc.S

-- 
2.25.1