mbox series

[v5,00/17] linux-user: simplify safe signal handling

Message ID 20211117160412.71563-1-richard.henderson@linaro.org
Headers show
Series linux-user: simplify safe signal handling | expand

Message

Richard Henderson Nov. 17, 2021, 4:03 p.m. UTC
Warner's v3:
https://patchew.org/QEMU/20211113045603.60391-1-imp@bsdimp.com/

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.


r~


Richard Henderson (13):
  common-user: Move syscall error detection into safe_syscall_base
  common-user/host/mips: Add safe-syscall.inc.S
  common-user/host/sparc64: Add safe-syscall.inc.S
  linux-user: Remove HAVE_SAFE_SYSCALL and hostdep.h
  *-user: Rename TARGET_ERESTARTSYS to QEMU_ERESTARTSYS
  linux-user: Rename TARGET_QEMU_ESIGRETURN to QEMU_ESIGRETURN
  bsd-user: Create special-errno.h
  linux-user: Create special-errno.h
  meson: Add build infrastructure for common-user
  common-user: Move safe-syscall.* from linux-user
  linux-user: Move thunk.c from top-level
  meson: Move linux_user_ss to linux-user/
  meson: Move bsd_user_ss to bsd-user/

Warner Losh (4):
  linux-user: Add host_signal_set_pc to set pc in mcontext
  linux-user/signal.c: Create a common rewind_if_in_safe_syscall
  linux-user/safe-syscall.inc.S: Move to common-user
  common-user: Adjust system call return on FreeBSD

 meson.build                                   |  23 ++-
 bsd-user/errno_defs.h                         |   6 +-
 bsd-user/special-errno.h                      |  24 ++++
 {linux-user => include/user}/safe-syscall.h   |  39 ++---
 linux-user/cpu_loop-common.h                  |   1 +
 linux-user/generic/target_errno_defs.h        |  17 ---
 linux-user/host/aarch64/host-signal.h         |   5 +
 linux-user/host/aarch64/hostdep.h             |  38 -----
 linux-user/host/alpha/host-signal.h           |   5 +
 linux-user/host/arm/host-signal.h             |   5 +
 linux-user/host/arm/hostdep.h                 |  38 -----
 linux-user/host/i386/host-signal.h            |   5 +
 linux-user/host/i386/hostdep.h                |  38 -----
 linux-user/host/ia64/hostdep.h                |  15 --
 linux-user/host/mips/host-signal.h            |   5 +
 linux-user/host/mips/hostdep.h                |  15 --
 linux-user/host/ppc/host-signal.h             |   5 +
 linux-user/host/ppc/hostdep.h                 |  15 --
 linux-user/host/ppc64/hostdep.h               |  38 -----
 linux-user/host/riscv/host-signal.h           |   5 +
 linux-user/host/riscv/hostdep.h               |  34 -----
 linux-user/host/s390/host-signal.h            |   5 +
 linux-user/host/s390/hostdep.h                |  15 --
 linux-user/host/s390x/hostdep.h               |  38 -----
 linux-user/host/sparc/host-signal.h           |   9 ++
 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/host-signal.h          |   5 +
 linux-user/host/x86_64/hostdep.h              |  38 -----
 linux-user/signal-common.h                    |   4 +-
 linux-user/special-errno.h                    |  32 +++++
 linux-user/user-internals.h                   |   1 -
 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                           |  19 ++-
 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 +-
 bsd-user/meson.build                          |   6 +
 .../host/aarch64/safe-syscall.inc.S           |  65 ++++++---
 .../host/arm/safe-syscall.inc.S               |  69 ++++++---
 .../host/i386/safe-syscall.inc.S              |  61 +++++---
 common-user/host/mips/safe-syscall.inc.S      | 135 ++++++++++++++++++
 .../host/ppc64/safe-syscall.inc.S             |  63 ++++----
 .../host/riscv/safe-syscall.inc.S             |  50 ++++---
 .../host/s390x/safe-syscall.inc.S             |  50 ++++---
 common-user/host/sparc64/safe-syscall.inc.S   |  91 ++++++++++++
 .../host/x86_64/safe-syscall.inc.S            |  80 +++++++----
 common-user/meson.build                       |   3 +
 {linux-user => common-user}/safe-syscall.S    |   5 +-
 linux-user/meson.build                        |   9 +-
 82 files changed, 778 insertions(+), 689 deletions(-)
 create mode 100644 bsd-user/special-errno.h
 rename {linux-user => include/user}/safe-syscall.h (81%)
 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
 rename thunk.c => linux-user/thunk.c (100%)
 rename {linux-user => common-user}/host/aarch64/safe-syscall.inc.S (64%)
 rename {linux-user => common-user}/host/arm/safe-syscall.inc.S (64%)
 rename {linux-user => common-user}/host/i386/safe-syscall.inc.S (71%)
 create mode 100644 common-user/host/mips/safe-syscall.inc.S
 rename {linux-user => common-user}/host/ppc64/safe-syscall.inc.S (68%)
 rename {linux-user => common-user}/host/riscv/safe-syscall.inc.S (77%)
 rename {linux-user => common-user}/host/s390x/safe-syscall.inc.S (71%)
 create mode 100644 common-user/host/sparc64/safe-syscall.inc.S
 rename {linux-user => common-user}/host/x86_64/safe-syscall.inc.S (64%)
 create mode 100644 common-user/meson.build
 rename {linux-user => common-user}/safe-syscall.S (91%)

Comments

Warner Losh Nov. 17, 2021, 5:42 p.m. UTC | #1
On Wed, Nov 17, 2021 at 9:04 AM Richard Henderson <
richard.henderson@linaro.org> wrote:

> Warner's v3:
> https://patchew.org/QEMU/20211113045603.60391-1-imp@bsdimp.com/
>
> 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.
>
>
> r~
>
>
> Richard Henderson (13):
>   common-user: Move syscall error detection into safe_syscall_base
>   common-user/host/mips: Add safe-syscall.inc.S
>   common-user/host/sparc64: Add safe-syscall.inc.S
>   linux-user: Remove HAVE_SAFE_SYSCALL and hostdep.h
>   *-user: Rename TARGET_ERESTARTSYS to QEMU_ERESTARTSYS
>   linux-user: Rename TARGET_QEMU_ESIGRETURN to QEMU_ESIGRETURN
>   bsd-user: Create special-errno.h
>   linux-user: Create special-errno.h
>   meson: Add build infrastructure for common-user
>   common-user: Move safe-syscall.* from linux-user
>   linux-user: Move thunk.c from top-level
>   meson: Move linux_user_ss to linux-user/
>   meson: Move bsd_user_ss to bsd-user/
>

In addition to the reviews, I've pulled these changes, and
as a whole they build and work on FreeBSD with my small
test binaries for x86.

It also works with my in-flight arm addition.

I've not tried to integrate it into the bsd-user fork's 'blitz'
branch though I don't think there will be issues.

Thanks!

Warner


> Warner Losh (4):
>   linux-user: Add host_signal_set_pc to set pc in mcontext
>   linux-user/signal.c: Create a common rewind_if_in_safe_syscall
>   linux-user/safe-syscall.inc.S: Move to common-user
>   common-user: Adjust system call return on FreeBSD
>
>  meson.build                                   |  23 ++-
>  bsd-user/errno_defs.h                         |   6 +-
>  bsd-user/special-errno.h                      |  24 ++++
>  {linux-user => include/user}/safe-syscall.h   |  39 ++---
>  linux-user/cpu_loop-common.h                  |   1 +
>  linux-user/generic/target_errno_defs.h        |  17 ---
>  linux-user/host/aarch64/host-signal.h         |   5 +
>  linux-user/host/aarch64/hostdep.h             |  38 -----
>  linux-user/host/alpha/host-signal.h           |   5 +
>  linux-user/host/arm/host-signal.h             |   5 +
>  linux-user/host/arm/hostdep.h                 |  38 -----
>  linux-user/host/i386/host-signal.h            |   5 +
>  linux-user/host/i386/hostdep.h                |  38 -----
>  linux-user/host/ia64/hostdep.h                |  15 --
>  linux-user/host/mips/host-signal.h            |   5 +
>  linux-user/host/mips/hostdep.h                |  15 --
>  linux-user/host/ppc/host-signal.h             |   5 +
>  linux-user/host/ppc/hostdep.h                 |  15 --
>  linux-user/host/ppc64/hostdep.h               |  38 -----
>  linux-user/host/riscv/host-signal.h           |   5 +
>  linux-user/host/riscv/hostdep.h               |  34 -----
>  linux-user/host/s390/host-signal.h            |   5 +
>  linux-user/host/s390/hostdep.h                |  15 --
>  linux-user/host/s390x/hostdep.h               |  38 -----
>  linux-user/host/sparc/host-signal.h           |   9 ++
>  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/host-signal.h          |   5 +
>  linux-user/host/x86_64/hostdep.h              |  38 -----
>  linux-user/signal-common.h                    |   4 +-
>  linux-user/special-errno.h                    |  32 +++++
>  linux-user/user-internals.h                   |   1 -
>  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                           |  19 ++-
>  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 +-
>  bsd-user/meson.build                          |   6 +
>  .../host/aarch64/safe-syscall.inc.S           |  65 ++++++---
>  .../host/arm/safe-syscall.inc.S               |  69 ++++++---
>  .../host/i386/safe-syscall.inc.S              |  61 +++++---
>  common-user/host/mips/safe-syscall.inc.S      | 135 ++++++++++++++++++
>  .../host/ppc64/safe-syscall.inc.S             |  63 ++++----
>  .../host/riscv/safe-syscall.inc.S             |  50 ++++---
>  .../host/s390x/safe-syscall.inc.S             |  50 ++++---
>  common-user/host/sparc64/safe-syscall.inc.S   |  91 ++++++++++++
>  .../host/x86_64/safe-syscall.inc.S            |  80 +++++++----
>  common-user/meson.build                       |   3 +
>  {linux-user => common-user}/safe-syscall.S    |   5 +-
>  linux-user/meson.build                        |   9 +-
>  82 files changed, 778 insertions(+), 689 deletions(-)
>  create mode 100644 bsd-user/special-errno.h
>  rename {linux-user => include/user}/safe-syscall.h (81%)
>  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
>  rename thunk.c => linux-user/thunk.c (100%)
>  rename {linux-user => common-user}/host/aarch64/safe-syscall.inc.S (64%)
>  rename {linux-user => common-user}/host/arm/safe-syscall.inc.S (64%)
>  rename {linux-user => common-user}/host/i386/safe-syscall.inc.S (71%)
>  create mode 100644 common-user/host/mips/safe-syscall.inc.S
>  rename {linux-user => common-user}/host/ppc64/safe-syscall.inc.S (68%)
>  rename {linux-user => common-user}/host/riscv/safe-syscall.inc.S (77%)
>  rename {linux-user => common-user}/host/s390x/safe-syscall.inc.S (71%)
>  create mode 100644 common-user/host/sparc64/safe-syscall.inc.S
>  rename {linux-user => common-user}/host/x86_64/safe-syscall.inc.S (64%)
>  create mode 100644 common-user/meson.build
>  rename {linux-user => common-user}/safe-syscall.S (91%)
>
> --
> 2.25.1
>
>