* [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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).