All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v4 0/9] linux-user: simplify safe signal handling
@ 2021-11-16 11:02 Richard Henderson
  2021-11-16 11:02 ` [PATCH v4 1/9] linux-user: Add host_signal_set_pc to set pc in mcontext Richard Henderson
                   ` (9 more replies)
  0 siblings, 10 replies; 23+ messages in thread
From: Richard Henderson @ 2021-11-16 11:02 UTC (permalink / raw)
  To: qemu-devel; +Cc: laurent, imp

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

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.

    I'll note that this last patch will at present break bsd-user,
    because TARGET_ERESTARTSYS and the header from whence it comes
    is currently missing there.

    In addition, I think that this should be reorganized further
    so that TARGET_ERESTARTSYS is (1) renamed because in *this*
    context it is pretending to be a host errno, and (2) placed
    in a file of its own under include/user/.  At which point,
    meson.build could be simplified further so that safe-syscall.S
    is compiled once, not per target.

    Anyway, the final patch needs some bsd-user changes sorted first.


r~


Richard Henderson (4):
  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

Warner Losh (5):
  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
  common-user: Move safe-syscall.* from *-user

 meson.build                                   |   9 +-
 {linux-user => include/user}/safe-syscall.h   |  31 ++--
 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/user-internals.h                   |   1 -
 linux-user/signal.c                           |  13 +-
 linux-user/syscall.c                          |   2 +-
 .../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                       |   2 +
 {linux-user => common-user}/safe-syscall.S    |   3 -
 linux-user/meson.build                        |   1 -
 41 files changed, 585 insertions(+), 562 deletions(-)
 rename {linux-user => include/user}/safe-syscall.h (85%)
 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
 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 (94%)

-- 
2.25.1



^ permalink raw reply	[flat|nested] 23+ messages in thread

* [PATCH v4 1/9] linux-user: Add host_signal_set_pc to set pc in mcontext
  2021-11-16 11:02 [PATCH v4 0/9] linux-user: simplify safe signal handling Richard Henderson
@ 2021-11-16 11:02 ` Richard Henderson
  2021-11-16 11:02 ` [PATCH v4 2/9] linux-user/signal.c: Create a common rewind_if_in_safe_syscall Richard Henderson
                   ` (8 subsequent siblings)
  9 siblings, 0 replies; 23+ messages in thread
From: Richard Henderson @ 2021-11-16 11:02 UTC (permalink / raw)
  To: qemu-devel; +Cc: laurent, imp, Philippe Mathieu-Daudé

From: Warner Losh <imp@bsdimp.com>

Add a new function host_signal_set_pc to set the next pc in an
mcontext. The caller should ensure this is a valid PC for execution.

Signed-off-by: Warner Losh <imp@bsdimp.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Message-Id: <20211113045603.60391-2-imp@bsdimp.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 linux-user/host/aarch64/host-signal.h | 5 +++++
 linux-user/host/alpha/host-signal.h   | 5 +++++
 linux-user/host/arm/host-signal.h     | 5 +++++
 linux-user/host/i386/host-signal.h    | 5 +++++
 linux-user/host/mips/host-signal.h    | 5 +++++
 linux-user/host/ppc/host-signal.h     | 5 +++++
 linux-user/host/riscv/host-signal.h   | 5 +++++
 linux-user/host/s390/host-signal.h    | 5 +++++
 linux-user/host/sparc/host-signal.h   | 9 +++++++++
 linux-user/host/x86_64/host-signal.h  | 5 +++++
 10 files changed, 54 insertions(+)

diff --git a/linux-user/host/aarch64/host-signal.h b/linux-user/host/aarch64/host-signal.h
index 0c0b08383a..9770b36dc1 100644
--- a/linux-user/host/aarch64/host-signal.h
+++ b/linux-user/host/aarch64/host-signal.h
@@ -35,6 +35,11 @@ static inline uintptr_t host_signal_pc(ucontext_t *uc)
     return uc->uc_mcontext.pc;
 }
 
+static inline void host_signal_set_pc(ucontext_t *uc, uintptr_t pc)
+{
+    uc->uc_mcontext.pc = pc;
+}
+
 static inline bool host_signal_write(siginfo_t *info, ucontext_t *uc)
 {
     struct _aarch64_ctx *hdr;
diff --git a/linux-user/host/alpha/host-signal.h b/linux-user/host/alpha/host-signal.h
index e080be412f..f4c942948a 100644
--- a/linux-user/host/alpha/host-signal.h
+++ b/linux-user/host/alpha/host-signal.h
@@ -16,6 +16,11 @@ static inline uintptr_t host_signal_pc(ucontext_t *uc)
     return uc->uc_mcontext.sc_pc;
 }
 
+static inline void host_signal_set_pc(ucontext_t *uc, uintptr_t pc)
+{
+    uc->uc_mcontext.sc_pc = pc;
+}
+
 static inline bool host_signal_write(siginfo_t *info, ucontext_t *uc)
 {
     uint32_t *pc = (uint32_t *)host_signal_pc(uc);
diff --git a/linux-user/host/arm/host-signal.h b/linux-user/host/arm/host-signal.h
index efb165c0c5..6c095773c0 100644
--- a/linux-user/host/arm/host-signal.h
+++ b/linux-user/host/arm/host-signal.h
@@ -16,6 +16,11 @@ static inline uintptr_t host_signal_pc(ucontext_t *uc)
     return uc->uc_mcontext.arm_pc;
 }
 
+static inline void host_signal_set_pc(ucontext_t *uc, uintptr_t pc)
+{
+    uc->uc_mcontext.arm_pc = pc;
+}
+
 static inline bool host_signal_write(siginfo_t *info, ucontext_t *uc)
 {
     /*
diff --git a/linux-user/host/i386/host-signal.h b/linux-user/host/i386/host-signal.h
index 4c8eef99ce..abe1ece5c9 100644
--- a/linux-user/host/i386/host-signal.h
+++ b/linux-user/host/i386/host-signal.h
@@ -16,6 +16,11 @@ static inline uintptr_t host_signal_pc(ucontext_t *uc)
     return uc->uc_mcontext.gregs[REG_EIP];
 }
 
+static inline void host_signal_set_pc(ucontext_t *uc, uintptr_t pc)
+{
+    uc->uc_mcontext.gregs[REG_EIP] = pc;
+}
+
 static inline bool host_signal_write(siginfo_t *info, ucontext_t *uc)
 {
     return uc->uc_mcontext.gregs[REG_TRAPNO] == 0xe
diff --git a/linux-user/host/mips/host-signal.h b/linux-user/host/mips/host-signal.h
index ef341f7c20..c666ed8c3f 100644
--- a/linux-user/host/mips/host-signal.h
+++ b/linux-user/host/mips/host-signal.h
@@ -16,6 +16,11 @@ static inline uintptr_t host_signal_pc(ucontext_t *uc)
     return uc->uc_mcontext.pc;
 }
 
+static inline void host_signal_set_pc(ucontext_t *uc, uintptr_t pc)
+{
+    uc->uc_mcontext.pc = pc;
+}
+
 #if defined(__misp16) || defined(__mips_micromips)
 #error "Unsupported encoding"
 #endif
diff --git a/linux-user/host/ppc/host-signal.h b/linux-user/host/ppc/host-signal.h
index a491c413dc..1d8e658ff7 100644
--- a/linux-user/host/ppc/host-signal.h
+++ b/linux-user/host/ppc/host-signal.h
@@ -16,6 +16,11 @@ static inline uintptr_t host_signal_pc(ucontext_t *uc)
     return uc->uc_mcontext.regs->nip;
 }
 
+static inline void host_signal_set_pc(ucontext_t *uc, uintptr_t pc)
+{
+    uc->uc_mcontext.regs->nip = pc;
+}
+
 static inline bool host_signal_write(siginfo_t *info, ucontext_t *uc)
 {
     return uc->uc_mcontext.regs->trap != 0x400
diff --git a/linux-user/host/riscv/host-signal.h b/linux-user/host/riscv/host-signal.h
index 3b168cb58b..a4f170efb0 100644
--- a/linux-user/host/riscv/host-signal.h
+++ b/linux-user/host/riscv/host-signal.h
@@ -16,6 +16,11 @@ static inline uintptr_t host_signal_pc(ucontext_t *uc)
     return uc->uc_mcontext.__gregs[REG_PC];
 }
 
+static inline void host_signal_set_pc(ucontext_t *uc, uintptr_t pc)
+{
+    uc->uc_mcontext.__gregs[REG_PC] = pc;
+}
+
 static inline bool host_signal_write(siginfo_t *info, ucontext_t *uc)
 {
     /*
diff --git a/linux-user/host/s390/host-signal.h b/linux-user/host/s390/host-signal.h
index 26990e4893..a524f2ab00 100644
--- a/linux-user/host/s390/host-signal.h
+++ b/linux-user/host/s390/host-signal.h
@@ -16,6 +16,11 @@ static inline uintptr_t host_signal_pc(ucontext_t *uc)
     return uc->uc_mcontext.psw.addr;
 }
 
+static inline void host_signal_set_pc(ucontext_t *uc, uintptr_t pc)
+{
+    uc->uc_mcontext.psw.addr = pc;
+}
+
 static inline bool host_signal_write(siginfo_t *info, ucontext_t *uc)
 {
     uint16_t *pinsn = (uint16_t *)host_signal_pc(uc);
diff --git a/linux-user/host/sparc/host-signal.h b/linux-user/host/sparc/host-signal.h
index 5e71d33f8e..7342936071 100644
--- a/linux-user/host/sparc/host-signal.h
+++ b/linux-user/host/sparc/host-signal.h
@@ -20,6 +20,15 @@ static inline uintptr_t host_signal_pc(ucontext_t *uc)
 #endif
 }
 
+static inline void host_signal_set_pc(ucontext_t *uc, uintptr_t pc)
+{
+#ifdef __arch64__
+    uc->uc_mcontext.mc_gregs[MC_PC] = pc;
+#else
+    uc->uc_mcontext.gregs[REG_PC] = pc;
+#endif
+}
+
 static inline bool host_signal_write(siginfo_t *info, ucontext_t *uc)
 {
     uint32_t insn = *(uint32_t *)host_signal_pc(uc);
diff --git a/linux-user/host/x86_64/host-signal.h b/linux-user/host/x86_64/host-signal.h
index 883d2fcf65..c71d597eb2 100644
--- a/linux-user/host/x86_64/host-signal.h
+++ b/linux-user/host/x86_64/host-signal.h
@@ -15,6 +15,11 @@ static inline uintptr_t host_signal_pc(ucontext_t *uc)
     return uc->uc_mcontext.gregs[REG_RIP];
 }
 
+static inline void host_signal_set_pc(ucontext_t *uc, uintptr_t pc)
+{
+    uc->uc_mcontext.gregs[REG_RIP] = pc;
+}
+
 static inline bool host_signal_write(siginfo_t *info, ucontext_t *uc)
 {
     return uc->uc_mcontext.gregs[REG_TRAPNO] == 0xe
-- 
2.25.1



^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v4 2/9] linux-user/signal.c: Create a common rewind_if_in_safe_syscall
  2021-11-16 11:02 [PATCH v4 0/9] linux-user: simplify safe signal handling Richard Henderson
  2021-11-16 11:02 ` [PATCH v4 1/9] linux-user: Add host_signal_set_pc to set pc in mcontext Richard Henderson
@ 2021-11-16 11:02 ` Richard Henderson
  2021-11-16 11:02 ` [PATCH v4 3/9] linux-user/safe-syscall.inc.S: Move to common-user Richard Henderson
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 23+ messages in thread
From: Richard Henderson @ 2021-11-16 11:02 UTC (permalink / raw)
  To: qemu-devel; +Cc: laurent, imp, Philippe Mathieu-Daudé

From: Warner Losh <imp@bsdimp.com>

All instances of rewind_if_in_safe_syscall are the same, differing only
in how the instruction point is fetched from the ucontext and the size
of the registers. Use host_signal_pc and new host_signal_set_pc
interfaces to fetch the pointer to the PC and adjust if needed. Delete
all the old copies of rewind_if_in_safe_syscall.

Signed-off-by: Warner Losh <imp@bsdimp.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Message-Id: <20211113045603.60391-3-imp@bsdimp.com>
[rth: include safe-syscall.h, simplify ifdefs]
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 linux-user/host/aarch64/hostdep.h | 20 --------------------
 linux-user/host/arm/hostdep.h     | 20 --------------------
 linux-user/host/i386/hostdep.h    | 20 --------------------
 linux-user/host/ppc64/hostdep.h   | 20 --------------------
 linux-user/host/riscv/hostdep.h   | 20 --------------------
 linux-user/host/s390x/hostdep.h   | 20 --------------------
 linux-user/host/x86_64/hostdep.h  | 20 --------------------
 linux-user/safe-syscall.h         |  3 +++
 linux-user/signal.c               | 15 ++++++++++++---
 9 files changed, 15 insertions(+), 143 deletions(-)

diff --git a/linux-user/host/aarch64/hostdep.h b/linux-user/host/aarch64/hostdep.h
index a8d41a21ad..39299d798a 100644
--- a/linux-user/host/aarch64/hostdep.h
+++ b/linux-user/host/aarch64/hostdep.h
@@ -15,24 +15,4 @@
 /* We have a safe-syscall.inc.S */
 #define HAVE_SAFE_SYSCALL
 
-#ifndef __ASSEMBLER__
-
-/* These are defined by the safe-syscall.inc.S file */
-extern char safe_syscall_start[];
-extern char safe_syscall_end[];
-
-/* Adjust the signal context to rewind out of safe-syscall if we're in it */
-static inline void rewind_if_in_safe_syscall(void *puc)
-{
-    ucontext_t *uc = puc;
-    __u64 *pcreg = &uc->uc_mcontext.pc;
-
-    if (*pcreg > (uintptr_t)safe_syscall_start
-        && *pcreg < (uintptr_t)safe_syscall_end) {
-        *pcreg = (uintptr_t)safe_syscall_start;
-    }
-}
-
-#endif /* __ASSEMBLER__ */
-
 #endif
diff --git a/linux-user/host/arm/hostdep.h b/linux-user/host/arm/hostdep.h
index 9276fe6ceb..86b137875a 100644
--- a/linux-user/host/arm/hostdep.h
+++ b/linux-user/host/arm/hostdep.h
@@ -15,24 +15,4 @@
 /* We have a safe-syscall.inc.S */
 #define HAVE_SAFE_SYSCALL
 
-#ifndef __ASSEMBLER__
-
-/* These are defined by the safe-syscall.inc.S file */
-extern char safe_syscall_start[];
-extern char safe_syscall_end[];
-
-/* Adjust the signal context to rewind out of safe-syscall if we're in it */
-static inline void rewind_if_in_safe_syscall(void *puc)
-{
-    ucontext_t *uc = puc;
-    unsigned long *pcreg = &uc->uc_mcontext.arm_pc;
-
-    if (*pcreg > (uintptr_t)safe_syscall_start
-        && *pcreg < (uintptr_t)safe_syscall_end) {
-        *pcreg = (uintptr_t)safe_syscall_start;
-    }
-}
-
-#endif /* __ASSEMBLER__ */
-
 #endif
diff --git a/linux-user/host/i386/hostdep.h b/linux-user/host/i386/hostdep.h
index 073be74d87..ce7136501f 100644
--- a/linux-user/host/i386/hostdep.h
+++ b/linux-user/host/i386/hostdep.h
@@ -15,24 +15,4 @@
 /* We have a safe-syscall.inc.S */
 #define HAVE_SAFE_SYSCALL
 
-#ifndef __ASSEMBLER__
-
-/* These are defined by the safe-syscall.inc.S file */
-extern char safe_syscall_start[];
-extern char safe_syscall_end[];
-
-/* Adjust the signal context to rewind out of safe-syscall if we're in it */
-static inline void rewind_if_in_safe_syscall(void *puc)
-{
-    ucontext_t *uc = puc;
-    greg_t *pcreg = &uc->uc_mcontext.gregs[REG_EIP];
-
-    if (*pcreg > (uintptr_t)safe_syscall_start
-        && *pcreg < (uintptr_t)safe_syscall_end) {
-        *pcreg = (uintptr_t)safe_syscall_start;
-    }
-}
-
-#endif /* __ASSEMBLER__ */
-
 #endif
diff --git a/linux-user/host/ppc64/hostdep.h b/linux-user/host/ppc64/hostdep.h
index 98979ad917..0c290dd904 100644
--- a/linux-user/host/ppc64/hostdep.h
+++ b/linux-user/host/ppc64/hostdep.h
@@ -15,24 +15,4 @@
 /* We have a safe-syscall.inc.S */
 #define HAVE_SAFE_SYSCALL
 
-#ifndef __ASSEMBLER__
-
-/* These are defined by the safe-syscall.inc.S file */
-extern char safe_syscall_start[];
-extern char safe_syscall_end[];
-
-/* Adjust the signal context to rewind out of safe-syscall if we're in it */
-static inline void rewind_if_in_safe_syscall(void *puc)
-{
-    ucontext_t *uc = puc;
-    unsigned long *pcreg = &uc->uc_mcontext.gp_regs[PT_NIP];
-
-    if (*pcreg > (uintptr_t)safe_syscall_start
-        && *pcreg < (uintptr_t)safe_syscall_end) {
-        *pcreg = (uintptr_t)safe_syscall_start;
-    }
-}
-
-#endif /* __ASSEMBLER__ */
-
 #endif
diff --git a/linux-user/host/riscv/hostdep.h b/linux-user/host/riscv/hostdep.h
index 2ba07456ae..7f67c22868 100644
--- a/linux-user/host/riscv/hostdep.h
+++ b/linux-user/host/riscv/hostdep.h
@@ -11,24 +11,4 @@
 /* We have a safe-syscall.inc.S */
 #define HAVE_SAFE_SYSCALL
 
-#ifndef __ASSEMBLER__
-
-/* These are defined by the safe-syscall.inc.S file */
-extern char safe_syscall_start[];
-extern char safe_syscall_end[];
-
-/* Adjust the signal context to rewind out of safe-syscall if we're in it */
-static inline void rewind_if_in_safe_syscall(void *puc)
-{
-    ucontext_t *uc = puc;
-    unsigned long *pcreg = &uc->uc_mcontext.__gregs[REG_PC];
-
-    if (*pcreg > (uintptr_t)safe_syscall_start
-        && *pcreg < (uintptr_t)safe_syscall_end) {
-        *pcreg = (uintptr_t)safe_syscall_start;
-    }
-}
-
-#endif /* __ASSEMBLER__ */
-
 #endif
diff --git a/linux-user/host/s390x/hostdep.h b/linux-user/host/s390x/hostdep.h
index 4f0171f36f..d801145854 100644
--- a/linux-user/host/s390x/hostdep.h
+++ b/linux-user/host/s390x/hostdep.h
@@ -15,24 +15,4 @@
 /* We have a safe-syscall.inc.S */
 #define HAVE_SAFE_SYSCALL
 
-#ifndef __ASSEMBLER__
-
-/* These are defined by the safe-syscall.inc.S file */
-extern char safe_syscall_start[];
-extern char safe_syscall_end[];
-
-/* Adjust the signal context to rewind out of safe-syscall if we're in it */
-static inline void rewind_if_in_safe_syscall(void *puc)
-{
-    ucontext_t *uc = puc;
-    unsigned long *pcreg = &uc->uc_mcontext.psw.addr;
-
-    if (*pcreg > (uintptr_t)safe_syscall_start
-        && *pcreg < (uintptr_t)safe_syscall_end) {
-        *pcreg = (uintptr_t)safe_syscall_start;
-    }
-}
-
-#endif /* __ASSEMBLER__ */
-
 #endif
diff --git a/linux-user/host/x86_64/hostdep.h b/linux-user/host/x86_64/hostdep.h
index a4fefb5114..9c62bd26bd 100644
--- a/linux-user/host/x86_64/hostdep.h
+++ b/linux-user/host/x86_64/hostdep.h
@@ -15,24 +15,4 @@
 /* We have a safe-syscall.inc.S */
 #define HAVE_SAFE_SYSCALL
 
-#ifndef __ASSEMBLER__
-
-/* These are defined by the safe-syscall.inc.S file */
-extern char safe_syscall_start[];
-extern char safe_syscall_end[];
-
-/* Adjust the signal context to rewind out of safe-syscall if we're in it */
-static inline void rewind_if_in_safe_syscall(void *puc)
-{
-    ucontext_t *uc = puc;
-    greg_t *pcreg = &uc->uc_mcontext.gregs[REG_RIP];
-
-    if (*pcreg > (uintptr_t)safe_syscall_start
-        && *pcreg < (uintptr_t)safe_syscall_end) {
-        *pcreg = (uintptr_t)safe_syscall_start;
-    }
-}
-
-#endif /* __ASSEMBLER__ */
-
 #endif
diff --git a/linux-user/safe-syscall.h b/linux-user/safe-syscall.h
index 6bc0390262..aaa9ffc0e2 100644
--- a/linux-user/safe-syscall.h
+++ b/linux-user/safe-syscall.h
@@ -127,6 +127,9 @@
 #ifdef HAVE_SAFE_SYSCALL
 /* The core part of this function is implemented in assembly */
 extern long safe_syscall_base(int *pending, long number, ...);
+/* These are defined by the safe-syscall.inc.S file */
+extern char safe_syscall_start[];
+extern char safe_syscall_end[];
 
 #define safe_syscall(...)                                               \
     ({                                                                  \
diff --git a/linux-user/signal.c b/linux-user/signal.c
index 81c45bfce9..6d5e5b698c 100644
--- a/linux-user/signal.c
+++ b/linux-user/signal.c
@@ -31,6 +31,7 @@
 #include "trace.h"
 #include "signal-common.h"
 #include "host-signal.h"
+#include "safe-syscall.h"
 
 static struct target_sigaction sigact_table[TARGET_NSIG];
 
@@ -793,12 +794,20 @@ int queue_signal(CPUArchState *env, int sig, int si_type,
     return 1; /* indicates that the signal was queued */
 }
 
-#ifndef HAVE_SAFE_SYSCALL
+
+/* Adjust the signal context to rewind out of safe-syscall if we're in it */
 static inline void rewind_if_in_safe_syscall(void *puc)
 {
-    /* Default version: never rewind */
-}
+#ifdef HAVE_SAFE_SYSCALL
+    ucontext_t *uc = (ucontext_t *)puc;
+    uintptr_t pcreg = host_signal_pc(uc);
+
+    if (pcreg > (uintptr_t)safe_syscall_start
+        && pcreg < (uintptr_t)safe_syscall_end) {
+        host_signal_set_pc(uc, (uintptr_t)safe_syscall_start);
+    }
 #endif
+}
 
 static void host_signal_handler(int host_sig, siginfo_t *info, void *puc)
 {
-- 
2.25.1



^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v4 3/9] linux-user/safe-syscall.inc.S: Move to common-user
  2021-11-16 11:02 [PATCH v4 0/9] linux-user: simplify safe signal handling Richard Henderson
  2021-11-16 11:02 ` [PATCH v4 1/9] linux-user: Add host_signal_set_pc to set pc in mcontext Richard Henderson
  2021-11-16 11:02 ` [PATCH v4 2/9] linux-user/signal.c: Create a common rewind_if_in_safe_syscall Richard Henderson
@ 2021-11-16 11:02 ` Richard Henderson
  2021-11-16 21:03   ` Warner Losh
  2021-11-16 11:02 ` [PATCH v4 4/9] common-user: Move syscall error detection into safe_syscall_base Richard Henderson
                   ` (6 subsequent siblings)
  9 siblings, 1 reply; 23+ messages in thread
From: Richard Henderson @ 2021-11-16 11:02 UTC (permalink / raw)
  To: qemu-devel; +Cc: laurent, imp

From: Warner Losh <imp@bsdimp.com>

Move all the safe_syscall.inc.S files to common-user. They are almost
identical between linux-user and bsd-user to re-use.

Signed-off-by: Warner Losh <imp@bsdimp.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Message-Id: <20211113045603.60391-4-imp@bsdimp.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 meson.build                                                 | 1 +
 {linux-user => common-user}/host/aarch64/hostdep.h          | 0
 {linux-user => common-user}/host/arm/hostdep.h              | 0
 {linux-user => common-user}/host/i386/hostdep.h             | 0
 {linux-user => common-user}/host/ppc64/hostdep.h            | 0
 {linux-user => common-user}/host/riscv/hostdep.h            | 0
 {linux-user => common-user}/host/s390x/hostdep.h            | 0
 {linux-user => common-user}/host/x86_64/hostdep.h           | 0
 {linux-user => common-user}/host/aarch64/safe-syscall.inc.S | 0
 {linux-user => common-user}/host/arm/safe-syscall.inc.S     | 0
 {linux-user => common-user}/host/i386/safe-syscall.inc.S    | 0
 {linux-user => common-user}/host/ppc64/safe-syscall.inc.S   | 0
 {linux-user => common-user}/host/riscv/safe-syscall.inc.S   | 0
 {linux-user => common-user}/host/s390x/safe-syscall.inc.S   | 0
 {linux-user => common-user}/host/x86_64/safe-syscall.inc.S  | 0
 15 files changed, 1 insertion(+)
 rename {linux-user => common-user}/host/aarch64/hostdep.h (100%)
 rename {linux-user => common-user}/host/arm/hostdep.h (100%)
 rename {linux-user => common-user}/host/i386/hostdep.h (100%)
 rename {linux-user => common-user}/host/ppc64/hostdep.h (100%)
 rename {linux-user => common-user}/host/riscv/hostdep.h (100%)
 rename {linux-user => common-user}/host/s390x/hostdep.h (100%)
 rename {linux-user => common-user}/host/x86_64/hostdep.h (100%)
 rename {linux-user => common-user}/host/aarch64/safe-syscall.inc.S (100%)
 rename {linux-user => common-user}/host/arm/safe-syscall.inc.S (100%)
 rename {linux-user => common-user}/host/i386/safe-syscall.inc.S (100%)
 rename {linux-user => common-user}/host/ppc64/safe-syscall.inc.S (100%)
 rename {linux-user => common-user}/host/riscv/safe-syscall.inc.S (100%)
 rename {linux-user => common-user}/host/s390x/safe-syscall.inc.S (100%)
 rename {linux-user => common-user}/host/x86_64/safe-syscall.inc.S (100%)

diff --git a/meson.build b/meson.build
index ccc6cefc25..ec22cf05c1 100644
--- a/meson.build
+++ b/meson.build
@@ -2878,6 +2878,7 @@ foreach target : target_dirs
     if 'CONFIG_LINUX_USER' in config_target
       base_dir = 'linux-user'
       target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
+      target_inc += include_directories('common-user/host/' / config_host['ARCH'])
     endif
     if 'CONFIG_BSD_USER' in config_target
       base_dir = 'bsd-user'
diff --git a/linux-user/host/aarch64/hostdep.h b/common-user/host/aarch64/hostdep.h
similarity index 100%
rename from linux-user/host/aarch64/hostdep.h
rename to common-user/host/aarch64/hostdep.h
diff --git a/linux-user/host/arm/hostdep.h b/common-user/host/arm/hostdep.h
similarity index 100%
rename from linux-user/host/arm/hostdep.h
rename to common-user/host/arm/hostdep.h
diff --git a/linux-user/host/i386/hostdep.h b/common-user/host/i386/hostdep.h
similarity index 100%
rename from linux-user/host/i386/hostdep.h
rename to common-user/host/i386/hostdep.h
diff --git a/linux-user/host/ppc64/hostdep.h b/common-user/host/ppc64/hostdep.h
similarity index 100%
rename from linux-user/host/ppc64/hostdep.h
rename to common-user/host/ppc64/hostdep.h
diff --git a/linux-user/host/riscv/hostdep.h b/common-user/host/riscv/hostdep.h
similarity index 100%
rename from linux-user/host/riscv/hostdep.h
rename to common-user/host/riscv/hostdep.h
diff --git a/linux-user/host/s390x/hostdep.h b/common-user/host/s390x/hostdep.h
similarity index 100%
rename from linux-user/host/s390x/hostdep.h
rename to common-user/host/s390x/hostdep.h
diff --git a/linux-user/host/x86_64/hostdep.h b/common-user/host/x86_64/hostdep.h
similarity index 100%
rename from linux-user/host/x86_64/hostdep.h
rename to common-user/host/x86_64/hostdep.h
diff --git a/linux-user/host/aarch64/safe-syscall.inc.S b/common-user/host/aarch64/safe-syscall.inc.S
similarity index 100%
rename from linux-user/host/aarch64/safe-syscall.inc.S
rename to common-user/host/aarch64/safe-syscall.inc.S
diff --git a/linux-user/host/arm/safe-syscall.inc.S b/common-user/host/arm/safe-syscall.inc.S
similarity index 100%
rename from linux-user/host/arm/safe-syscall.inc.S
rename to common-user/host/arm/safe-syscall.inc.S
diff --git a/linux-user/host/i386/safe-syscall.inc.S b/common-user/host/i386/safe-syscall.inc.S
similarity index 100%
rename from linux-user/host/i386/safe-syscall.inc.S
rename to common-user/host/i386/safe-syscall.inc.S
diff --git a/linux-user/host/ppc64/safe-syscall.inc.S b/common-user/host/ppc64/safe-syscall.inc.S
similarity index 100%
rename from linux-user/host/ppc64/safe-syscall.inc.S
rename to common-user/host/ppc64/safe-syscall.inc.S
diff --git a/linux-user/host/riscv/safe-syscall.inc.S b/common-user/host/riscv/safe-syscall.inc.S
similarity index 100%
rename from linux-user/host/riscv/safe-syscall.inc.S
rename to common-user/host/riscv/safe-syscall.inc.S
diff --git a/linux-user/host/s390x/safe-syscall.inc.S b/common-user/host/s390x/safe-syscall.inc.S
similarity index 100%
rename from linux-user/host/s390x/safe-syscall.inc.S
rename to common-user/host/s390x/safe-syscall.inc.S
diff --git a/linux-user/host/x86_64/safe-syscall.inc.S b/common-user/host/x86_64/safe-syscall.inc.S
similarity index 100%
rename from linux-user/host/x86_64/safe-syscall.inc.S
rename to common-user/host/x86_64/safe-syscall.inc.S
-- 
2.25.1



^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v4 4/9] common-user: Move syscall error detection into safe_syscall_base
  2021-11-16 11:02 [PATCH v4 0/9] linux-user: simplify safe signal handling Richard Henderson
                   ` (2 preceding siblings ...)
  2021-11-16 11:02 ` [PATCH v4 3/9] linux-user/safe-syscall.inc.S: Move to common-user Richard Henderson
@ 2021-11-16 11:02 ` Richard Henderson
  2021-11-16 11:02 ` [PATCH v4 5/9] common-user/host/mips: Add safe-syscall.inc.S Richard Henderson
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 23+ messages in thread
From: Richard Henderson @ 2021-11-16 11:02 UTC (permalink / raw)
  To: qemu-devel; +Cc: laurent, imp

The current api from safe_syscall_base() is to return -errno, which is
the interface provided by *some* linux kernel abis.  The wrapper macro,
safe_syscall(), detects error, stores into errno, and returns -1, to
match the api of the system syscall().

For those kernel abis that do not return -errno natively, this leads
to double syscall error detection.  E.g. Linux ppc64, which sets the
SO flag for error.

Simplify the usage from C by moving the error detection into assembly.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 linux-user/safe-syscall.h                   | 20 +++---
 common-user/host/aarch64/safe-syscall.inc.S | 55 +++++++++-------
 common-user/host/arm/safe-syscall.inc.S     | 58 ++++++++++-------
 common-user/host/i386/safe-syscall.inc.S    | 51 +++++++++------
 common-user/host/ppc64/safe-syscall.inc.S   | 63 +++++++++++--------
 common-user/host/riscv/safe-syscall.inc.S   | 50 +++++++++------
 common-user/host/s390x/safe-syscall.inc.S   | 50 +++++++++------
 common-user/host/x86_64/safe-syscall.inc.S  | 70 ++++++++++++---------
 8 files changed, 243 insertions(+), 174 deletions(-)

diff --git a/linux-user/safe-syscall.h b/linux-user/safe-syscall.h
index aaa9ffc0e2..ea0e8a8d24 100644
--- a/linux-user/safe-syscall.h
+++ b/linux-user/safe-syscall.h
@@ -125,23 +125,17 @@
  * kinds of restartability.
  */
 #ifdef HAVE_SAFE_SYSCALL
-/* The core part of this function is implemented in assembly */
-extern long safe_syscall_base(int *pending, long number, ...);
+
+/* The core part of this function is implemented in assembly. */
+extern long safe_syscall_base(int *pending, int *errnop, long number, ...);
+
 /* These are defined by the safe-syscall.inc.S file */
 extern char safe_syscall_start[];
 extern char safe_syscall_end[];
 
-#define safe_syscall(...)                                               \
-    ({                                                                  \
-        long ret_;                                                      \
-        int *psp_ = &((TaskState *)thread_cpu->opaque)->signal_pending; \
-        ret_ = safe_syscall_base(psp_, __VA_ARGS__);                    \
-        if (is_error(ret_)) {                                           \
-            errno = -ret_;                                              \
-            ret_ = -1;                                                  \
-        }                                                               \
-        ret_;                                                           \
-    })
+#define safe_syscall(...)                                                 \
+    safe_syscall_base(&((TaskState *)thread_cpu->opaque)->signal_pending, \
+                      &errno, __VA_ARGS__)
 
 #else
 
diff --git a/common-user/host/aarch64/safe-syscall.inc.S b/common-user/host/aarch64/safe-syscall.inc.S
index bc1f5a9792..95c60d8609 100644
--- a/common-user/host/aarch64/safe-syscall.inc.S
+++ b/common-user/host/aarch64/safe-syscall.inc.S
@@ -17,22 +17,21 @@
 	.type	safe_syscall_start, #function
 	.type	safe_syscall_end, #function
 
-	/* This is the entry point for making a system call. The calling
+	/*
+	 * This is the entry point for making a system call. The calling
 	 * convention here is that of a C varargs function with the
 	 * first argument an 'int *' to the signal_pending flag, the
 	 * second one the system call number (as a 'long'), and all further
 	 * arguments being syscall arguments (also 'long').
-	 * We return a long which is the syscall's return value, which
-	 * may be negative-errno on failure. Conversion to the
-	 * -1-and-errno-set convention is done by the calling wrapper.
 	 */
 safe_syscall_base:
 	.cfi_startproc
-	/* The syscall calling convention isn't the same as the
-	 * C one:
+	/*
+         * The syscall calling convention isn't the same as the C one:
 	 * we enter with x0 == *signal_pending
-	 *               x1 == syscall number
-	 *               x2 ... x7, (stack) == syscall arguments
+	 *               x1 == errno
+	 *               x2 == syscall number
+	 *               x3 ... x7, (stack) == syscall arguments
 	 *               and return the result in x0
 	 * and the syscall instruction needs
 	 *               x8 == syscall number
@@ -40,17 +39,18 @@ safe_syscall_base:
 	 *               and returns the result in x0
 	 * Shuffle everything around appropriately.
 	 */
-	mov	x9, x0		/* signal_pending pointer */
-	mov	x8, x1		/* syscall number */
-	mov	x0, x2		/* syscall arguments */
-	mov	x1, x3
-	mov	x2, x4
-	mov	x3, x5
-	mov	x4, x6
-	mov	x5, x7
-	ldr	x6, [sp]
+	mov	x10, x0		/* signal_pending pointer */
+	mov	x11, x1		/* errno pointer */
+	mov	x8, x2		/* syscall number */
+	mov	x0, x3		/* syscall arguments */
+	mov	x1, x4
+	mov	x2, x5
+	mov	x3, x6
+	mov	x4, x7
+	ldp	x5, x6, [sp]
 
-	/* This next sequence of code works in conjunction with the
+	/*
+         * This next sequence of code works in conjunction with the
 	 * rewind_if_safe_syscall_function(). If a signal is taken
 	 * and the interrupted PC is anywhere between 'safe_syscall_start'
 	 * and 'safe_syscall_end' then we rewind it to 'safe_syscall_start'.
@@ -59,17 +59,26 @@ safe_syscall_base:
 	 */
 safe_syscall_start:
 	/* if signal_pending is non-zero, don't do the call */
-	ldr	w10, [x9]
-	cbnz	w10, 0f 
+	ldr	w9, [x10]
+	cbnz	w9, 2f
 	svc	0x0
 safe_syscall_end:
+
 	/* code path for having successfully executed the syscall */
+	cmn	x0, #4095
+	b.cs	1f
 	ret
 
-0:
-	/* code path when we didn't execute the syscall */
-	mov	x0, #-TARGET_ERESTARTSYS
+	/* code path setting errno */
+0:	neg	w0, w0			/* create positive errno */
+1:	str	w0, [x11]		/* store errno */
+	mov	x0, #-1
 	ret
+
+	/* code path when we didn't execute the syscall */
+2:	mov	w0, #TARGET_ERESTARTSYS
+	b	1b
+
 	.cfi_endproc
 
 	.size	safe_syscall_base, .-safe_syscall_base
diff --git a/common-user/host/arm/safe-syscall.inc.S b/common-user/host/arm/safe-syscall.inc.S
index 88c4958504..17839c6486 100644
--- a/common-user/host/arm/safe-syscall.inc.S
+++ b/common-user/host/arm/safe-syscall.inc.S
@@ -22,33 +22,35 @@
 	.arm
 	.align 2
 
-	/* This is the entry point for making a system call. The calling
+	/*
+	 * This is the entry point for making a system call. The calling
 	 * convention here is that of a C varargs function with the
 	 * first argument an 'int *' to the signal_pending flag, the
 	 * second one the system call number (as a 'long'), and all further
 	 * arguments being syscall arguments (also 'long').
-	 * We return a long which is the syscall's return value, which
-	 * may be negative-errno on failure. Conversion to the
-	 * -1-and-errno-set convention is done by the calling wrapper.
 	 */
 safe_syscall_base:
 	.fnstart
 	.cfi_startproc
 	mov	r12, sp			/* save entry stack */
-	push	{ r4, r5, r6, r7, r8, lr }
-	.save	{ r4, r5, r6, r7, r8, lr }
-	.cfi_adjust_cfa_offset 24
+	push	{ r4, r5, r6, r7, r8, r9, r10, lr }
+	.save	{ r4, r5, r6, r7, r8, r9, r10, lr }
+	.cfi_adjust_cfa_offset 32
 	.cfi_rel_offset r4, 0
 	.cfi_rel_offset r5, 4
 	.cfi_rel_offset r6, 8
 	.cfi_rel_offset r7, 12
 	.cfi_rel_offset r8, 16
-	.cfi_rel_offset lr, 20
+	.cfi_rel_offset r9, 20
+	.cfi_rel_offset r10, 24
+	.cfi_rel_offset lr, 28
 
-	/* The syscall calling convention isn't the same as the C one:
-	 * we enter with r0 == *signal_pending
-	 *               r1 == syscall number
-	 *               r2, r3, [sp+0] ... [sp+12] == syscall arguments
+	/*
+	 * The syscall calling convention isn't the same as the C one:
+	 * we enter with r0 == &signal_pending
+         *               r1 == &errno
+	 *               r2 == syscall number
+	 *               r3, [sp+0] ... [sp+16] == syscall arguments
 	 *               and return the result in r0
 	 * and the syscall instruction needs
 	 *               r7 == syscall number
@@ -58,12 +60,13 @@ safe_syscall_base:
 	 * Note the 16 bytes that we pushed to save registers.
 	 */
 	mov	r8, r0			/* copy signal_pending */
-	mov	r7, r1			/* syscall number */
-	mov	r0, r2			/* syscall args */
-	mov	r1, r3
-	ldm	r12, { r2, r3, r4, r5, r6 }
+	mov	r9, r1			/* copy errnop */
+	mov	r7, r2			/* syscall number */
+	mov	r0, r3			/* syscall args */
+	ldm	r12, { r1, r2, r3, r4, r5, r6 }
 
-	/* This next sequence of code works in conjunction with the
+	/*
+	 * This next sequence of code works in conjunction with the
 	 * rewind_if_safe_syscall_function(). If a signal is taken
 	 * and the interrupted PC is anywhere between 'safe_syscall_start'
 	 * and 'safe_syscall_end' then we rewind it to 'safe_syscall_start'.
@@ -74,16 +77,25 @@ safe_syscall_start:
 	/* if signal_pending is non-zero, don't do the call */
 	ldr	r12, [r8]		/* signal_pending */
 	tst	r12, r12
-	bne	1f
+	bne	2f
 	swi	0
 safe_syscall_end:
-	/* code path for having successfully executed the syscall */
-	pop	{ r4, r5, r6, r7, r8, pc }
 
-1:
+	/* code path for having successfully executed the syscall */
+	cmp	r0, #-4096
+	bhi	0f
+9:	pop	{ r4, r5, r6, r7, r8, r9, r10, pc }
+
+	/* code path setting errno */
+0:	neg	r0, r0		/* create positive errno */
+1:	str	r0, [r9]	/* store errno */
+	mov	r0, #-1
+	b	9b
+
 	/* code path when we didn't execute the syscall */
-	ldr	r0, =-TARGET_ERESTARTSYS
-	pop	{ r4, r5, r6, r7, r8, pc }
+2:	ldr	r0, =TARGET_ERESTARTSYS
+	b	1b
+
 	.fnend
 	.cfi_endproc
 
diff --git a/common-user/host/i386/safe-syscall.inc.S b/common-user/host/i386/safe-syscall.inc.S
index 9e58fc6504..ad89521783 100644
--- a/common-user/host/i386/safe-syscall.inc.S
+++ b/common-user/host/i386/safe-syscall.inc.S
@@ -15,14 +15,12 @@
 	.global safe_syscall_end
 	.type	safe_syscall_base, @function
 
-	/* This is the entry point for making a system call. The calling
+	/*
+	 * This is the entry point for making a system call. The calling
 	 * convention here is that of a C varargs function with the
 	 * first argument an 'int *' to the signal_pending flag, the
 	 * second one the system call number (as a 'long'), and all further
 	 * arguments being syscall arguments (also 'long').
-	 * We return a long which is the syscall's return value, which
-	 * may be negative-errno on failure. Conversion to the
-	 * -1-and-errno-set convention is done by the calling wrapper.
 	 */
 safe_syscall_base:
 	.cfi_startproc
@@ -41,9 +39,10 @@ safe_syscall_base:
 
 	/* The syscall calling convention isn't the same as the C one:
 	 * we enter with 0(%esp) == return address
-	 *               4(%esp) == *signal_pending
-	 *               8(%esp) == syscall number
-	 *               12(%esp) ... 32(%esp) == syscall arguments
+	 *               4(%esp) == &signal_pending
+	 *               8(%esp) == &errno
+	 *               12(%esp) == syscall number
+	 *               16(%esp) ... 36(%esp) == syscall arguments
 	 *               and return the result in eax
 	 * and the syscall instruction needs
 	 *               eax == syscall number
@@ -52,14 +51,15 @@ safe_syscall_base:
 	 * Shuffle everything around appropriately.
 	 * Note the 16 bytes that we pushed to save registers.
 	 */
-	mov	12+16(%esp), %ebx	/* the syscall arguments */
-	mov	16+16(%esp), %ecx
-	mov	20+16(%esp), %edx
-	mov	24+16(%esp), %esi
-	mov	28+16(%esp), %edi
-	mov	32+16(%esp), %ebp
+	mov	16+16(%esp), %ebx	/* the syscall arguments */
+	mov	20+16(%esp), %ecx
+	mov	24+16(%esp), %edx
+	mov	28+16(%esp), %esi
+	mov	32+16(%esp), %edi
+	mov	36+16(%esp), %ebp
 
-	/* This next sequence of code works in conjunction with the
+	/*
+	 * This next sequence of code works in conjunction with the
 	 * rewind_if_safe_syscall_function(). If a signal is taken
 	 * and the interrupted PC is anywhere between 'safe_syscall_start'
 	 * and 'safe_syscall_end' then we rewind it to 'safe_syscall_start'.
@@ -70,12 +70,16 @@ safe_syscall_start:
 	/* if signal_pending is non-zero, don't do the call */
 	mov	4+16(%esp), %eax	/* signal_pending */
 	cmpl	$0, (%eax)
-	jnz	1f
+	jnz	2f
 	mov	8+16(%esp), %eax	/* syscall number */
 	int	$0x80
 safe_syscall_end:
+
 	/* code path for having successfully executed the syscall */
-	pop	%ebx
+	cmp	$-4095, %eax
+	jae	0f
+
+9:	pop	%ebx
 	.cfi_remember_state
 	.cfi_adjust_cfa_offset -4
 	.cfi_restore ebx
@@ -90,11 +94,18 @@ safe_syscall_end:
 	.cfi_restore ebp
 	ret
 
-1:
-	/* code path when we didn't execute the syscall */
 	.cfi_restore_state
-	mov	$-TARGET_ERESTARTSYS, %eax
-	jmp	safe_syscall_end
+
+	/* code path setting errno */
+0:	neg	%eax			/* create positive errno */
+1:	mov	8+16(%esp), %ebx	/* load errno pointer */
+	mov	%eax, (%ebx)		/* store errno */
+	mov	$-1, %eax
+	jmp	9b
+
+	/* code path when we didn't execute the syscall */
+2:	mov	$TARGET_ERESTARTSYS, %eax
+	jmp	1b
 	.cfi_endproc
 
 	.size	safe_syscall_base, .-safe_syscall_base
diff --git a/common-user/host/ppc64/safe-syscall.inc.S b/common-user/host/ppc64/safe-syscall.inc.S
index 875133173b..e35408c5fb 100644
--- a/common-user/host/ppc64/safe-syscall.inc.S
+++ b/common-user/host/ppc64/safe-syscall.inc.S
@@ -17,14 +17,19 @@
 
 	.text
 
-	/* This is the entry point for making a system call. The calling
+#if _CALL_ELF == 2
+#define PARAM_OFS   32
+#else
+#define PARAM_OFS   48
+#endif
+#define PARAM(X)    PARAM_OFS + X*8
+
+	/*
+	 * This is the entry point for making a system call. The calling
 	 * convention here is that of a C varargs function with the
 	 * first argument an 'int *' to the signal_pending flag, the
 	 * second one the system call number (as a 'long'), and all further
 	 * arguments being syscall arguments (also 'long').
-	 * We return a long which is the syscall's return value, which
-	 * may be negative-errno on failure. Conversion to the
-	 * -1-and-errno-set convention is done by the calling wrapper.
 	 */
 #if _CALL_ELF == 2
 safe_syscall_base:
@@ -39,9 +44,11 @@ safe_syscall_base:
 .L.safe_syscall_base:
 	.cfi_startproc
 #endif
-	/* We enter with r3 == *signal_pending
-	 *               r4 == syscall number
-	 *               r5 ... r10 == syscall arguments
+	/*
+	 * We enter with r3 == &signal_pending
+	 *               r4 == &errno
+	 *               r5 == syscall number
+	 *               r6 ... r10, (stack) == syscall arguments
 	 *               and return the result in r3
 	 * and the syscall instruction needs
 	 *               r0 == syscall number
@@ -49,18 +56,18 @@ safe_syscall_base:
 	 *               and returns the result in r3
 	 * Shuffle everything around appropriately.
 	 */
-	std     14, 16(1) /* Preserve r14 in SP+16 */
-	.cfi_offset 14, 16
-	mr	14, 3	/* signal_pending */
-	mr	0, 4	/* syscall number */
-	mr	3, 5	/* syscall arguments */
-	mr	4, 6
-	mr	5, 7
-	mr	6, 8
-	mr	7, 9
-	mr	8, 10
+	mr	11, 3		/* signal_pending pointer */
+	std	4, PARAM(1)(1)	/* save errno pointer in param slot */
+	mr	0, 5		/* syscall number */
+	mr	3, 6		/* syscall arguments */
+	mr	4, 7
+	mr	5, 8
+	mr	6, 9
+	mr	7, 10
+	ld	8, PARAM(8)(1)
 
-	/* This next sequence of code works in conjunction with the
+	/*
+	 * This next sequence of code works in conjunction with the
 	 * rewind_if_safe_syscall_function(). If a signal is taken
 	 * and the interrupted PC is anywhere between 'safe_syscall_start'
 	 * and 'safe_syscall_end' then we rewind it to 'safe_syscall_start'.
@@ -69,23 +76,25 @@ safe_syscall_base:
 	 */
 safe_syscall_start:
 	/* if signal_pending is non-zero, don't do the call */
-	lwz	12, 0(14)
+	lwz	12, 0(11)
 	cmpwi	0, 12, 0
 	bne-	0f
 	sc
 safe_syscall_end:
-	/* code path when we did execute the syscall */
-	ld 14, 16(1) /* restore r14 to its original value */
-	bnslr+
 
-	/* syscall failed; return negative errno */
-	neg	3, 3
+	/* code path for having successfully executed the syscall */
+	bnslr+			/* SO set for syscall error */
+
+	/* code path setting errno */
+1:	ld	11, PARAM(1)(1)	/* restore errno pointer */
+	stw	3, 0(11)	/* store errno */
+	li	3, -1
 	blr
 
 	/* code path when we didn't execute the syscall */
-0:	addi	3, 0, -TARGET_ERESTARTSYS
-	ld 14, 16(1) /* restore r14 to its original value */
-	blr
+0:	li	3, TARGET_ERESTARTSYS
+	b	1b
+
 	.cfi_endproc
 
 #if _CALL_ELF == 2
diff --git a/common-user/host/riscv/safe-syscall.inc.S b/common-user/host/riscv/safe-syscall.inc.S
index 9ca3fbfd1e..eddede702b 100644
--- a/common-user/host/riscv/safe-syscall.inc.S
+++ b/common-user/host/riscv/safe-syscall.inc.S
@@ -23,17 +23,15 @@
 	 * first argument an 'int *' to the signal_pending flag, the
 	 * second one the system call number (as a 'long'), and all further
 	 * arguments being syscall arguments (also 'long').
-	 * We return a long which is the syscall's return value, which
-	 * may be negative-errno on failure. Conversion to the
-	 * -1-and-errno-set convention is done by the calling wrapper.
 	 */
 safe_syscall_base:
 	.cfi_startproc
 	/*
 	 * The syscall calling convention is nearly the same as C:
-	 * we enter with a0 == *signal_pending
-	 *               a1 == syscall number
-	 *               a2 ... a7 == syscall arguments
+	 * we enter with a0 == &signal_pending
+	 *               a1 == &errno
+	 *               a2 == syscall number
+	 *               a3 ... a7, [sp] == syscall arguments
 	 *               and return the result in a0
 	 * and the syscall instruction needs
 	 *               a7 == syscall number
@@ -42,14 +40,19 @@ safe_syscall_base:
 	 * Shuffle everything around appropriately.
 	 */
 	mv	t0, a0		/* signal_pending pointer */
-	mv	t1, a1		/* syscall number */
-	mv	a0, a2		/* syscall arguments */
-	mv	a1, a3
-	mv	a2, a4
-	mv	a3, a5
-	mv	a4, a6
-	mv	a5, a7
-	mv	a7, t1
+	mv	t1, a1		/* errno pointer */
+	mv	t2, a2		/* syscall number */
+	mv	a0, a3		/* syscall arguments */
+	mv	a1, a4
+	mv	a2, a5
+	mv	a3, a6
+	mv	a4, a7
+#if __riscv_xlen == 32
+	lw	a5, 0(sp)
+#else
+	ld	a5, 0(sp)
+#endif
+	mv	a7, t2
 
 	/*
 	 * This next sequence of code works in conjunction with the
@@ -61,17 +64,26 @@ safe_syscall_base:
 	 */
 safe_syscall_start:
 	/* If signal_pending is non-zero, don't do the call */
-	lw	t1, 0(t0)
-	bnez	t1, 0f
+	lw	t2, 0(t0)
+	bnez	t2, 2f
 	scall
 safe_syscall_end:
+
 	/* code path for having successfully executed the syscall */
+	li	t2, -4096
+	bgtu	a0, t2, 0f
 	ret
 
-0:
-	/* code path when we didn't execute the syscall */
-	li	a0, -TARGET_ERESTARTSYS
+	/* code path setting errno */
+0:	neg	a0, a0			/* create positive errno */
+1:	sw	a0, 0(t1)		/* store errno */
+	li	a0, -1
 	ret
+
+	/* code path when we didn't execute the syscall */
+2:	li	a0, TARGET_ERESTARTSYS
+	j	1b
+
 	.cfi_endproc
 
 	.size	safe_syscall_base, .-safe_syscall_base
diff --git a/common-user/host/s390x/safe-syscall.inc.S b/common-user/host/s390x/safe-syscall.inc.S
index 414b44ad38..f2a3bccc13 100644
--- a/common-user/host/s390x/safe-syscall.inc.S
+++ b/common-user/host/s390x/safe-syscall.inc.S
@@ -15,14 +15,12 @@
 	.global safe_syscall_end
 	.type	safe_syscall_base, @function
 
-	/* This is the entry point for making a system call. The calling
+	/*
+	 * This is the entry point for making a system call. The calling
 	 * convention here is that of a C varargs function with the
 	 * first argument an 'int *' to the signal_pending flag, the
 	 * second one the system call number (as a 'long'), and all further
 	 * arguments being syscall arguments (also 'long').
-	 * We return a long which is the syscall's return value, which
-	 * may be negative-errno on failure. Conversion to the
-	 * -1-and-errno-set convention is done by the calling wrapper.
 	 */
 safe_syscall_base:
 	.cfi_startproc
@@ -44,11 +42,13 @@ safe_syscall_base:
 	stg	%r1,0(%r15)		/* store back chain */
 	stg	%r0,8(%r15)		/* store eos */
 
-	/* The syscall calling convention isn't the same as the
+	/*
+	 * The syscall calling convention isn't the same as the
 	 * C one:
-	 * we enter with r2 == *signal_pending
-	 *               r3 == syscall number
-	 *               r4, r5, r6, (stack) == syscall arguments
+	 * we enter with r2 == &signal_pending
+	 *               r3 == &errno
+	 *               r4 == syscall number
+	 *               r5, r6, (stack) == syscall arguments
 	 *               and return the result in r2
 	 * and the syscall instruction needs
 	 *               r1 == syscall number
@@ -57,13 +57,14 @@ safe_syscall_base:
 	 * Shuffle everything around appropriately.
 	 */
 	lgr	%r8,%r2			/* signal_pending pointer */
-	lgr	%r1,%r3			/* syscall number */
-	lgr	%r2,%r4			/* syscall args */
-	lgr	%r3,%r5
-	lgr	%r4,%r6
-	lmg	%r5,%r7,320(%r15)
+	lgr	%r9,%r3			/* errno pointer */
+	lgr	%r1,%r4			/* syscall number */
+	lgr	%r2,%r5			/* syscall args */
+	lgr	%r3,%r6
+	lmg	%r4,%r7,320(%r15)
 
-	/* This next sequence of code works in conjunction with the
+	/*
+	 * This next sequence of code works in conjunction with the
 	 * rewind_if_safe_syscall_function(). If a signal is taken
 	 * and the interrupted PC is anywhere between 'safe_syscall_start'
 	 * and 'safe_syscall_end' then we rewind it to 'safe_syscall_start'.
@@ -73,18 +74,31 @@ safe_syscall_base:
 safe_syscall_start:
 	/* if signal_pending is non-zero, don't do the call */
 	icm	%r0,15,0(%r8)
-	jne	2f
+	jne	1f
 	svc	0
 safe_syscall_end:
 
-1:	lg	%r15,0(%r15)		/* load back chain */
+	/* code path for having successfully executed the syscall */
+	lghi	%r0, -4095		/* check for syscall error */
+	clgr	%r2, %r0
+	jgnl	0f
+
+9:	lg	%r15,0(%r15)		/* load back chain */
 	.cfi_remember_state
 	.cfi_adjust_cfa_offset -160
 	lmg	%r6,%r15,48(%r15)	/* load saved registers */
 	br	%r14
 	.cfi_restore_state
-2:	lghi	%r2, -TARGET_ERESTARTSYS
-	j	1b
+
+	/* code path when we didn't execute the syscall */
+1:	lghi	%r2, -TARGET_ERESTARTSYS
+
+	/* code path setting errno */
+0:	lcr	%r2, %r2		/* create positive errno */
+	st	%r2, 0(%r9)		/* store errno */
+	lghi	%r2, -1
+	j	9b
+
 	.cfi_endproc
 
 	.size	safe_syscall_base, .-safe_syscall_base
diff --git a/common-user/host/x86_64/safe-syscall.inc.S b/common-user/host/x86_64/safe-syscall.inc.S
index f36992daa3..9a0c4c93b4 100644
--- a/common-user/host/x86_64/safe-syscall.inc.S
+++ b/common-user/host/x86_64/safe-syscall.inc.S
@@ -14,18 +14,17 @@
         .global safe_syscall_end
         .type   safe_syscall_base, @function
 
-        /* This is the entry point for making a system call. The calling
+        /*
+         * This is the entry point for making a system call. The calling
          * convention here is that of a C varargs function with the
          * first argument an 'int *' to the signal_pending flag, the
          * second one the system call number (as a 'long'), and all further
          * arguments being syscall arguments (also 'long').
-         * We return a long which is the syscall's return value, which
-         * may be negative-errno on failure. Conversion to the
-         * -1-and-errno-set convention is done by the calling wrapper.
          */
 safe_syscall_base:
         .cfi_startproc
-        /* This saves a frame pointer and aligns the stack for the syscall.
+        /*
+         * This saves a frame pointer and aligns the stack for the syscall.
          * (It's unclear if the syscall ABI has the same stack alignment
          * requirements as the userspace function call ABI, but better safe than
          * sorry. Appendix A2 of http://www.x86-64.org/documentation/abi.pdf
@@ -35,11 +34,12 @@ safe_syscall_base:
         .cfi_adjust_cfa_offset 8
         .cfi_rel_offset rbp, 0
 
-        /* The syscall calling convention isn't the same as the
-         * C one:
-         * we enter with rdi == *signal_pending
-         *               rsi == syscall number
-         *               rdx, rcx, r8, r9, (stack), (stack) == syscall arguments
+        /*
+         * The syscall calling convention isn't the same as the C one:
+         * we enter with rdi == &signal_pending
+         *               rsi == &errno
+         *               rdx == syscall number
+         *               rcx, r8, r9, (stack...) == syscall arguments
          *               and return the result in rax
          * and the syscall instruction needs
          *               rax == syscall number
@@ -48,17 +48,19 @@ safe_syscall_base:
          * Shuffle everything around appropriately.
          * Note that syscall will trash rcx and r11.
          */
-        mov     %rsi, %rax /* syscall number */
-        mov     %rdi, %rbp /* signal_pending pointer */
+        mov     %rdi, %r11 /* signal_pending pointer */
+        mov     %rsi, %rbp /* errno pointer */
+        mov     %rdx, %rax /* syscall number */
         /* and the syscall arguments */
-        mov     %rdx, %rdi
-        mov     %rcx, %rsi
-        mov     %r8,  %rdx
-        mov     %r9,  %r10
-        mov     16(%rsp), %r8
-        mov     24(%rsp), %r9
+        mov     %rcx, %rdi
+        mov     %r8, %rsi
+        mov     %r9,  %rdx
+        mov     16(%rsp), %r10
+        mov     24(%rsp), %r8
+        mov     32(%rsp), %r9
 
-        /* This next sequence of code works in conjunction with the
+        /*
+         * This next sequence of code works in conjunction with the
          * rewind_if_safe_syscall_function(). If a signal is taken
          * and the interrupted PC is anywhere between 'safe_syscall_start'
          * and 'safe_syscall_end' then we rewind it to 'safe_syscall_start'.
@@ -67,25 +69,31 @@ safe_syscall_base:
          */
 safe_syscall_start:
         /* if signal_pending is non-zero, don't do the call */
-        cmpl	$0, (%rbp)
-        jnz     1f
+        cmpl    $0, (%r11)
+        jnz     2f
         syscall
 safe_syscall_end:
+
         /* code path for having successfully executed the syscall */
-        pop     %rbp
+        cmp	$-4095, %rax
+        jae	0f
+
+9:      pop     %rbp
         .cfi_remember_state
         .cfi_def_cfa_offset 8
         .cfi_restore rbp
         ret
-
-1:
-        /* code path when we didn't execute the syscall */
         .cfi_restore_state
-        mov     $-TARGET_ERESTARTSYS, %rax
-        pop     %rbp
-        .cfi_def_cfa_offset 8
-        .cfi_restore rbp
-        ret
-        .cfi_endproc
 
+        /* code path setting errno */
+0:      neg	%eax			/* create positive errno */
+1:      mov	%eax, (%rbp)		/* store errno */
+        mov	$-1, %rax
+        jmp	9b
+
+        /* code path when we didn't execute the syscall */
+2:      mov     $TARGET_ERESTARTSYS, %eax
+        jmp	1b
+
+        .cfi_endproc
         .size   safe_syscall_base, .-safe_syscall_base
-- 
2.25.1



^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v4 5/9] common-user/host/mips: Add safe-syscall.inc.S
  2021-11-16 11:02 [PATCH v4 0/9] linux-user: simplify safe signal handling Richard Henderson
                   ` (3 preceding siblings ...)
  2021-11-16 11:02 ` [PATCH v4 4/9] common-user: Move syscall error detection into safe_syscall_base Richard Henderson
@ 2021-11-16 11:02 ` Richard Henderson
  2021-11-16 11:02 ` [PATCH v4 6/9] common-user/host/sparc64: " Richard Henderson
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 23+ messages in thread
From: Richard Henderson @ 2021-11-16 11:02 UTC (permalink / raw)
  To: qemu-devel; +Cc: laurent, imp

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 common-user/host/mips/hostdep.h          |   2 +
 common-user/host/mips/safe-syscall.inc.S | 135 +++++++++++++++++++++++
 2 files changed, 137 insertions(+)
 create mode 100644 common-user/host/mips/hostdep.h
 create mode 100644 common-user/host/mips/safe-syscall.inc.S

diff --git a/common-user/host/mips/hostdep.h b/common-user/host/mips/hostdep.h
new file mode 100644
index 0000000000..b18aca1deb
--- /dev/null
+++ b/common-user/host/mips/hostdep.h
@@ -0,0 +1,2 @@
+/* We have a safe-syscall.inc.S */
+#define HAVE_SAFE_SYSCALL
diff --git a/common-user/host/mips/safe-syscall.inc.S b/common-user/host/mips/safe-syscall.inc.S
new file mode 100644
index 0000000000..1e2f5a079c
--- /dev/null
+++ b/common-user/host/mips/safe-syscall.inc.S
@@ -0,0 +1,135 @@
+/*
+ * safe-syscall.inc.S : host-specific assembly fragment
+ * to handle signals occurring at the same time as system calls.
+ * This is intended to be included by linux-user/safe-syscall.S
+ *
+ * Written by Richard Henderson <rth@twiddle.net>
+ * Copyright (C) 2021 Linaro, Inc.
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ */
+
+#include "sys/regdef.h"
+#include "sys/asm.h"
+
+	.text
+	.set	nomips16
+	.set	noreorder
+
+	.global safe_syscall_start
+	.global safe_syscall_end
+	.type	safe_syscall_start, @function
+	.type	safe_syscall_end, @function
+
+	/*
+	 * This is the entry point for making a system call. The calling
+	 * convention here is that of a C varargs function with the
+	 * first argument an 'int *' to the signal_pending flag, the
+	 * second one the system call number (as a 'long'), and all further
+	 * arguments being syscall arguments (also 'long').
+	 */
+
+#if _MIPS_SIM == _ABIO32
+/* Do not allocate a stack frame and store into the parameter space. */
+#define FRAME   0
+#define ERRNOP  4
+#else
+/* Allocate a stack frame and store into the first allocated slot. */
+#define FRAME   16
+#define ERRNOP  0
+#endif
+
+NESTED(safe_syscall_base, FRAME, ra)
+	.cfi_startproc
+#if _MIPS_SIM == _ABIO32
+	/*
+	 * The syscall calling convention is nearly the same as C:
+	 * we enter with a0 == &signal_pending
+	 *               a1 == &errno
+	 *               a2 == syscall number
+	 *               a3, stack == syscall arguments
+	 *               and return the result in a0
+	 * and the syscall instruction needs
+	 *               v0 == syscall number
+	 *               a0 ... a3, stack == syscall arguments
+	 *               and returns the result in v0
+	 * Shuffle everything around appropriately.
+	 */
+	move	t0, a0		/* signal_pending pointer */
+	sw	a1, ERRNOP(sp)	/* errno pointer */
+	move	v0, a2		/* syscall number */
+	move	a0, a3		/* syscall arguments */
+	lw	a1, 16(sp)
+	lw	a2, 20(sp)
+	lw	a3, 24(sp)
+	lw	t4, 28(sp)
+	lw	t5, 32(sp)
+	lw	t6, 40(sp)
+	lw	t7, 44(sp)
+	sw	t4, 16(sp)
+	sw	t5, 20(sp)
+	sw	t6, 24(sp)
+	sw	t7, 28(sp)
+#else
+	PTR_ADDIU sp, sp, -FRAME
+	.cfi_adjust_cfa_offset FRAME
+
+	/*
+	 * The syscall calling convention is nearly the same as C:
+	 * we enter with a0 == &signal_pending
+	 *               a1 == &errno
+	 *               a2 == syscall number
+	 *               a3 ... a7, stack == syscall arguments
+	 *               and return the result in a0
+	 * and the syscall instruction needs
+	 *               v0 == syscall number
+	 *               a0 ... a5 == syscall arguments
+	 *               and returns the result in v0
+	 * Shuffle everything around appropriately.
+	 */
+	move	t0, a0		/* signal_pending pointer */
+	PTR_S	a1, ERRNOP(sp)	/* save errno pointer */
+	move	v0, a2		/* syscall number */
+	move	a0, a3		/* syscall arguments */
+	move	a1, a4
+	move	a2, a5
+	move	a3, a6
+	move	a4, a7
+	ld	a5, 16(sp)
+#endif
+
+	/*
+	 * This next sequence of code works in conjunction with the
+	 * rewind_if_safe_syscall_function(). If a signal is taken
+	 * and the interrupted PC is anywhere between 'safe_syscall_start'
+	 * and 'safe_syscall_end' then we rewind it to 'safe_syscall_start'.
+	 * The code sequence must therefore be able to cope with this, and
+	 * the syscall instruction must be the final one in the sequence.
+	 */
+safe_syscall_start:
+	/* If signal_pending is non-zero, don't do the call */
+	lw	t1, 0(t0)
+	bnez	t1, 0f
+	 nop
+	syscall
+safe_syscall_end:
+
+	/* code path for having successfully executed the syscall */
+	bnez	a3, 1f
+	 nop
+	jr	ra
+	 PTR_ADDIU sp, sp, FRAME
+
+	/* code path when we didn't execute the syscall */
+0:	li	v0, TARGET_ERESTARTSYS
+
+	/* code path setting errno */
+1:	PTR_L	t0, ERRNOP(sp)
+	sw	v0, 0(t0)		/* store errno */
+	li	v0, -1
+	jr	ra
+	 PTR_ADDIU sp, sp, FRAME
+
+	.cfi_endproc
+END(safe_syscall_base)
-- 
2.25.1



^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v4 6/9] common-user/host/sparc64: Add safe-syscall.inc.S
  2021-11-16 11:02 [PATCH v4 0/9] linux-user: simplify safe signal handling Richard Henderson
                   ` (4 preceding siblings ...)
  2021-11-16 11:02 ` [PATCH v4 5/9] common-user/host/mips: Add safe-syscall.inc.S Richard Henderson
@ 2021-11-16 11:02 ` Richard Henderson
  2021-11-16 11:02 ` [PATCH v4 7/9] linux-user: Remove HAVE_SAFE_SYSCALL and hostdep.h Richard Henderson
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 23+ messages in thread
From: Richard Henderson @ 2021-11-16 11:02 UTC (permalink / raw)
  To: qemu-devel; +Cc: laurent, imp

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 common-user/host/sparc64/hostdep.h          |  2 +
 common-user/host/sparc64/safe-syscall.inc.S | 91 +++++++++++++++++++++
 2 files changed, 93 insertions(+)
 create mode 100644 common-user/host/sparc64/hostdep.h
 create mode 100644 common-user/host/sparc64/safe-syscall.inc.S

diff --git a/common-user/host/sparc64/hostdep.h b/common-user/host/sparc64/hostdep.h
new file mode 100644
index 0000000000..b18aca1deb
--- /dev/null
+++ b/common-user/host/sparc64/hostdep.h
@@ -0,0 +1,2 @@
+/* We have a safe-syscall.inc.S */
+#define HAVE_SAFE_SYSCALL
diff --git a/common-user/host/sparc64/safe-syscall.inc.S b/common-user/host/sparc64/safe-syscall.inc.S
new file mode 100644
index 0000000000..2492fcbd9e
--- /dev/null
+++ b/common-user/host/sparc64/safe-syscall.inc.S
@@ -0,0 +1,91 @@
+/*
+ * safe-syscall.inc.S : host-specific assembly fragment
+ * to handle signals occurring at the same time as system calls.
+ * This is intended to be included by linux-user/safe-syscall.S
+ *
+ * Written by Richard Henderson <rth@twiddle.net>
+ * Copyright (C) 2021 Red Hat, Inc.
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ */
+
+	.text
+	.balign	4
+
+	.global safe_syscall_base
+	.global safe_syscall_start
+	.global safe_syscall_end
+	.type	safe_syscall_base, @function
+	.type	safe_syscall_start, @object
+	.type	safe_syscall_end, @object
+
+#define STACK_BIAS  2047
+#define PARAM(N)    STACK_BIAS + N*8
+
+	/*
+	 * This is the entry point for making a system call. The calling
+	 * convention here is that of a C varargs function with the
+	 * first argument an 'int *' to the signal_pending flag, the
+	 * second one the system call number (as a 'long'), and all further
+	 * arguments being syscall arguments (also 'long').
+	 */
+safe_syscall_base:
+	.cfi_startproc
+	/*
+         * The syscall calling convention isn't the same as the C one:
+	 * we enter with o0 == *signal_pending
+	 *               o1 == errno
+	 *               o2 == syscall number
+	 *               o3 ... o5, (stack) == syscall arguments
+	 *               and return the result in x0
+	 * and the syscall instruction needs
+	 *               g1 == syscall number
+	 *               o0 ... o5 == syscall arguments
+	 *               and returns the result in o0
+	 * Shuffle everything around appropriately.
+	 */
+	mov	%o0, %g2		/* signal_pending pointer */
+	stx	%o1, [%sp + PARAM(1)]	/* save errno pointer */
+	mov	%o2, %g1		/* syscall number */
+	mov	%o3, %o0		/* syscall arguments */
+	mov	%o4, %o1
+	mov	%o5, %o2
+	ldx	[%sp + PARAM(6)], %o3
+	ldx	[%sp + PARAM(7)], %o4
+	ldx	[%sp + PARAM(8)], %o5
+
+	/*
+         * This next sequence of code works in conjunction with the
+	 * rewind_if_safe_syscall_function(). If a signal is taken
+	 * and the interrupted PC is anywhere between 'safe_syscall_start'
+	 * and 'safe_syscall_end' then we rewind it to 'safe_syscall_start'.
+	 * The code sequence must therefore be able to cope with this, and
+	 * the syscall instruction must be the final one in the sequence.
+	 */
+safe_syscall_start:
+	/* if signal_pending is non-zero, don't do the call */
+	lduw	[%g2], %g3
+	brnz,pn	%g3, 2f
+	 nop
+	ta	0x6d
+safe_syscall_end:
+
+	/* code path for having successfully executed the syscall */
+	bcc,pt	%xcc, 9f
+	 nop
+
+	/* code path setting errno */
+1:	ldx	[%sp + PARAM(1)], %g2
+	stw	%o0, [%g2]		/* store errno */
+	set	-1, %o0
+
+9:	ret
+	 nop
+
+	/* code path when we didn't execute the syscall */
+2:	ba,pt	%xcc, 1b
+	 set	TARGET_ERESTARTSYS, %o0
+
+	.cfi_endproc
+	.size	safe_syscall_base, .-safe_syscall_base
-- 
2.25.1



^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v4 7/9] linux-user: Remove HAVE_SAFE_SYSCALL and hostdep.h
  2021-11-16 11:02 [PATCH v4 0/9] linux-user: simplify safe signal handling Richard Henderson
                   ` (5 preceding siblings ...)
  2021-11-16 11:02 ` [PATCH v4 6/9] common-user/host/sparc64: " Richard Henderson
@ 2021-11-16 11:02 ` Richard Henderson
  2021-11-17  8:22   ` Philippe Mathieu-Daudé
  2021-11-17 15:58   ` Warner Losh
  2021-11-16 11:02 ` [PATCH v4 8/9] common-user: Adjust system call return on FreeBSD Richard Henderson
                   ` (2 subsequent siblings)
  9 siblings, 2 replies; 23+ messages in thread
From: Richard Henderson @ 2021-11-16 11:02 UTC (permalink / raw)
  To: qemu-devel; +Cc: laurent, imp

All supported hosts now define HAVE_SAFE_SYSCALL, so remove
the ifdefs.  This leaves hostdep.h empty, so remove it.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 common-user/host/aarch64/hostdep.h | 18 ------------------
 common-user/host/arm/hostdep.h     | 18 ------------------
 common-user/host/i386/hostdep.h    | 18 ------------------
 common-user/host/mips/hostdep.h    |  2 --
 common-user/host/ppc64/hostdep.h   | 18 ------------------
 common-user/host/riscv/hostdep.h   | 14 --------------
 common-user/host/s390x/hostdep.h   | 18 ------------------
 common-user/host/sparc64/hostdep.h |  2 --
 common-user/host/x86_64/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/s390/hostdep.h     | 15 ---------------
 linux-user/host/sparc/hostdep.h    | 15 ---------------
 linux-user/host/sparc64/hostdep.h  | 15 ---------------
 linux-user/host/x32/hostdep.h      | 15 ---------------
 linux-user/safe-syscall.h          | 12 ------------
 linux-user/user-internals.h        |  1 -
 linux-user/signal.c                |  2 --
 linux-user/safe-syscall.S          |  3 ---
 20 files changed, 249 deletions(-)
 delete mode 100644 common-user/host/aarch64/hostdep.h
 delete mode 100644 common-user/host/arm/hostdep.h
 delete mode 100644 common-user/host/i386/hostdep.h
 delete mode 100644 common-user/host/mips/hostdep.h
 delete mode 100644 common-user/host/ppc64/hostdep.h
 delete mode 100644 common-user/host/riscv/hostdep.h
 delete mode 100644 common-user/host/s390x/hostdep.h
 delete mode 100644 common-user/host/sparc64/hostdep.h
 delete mode 100644 common-user/host/x86_64/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/s390/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

diff --git a/common-user/host/aarch64/hostdep.h b/common-user/host/aarch64/hostdep.h
deleted file mode 100644
index 39299d798a..0000000000
--- a/common-user/host/aarch64/hostdep.h
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * hostdep.h : things which are dependent on the host architecture
- *
- *  * Written by Peter Maydell <peter.maydell@linaro.org>
- *
- * Copyright (C) 2016 Linaro Limited
- *
- * This work is licensed under the terms of the GNU GPL, version 2 or later.
- * See the COPYING file in the top-level directory.
- */
-
-#ifndef AARCH64_HOSTDEP_H
-#define AARCH64_HOSTDEP_H
-
-/* We have a safe-syscall.inc.S */
-#define HAVE_SAFE_SYSCALL
-
-#endif
diff --git a/common-user/host/arm/hostdep.h b/common-user/host/arm/hostdep.h
deleted file mode 100644
index 86b137875a..0000000000
--- a/common-user/host/arm/hostdep.h
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * hostdep.h : things which are dependent on the host architecture
- *
- *  * Written by Peter Maydell <peter.maydell@linaro.org>
- *
- * Copyright (C) 2016 Linaro Limited
- *
- * This work is licensed under the terms of the GNU GPL, version 2 or later.
- * See the COPYING file in the top-level directory.
- */
-
-#ifndef ARM_HOSTDEP_H
-#define ARM_HOSTDEP_H
-
-/* We have a safe-syscall.inc.S */
-#define HAVE_SAFE_SYSCALL
-
-#endif
diff --git a/common-user/host/i386/hostdep.h b/common-user/host/i386/hostdep.h
deleted file mode 100644
index ce7136501f..0000000000
--- a/common-user/host/i386/hostdep.h
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * hostdep.h : things which are dependent on the host architecture
- *
- *  * Written by Peter Maydell <peter.maydell@linaro.org>
- *
- * Copyright (C) 2016 Linaro Limited
- *
- * This work is licensed under the terms of the GNU GPL, version 2 or later.
- * See the COPYING file in the top-level directory.
- */
-
-#ifndef I386_HOSTDEP_H
-#define I386_HOSTDEP_H
-
-/* We have a safe-syscall.inc.S */
-#define HAVE_SAFE_SYSCALL
-
-#endif
diff --git a/common-user/host/mips/hostdep.h b/common-user/host/mips/hostdep.h
deleted file mode 100644
index b18aca1deb..0000000000
--- a/common-user/host/mips/hostdep.h
+++ /dev/null
@@ -1,2 +0,0 @@
-/* We have a safe-syscall.inc.S */
-#define HAVE_SAFE_SYSCALL
diff --git a/common-user/host/ppc64/hostdep.h b/common-user/host/ppc64/hostdep.h
deleted file mode 100644
index 0c290dd904..0000000000
--- a/common-user/host/ppc64/hostdep.h
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * hostdep.h : things which are dependent on the host architecture
- *
- *  * Written by Peter Maydell <peter.maydell@linaro.org>
- *
- * Copyright (C) 2016 Linaro Limited
- *
- * This work is licensed under the terms of the GNU GPL, version 2 or later.
- * See the COPYING file in the top-level directory.
- */
-
-#ifndef PPC64_HOSTDEP_H
-#define PPC64_HOSTDEP_H
-
-/* We have a safe-syscall.inc.S */
-#define HAVE_SAFE_SYSCALL
-
-#endif
diff --git a/common-user/host/riscv/hostdep.h b/common-user/host/riscv/hostdep.h
deleted file mode 100644
index 7f67c22868..0000000000
--- a/common-user/host/riscv/hostdep.h
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- * hostdep.h : things which are dependent on the host architecture
- *
- * This work is licensed under the terms of the GNU GPL, version 2 or later.
- * See the COPYING file in the top-level directory.
- */
-
-#ifndef RISCV_HOSTDEP_H
-#define RISCV_HOSTDEP_H
-
-/* We have a safe-syscall.inc.S */
-#define HAVE_SAFE_SYSCALL
-
-#endif
diff --git a/common-user/host/s390x/hostdep.h b/common-user/host/s390x/hostdep.h
deleted file mode 100644
index d801145854..0000000000
--- a/common-user/host/s390x/hostdep.h
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * hostdep.h : things which are dependent on the host architecture
- *
- *  * Written by Peter Maydell <peter.maydell@linaro.org>
- *
- * Copyright (C) 2016 Linaro Limited
- *
- * This work is licensed under the terms of the GNU GPL, version 2 or later.
- * See the COPYING file in the top-level directory.
- */
-
-#ifndef S390X_HOSTDEP_H
-#define S390X_HOSTDEP_H
-
-/* We have a safe-syscall.inc.S */
-#define HAVE_SAFE_SYSCALL
-
-#endif
diff --git a/common-user/host/sparc64/hostdep.h b/common-user/host/sparc64/hostdep.h
deleted file mode 100644
index b18aca1deb..0000000000
--- a/common-user/host/sparc64/hostdep.h
+++ /dev/null
@@ -1,2 +0,0 @@
-/* We have a safe-syscall.inc.S */
-#define HAVE_SAFE_SYSCALL
diff --git a/common-user/host/x86_64/hostdep.h b/common-user/host/x86_64/hostdep.h
deleted file mode 100644
index 9c62bd26bd..0000000000
--- a/common-user/host/x86_64/hostdep.h
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * hostdep.h : things which are dependent on the host architecture
- *
- *  * Written by Peter Maydell <peter.maydell@linaro.org>
- *
- * Copyright (C) 2016 Linaro Limited
- *
- * This work is licensed under the terms of the GNU GPL, version 2 or later.
- * See the COPYING file in the top-level directory.
- */
-
-#ifndef X86_64_HOSTDEP_H
-#define X86_64_HOSTDEP_H
-
-/* We have a safe-syscall.inc.S */
-#define HAVE_SAFE_SYSCALL
-
-#endif
diff --git a/linux-user/host/ia64/hostdep.h b/linux-user/host/ia64/hostdep.h
deleted file mode 100644
index 263bf7658e..0000000000
--- a/linux-user/host/ia64/hostdep.h
+++ /dev/null
@@ -1,15 +0,0 @@
-/*
- * hostdep.h : things which are dependent on the host architecture
- *
- *  * Written by Peter Maydell <peter.maydell@linaro.org>
- *
- * Copyright (C) 2016 Linaro Limited
- *
- * This work is licensed under the terms of the GNU GPL, version 2 or later.
- * See the COPYING file in the top-level directory.
- */
-
-#ifndef IA64_HOSTDEP_H
-#define IA64_HOSTDEP_H
-
-#endif
diff --git a/linux-user/host/mips/hostdep.h b/linux-user/host/mips/hostdep.h
deleted file mode 100644
index ba111d75c3..0000000000
--- a/linux-user/host/mips/hostdep.h
+++ /dev/null
@@ -1,15 +0,0 @@
-/*
- * hostdep.h : things which are dependent on the host architecture
- *
- *  * Written by Peter Maydell <peter.maydell@linaro.org>
- *
- * Copyright (C) 2016 Linaro Limited
- *
- * This work is licensed under the terms of the GNU GPL, version 2 or later.
- * See the COPYING file in the top-level directory.
- */
-
-#ifndef MIPS_HOSTDEP_H
-#define MIPS_HOSTDEP_H
-
-#endif
diff --git a/linux-user/host/ppc/hostdep.h b/linux-user/host/ppc/hostdep.h
deleted file mode 100644
index 23d8bd9d47..0000000000
--- a/linux-user/host/ppc/hostdep.h
+++ /dev/null
@@ -1,15 +0,0 @@
-/*
- * hostdep.h : things which are dependent on the host architecture
- *
- *  * Written by Peter Maydell <peter.maydell@linaro.org>
- *
- * Copyright (C) 2016 Linaro Limited
- *
- * This work is licensed under the terms of the GNU GPL, version 2 or later.
- * See the COPYING file in the top-level directory.
- */
-
-#ifndef PPC_HOSTDEP_H
-#define PPC_HOSTDEP_H
-
-#endif
diff --git a/linux-user/host/s390/hostdep.h b/linux-user/host/s390/hostdep.h
deleted file mode 100644
index afcba5a16a..0000000000
--- a/linux-user/host/s390/hostdep.h
+++ /dev/null
@@ -1,15 +0,0 @@
-/*
- * hostdep.h : things which are dependent on the host architecture
- *
- *  * Written by Peter Maydell <peter.maydell@linaro.org>
- *
- * Copyright (C) 2016 Linaro Limited
- *
- * This work is licensed under the terms of the GNU GPL, version 2 or later.
- * See the COPYING file in the top-level directory.
- */
-
-#ifndef S390_HOSTDEP_H
-#define S390_HOSTDEP_H
-
-#endif
diff --git a/linux-user/host/sparc/hostdep.h b/linux-user/host/sparc/hostdep.h
deleted file mode 100644
index 391ad923cf..0000000000
--- a/linux-user/host/sparc/hostdep.h
+++ /dev/null
@@ -1,15 +0,0 @@
-/*
- * hostdep.h : things which are dependent on the host architecture
- *
- *  * Written by Peter Maydell <peter.maydell@linaro.org>
- *
- * Copyright (C) 2016 Linaro Limited
- *
- * This work is licensed under the terms of the GNU GPL, version 2 or later.
- * See the COPYING file in the top-level directory.
- */
-
-#ifndef SPARC_HOSTDEP_H
-#define SPARC_HOSTDEP_H
-
-#endif
diff --git a/linux-user/host/sparc64/hostdep.h b/linux-user/host/sparc64/hostdep.h
deleted file mode 100644
index ce3968fca0..0000000000
--- a/linux-user/host/sparc64/hostdep.h
+++ /dev/null
@@ -1,15 +0,0 @@
-/*
- * hostdep.h : things which are dependent on the host architecture
- *
- *  * Written by Peter Maydell <peter.maydell@linaro.org>
- *
- * Copyright (C) 2016 Linaro Limited
- *
- * This work is licensed under the terms of the GNU GPL, version 2 or later.
- * See the COPYING file in the top-level directory.
- */
-
-#ifndef SPARC64_HOSTDEP_H
-#define SPARC64_HOSTDEP_H
-
-#endif
diff --git a/linux-user/host/x32/hostdep.h b/linux-user/host/x32/hostdep.h
deleted file mode 100644
index 2c2d6d37da..0000000000
--- a/linux-user/host/x32/hostdep.h
+++ /dev/null
@@ -1,15 +0,0 @@
-/*
- * hostdep.h : things which are dependent on the host architecture
- *
- *  * Written by Peter Maydell <peter.maydell@linaro.org>
- *
- * Copyright (C) 2016 Linaro Limited
- *
- * This work is licensed under the terms of the GNU GPL, version 2 or later.
- * See the COPYING file in the top-level directory.
- */
-
-#ifndef X32_HOSTDEP_H
-#define X32_HOSTDEP_H
-
-#endif
diff --git a/linux-user/safe-syscall.h b/linux-user/safe-syscall.h
index ea0e8a8d24..0deb87e51a 100644
--- a/linux-user/safe-syscall.h
+++ b/linux-user/safe-syscall.h
@@ -124,7 +124,6 @@
  * need to check SA_RESTART flags in QEMU or distinguish the various
  * kinds of restartability.
  */
-#ifdef HAVE_SAFE_SYSCALL
 
 /* The core part of this function is implemented in assembly. */
 extern long safe_syscall_base(int *pending, int *errnop, long number, ...);
@@ -137,15 +136,4 @@ extern char safe_syscall_end[];
     safe_syscall_base(&((TaskState *)thread_cpu->opaque)->signal_pending, \
                       &errno, __VA_ARGS__)
 
-#else
-
-/*
- * Fallback for architectures which don't yet provide a safe-syscall assembly
- * fragment; note that this is racy!
- * This should go away when all host architectures have been updated.
- */
-#define safe_syscall syscall
-
-#endif
-
 #endif
diff --git a/linux-user/user-internals.h b/linux-user/user-internals.h
index 661612a088..f71f372829 100644
--- a/linux-user/user-internals.h
+++ b/linux-user/user-internals.h
@@ -18,7 +18,6 @@
 #ifndef LINUX_USER_USER_INTERNALS_H
 #define LINUX_USER_USER_INTERNALS_H
 
-#include "hostdep.h"
 #include "exec/user/thunk.h"
 #include "exec/exec-all.h"
 #include "qemu/log.h"
diff --git a/linux-user/signal.c b/linux-user/signal.c
index 6d5e5b698c..ca8f24b9ec 100644
--- a/linux-user/signal.c
+++ b/linux-user/signal.c
@@ -798,7 +798,6 @@ int queue_signal(CPUArchState *env, int sig, int si_type,
 /* Adjust the signal context to rewind out of safe-syscall if we're in it */
 static inline void rewind_if_in_safe_syscall(void *puc)
 {
-#ifdef HAVE_SAFE_SYSCALL
     ucontext_t *uc = (ucontext_t *)puc;
     uintptr_t pcreg = host_signal_pc(uc);
 
@@ -806,7 +805,6 @@ static inline void rewind_if_in_safe_syscall(void *puc)
         && pcreg < (uintptr_t)safe_syscall_end) {
         host_signal_set_pc(uc, (uintptr_t)safe_syscall_start);
     }
-#endif
 }
 
 static void host_signal_handler(int host_sig, siginfo_t *info, void *puc)
diff --git a/linux-user/safe-syscall.S b/linux-user/safe-syscall.S
index 42ea7c40ba..7ddc997801 100644
--- a/linux-user/safe-syscall.S
+++ b/linux-user/safe-syscall.S
@@ -10,15 +10,12 @@
  * See the COPYING file in the top-level directory.
  */
 
-#include "hostdep.h"
 #include "target_errno_defs.h"
 
 /* We have the correct host directory on our include path
  * so that this will pull in the right fragment for the architecture.
  */
-#ifdef HAVE_SAFE_SYSCALL
 #include "safe-syscall.inc.S"
-#endif
 
 /* We must specifically say that we're happy for the stack to not be
  * executable, otherwise the toolchain will default to assuming our
-- 
2.25.1



^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v4 8/9] common-user: Adjust system call return on FreeBSD
  2021-11-16 11:02 [PATCH v4 0/9] linux-user: simplify safe signal handling Richard Henderson
                   ` (6 preceding siblings ...)
  2021-11-16 11:02 ` [PATCH v4 7/9] linux-user: Remove HAVE_SAFE_SYSCALL and hostdep.h Richard Henderson
@ 2021-11-16 11:02 ` Richard Henderson
  2021-11-16 20:58   ` Warner Losh
  2021-11-17  8:23   ` Philippe Mathieu-Daudé
  2021-11-16 11:02 ` [PATCH v4 9/9] common-user: Move safe-syscall.* from *-user Richard Henderson
  2021-11-16 21:10 ` [PATCH v4 0/9] linux-user: simplify safe signal handling Warner Losh
  9 siblings, 2 replies; 23+ messages in thread
From: Richard Henderson @ 2021-11-16 11:02 UTC (permalink / raw)
  To: qemu-devel; +Cc: laurent, imp

From: Warner Losh <imp@bsdimp.com>

FreeBSD system calls return positive errno.  On the 4 hosts for
which we have support, error is indicated by the C bit set or clear.

Signed-off-by: Warner Losh <imp@bsdimp.com>
[rth: Rebase on new safe_syscall_base api; add #error check.]
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 common-user/host/aarch64/safe-syscall.inc.S | 12 +++++++++++-
 common-user/host/arm/safe-syscall.inc.S     | 11 +++++++++++
 common-user/host/i386/safe-syscall.inc.S    | 10 ++++++++++
 common-user/host/x86_64/safe-syscall.inc.S  | 10 ++++++++++
 4 files changed, 42 insertions(+), 1 deletion(-)

diff --git a/common-user/host/aarch64/safe-syscall.inc.S b/common-user/host/aarch64/safe-syscall.inc.S
index 95c60d8609..d3f065cdef 100644
--- a/common-user/host/aarch64/safe-syscall.inc.S
+++ b/common-user/host/aarch64/safe-syscall.inc.S
@@ -65,12 +65,22 @@ safe_syscall_start:
 safe_syscall_end:
 
 	/* code path for having successfully executed the syscall */
-	cmn	x0, #4095
+#if defined(__linux__)
+	/* Linux kernel returns (small) negative errno. */
+	cmn	x0, #4096
+	b.hi	0f
+#elif defined(__FreeBSD__)
+	/* FreeBSD kernel returns positive errno and C bit set. */
 	b.cs	1f
+#else
+#error "unsupported os"
+#endif
 	ret
 
 	/* code path setting errno */
+#ifdef __linux__
 0:	neg	w0, w0			/* create positive errno */
+#endif
 1:	str	w0, [x11]		/* store errno */
 	mov	x0, #-1
 	ret
diff --git a/common-user/host/arm/safe-syscall.inc.S b/common-user/host/arm/safe-syscall.inc.S
index 17839c6486..328299021d 100644
--- a/common-user/host/arm/safe-syscall.inc.S
+++ b/common-user/host/arm/safe-syscall.inc.S
@@ -82,12 +82,23 @@ safe_syscall_start:
 safe_syscall_end:
 
 	/* code path for having successfully executed the syscall */
+#if defined(__linux__)
+	/* Linux kernel returns (small) negative errno. */
 	cmp	r0, #-4096
 	bhi	0f
+#elif defined(__FreeBSD__)
+	/* FreeBSD kernel returns positive errno and C bit set. */
+	bcs	1f
+#else
+#error "unsupported os"
+#endif
+
 9:	pop	{ r4, r5, r6, r7, r8, r9, r10, pc }
 
 	/* code path setting errno */
+#ifdef __linux__
 0:	neg	r0, r0		/* create positive errno */
+#endif
 1:	str	r0, [r9]	/* store errno */
 	mov	r0, #-1
 	b	9b
diff --git a/common-user/host/i386/safe-syscall.inc.S b/common-user/host/i386/safe-syscall.inc.S
index ad89521783..a9382f777e 100644
--- a/common-user/host/i386/safe-syscall.inc.S
+++ b/common-user/host/i386/safe-syscall.inc.S
@@ -76,8 +76,16 @@ safe_syscall_start:
 safe_syscall_end:
 
 	/* code path for having successfully executed the syscall */
+#if defined(__linux__)
+	/* Linux kernel returns (small) negative errno. */
 	cmp	$-4095, %eax
 	jae	0f
+#elif defined(__FreeBSD__)
+	/* FreeBSD kernel returns positive errno and C bit set. */
+	jcs	1f
+#else
+#error "unsupported os"
+#endif
 
 9:	pop	%ebx
 	.cfi_remember_state
@@ -97,7 +105,9 @@ safe_syscall_end:
 	.cfi_restore_state
 
 	/* code path setting errno */
+#ifdef __linux__
 0:	neg	%eax			/* create positive errno */
+#endif
 1:	mov	8+16(%esp), %ebx	/* load errno pointer */
 	mov	%eax, (%ebx)		/* store errno */
 	mov	$-1, %eax
diff --git a/common-user/host/x86_64/safe-syscall.inc.S b/common-user/host/x86_64/safe-syscall.inc.S
index 9a0c4c93b4..36b7efe2ca 100644
--- a/common-user/host/x86_64/safe-syscall.inc.S
+++ b/common-user/host/x86_64/safe-syscall.inc.S
@@ -75,8 +75,16 @@ safe_syscall_start:
 safe_syscall_end:
 
         /* code path for having successfully executed the syscall */
+#if defined(__linux__)
+	/* Linux kernel returns (small) negative errno. */
         cmp	$-4095, %rax
         jae	0f
+#elif defined(__FreeBSD__)
+	/* FreeBSD kernel returns positive errno and C bit set. */
+	jcs	1f
+#else
+#error "unsupported os"
+#endif
 
 9:      pop     %rbp
         .cfi_remember_state
@@ -86,7 +94,9 @@ safe_syscall_end:
         .cfi_restore_state
 
         /* code path setting errno */
+#ifdef __linux__
 0:      neg	%eax			/* create positive errno */
+#endif
 1:      mov	%eax, (%rbp)		/* store errno */
         mov	$-1, %rax
         jmp	9b
-- 
2.25.1



^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v4 9/9] common-user: Move safe-syscall.* from *-user
  2021-11-16 11:02 [PATCH v4 0/9] linux-user: simplify safe signal handling Richard Henderson
                   ` (7 preceding siblings ...)
  2021-11-16 11:02 ` [PATCH v4 8/9] common-user: Adjust system call return on FreeBSD Richard Henderson
@ 2021-11-16 11:02 ` Richard Henderson
  2021-11-16 21:10 ` [PATCH v4 0/9] linux-user: simplify safe signal handling Warner Losh
  9 siblings, 0 replies; 23+ messages in thread
From: Richard Henderson @ 2021-11-16 11:02 UTC (permalink / raw)
  To: qemu-devel; +Cc: laurent, imp

From: Warner Losh <imp@bsdimp.com>

Move linux-user/safe-syscall.S to common-user so that bsd-user
can also use it.  Also move safe-syscall.h to include/user/.

Signed-off-by: Warner Losh <imp@bsdimp.com>
[rth: Adjust build rules to eliminate common-save-syscall.S.]
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 meson.build                                 | 8 ++++++--
 {linux-user => include/user}/safe-syscall.h | 0
 linux-user/signal.c                         | 2 +-
 linux-user/syscall.c                        | 2 +-
 common-user/meson.build                     | 2 ++
 {linux-user => common-user}/safe-syscall.S  | 0
 linux-user/meson.build                      | 1 -
 7 files changed, 10 insertions(+), 5 deletions(-)
 rename {linux-user => include/user}/safe-syscall.h (100%)
 create mode 100644 common-user/meson.build
 rename {linux-user => common-user}/safe-syscall.S (100%)

diff --git a/meson.build b/meson.build
index ec22cf05c1..c5b0b2b247 100644
--- a/meson.build
+++ b/meson.build
@@ -2359,6 +2359,7 @@ block_ss = ss.source_set()
 bsd_user_ss = ss.source_set()
 chardev_ss = ss.source_set()
 common_ss = ss.source_set()
+common_user_ss = ss.source_set()
 crypto_ss = ss.source_set()
 hwcore_ss = ss.source_set()
 io_ss = ss.source_set()
@@ -2605,12 +2606,15 @@ subdir('accel')
 subdir('plugins')
 subdir('bsd-user')
 subdir('linux-user')
+subdir('common-user')
 subdir('ebpf')
 
-specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
+specific_ss.add_all(when: 'CONFIG_BSD_USER',
+                    if_true: [bsd_user_ss, common_user_ss])
 
 linux_user_ss.add(files('thunk.c'))
-specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
+specific_ss.add_all(when: 'CONFIG_LINUX_USER',
+                    if_true: [linux_user_ss, common_user_ss])
 
 # needed for fuzzing binaries
 subdir('tests/qtest/libqos')
diff --git a/linux-user/safe-syscall.h b/include/user/safe-syscall.h
similarity index 100%
rename from linux-user/safe-syscall.h
rename to include/user/safe-syscall.h
diff --git a/linux-user/signal.c b/linux-user/signal.c
index ca8f24b9ec..0744c6bf20 100644
--- a/linux-user/signal.c
+++ b/linux-user/signal.c
@@ -31,7 +31,7 @@
 #include "trace.h"
 #include "signal-common.h"
 #include "host-signal.h"
-#include "safe-syscall.h"
+#include "user/safe-syscall.h"
 
 static struct target_sigaction sigact_table[TARGET_NSIG];
 
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 544f5b662f..0c5f63d08c 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -132,7 +132,7 @@
 #include "signal-common.h"
 #include "loader.h"
 #include "user-mmap.h"
-#include "safe-syscall.h"
+#include "user/safe-syscall.h"
 #include "qemu/guest-random.h"
 #include "qemu/selfmap.h"
 #include "user/syscall-trace.h"
diff --git a/common-user/meson.build b/common-user/meson.build
new file mode 100644
index 0000000000..233b69199c
--- /dev/null
+++ b/common-user/meson.build
@@ -0,0 +1,2 @@
+# TODO: reorg the *-user headers so that this can be built once.
+common_user_ss.add(when: 'CONFIG_USER_ONLY', if_true: files('safe-syscall.S'))
diff --git a/linux-user/safe-syscall.S b/common-user/safe-syscall.S
similarity index 100%
rename from linux-user/safe-syscall.S
rename to common-user/safe-syscall.S
diff --git a/linux-user/meson.build b/linux-user/meson.build
index bf62c13e37..af8d39aecc 100644
--- a/linux-user/meson.build
+++ b/linux-user/meson.build
@@ -9,7 +9,6 @@ linux_user_ss.add(files(
   'linuxload.c',
   'main.c',
   'mmap.c',
-  'safe-syscall.S',
   'signal.c',
   'strace.c',
   'syscall.c',
-- 
2.25.1



^ permalink raw reply related	[flat|nested] 23+ messages in thread

* Re: [PATCH v4 8/9] common-user: Adjust system call return on FreeBSD
  2021-11-16 11:02 ` [PATCH v4 8/9] common-user: Adjust system call return on FreeBSD Richard Henderson
@ 2021-11-16 20:58   ` Warner Losh
  2021-11-16 21:43     ` Richard Henderson
  2021-11-17  8:23   ` Philippe Mathieu-Daudé
  1 sibling, 1 reply; 23+ messages in thread
From: Warner Losh @ 2021-11-16 20:58 UTC (permalink / raw)
  To: Richard Henderson; +Cc: QEMU Developers, Laurent Vivier

[-- Attachment #1: Type: text/plain, Size: 5036 bytes --]

On Tue, Nov 16, 2021 at 4:03 AM Richard Henderson <
richard.henderson@linaro.org> wrote:

> From: Warner Losh <imp@bsdimp.com>
>
> FreeBSD system calls return positive errno.  On the 4 hosts for
> which we have support, error is indicated by the C bit set or clear.
>
> Signed-off-by: Warner Losh <imp@bsdimp.com>
> [rth: Rebase on new safe_syscall_base api; add #error check.]
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>  common-user/host/aarch64/safe-syscall.inc.S | 12 +++++++++++-
>  common-user/host/arm/safe-syscall.inc.S     | 11 +++++++++++
>  common-user/host/i386/safe-syscall.inc.S    | 10 ++++++++++
>  common-user/host/x86_64/safe-syscall.inc.S  | 10 ++++++++++
>  4 files changed, 42 insertions(+), 1 deletion(-)
>
> diff --git a/common-user/host/aarch64/safe-syscall.inc.S
> b/common-user/host/aarch64/safe-syscall.inc.S
> index 95c60d8609..d3f065cdef 100644
> --- a/common-user/host/aarch64/safe-syscall.inc.S
> +++ b/common-user/host/aarch64/safe-syscall.inc.S
> @@ -65,12 +65,22 @@ safe_syscall_start:
>  safe_syscall_end:
>
>         /* code path for having successfully executed the syscall */
> -       cmn     x0, #4095
> +#if defined(__linux__)
> +       /* Linux kernel returns (small) negative errno. */
> +       cmn     x0, #4096
> +       b.hi    0f
> +#elif defined(__FreeBSD__)
> +       /* FreeBSD kernel returns positive errno and C bit set. */
>         b.cs    1f
> +#else
> +#error "unsupported os"
> +#endif
>         ret
>
>         /* code path setting errno */
> +#ifdef __linux__
>  0:     neg     w0, w0                  /* create positive errno */
> +#endif
>  1:     str     w0, [x11]               /* store errno */
>         mov     x0, #-1
>         ret
> diff --git a/common-user/host/arm/safe-syscall.inc.S
> b/common-user/host/arm/safe-syscall.inc.S
> index 17839c6486..328299021d 100644
> --- a/common-user/host/arm/safe-syscall.inc.S
> +++ b/common-user/host/arm/safe-syscall.inc.S
> @@ -82,12 +82,23 @@ safe_syscall_start:
>  safe_syscall_end:
>
>         /* code path for having successfully executed the syscall */
> +#if defined(__linux__)
> +       /* Linux kernel returns (small) negative errno. */
>         cmp     r0, #-4096
>         bhi     0f
> +#elif defined(__FreeBSD__)
> +       /* FreeBSD kernel returns positive errno and C bit set. */
> +       bcs     1f
> +#else
> +#error "unsupported os"
> +#endif
> +
>  9:     pop     { r4, r5, r6, r7, r8, r9, r10, pc }
>
>         /* code path setting errno */
> +#ifdef __linux__
>  0:     neg     r0, r0          /* create positive errno */
> +#endif
>  1:     str     r0, [r9]        /* store errno */
>         mov     r0, #-1
>         b       9b
> diff --git a/common-user/host/i386/safe-syscall.inc.S
> b/common-user/host/i386/safe-syscall.inc.S
> index ad89521783..a9382f777e 100644
> --- a/common-user/host/i386/safe-syscall.inc.S
> +++ b/common-user/host/i386/safe-syscall.inc.S
> @@ -76,8 +76,16 @@ safe_syscall_start:
>  safe_syscall_end:
>
>         /* code path for having successfully executed the syscall */
> +#if defined(__linux__)
> +       /* Linux kernel returns (small) negative errno. */
>         cmp     $-4095, %eax
>         jae     0f
> +#elif defined(__FreeBSD__)
> +       /* FreeBSD kernel returns positive errno and C bit set. */
> +       jcs     1f
>

I needed to change this to 'jc' and that's all google found for Intel.

+#else
> +#error "unsupported os"
> +#endif
>
>  9:     pop     %ebx
>         .cfi_remember_state
> @@ -97,7 +105,9 @@ safe_syscall_end:
>         .cfi_restore_state
>
>         /* code path setting errno */
> +#ifdef __linux__
>  0:     neg     %eax                    /* create positive errno */
> +#endif
>  1:     mov     8+16(%esp), %ebx        /* load errno pointer */
>         mov     %eax, (%ebx)            /* store errno */
>         mov     $-1, %eax
> diff --git a/common-user/host/x86_64/safe-syscall.inc.S
> b/common-user/host/x86_64/safe-syscall.inc.S
> index 9a0c4c93b4..36b7efe2ca 100644
> --- a/common-user/host/x86_64/safe-syscall.inc.S
> +++ b/common-user/host/x86_64/safe-syscall.inc.S
> @@ -75,8 +75,16 @@ safe_syscall_start:
>  safe_syscall_end:
>
>          /* code path for having successfully executed the syscall */
> +#if defined(__linux__)
> +       /* Linux kernel returns (small) negative errno. */
>          cmp    $-4095, %rax
>          jae    0f
> +#elif defined(__FreeBSD__)
> +       /* FreeBSD kernel returns positive errno and C bit set. */
> +       jcs     1f
>

Likewise.


> +#else
> +#error "unsupported os"
> +#endif
>
>  9:      pop     %rbp
>          .cfi_remember_state
> @@ -86,7 +94,9 @@ safe_syscall_end:
>          .cfi_restore_state
>
>          /* code path setting errno */
> +#ifdef __linux__
>  0:      neg    %eax                    /* create positive errno */
> +#endif
>  1:      mov    %eax, (%rbp)            /* store errno */
>          mov    $-1, %rax
>          jmp    9b
>

I've not yet tested this on my arm/aarch64 systems, but I think it will
work there.

Warner

[-- Attachment #2: Type: text/html, Size: 6767 bytes --]

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH v4 3/9] linux-user/safe-syscall.inc.S: Move to common-user
  2021-11-16 11:02 ` [PATCH v4 3/9] linux-user/safe-syscall.inc.S: Move to common-user Richard Henderson
@ 2021-11-16 21:03   ` Warner Losh
  2021-11-17  8:11     ` Philippe Mathieu-Daudé
  2021-11-17 12:49     ` Richard Henderson
  0 siblings, 2 replies; 23+ messages in thread
From: Warner Losh @ 2021-11-16 21:03 UTC (permalink / raw)
  To: Richard Henderson; +Cc: QEMU Developers, Laurent Vivier

[-- Attachment #1: Type: text/plain, Size: 6705 bytes --]

On Tue, Nov 16, 2021 at 4:03 AM Richard Henderson <
richard.henderson@linaro.org> wrote:

> From: Warner Losh <imp@bsdimp.com>
>
> Move all the safe_syscall.inc.S files to common-user. They are almost
> identical between linux-user and bsd-user to re-use.
>
> Signed-off-by: Warner Losh <imp@bsdimp.com>
> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
> Message-Id: <20211113045603.60391-4-imp@bsdimp.com>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>  meson.build                                                 | 1 +
>  {linux-user => common-user}/host/aarch64/hostdep.h          | 0
>  {linux-user => common-user}/host/arm/hostdep.h              | 0
>  {linux-user => common-user}/host/i386/hostdep.h             | 0
>  {linux-user => common-user}/host/ppc64/hostdep.h            | 0
>  {linux-user => common-user}/host/riscv/hostdep.h            | 0
>  {linux-user => common-user}/host/s390x/hostdep.h            | 0
>  {linux-user => common-user}/host/x86_64/hostdep.h           | 0
>  {linux-user => common-user}/host/aarch64/safe-syscall.inc.S | 0
>  {linux-user => common-user}/host/arm/safe-syscall.inc.S     | 0
>  {linux-user => common-user}/host/i386/safe-syscall.inc.S    | 0
>  {linux-user => common-user}/host/ppc64/safe-syscall.inc.S   | 0
>  {linux-user => common-user}/host/riscv/safe-syscall.inc.S   | 0
>  {linux-user => common-user}/host/s390x/safe-syscall.inc.S   | 0
>  {linux-user => common-user}/host/x86_64/safe-syscall.inc.S  | 0
>  15 files changed, 1 insertion(+)
>  rename {linux-user => common-user}/host/aarch64/hostdep.h (100%)
>  rename {linux-user => common-user}/host/arm/hostdep.h (100%)
>  rename {linux-user => common-user}/host/i386/hostdep.h (100%)
>  rename {linux-user => common-user}/host/ppc64/hostdep.h (100%)
>  rename {linux-user => common-user}/host/riscv/hostdep.h (100%)
>  rename {linux-user => common-user}/host/s390x/hostdep.h (100%)
>  rename {linux-user => common-user}/host/x86_64/hostdep.h (100%)
>  rename {linux-user => common-user}/host/aarch64/safe-syscall.inc.S (100%)
>  rename {linux-user => common-user}/host/arm/safe-syscall.inc.S (100%)
>  rename {linux-user => common-user}/host/i386/safe-syscall.inc.S (100%)
>  rename {linux-user => common-user}/host/ppc64/safe-syscall.inc.S (100%)
>  rename {linux-user => common-user}/host/riscv/safe-syscall.inc.S (100%)
>  rename {linux-user => common-user}/host/s390x/safe-syscall.inc.S (100%)
>  rename {linux-user => common-user}/host/x86_64/safe-syscall.inc.S (100%)
>
> diff --git a/meson.build b/meson.build
> index ccc6cefc25..ec22cf05c1 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -2878,6 +2878,7 @@ foreach target : target_dirs
>      if 'CONFIG_LINUX_USER' in config_target
>        base_dir = 'linux-user'
>        target_inc += include_directories('linux-user/host/' /
> config_host['ARCH'])
> +      target_inc += include_directories('common-user/host/' /
> config_host['ARCH'])
>      endif
>      if 'CONFIG_BSD_USER' in config_target
>        base_dir = 'bsd-user'
>

I had to add this:

diff --git a/meson.build b/meson.build
index 0a88bff8d2..349e7a988f 100644
--- a/meson.build
+++ b/meson.build
@@ -2880,6 +2880,8 @@ foreach target : target_dirs
     endif
     if 'CONFIG_BSD_USER' in config_target
       base_dir = 'bsd-user'
+      target_inc += include_directories('bsd-user/host/' /
config_host['ARCH'])
+      target_inc += include_directories('common-user/host/' /
config_host['ARCH'])
       target_inc += include_directories('bsd-user/' / targetos)
       dir = base_dir / abi
       arch_srcs += files(dir / 'target_arch_cpu.c')

to get bsd-user compiling.


> diff --git a/linux-user/host/aarch64/hostdep.h
> b/common-user/host/aarch64/hostdep.h
> similarity index 100%
> rename from linux-user/host/aarch64/hostdep.h
> rename to common-user/host/aarch64/hostdep.h
> diff --git a/linux-user/host/arm/hostdep.h b/common-user/host/arm/hostdep.h
> similarity index 100%
> rename from linux-user/host/arm/hostdep.h
> rename to common-user/host/arm/hostdep.h
> diff --git a/linux-user/host/i386/hostdep.h
> b/common-user/host/i386/hostdep.h
> similarity index 100%
> rename from linux-user/host/i386/hostdep.h
> rename to common-user/host/i386/hostdep.h
> diff --git a/linux-user/host/ppc64/hostdep.h
> b/common-user/host/ppc64/hostdep.h
> similarity index 100%
> rename from linux-user/host/ppc64/hostdep.h
> rename to common-user/host/ppc64/hostdep.h
> diff --git a/linux-user/host/riscv/hostdep.h
> b/common-user/host/riscv/hostdep.h
> similarity index 100%
> rename from linux-user/host/riscv/hostdep.h
> rename to common-user/host/riscv/hostdep.h
> diff --git a/linux-user/host/s390x/hostdep.h
> b/common-user/host/s390x/hostdep.h
> similarity index 100%
> rename from linux-user/host/s390x/hostdep.h
> rename to common-user/host/s390x/hostdep.h
> diff --git a/linux-user/host/x86_64/hostdep.h
> b/common-user/host/x86_64/hostdep.h
> similarity index 100%
> rename from linux-user/host/x86_64/hostdep.h
> rename to common-user/host/x86_64/hostdep.h
> diff --git a/linux-user/host/aarch64/safe-syscall.inc.S
> b/common-user/host/aarch64/safe-syscall.inc.S
> similarity index 100%
> rename from linux-user/host/aarch64/safe-syscall.inc.S
> rename to common-user/host/aarch64/safe-syscall.inc.S
> diff --git a/linux-user/host/arm/safe-syscall.inc.S
> b/common-user/host/arm/safe-syscall.inc.S
> similarity index 100%
> rename from linux-user/host/arm/safe-syscall.inc.S
> rename to common-user/host/arm/safe-syscall.inc.S
> diff --git a/linux-user/host/i386/safe-syscall.inc.S
> b/common-user/host/i386/safe-syscall.inc.S
> similarity index 100%
> rename from linux-user/host/i386/safe-syscall.inc.S
> rename to common-user/host/i386/safe-syscall.inc.S
> diff --git a/linux-user/host/ppc64/safe-syscall.inc.S
> b/common-user/host/ppc64/safe-syscall.inc.S
> similarity index 100%
> rename from linux-user/host/ppc64/safe-syscall.inc.S
> rename to common-user/host/ppc64/safe-syscall.inc.S
> diff --git a/linux-user/host/riscv/safe-syscall.inc.S
> b/common-user/host/riscv/safe-syscall.inc.S
> similarity index 100%
> rename from linux-user/host/riscv/safe-syscall.inc.S
> rename to common-user/host/riscv/safe-syscall.inc.S
> diff --git a/linux-user/host/s390x/safe-syscall.inc.S
> b/common-user/host/s390x/safe-syscall.inc.S
> similarity index 100%
> rename from linux-user/host/s390x/safe-syscall.inc.S
> rename to common-user/host/s390x/safe-syscall.inc.S
> diff --git a/linux-user/host/x86_64/safe-syscall.inc.S
> b/common-user/host/x86_64/safe-syscall.inc.S
> similarity index 100%
> rename from linux-user/host/x86_64/safe-syscall.inc.S
> rename to common-user/host/x86_64/safe-syscall.inc.S
> --
> 2.25.1
>
>

[-- Attachment #2: Type: text/html, Size: 8298 bytes --]

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* Re: [PATCH v4 0/9] linux-user: simplify safe signal handling
  2021-11-16 11:02 [PATCH v4 0/9] linux-user: simplify safe signal handling Richard Henderson
                   ` (8 preceding siblings ...)
  2021-11-16 11:02 ` [PATCH v4 9/9] common-user: Move safe-syscall.* from *-user Richard Henderson
@ 2021-11-16 21:10 ` Warner Losh
  9 siblings, 0 replies; 23+ messages in thread
From: Warner Losh @ 2021-11-16 21:10 UTC (permalink / raw)
  To: Richard Henderson; +Cc: QEMU Developers, Laurent Vivier

[-- Attachment #1: Type: text/plain, Size: 7170 bytes --]

On Tue, Nov 16, 2021 at 4:02 AM Richard Henderson <
richard.henderson@linaro.org> wrote:

> Warner's v3:
> https://patchew.org/QEMU/20211113045603.60391-1-imp@bsdimp.com/
>
> 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.
>
>     I'll note that this last patch will at present break bsd-user,
>     because TARGET_ERESTARTSYS and the header from whence it comes
>     is currently missing there.
>
>     In addition, I think that this should be reorganized further
>     so that TARGET_ERESTARTSYS is (1) renamed because in *this*
>     context it is pretending to be a host errno, and (2) placed
>     in a file of its own under include/user/.  At which point,
>     meson.build could be simplified further so that safe-syscall.S
>     is compiled once, not per target.
>
>     Anyway, the final patch needs some bsd-user changes sorted first.
>

I've got bsd-user to compile with these changes by creating
bsd-user/target_errno_defs.h that was just #include "errno_defs.h", which
suggests a simple rename and #include adjustment in bsd-user/syscall_defs.h
would also work. On *BSD, the errno namespace is the same for all
architectures since they never followed the rather divergent System V ABIs
that Linux follows (or at least did for the early ports).

I've noted a couple of other tweaks I needed as well, but there seemed to
be no good place to share this.

I'd  be happy to change these vague descriptions into actual code I can
push to gitlab that you can pull into the patch series as well (or I can
send them to the list, I'm not sure about this finer point of qemu and want
to fit in).

Thanks for expanding my start at this.

Warner


>
> r~
>
>
> Richard Henderson (4):
>   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
>
> Warner Losh (5):
>   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
>   common-user: Move safe-syscall.* from *-user
>
>  meson.build                                   |   9 +-
>  {linux-user => include/user}/safe-syscall.h   |  31 ++--
>  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/user-internals.h                   |   1 -
>  linux-user/signal.c                           |  13 +-
>  linux-user/syscall.c                          |   2 +-
>  .../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                       |   2 +
>  {linux-user => common-user}/safe-syscall.S    |   3 -
>  linux-user/meson.build                        |   1 -
>  41 files changed, 585 insertions(+), 562 deletions(-)
>  rename {linux-user => include/user}/safe-syscall.h (85%)
>  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
>  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 (94%)
>
> --
> 2.25.1
>
>

[-- Attachment #2: Type: text/html, Size: 8810 bytes --]

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH v4 8/9] common-user: Adjust system call return on FreeBSD
  2021-11-16 20:58   ` Warner Losh
@ 2021-11-16 21:43     ` Richard Henderson
  0 siblings, 0 replies; 23+ messages in thread
From: Richard Henderson @ 2021-11-16 21:43 UTC (permalink / raw)
  To: Warner Losh; +Cc: QEMU Developers, Laurent Vivier

On 11/16/21 9:58 PM, Warner Losh wrote:
>     +#elif defined(__FreeBSD__)
>     +       /* FreeBSD kernel returns positive errno and C bit set. */
>     +       jcs     1f
> 
> 
> I needed to change this to 'jc' and that's all google found for Intel.

Yep, that's me jumping between too many arches in one day.  It's jc/jnc for intel.


r~


^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH v4 3/9] linux-user/safe-syscall.inc.S: Move to common-user
  2021-11-16 21:03   ` Warner Losh
@ 2021-11-17  8:11     ` Philippe Mathieu-Daudé
  2021-11-17 12:49     ` Richard Henderson
  1 sibling, 0 replies; 23+ messages in thread
From: Philippe Mathieu-Daudé @ 2021-11-17  8:11 UTC (permalink / raw)
  To: Warner Losh, Richard Henderson; +Cc: QEMU Developers, Laurent Vivier

On 11/16/21 22:03, Warner Losh wrote:
> On Tue, Nov 16, 2021 at 4:03 AM Richard Henderson
> <richard.henderson@linaro.org <mailto:richard.henderson@linaro.org>> wrote:
> 
>     From: Warner Losh <imp@bsdimp.com <mailto:imp@bsdimp.com>>
> 
>     Move all the safe_syscall.inc.S files to common-user. They are almost
>     identical between linux-user and bsd-user to re-use.
> 
>     Signed-off-by: Warner Losh <imp@bsdimp.com <mailto:imp@bsdimp.com>>
>     Reviewed-by: Richard Henderson <richard.henderson@linaro.org
>     <mailto:richard.henderson@linaro.org>>
>     Message-Id: <20211113045603.60391-4-imp@bsdimp.com
>     <mailto:20211113045603.60391-4-imp@bsdimp.com>>
>     Signed-off-by: Richard Henderson <richard.henderson@linaro.org
>     <mailto:richard.henderson@linaro.org>>
>     ---
>      meson.build                                                 | 1 +
>      {linux-user => common-user}/host/aarch64/hostdep.h          | 0
>      {linux-user => common-user}/host/arm/hostdep.h              | 0
>      {linux-user => common-user}/host/i386/hostdep.h             | 0
>      {linux-user => common-user}/host/ppc64/hostdep.h            | 0
>      {linux-user => common-user}/host/riscv/hostdep.h            | 0
>      {linux-user => common-user}/host/s390x/hostdep.h            | 0
>      {linux-user => common-user}/host/x86_64/hostdep.h           | 0
>      {linux-user => common-user}/host/aarch64/safe-syscall.inc.S | 0
>      {linux-user => common-user}/host/arm/safe-syscall.inc.S     | 0
>      {linux-user => common-user}/host/i386/safe-syscall.inc.S    | 0
>      {linux-user => common-user}/host/ppc64/safe-syscall.inc.S   | 0
>      {linux-user => common-user}/host/riscv/safe-syscall.inc.S   | 0
>      {linux-user => common-user}/host/s390x/safe-syscall.inc.S   | 0
>      {linux-user => common-user}/host/x86_64/safe-syscall.inc.S  | 0
>      15 files changed, 1 insertion(+)
>      rename {linux-user => common-user}/host/aarch64/hostdep.h (100%)
>      rename {linux-user => common-user}/host/arm/hostdep.h (100%)
>      rename {linux-user => common-user}/host/i386/hostdep.h (100%)
>      rename {linux-user => common-user}/host/ppc64/hostdep.h (100%)
>      rename {linux-user => common-user}/host/riscv/hostdep.h (100%)
>      rename {linux-user => common-user}/host/s390x/hostdep.h (100%)
>      rename {linux-user => common-user}/host/x86_64/hostdep.h (100%)
>      rename {linux-user => common-user}/host/aarch64/safe-syscall.inc.S
>     (100%)
>      rename {linux-user => common-user}/host/arm/safe-syscall.inc.S (100%)
>      rename {linux-user => common-user}/host/i386/safe-syscall.inc.S (100%)
>      rename {linux-user => common-user}/host/ppc64/safe-syscall.inc.S (100%)
>      rename {linux-user => common-user}/host/riscv/safe-syscall.inc.S (100%)
>      rename {linux-user => common-user}/host/s390x/safe-syscall.inc.S (100%)
>      rename {linux-user => common-user}/host/x86_64/safe-syscall.inc.S
>     (100%)
> 
>     diff --git a/meson.build b/meson.build
>     index ccc6cefc25..ec22cf05c1 100644
>     --- a/meson.build
>     +++ b/meson.build
>     @@ -2878,6 +2878,7 @@ foreach target : target_dirs
>          if 'CONFIG_LINUX_USER' in config_target
>            base_dir = 'linux-user'
>            target_inc += include_directories('linux-user/host/' /
>     config_host['ARCH'])
>     +      target_inc += include_directories('common-user/host/' /
>     config_host['ARCH'])
>          endif
>          if 'CONFIG_BSD_USER' in config_target
>            base_dir = 'bsd-user'
> 
> 
> I had to add this:
> 
> diff --git a/meson.build b/meson.build
> index 0a88bff8d2..349e7a988f 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -2880,6 +2880,8 @@ foreach target : target_dirs
>      endif
>      if 'CONFIG_BSD_USER' in config_target
>        base_dir = 'bsd-user'
> +      target_inc += include_directories('bsd-user/host/' /
> config_host['ARCH'])
> +      target_inc += include_directories('common-user/host/' /
> config_host['ARCH'])
>        target_inc += include_directories('bsd-user/' / targetos)
>        dir = base_dir / abi
>        arch_srcs += files(dir / 'target_arch_cpu.c')
> 
> to get bsd-user compiling.

Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>


^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH v4 7/9] linux-user: Remove HAVE_SAFE_SYSCALL and hostdep.h
  2021-11-16 11:02 ` [PATCH v4 7/9] linux-user: Remove HAVE_SAFE_SYSCALL and hostdep.h Richard Henderson
@ 2021-11-17  8:22   ` Philippe Mathieu-Daudé
  2021-11-17 15:58   ` Warner Losh
  1 sibling, 0 replies; 23+ messages in thread
From: Philippe Mathieu-Daudé @ 2021-11-17  8:22 UTC (permalink / raw)
  To: Richard Henderson, qemu-devel; +Cc: laurent, imp

On 11/16/21 12:02, Richard Henderson wrote:
> All supported hosts now define HAVE_SAFE_SYSCALL, so remove
> the ifdefs.  This leaves hostdep.h empty, so remove it.
> 
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>  common-user/host/aarch64/hostdep.h | 18 ------------------
>  common-user/host/arm/hostdep.h     | 18 ------------------
>  common-user/host/i386/hostdep.h    | 18 ------------------
>  common-user/host/mips/hostdep.h    |  2 --
>  common-user/host/ppc64/hostdep.h   | 18 ------------------
>  common-user/host/riscv/hostdep.h   | 14 --------------
>  common-user/host/s390x/hostdep.h   | 18 ------------------
>  common-user/host/sparc64/hostdep.h |  2 --
>  common-user/host/x86_64/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/s390/hostdep.h     | 15 ---------------
>  linux-user/host/sparc/hostdep.h    | 15 ---------------
>  linux-user/host/sparc64/hostdep.h  | 15 ---------------
>  linux-user/host/x32/hostdep.h      | 15 ---------------
>  linux-user/safe-syscall.h          | 12 ------------
>  linux-user/user-internals.h        |  1 -
>  linux-user/signal.c                |  2 --
>  linux-user/safe-syscall.S          |  3 ---
>  20 files changed, 249 deletions(-)
>  delete mode 100644 common-user/host/aarch64/hostdep.h
>  delete mode 100644 common-user/host/arm/hostdep.h
>  delete mode 100644 common-user/host/i386/hostdep.h
>  delete mode 100644 common-user/host/mips/hostdep.h
>  delete mode 100644 common-user/host/ppc64/hostdep.h
>  delete mode 100644 common-user/host/riscv/hostdep.h
>  delete mode 100644 common-user/host/s390x/hostdep.h
>  delete mode 100644 common-user/host/sparc64/hostdep.h
>  delete mode 100644 common-user/host/x86_64/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/s390/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

> diff --git a/linux-user/safe-syscall.h b/linux-user/safe-syscall.h
> -#ifdef HAVE_SAFE_SYSCALL
>  
>  /* The core part of this function is implemented in assembly. */
>  extern long safe_syscall_base(int *pending, int *errnop, long number, ...);
> @@ -137,15 +136,4 @@ extern char safe_syscall_end[];
>      safe_syscall_base(&((TaskState *)thread_cpu->opaque)->signal_pending, \
>                        &errno, __VA_ARGS__)
>  
> -#else
> -
> -/*
> - * Fallback for architectures which don't yet provide a safe-syscall assembly
> - * fragment; note that this is racy!
> - * This should go away when all host architectures have been updated.
> - */
> -#define safe_syscall syscall
> -
> -#endif

Good!

Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>


^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH v4 8/9] common-user: Adjust system call return on FreeBSD
  2021-11-16 11:02 ` [PATCH v4 8/9] common-user: Adjust system call return on FreeBSD Richard Henderson
  2021-11-16 20:58   ` Warner Losh
@ 2021-11-17  8:23   ` Philippe Mathieu-Daudé
  2021-11-17  8:32     ` Richard Henderson
  1 sibling, 1 reply; 23+ messages in thread
From: Philippe Mathieu-Daudé @ 2021-11-17  8:23 UTC (permalink / raw)
  To: Richard Henderson, qemu-devel; +Cc: laurent, imp

On 11/16/21 12:02, Richard Henderson wrote:
> From: Warner Losh <imp@bsdimp.com>
> 
> FreeBSD system calls return positive errno.  On the 4 hosts for
> which we have support, error is indicated by the C bit set or clear.
> 
> Signed-off-by: Warner Losh <imp@bsdimp.com>
> [rth: Rebase on new safe_syscall_base api; add #error check.]
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>  common-user/host/aarch64/safe-syscall.inc.S | 12 +++++++++++-
>  common-user/host/arm/safe-syscall.inc.S     | 11 +++++++++++

Can we split this in 2 patches?

>  common-user/host/i386/safe-syscall.inc.S    | 10 ++++++++++
>  common-user/host/x86_64/safe-syscall.inc.S  | 10 ++++++++++
>  4 files changed, 42 insertions(+), 1 deletion(-)


^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH v4 8/9] common-user: Adjust system call return on FreeBSD
  2021-11-17  8:23   ` Philippe Mathieu-Daudé
@ 2021-11-17  8:32     ` Richard Henderson
  2021-11-17  8:38       ` Philippe Mathieu-Daudé
  0 siblings, 1 reply; 23+ messages in thread
From: Richard Henderson @ 2021-11-17  8:32 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, qemu-devel; +Cc: laurent, imp

On 11/17/21 9:23 AM, Philippe Mathieu-Daudé wrote:
> On 11/16/21 12:02, Richard Henderson wrote:
>> From: Warner Losh <imp@bsdimp.com>
>>
>> FreeBSD system calls return positive errno.  On the 4 hosts for
>> which we have support, error is indicated by the C bit set or clear.
>>
>> Signed-off-by: Warner Losh <imp@bsdimp.com>
>> [rth: Rebase on new safe_syscall_base api; add #error check.]
>> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
>> ---
>>   common-user/host/aarch64/safe-syscall.inc.S | 12 +++++++++++-
>>   common-user/host/arm/safe-syscall.inc.S     | 11 +++++++++++
> 
> Can we split this in 2 patches?
> 
>>   common-user/host/i386/safe-syscall.inc.S    | 10 ++++++++++
>>   common-user/host/x86_64/safe-syscall.inc.S  | 10 ++++++++++
>>   4 files changed, 42 insertions(+), 1 deletion(-)

Why 2?

They're small enough that I think having them all together is fine, but otherwise why 
wouldn't I split to 4?


r~


^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH v4 8/9] common-user: Adjust system call return on FreeBSD
  2021-11-17  8:32     ` Richard Henderson
@ 2021-11-17  8:38       ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 23+ messages in thread
From: Philippe Mathieu-Daudé @ 2021-11-17  8:38 UTC (permalink / raw)
  To: Richard Henderson, qemu-devel; +Cc: laurent, imp

On 11/17/21 09:32, Richard Henderson wrote:
> On 11/17/21 9:23 AM, Philippe Mathieu-Daudé wrote:
>> On 11/16/21 12:02, Richard Henderson wrote:
>>> From: Warner Losh <imp@bsdimp.com>
>>>
>>> FreeBSD system calls return positive errno.  On the 4 hosts for
>>> which we have support, error is indicated by the C bit set or clear.
>>>
>>> Signed-off-by: Warner Losh <imp@bsdimp.com>
>>> [rth: Rebase on new safe_syscall_base api; add #error check.]
>>> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
>>> ---
>>>   common-user/host/aarch64/safe-syscall.inc.S | 12 +++++++++++-
>>>   common-user/host/arm/safe-syscall.inc.S     | 11 +++++++++++
>>
>> Can we split this in 2 patches?
>>
>>>   common-user/host/i386/safe-syscall.inc.S    | 10 ++++++++++
>>>   common-user/host/x86_64/safe-syscall.inc.S  | 10 ++++++++++
>>>   4 files changed, 42 insertions(+), 1 deletion(-)
> 
> Why 2?

Personal brain limitation, it is easier to me when I focus on
one base arch at a time. Previous mips/sparc64 changes are
in different patches.

> They're small enough that I think having them all together is fine, but
> otherwise why wouldn't I split to 4?

4 is even better for my brain, but I think I could force my brain
to focus in 1 hunk at a time in a single patch :)


^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH v4 3/9] linux-user/safe-syscall.inc.S: Move to common-user
  2021-11-16 21:03   ` Warner Losh
  2021-11-17  8:11     ` Philippe Mathieu-Daudé
@ 2021-11-17 12:49     ` Richard Henderson
  2021-11-17 16:09       ` Warner Losh
  2021-11-17 16:20       ` Philippe Mathieu-Daudé
  1 sibling, 2 replies; 23+ messages in thread
From: Richard Henderson @ 2021-11-17 12:49 UTC (permalink / raw)
  To: Warner Losh; +Cc: QEMU Developers, Laurent Vivier

On 11/16/21 10:03 PM, Warner Losh wrote:
> I had to add this:
> 
> diff --git a/meson.build b/meson.build
> index 0a88bff8d2..349e7a988f 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -2880,6 +2880,8 @@ foreach target : target_dirs
>       endif
>       if 'CONFIG_BSD_USER' in config_target
>         base_dir = 'bsd-user'
> +      target_inc += include_directories('bsd-user/host/' / config_host['ARCH'])
> +      target_inc += include_directories('common-user/host/' / config_host['ARCH'])

I get an error for adding bsd-user/host/ at this point, because bsd-user/host/arch does 
not yet exist.  But I can certainly add common-user/host/ now.


r~


^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH v4 7/9] linux-user: Remove HAVE_SAFE_SYSCALL and hostdep.h
  2021-11-16 11:02 ` [PATCH v4 7/9] linux-user: Remove HAVE_SAFE_SYSCALL and hostdep.h Richard Henderson
  2021-11-17  8:22   ` Philippe Mathieu-Daudé
@ 2021-11-17 15:58   ` Warner Losh
  1 sibling, 0 replies; 23+ messages in thread
From: Warner Losh @ 2021-11-17 15:58 UTC (permalink / raw)
  To: Richard Henderson; +Cc: QEMU Developers, Laurent Vivier

[-- Attachment #1: Type: text/plain, Size: 14934 bytes --]

On Tue, Nov 16, 2021 at 4:03 AM Richard Henderson <
richard.henderson@linaro.org> wrote:

> All supported hosts now define HAVE_SAFE_SYSCALL, so remove
> the ifdefs.  This leaves hostdep.h empty, so remove it.
>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>  common-user/host/aarch64/hostdep.h | 18 ------------------
>  common-user/host/arm/hostdep.h     | 18 ------------------
>  common-user/host/i386/hostdep.h    | 18 ------------------
>  common-user/host/mips/hostdep.h    |  2 --
>  common-user/host/ppc64/hostdep.h   | 18 ------------------
>  common-user/host/riscv/hostdep.h   | 14 --------------
>  common-user/host/s390x/hostdep.h   | 18 ------------------
>  common-user/host/sparc64/hostdep.h |  2 --
>  common-user/host/x86_64/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/s390/hostdep.h     | 15 ---------------
>  linux-user/host/sparc/hostdep.h    | 15 ---------------
>  linux-user/host/sparc64/hostdep.h  | 15 ---------------
>  linux-user/host/x32/hostdep.h      | 15 ---------------
>  linux-user/safe-syscall.h          | 12 ------------
>  linux-user/user-internals.h        |  1 -
>  linux-user/signal.c                |  2 --
>  linux-user/safe-syscall.S          |  3 ---
>  20 files changed, 249 deletions(-)
>  delete mode 100644 common-user/host/aarch64/hostdep.h
>  delete mode 100644 common-user/host/arm/hostdep.h
>  delete mode 100644 common-user/host/i386/hostdep.h
>  delete mode 100644 common-user/host/mips/hostdep.h
>  delete mode 100644 common-user/host/ppc64/hostdep.h
>  delete mode 100644 common-user/host/riscv/hostdep.h
>  delete mode 100644 common-user/host/s390x/hostdep.h
>  delete mode 100644 common-user/host/sparc64/hostdep.h
>  delete mode 100644 common-user/host/x86_64/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/s390/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
>

Reviewed-by: Warner Losh <imp@bsdimp.com>



> diff --git a/common-user/host/aarch64/hostdep.h
> b/common-user/host/aarch64/hostdep.h
> deleted file mode 100644
> index 39299d798a..0000000000
> --- a/common-user/host/aarch64/hostdep.h
> +++ /dev/null
> @@ -1,18 +0,0 @@
> -/*
> - * hostdep.h : things which are dependent on the host architecture
> - *
> - *  * Written by Peter Maydell <peter.maydell@linaro.org>
> - *
> - * Copyright (C) 2016 Linaro Limited
> - *
> - * This work is licensed under the terms of the GNU GPL, version 2 or
> later.
> - * See the COPYING file in the top-level directory.
> - */
> -
> -#ifndef AARCH64_HOSTDEP_H
> -#define AARCH64_HOSTDEP_H
> -
> -/* We have a safe-syscall.inc.S */
> -#define HAVE_SAFE_SYSCALL
> -
> -#endif
> diff --git a/common-user/host/arm/hostdep.h
> b/common-user/host/arm/hostdep.h
> deleted file mode 100644
> index 86b137875a..0000000000
> --- a/common-user/host/arm/hostdep.h
> +++ /dev/null
> @@ -1,18 +0,0 @@
> -/*
> - * hostdep.h : things which are dependent on the host architecture
> - *
> - *  * Written by Peter Maydell <peter.maydell@linaro.org>
> - *
> - * Copyright (C) 2016 Linaro Limited
> - *
> - * This work is licensed under the terms of the GNU GPL, version 2 or
> later.
> - * See the COPYING file in the top-level directory.
> - */
> -
> -#ifndef ARM_HOSTDEP_H
> -#define ARM_HOSTDEP_H
> -
> -/* We have a safe-syscall.inc.S */
> -#define HAVE_SAFE_SYSCALL
> -
> -#endif
> diff --git a/common-user/host/i386/hostdep.h
> b/common-user/host/i386/hostdep.h
> deleted file mode 100644
> index ce7136501f..0000000000
> --- a/common-user/host/i386/hostdep.h
> +++ /dev/null
> @@ -1,18 +0,0 @@
> -/*
> - * hostdep.h : things which are dependent on the host architecture
> - *
> - *  * Written by Peter Maydell <peter.maydell@linaro.org>
> - *
> - * Copyright (C) 2016 Linaro Limited
> - *
> - * This work is licensed under the terms of the GNU GPL, version 2 or
> later.
> - * See the COPYING file in the top-level directory.
> - */
> -
> -#ifndef I386_HOSTDEP_H
> -#define I386_HOSTDEP_H
> -
> -/* We have a safe-syscall.inc.S */
> -#define HAVE_SAFE_SYSCALL
> -
> -#endif
> diff --git a/common-user/host/mips/hostdep.h
> b/common-user/host/mips/hostdep.h
> deleted file mode 100644
> index b18aca1deb..0000000000
> --- a/common-user/host/mips/hostdep.h
> +++ /dev/null
> @@ -1,2 +0,0 @@
> -/* We have a safe-syscall.inc.S */
> -#define HAVE_SAFE_SYSCALL
> diff --git a/common-user/host/ppc64/hostdep.h
> b/common-user/host/ppc64/hostdep.h
> deleted file mode 100644
> index 0c290dd904..0000000000
> --- a/common-user/host/ppc64/hostdep.h
> +++ /dev/null
> @@ -1,18 +0,0 @@
> -/*
> - * hostdep.h : things which are dependent on the host architecture
> - *
> - *  * Written by Peter Maydell <peter.maydell@linaro.org>
> - *
> - * Copyright (C) 2016 Linaro Limited
> - *
> - * This work is licensed under the terms of the GNU GPL, version 2 or
> later.
> - * See the COPYING file in the top-level directory.
> - */
> -
> -#ifndef PPC64_HOSTDEP_H
> -#define PPC64_HOSTDEP_H
> -
> -/* We have a safe-syscall.inc.S */
> -#define HAVE_SAFE_SYSCALL
> -
> -#endif
> diff --git a/common-user/host/riscv/hostdep.h
> b/common-user/host/riscv/hostdep.h
> deleted file mode 100644
> index 7f67c22868..0000000000
> --- a/common-user/host/riscv/hostdep.h
> +++ /dev/null
> @@ -1,14 +0,0 @@
> -/*
> - * hostdep.h : things which are dependent on the host architecture
> - *
> - * This work is licensed under the terms of the GNU GPL, version 2 or
> later.
> - * See the COPYING file in the top-level directory.
> - */
> -
> -#ifndef RISCV_HOSTDEP_H
> -#define RISCV_HOSTDEP_H
> -
> -/* We have a safe-syscall.inc.S */
> -#define HAVE_SAFE_SYSCALL
> -
> -#endif
> diff --git a/common-user/host/s390x/hostdep.h
> b/common-user/host/s390x/hostdep.h
> deleted file mode 100644
> index d801145854..0000000000
> --- a/common-user/host/s390x/hostdep.h
> +++ /dev/null
> @@ -1,18 +0,0 @@
> -/*
> - * hostdep.h : things which are dependent on the host architecture
> - *
> - *  * Written by Peter Maydell <peter.maydell@linaro.org>
> - *
> - * Copyright (C) 2016 Linaro Limited
> - *
> - * This work is licensed under the terms of the GNU GPL, version 2 or
> later.
> - * See the COPYING file in the top-level directory.
> - */
> -
> -#ifndef S390X_HOSTDEP_H
> -#define S390X_HOSTDEP_H
> -
> -/* We have a safe-syscall.inc.S */
> -#define HAVE_SAFE_SYSCALL
> -
> -#endif
> diff --git a/common-user/host/sparc64/hostdep.h
> b/common-user/host/sparc64/hostdep.h
> deleted file mode 100644
> index b18aca1deb..0000000000
> --- a/common-user/host/sparc64/hostdep.h
> +++ /dev/null
> @@ -1,2 +0,0 @@
> -/* We have a safe-syscall.inc.S */
> -#define HAVE_SAFE_SYSCALL
> diff --git a/common-user/host/x86_64/hostdep.h
> b/common-user/host/x86_64/hostdep.h
> deleted file mode 100644
> index 9c62bd26bd..0000000000
> --- a/common-user/host/x86_64/hostdep.h
> +++ /dev/null
> @@ -1,18 +0,0 @@
> -/*
> - * hostdep.h : things which are dependent on the host architecture
> - *
> - *  * Written by Peter Maydell <peter.maydell@linaro.org>
> - *
> - * Copyright (C) 2016 Linaro Limited
> - *
> - * This work is licensed under the terms of the GNU GPL, version 2 or
> later.
> - * See the COPYING file in the top-level directory.
> - */
> -
> -#ifndef X86_64_HOSTDEP_H
> -#define X86_64_HOSTDEP_H
> -
> -/* We have a safe-syscall.inc.S */
> -#define HAVE_SAFE_SYSCALL
> -
> -#endif
> diff --git a/linux-user/host/ia64/hostdep.h
> b/linux-user/host/ia64/hostdep.h
> deleted file mode 100644
> index 263bf7658e..0000000000
> --- a/linux-user/host/ia64/hostdep.h
> +++ /dev/null
> @@ -1,15 +0,0 @@
> -/*
> - * hostdep.h : things which are dependent on the host architecture
> - *
> - *  * Written by Peter Maydell <peter.maydell@linaro.org>
> - *
> - * Copyright (C) 2016 Linaro Limited
> - *
> - * This work is licensed under the terms of the GNU GPL, version 2 or
> later.
> - * See the COPYING file in the top-level directory.
> - */
> -
> -#ifndef IA64_HOSTDEP_H
> -#define IA64_HOSTDEP_H
> -
> -#endif
> diff --git a/linux-user/host/mips/hostdep.h
> b/linux-user/host/mips/hostdep.h
> deleted file mode 100644
> index ba111d75c3..0000000000
> --- a/linux-user/host/mips/hostdep.h
> +++ /dev/null
> @@ -1,15 +0,0 @@
> -/*
> - * hostdep.h : things which are dependent on the host architecture
> - *
> - *  * Written by Peter Maydell <peter.maydell@linaro.org>
> - *
> - * Copyright (C) 2016 Linaro Limited
> - *
> - * This work is licensed under the terms of the GNU GPL, version 2 or
> later.
> - * See the COPYING file in the top-level directory.
> - */
> -
> -#ifndef MIPS_HOSTDEP_H
> -#define MIPS_HOSTDEP_H
> -
> -#endif
> diff --git a/linux-user/host/ppc/hostdep.h b/linux-user/host/ppc/hostdep.h
> deleted file mode 100644
> index 23d8bd9d47..0000000000
> --- a/linux-user/host/ppc/hostdep.h
> +++ /dev/null
> @@ -1,15 +0,0 @@
> -/*
> - * hostdep.h : things which are dependent on the host architecture
> - *
> - *  * Written by Peter Maydell <peter.maydell@linaro.org>
> - *
> - * Copyright (C) 2016 Linaro Limited
> - *
> - * This work is licensed under the terms of the GNU GPL, version 2 or
> later.
> - * See the COPYING file in the top-level directory.
> - */
> -
> -#ifndef PPC_HOSTDEP_H
> -#define PPC_HOSTDEP_H
> -
> -#endif
> diff --git a/linux-user/host/s390/hostdep.h
> b/linux-user/host/s390/hostdep.h
> deleted file mode 100644
> index afcba5a16a..0000000000
> --- a/linux-user/host/s390/hostdep.h
> +++ /dev/null
> @@ -1,15 +0,0 @@
> -/*
> - * hostdep.h : things which are dependent on the host architecture
> - *
> - *  * Written by Peter Maydell <peter.maydell@linaro.org>
> - *
> - * Copyright (C) 2016 Linaro Limited
> - *
> - * This work is licensed under the terms of the GNU GPL, version 2 or
> later.
> - * See the COPYING file in the top-level directory.
> - */
> -
> -#ifndef S390_HOSTDEP_H
> -#define S390_HOSTDEP_H
> -
> -#endif
> diff --git a/linux-user/host/sparc/hostdep.h
> b/linux-user/host/sparc/hostdep.h
> deleted file mode 100644
> index 391ad923cf..0000000000
> --- a/linux-user/host/sparc/hostdep.h
> +++ /dev/null
> @@ -1,15 +0,0 @@
> -/*
> - * hostdep.h : things which are dependent on the host architecture
> - *
> - *  * Written by Peter Maydell <peter.maydell@linaro.org>
> - *
> - * Copyright (C) 2016 Linaro Limited
> - *
> - * This work is licensed under the terms of the GNU GPL, version 2 or
> later.
> - * See the COPYING file in the top-level directory.
> - */
> -
> -#ifndef SPARC_HOSTDEP_H
> -#define SPARC_HOSTDEP_H
> -
> -#endif
> diff --git a/linux-user/host/sparc64/hostdep.h
> b/linux-user/host/sparc64/hostdep.h
> deleted file mode 100644
> index ce3968fca0..0000000000
> --- a/linux-user/host/sparc64/hostdep.h
> +++ /dev/null
> @@ -1,15 +0,0 @@
> -/*
> - * hostdep.h : things which are dependent on the host architecture
> - *
> - *  * Written by Peter Maydell <peter.maydell@linaro.org>
> - *
> - * Copyright (C) 2016 Linaro Limited
> - *
> - * This work is licensed under the terms of the GNU GPL, version 2 or
> later.
> - * See the COPYING file in the top-level directory.
> - */
> -
> -#ifndef SPARC64_HOSTDEP_H
> -#define SPARC64_HOSTDEP_H
> -
> -#endif
> diff --git a/linux-user/host/x32/hostdep.h b/linux-user/host/x32/hostdep.h
> deleted file mode 100644
> index 2c2d6d37da..0000000000
> --- a/linux-user/host/x32/hostdep.h
> +++ /dev/null
> @@ -1,15 +0,0 @@
> -/*
> - * hostdep.h : things which are dependent on the host architecture
> - *
> - *  * Written by Peter Maydell <peter.maydell@linaro.org>
> - *
> - * Copyright (C) 2016 Linaro Limited
> - *
> - * This work is licensed under the terms of the GNU GPL, version 2 or
> later.
> - * See the COPYING file in the top-level directory.
> - */
> -
> -#ifndef X32_HOSTDEP_H
> -#define X32_HOSTDEP_H
> -
> -#endif
> diff --git a/linux-user/safe-syscall.h b/linux-user/safe-syscall.h
> index ea0e8a8d24..0deb87e51a 100644
> --- a/linux-user/safe-syscall.h
> +++ b/linux-user/safe-syscall.h
> @@ -124,7 +124,6 @@
>   * need to check SA_RESTART flags in QEMU or distinguish the various
>   * kinds of restartability.
>   */
> -#ifdef HAVE_SAFE_SYSCALL
>
>  /* The core part of this function is implemented in assembly. */
>  extern long safe_syscall_base(int *pending, int *errnop, long number,
> ...);
> @@ -137,15 +136,4 @@ extern char safe_syscall_end[];
>      safe_syscall_base(&((TaskState *)thread_cpu->opaque)->signal_pending,
> \
>                        &errno, __VA_ARGS__)
>
> -#else
> -
> -/*
> - * Fallback for architectures which don't yet provide a safe-syscall
> assembly
> - * fragment; note that this is racy!
> - * This should go away when all host architectures have been updated.
> - */
> -#define safe_syscall syscall
> -
> -#endif
> -
>  #endif
> diff --git a/linux-user/user-internals.h b/linux-user/user-internals.h
> index 661612a088..f71f372829 100644
> --- a/linux-user/user-internals.h
> +++ b/linux-user/user-internals.h
> @@ -18,7 +18,6 @@
>  #ifndef LINUX_USER_USER_INTERNALS_H
>  #define LINUX_USER_USER_INTERNALS_H
>
> -#include "hostdep.h"
>  #include "exec/user/thunk.h"
>  #include "exec/exec-all.h"
>  #include "qemu/log.h"
> diff --git a/linux-user/signal.c b/linux-user/signal.c
> index 6d5e5b698c..ca8f24b9ec 100644
> --- a/linux-user/signal.c
> +++ b/linux-user/signal.c
> @@ -798,7 +798,6 @@ int queue_signal(CPUArchState *env, int sig, int
> si_type,
>  /* Adjust the signal context to rewind out of safe-syscall if we're in it
> */
>  static inline void rewind_if_in_safe_syscall(void *puc)
>  {
> -#ifdef HAVE_SAFE_SYSCALL
>      ucontext_t *uc = (ucontext_t *)puc;
>      uintptr_t pcreg = host_signal_pc(uc);
>
> @@ -806,7 +805,6 @@ static inline void rewind_if_in_safe_syscall(void *puc)
>          && pcreg < (uintptr_t)safe_syscall_end) {
>          host_signal_set_pc(uc, (uintptr_t)safe_syscall_start);
>      }
> -#endif
>  }
>
>  static void host_signal_handler(int host_sig, siginfo_t *info, void *puc)
> diff --git a/linux-user/safe-syscall.S b/linux-user/safe-syscall.S
> index 42ea7c40ba..7ddc997801 100644
> --- a/linux-user/safe-syscall.S
> +++ b/linux-user/safe-syscall.S
> @@ -10,15 +10,12 @@
>   * See the COPYING file in the top-level directory.
>   */
>
> -#include "hostdep.h"
>  #include "target_errno_defs.h"
>
>  /* We have the correct host directory on our include path
>   * so that this will pull in the right fragment for the architecture.
>   */
> -#ifdef HAVE_SAFE_SYSCALL
>  #include "safe-syscall.inc.S"
> -#endif
>
>  /* We must specifically say that we're happy for the stack to not be
>   * executable, otherwise the toolchain will default to assuming our
> --
> 2.25.1
>
>

[-- Attachment #2: Type: text/html, Size: 18002 bytes --]

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH v4 3/9] linux-user/safe-syscall.inc.S: Move to common-user
  2021-11-17 12:49     ` Richard Henderson
@ 2021-11-17 16:09       ` Warner Losh
  2021-11-17 16:20       ` Philippe Mathieu-Daudé
  1 sibling, 0 replies; 23+ messages in thread
From: Warner Losh @ 2021-11-17 16:09 UTC (permalink / raw)
  To: Richard Henderson; +Cc: QEMU Developers, Laurent Vivier

[-- Attachment #1: Type: text/plain, Size: 960 bytes --]

On Wed, Nov 17, 2021 at 5:49 AM Richard Henderson <
richard.henderson@linaro.org> wrote:

> On 11/16/21 10:03 PM, Warner Losh wrote:
> > I had to add this:
> >
> > diff --git a/meson.build b/meson.build
> > index 0a88bff8d2..349e7a988f 100644
> > --- a/meson.build
> > +++ b/meson.build
> > @@ -2880,6 +2880,8 @@ foreach target : target_dirs
> >       endif
> >       if 'CONFIG_BSD_USER' in config_target
> >         base_dir = 'bsd-user'
> > +      target_inc += include_directories('bsd-user/host/' /
> config_host['ARCH'])
> > +      target_inc += include_directories('common-user/host/' /
> config_host['ARCH'])
>
> I get an error for adding bsd-user/host/ at this point, because
> bsd-user/host/arch does
> not yet exist.  But I can certainly add common-user/host/ now.
>

That makes sense... It's in my staging area because git sometimes leaves it
behind when I
switch between the bsd-user fork and the qemu upstream and/or my working
branches.

Warner

[-- Attachment #2: Type: text/html, Size: 1481 bytes --]

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH v4 3/9] linux-user/safe-syscall.inc.S: Move to common-user
  2021-11-17 12:49     ` Richard Henderson
  2021-11-17 16:09       ` Warner Losh
@ 2021-11-17 16:20       ` Philippe Mathieu-Daudé
  1 sibling, 0 replies; 23+ messages in thread
From: Philippe Mathieu-Daudé @ 2021-11-17 16:20 UTC (permalink / raw)
  To: Richard Henderson, Warner Losh; +Cc: QEMU Developers, Laurent Vivier

On 11/17/21 13:49, Richard Henderson wrote:
> On 11/16/21 10:03 PM, Warner Losh wrote:
>> I had to add this:
>>
>> diff --git a/meson.build b/meson.build
>> index 0a88bff8d2..349e7a988f 100644
>> --- a/meson.build
>> +++ b/meson.build
>> @@ -2880,6 +2880,8 @@ foreach target : target_dirs
>>       endif
>>       if 'CONFIG_BSD_USER' in config_target
>>         base_dir = 'bsd-user'
>> +      target_inc += include_directories('bsd-user/host/' /
>> config_host['ARCH'])
>> +      target_inc += include_directories('common-user/host/' /
>> config_host['ARCH'])
> 
> I get an error for adding bsd-user/host/ at this point, because
> bsd-user/host/arch does not yet exist.  But I can certainly add
> common-user/host/ now.

Does commit 46369b50ee3 help?
("Introduce meson_user_arch source set for arch-specific user-mode")




^ permalink raw reply	[flat|nested] 23+ messages in thread

end of thread, other threads:[~2021-11-17 16:23 UTC | newest]

Thread overview: 23+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-11-16 11:02 [PATCH v4 0/9] linux-user: simplify safe signal handling Richard Henderson
2021-11-16 11:02 ` [PATCH v4 1/9] linux-user: Add host_signal_set_pc to set pc in mcontext Richard Henderson
2021-11-16 11:02 ` [PATCH v4 2/9] linux-user/signal.c: Create a common rewind_if_in_safe_syscall Richard Henderson
2021-11-16 11:02 ` [PATCH v4 3/9] linux-user/safe-syscall.inc.S: Move to common-user Richard Henderson
2021-11-16 21:03   ` Warner Losh
2021-11-17  8:11     ` Philippe Mathieu-Daudé
2021-11-17 12:49     ` Richard Henderson
2021-11-17 16:09       ` Warner Losh
2021-11-17 16:20       ` Philippe Mathieu-Daudé
2021-11-16 11:02 ` [PATCH v4 4/9] common-user: Move syscall error detection into safe_syscall_base Richard Henderson
2021-11-16 11:02 ` [PATCH v4 5/9] common-user/host/mips: Add safe-syscall.inc.S Richard Henderson
2021-11-16 11:02 ` [PATCH v4 6/9] common-user/host/sparc64: " Richard Henderson
2021-11-16 11:02 ` [PATCH v4 7/9] linux-user: Remove HAVE_SAFE_SYSCALL and hostdep.h Richard Henderson
2021-11-17  8:22   ` Philippe Mathieu-Daudé
2021-11-17 15:58   ` Warner Losh
2021-11-16 11:02 ` [PATCH v4 8/9] common-user: Adjust system call return on FreeBSD Richard Henderson
2021-11-16 20:58   ` Warner Losh
2021-11-16 21:43     ` Richard Henderson
2021-11-17  8:23   ` Philippe Mathieu-Daudé
2021-11-17  8:32     ` Richard Henderson
2021-11-17  8:38       ` Philippe Mathieu-Daudé
2021-11-16 11:02 ` [PATCH v4 9/9] common-user: Move safe-syscall.* from *-user Richard Henderson
2021-11-16 21:10 ` [PATCH v4 0/9] linux-user: simplify safe signal handling Warner Losh

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.