* [RFC v2 1/6] linux-user: Add host_signal_set_pc to set pc in mcontext
2021-11-10 16:31 [RFC v2 0/6] linux-user: simplify safe signal handling Warner Losh
@ 2021-11-10 16:31 ` Warner Losh
2021-11-10 16:42 ` Richard Henderson
2021-11-10 16:31 ` [RFC v2 2/6] linux-user/signal.c: Create a common rewind_if_in_safe_syscall Warner Losh
` (4 subsequent siblings)
5 siblings, 1 reply; 16+ messages in thread
From: Warner Losh @ 2021-11-10 16:31 UTC (permalink / raw)
To: qemu-devel
Cc: Warner Losh, Richard Henderson, Philippe Mathieu-Daude, Laurent Vivier
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>
---
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..e301c2c1ea 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.33.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [RFC v2 2/6] linux-user/signal.c: Create a common rewind_if_in_safe_syscall
2021-11-10 16:31 [RFC v2 0/6] linux-user: simplify safe signal handling Warner Losh
2021-11-10 16:31 ` [RFC v2 1/6] linux-user: Add host_signal_set_pc to set pc in mcontext Warner Losh
@ 2021-11-10 16:31 ` Warner Losh
2021-11-10 16:31 ` [RFC v2 3/6] linux-user/safe-syscall.inc.S: Move to common-user Warner Losh
` (3 subsequent siblings)
5 siblings, 0 replies; 16+ messages in thread
From: Warner Losh @ 2021-11-10 16:31 UTC (permalink / raw)
To: qemu-devel
Cc: Warner Losh, Richard Henderson, Philippe Mathieu-Daude, Laurent Vivier
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>
---
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 | 14 +++++++++++++-
9 files changed, 16 insertions(+), 141 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..ee038c2399 100644
--- a/linux-user/signal.c
+++ b/linux-user/signal.c
@@ -793,7 +793,19 @@ int queue_signal(CPUArchState *env, int sig, int si_type,
return 1; /* indicates that the signal was queued */
}
-#ifndef HAVE_SAFE_SYSCALL
+#ifdef 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)
+{
+ 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);
+ }
+}
+#else
static inline void rewind_if_in_safe_syscall(void *puc)
{
/* Default version: never rewind */
--
2.33.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [RFC v2 3/6] linux-user/safe-syscall.inc.S: Move to common-user
2021-11-10 16:31 [RFC v2 0/6] linux-user: simplify safe signal handling Warner Losh
2021-11-10 16:31 ` [RFC v2 1/6] linux-user: Add host_signal_set_pc to set pc in mcontext Warner Losh
2021-11-10 16:31 ` [RFC v2 2/6] linux-user/signal.c: Create a common rewind_if_in_safe_syscall Warner Losh
@ 2021-11-10 16:31 ` Warner Losh
2021-11-10 16:43 ` Richard Henderson
2021-11-10 16:31 ` [RFC v2 4/6] common-user: Adjust system call return on FreeBSD Warner Losh
` (2 subsequent siblings)
5 siblings, 1 reply; 16+ messages in thread
From: Warner Losh @ 2021-11-10 16:31 UTC (permalink / raw)
To: qemu-devel
Cc: Warner Losh, Richard Henderson, Philippe Mathieu-Daude, Laurent Vivier
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>
---
{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
meson.build | 1 +
8 files changed, 1 insertion(+)
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/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
diff --git a/meson.build b/meson.build
index 9702fdce6d..728d305403 100644
--- a/meson.build
+++ b/meson.build
@@ -2872,6 +2872,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'
--
2.33.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [RFC v2 3/6] linux-user/safe-syscall.inc.S: Move to common-user
2021-11-10 16:31 ` [RFC v2 3/6] linux-user/safe-syscall.inc.S: Move to common-user Warner Losh
@ 2021-11-10 16:43 ` Richard Henderson
0 siblings, 0 replies; 16+ messages in thread
From: Richard Henderson @ 2021-11-10 16:43 UTC (permalink / raw)
To: Warner Losh, qemu-devel; +Cc: Philippe Mathieu-Daude, Laurent Vivier
On 11/10/21 5:31 PM, Warner Losh wrote:
> 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>
> ---
> {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
> meson.build | 1 +
> 8 files changed, 1 insertion(+)
> 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%)
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
r~
^ permalink raw reply [flat|nested] 16+ messages in thread
* [RFC v2 4/6] common-user: Adjust system call return on FreeBSD
2021-11-10 16:31 [RFC v2 0/6] linux-user: simplify safe signal handling Warner Losh
` (2 preceding siblings ...)
2021-11-10 16:31 ` [RFC v2 3/6] linux-user/safe-syscall.inc.S: Move to common-user Warner Losh
@ 2021-11-10 16:31 ` Warner Losh
2021-11-10 16:59 ` Richard Henderson
2021-11-10 16:31 ` [RFC v2 5/6] common-user/host/mips: create, though mips hosts likely don't work reliably Warner Losh
2021-11-10 16:31 ` [RFC v2 6/6] *-user: move safe-syscall.* to common-user Warner Losh
5 siblings, 1 reply; 16+ messages in thread
From: Warner Losh @ 2021-11-10 16:31 UTC (permalink / raw)
To: qemu-devel
Cc: Warner Losh, Richard Henderson, Philippe Mathieu-Daude, Laurent Vivier
All the *-users generally use the Linux style of negative return codes
for errno. FreeBSD returns errno, not -errno. Add ifdefs for FreeBSD to
make the adjustment on the 4 hosts that we have support for.
Signed-off-by: Warner Losh <imp@bsdimp.com>
---
common-user/host/aarch64/safe-syscall.inc.S | 5 +++++
common-user/host/arm/safe-syscall.inc.S | 5 +++++
common-user/host/i386/safe-syscall.inc.S | 5 +++++
common-user/host/x86_64/safe-syscall.inc.S | 5 +++++
4 files changed, 20 insertions(+)
diff --git a/common-user/host/aarch64/safe-syscall.inc.S b/common-user/host/aarch64/safe-syscall.inc.S
index bc1f5a9792..6584950ccf 100644
--- a/common-user/host/aarch64/safe-syscall.inc.S
+++ b/common-user/host/aarch64/safe-syscall.inc.S
@@ -64,6 +64,11 @@ safe_syscall_start:
svc 0x0
safe_syscall_end:
/* code path for having successfully executed the syscall */
+#ifdef __FreeBSD__
+ b.cc 2f /* Convert to Linux -ERRNO convention */
+ neg x0, x0
+2:
+#endif
ret
0:
diff --git a/common-user/host/arm/safe-syscall.inc.S b/common-user/host/arm/safe-syscall.inc.S
index 88c4958504..85c47387f9 100644
--- a/common-user/host/arm/safe-syscall.inc.S
+++ b/common-user/host/arm/safe-syscall.inc.S
@@ -78,6 +78,11 @@ safe_syscall_start:
swi 0
safe_syscall_end:
/* code path for having successfully executed the syscall */
+#ifdef __FreeBSD__
+ bcc 2f
+ neg r0, r0
+2:
+#endif
pop { r4, r5, r6, r7, r8, pc }
1:
diff --git a/common-user/host/i386/safe-syscall.inc.S b/common-user/host/i386/safe-syscall.inc.S
index 9e58fc6504..7bb6a98a8b 100644
--- a/common-user/host/i386/safe-syscall.inc.S
+++ b/common-user/host/i386/safe-syscall.inc.S
@@ -75,6 +75,11 @@ safe_syscall_start:
int $0x80
safe_syscall_end:
/* code path for having successfully executed the syscall */
+#ifdef __FreeBSD__
+ jnb 2f /* Convert to Linux -ERRNO convention */
+ neg %eax
+2:
+#endif
pop %ebx
.cfi_remember_state
.cfi_adjust_cfa_offset -4
diff --git a/common-user/host/x86_64/safe-syscall.inc.S b/common-user/host/x86_64/safe-syscall.inc.S
index f36992daa3..7d8792c7ef 100644
--- a/common-user/host/x86_64/safe-syscall.inc.S
+++ b/common-user/host/x86_64/safe-syscall.inc.S
@@ -72,6 +72,11 @@ safe_syscall_start:
syscall
safe_syscall_end:
/* code path for having successfully executed the syscall */
+#ifdef __FreeBSD__
+ jnb 2f /* Convert to Linux -ERRNO convention */
+ neg %rax
+2:
+#endif
pop %rbp
.cfi_remember_state
.cfi_def_cfa_offset 8
--
2.33.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [RFC v2 4/6] common-user: Adjust system call return on FreeBSD
2021-11-10 16:31 ` [RFC v2 4/6] common-user: Adjust system call return on FreeBSD Warner Losh
@ 2021-11-10 16:59 ` Richard Henderson
2021-11-10 22:53 ` Warner Losh
0 siblings, 1 reply; 16+ messages in thread
From: Richard Henderson @ 2021-11-10 16:59 UTC (permalink / raw)
To: Warner Losh, qemu-devel; +Cc: Philippe Mathieu-Daude, Laurent Vivier
On 11/10/21 5:31 PM, Warner Losh wrote:
> All the *-users generally use the Linux style of negative return codes
> for errno. FreeBSD returns errno, not -errno. Add ifdefs for FreeBSD to
> make the adjustment on the 4 hosts that we have support for.
>
> Signed-off-by: Warner Losh <imp@bsdimp.com>
> ---
> common-user/host/aarch64/safe-syscall.inc.S | 5 +++++
> common-user/host/arm/safe-syscall.inc.S | 5 +++++
> common-user/host/i386/safe-syscall.inc.S | 5 +++++
> common-user/host/x86_64/safe-syscall.inc.S | 5 +++++
> 4 files changed, 20 insertions(+)
>
> diff --git a/common-user/host/aarch64/safe-syscall.inc.S b/common-user/host/aarch64/safe-syscall.inc.S
> index bc1f5a9792..6584950ccf 100644
> --- a/common-user/host/aarch64/safe-syscall.inc.S
> +++ b/common-user/host/aarch64/safe-syscall.inc.S
> @@ -64,6 +64,11 @@ safe_syscall_start:
> svc 0x0
> safe_syscall_end:
> /* code path for having successfully executed the syscall */
> +#ifdef __FreeBSD__
> + b.cc 2f /* Convert to Linux -ERRNO convention */
> + neg x0, x0
> +2:
> +#endif
I think it should be a little odd to mention Linux.
How about
/*
* FreeBSD kernel returns C bit set with positive errno.
* Encode this for use in bsd-user as -errno:
* x0 = !c ? x0 : -x0
*/
csneg x0, x0, x0, cc
> +++ b/common-user/host/arm/safe-syscall.inc.S
> @@ -78,6 +78,11 @@ safe_syscall_start:
> swi 0
> safe_syscall_end:
> /* code path for having successfully executed the syscall */
> +#ifdef __FreeBSD__
> + bcc 2f
> + neg r0, r0
negcs r0, r0
I just can't help myself. :-)
r~
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [RFC v2 4/6] common-user: Adjust system call return on FreeBSD
2021-11-10 16:59 ` Richard Henderson
@ 2021-11-10 22:53 ` Warner Losh
0 siblings, 0 replies; 16+ messages in thread
From: Warner Losh @ 2021-11-10 22:53 UTC (permalink / raw)
To: Richard Henderson; +Cc: Laurent Vivier, QEMU Developers, Philippe Mathieu-Daude
[-- Attachment #1: Type: text/plain, Size: 2201 bytes --]
On Wed, Nov 10, 2021 at 9:59 AM Richard Henderson <
richard.henderson@linaro.org> wrote:
> On 11/10/21 5:31 PM, Warner Losh wrote:
> > All the *-users generally use the Linux style of negative return codes
> > for errno. FreeBSD returns errno, not -errno. Add ifdefs for FreeBSD to
> > make the adjustment on the 4 hosts that we have support for.
> >
> > Signed-off-by: Warner Losh <imp@bsdimp.com>
> > ---
> > common-user/host/aarch64/safe-syscall.inc.S | 5 +++++
> > common-user/host/arm/safe-syscall.inc.S | 5 +++++
> > common-user/host/i386/safe-syscall.inc.S | 5 +++++
> > common-user/host/x86_64/safe-syscall.inc.S | 5 +++++
> > 4 files changed, 20 insertions(+)
> >
> > diff --git a/common-user/host/aarch64/safe-syscall.inc.S
> b/common-user/host/aarch64/safe-syscall.inc.S
> > index bc1f5a9792..6584950ccf 100644
> > --- a/common-user/host/aarch64/safe-syscall.inc.S
> > +++ b/common-user/host/aarch64/safe-syscall.inc.S
> > @@ -64,6 +64,11 @@ safe_syscall_start:
> > svc 0x0
> > safe_syscall_end:
> > /* code path for having successfully executed the syscall */
> > +#ifdef __FreeBSD__
> > + b.cc 2f /* Convert to Linux -ERRNO convention */
> > + neg x0, x0
> > +2:
> > +#endif
>
> I think it should be a little odd to mention Linux.
>
Yea, from my view of hacking on Unix and Unix-derived systems for the
last 30 years, Linux is the outlier in returning -errno. However, the
'norms'
have shifted, I guess, so I'm happy with your suggestion...
> How about
>
> /*
> * FreeBSD kernel returns C bit set with positive errno.
> * Encode this for use in bsd-user as -errno:
> * x0 = !c ? x0 : -x0
> */
> csneg x0, x0, x0, cc
>
Ah, better assembler. Good!
>
> > +++ b/common-user/host/arm/safe-syscall.inc.S
> > @@ -78,6 +78,11 @@ safe_syscall_start:
> > swi 0
> > safe_syscall_end:
> > /* code path for having successfully executed the syscall */
> > +#ifdef __FreeBSD__
> > + bcc 2f
> > + neg r0, r0
>
> negcs r0, r0
>
> I just can't help myself. :-)
I can relate... Really :)
I'll rework and resend in the next round.
Warner
[-- Attachment #2: Type: text/html, Size: 3367 bytes --]
^ permalink raw reply [flat|nested] 16+ messages in thread
* [RFC v2 5/6] common-user/host/mips: create, though mips hosts likely don't work reliably
2021-11-10 16:31 [RFC v2 0/6] linux-user: simplify safe signal handling Warner Losh
` (3 preceding siblings ...)
2021-11-10 16:31 ` [RFC v2 4/6] common-user: Adjust system call return on FreeBSD Warner Losh
@ 2021-11-10 16:31 ` Warner Losh
2021-11-10 17:00 ` Richard Henderson
2021-11-10 16:31 ` [RFC v2 6/6] *-user: move safe-syscall.* to common-user Warner Losh
5 siblings, 1 reply; 16+ messages in thread
From: Warner Losh @ 2021-11-10 16:31 UTC (permalink / raw)
To: qemu-devel
Cc: Warner Losh, Richard Henderson, Philippe Mathieu-Daude, Laurent Vivier
Signed-off-by: Warner Losh <imp@bsdimp.com>
---
common-user/host/mips/safe-syscall.inc.S | 1 +
1 file changed, 1 insertion(+)
create mode 100644 common-user/host/mips/safe-syscall.inc.S
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..72d9064acb
--- /dev/null
+++ b/common-user/host/mips/safe-syscall.inc.S
@@ -0,0 +1 @@
+ .asciiz "This file is not compiled and mips hosts are likely broken"
--
2.33.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [RFC v2 5/6] common-user/host/mips: create, though mips hosts likely don't work reliably
2021-11-10 16:31 ` [RFC v2 5/6] common-user/host/mips: create, though mips hosts likely don't work reliably Warner Losh
@ 2021-11-10 17:00 ` Richard Henderson
2021-11-10 22:58 ` Warner Losh
0 siblings, 1 reply; 16+ messages in thread
From: Richard Henderson @ 2021-11-10 17:00 UTC (permalink / raw)
To: Warner Losh, qemu-devel; +Cc: Philippe Mathieu-Daude, Laurent Vivier
On 11/10/21 5:31 PM, Warner Losh wrote:
> Signed-off-by: Warner Losh <imp@bsdimp.com>
> ---
> common-user/host/mips/safe-syscall.inc.S | 1 +
> 1 file changed, 1 insertion(+)
> create mode 100644 common-user/host/mips/safe-syscall.inc.S
>
> 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..72d9064acb
> --- /dev/null
> +++ b/common-user/host/mips/safe-syscall.inc.S
> @@ -0,0 +1 @@
> + .asciiz "This file is not compiled and mips hosts are likely broken"
>
Let's not include this. I have created
https://gitlab.com/qemu-project/qemu/-/issues/713
for tracking.
r~
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [RFC v2 5/6] common-user/host/mips: create, though mips hosts likely don't work reliably
2021-11-10 17:00 ` Richard Henderson
@ 2021-11-10 22:58 ` Warner Losh
0 siblings, 0 replies; 16+ messages in thread
From: Warner Losh @ 2021-11-10 22:58 UTC (permalink / raw)
To: Richard Henderson; +Cc: Laurent Vivier, QEMU Developers, Philippe Mathieu-Daude
[-- Attachment #1: Type: text/plain, Size: 967 bytes --]
On Wed, Nov 10, 2021 at 10:00 AM Richard Henderson <
richard.henderson@linaro.org> wrote:
> On 11/10/21 5:31 PM, Warner Losh wrote:
> > Signed-off-by: Warner Losh <imp@bsdimp.com>
> > ---
> > common-user/host/mips/safe-syscall.inc.S | 1 +
> > 1 file changed, 1 insertion(+)
> > create mode 100644 common-user/host/mips/safe-syscall.inc.S
> >
> > 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..72d9064acb
> > --- /dev/null
> > +++ b/common-user/host/mips/safe-syscall.inc.S
> > @@ -0,0 +1 @@
> > + .asciiz "This file is not compiled and mips hosts are likely
> broken"
> >
>
> Let's not include this. I have created
>
> https://gitlab.com/qemu-project/qemu/-/issues/713
>
> for tracking.
>
Without including it, the mips CI jobs will fail. If you are OK with this
and dealing with that
issue in another way, then I'll drop it. It's easy enough.
Warner
[-- Attachment #2: Type: text/html, Size: 1630 bytes --]
^ permalink raw reply [flat|nested] 16+ messages in thread
* [RFC v2 6/6] *-user: move safe-syscall.* to common-user
2021-11-10 16:31 [RFC v2 0/6] linux-user: simplify safe signal handling Warner Losh
` (4 preceding siblings ...)
2021-11-10 16:31 ` [RFC v2 5/6] common-user/host/mips: create, though mips hosts likely don't work reliably Warner Losh
@ 2021-11-10 16:31 ` Warner Losh
2021-11-10 17:04 ` Richard Henderson
5 siblings, 1 reply; 16+ messages in thread
From: Warner Losh @ 2021-11-10 16:31 UTC (permalink / raw)
To: qemu-devel
Cc: Warner Losh, Richard Henderson, Philippe Mathieu-Daude, Laurent Vivier
Move linux-user/safe-syscall.S to common-user/common-safe-syscall.S and
replace it with a #include "common-safe-syscall.S" so that bsd-user can
also use it. Also move safe-syscall.h so that it can define a few more
externs.
Signed-off-by: Warner Losh <imp@bsdimp.com>
---
common-user/common-safe-syscall.S | 30 +++++++++++++++++++++
{linux-user => common-user}/safe-syscall.h | 0
linux-user/safe-syscall.S | 31 +---------------------
linux-user/signal.c | 1 +
meson.build | 1 +
5 files changed, 33 insertions(+), 30 deletions(-)
create mode 100644 common-user/common-safe-syscall.S
rename {linux-user => common-user}/safe-syscall.h (100%)
diff --git a/common-user/common-safe-syscall.S b/common-user/common-safe-syscall.S
new file mode 100644
index 0000000000..42ea7c40ba
--- /dev/null
+++ b/common-user/common-safe-syscall.S
@@ -0,0 +1,30 @@
+/*
+ * safe-syscall.S : include the host-specific assembly fragment
+ * to handle signals occurring at the same time as system calls.
+ *
+ * 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.
+ */
+
+#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
+ * assembly needs an executable stack and the whole QEMU binary will
+ * needlessly end up with one. This should be the last thing in this file.
+ */
+#if defined(__linux__) && defined(__ELF__)
+.section .note.GNU-stack, "", %progbits
+#endif
diff --git a/linux-user/safe-syscall.h b/common-user/safe-syscall.h
similarity index 100%
rename from linux-user/safe-syscall.h
rename to common-user/safe-syscall.h
diff --git a/linux-user/safe-syscall.S b/linux-user/safe-syscall.S
index 42ea7c40ba..c86f0aea74 100644
--- a/linux-user/safe-syscall.S
+++ b/linux-user/safe-syscall.S
@@ -1,30 +1 @@
-/*
- * safe-syscall.S : include the host-specific assembly fragment
- * to handle signals occurring at the same time as system calls.
- *
- * 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.
- */
-
-#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
- * assembly needs an executable stack and the whole QEMU binary will
- * needlessly end up with one. This should be the last thing in this file.
- */
-#if defined(__linux__) && defined(__ELF__)
-.section .note.GNU-stack, "", %progbits
-#endif
+#include "common-safe-syscall.S"
diff --git a/linux-user/signal.c b/linux-user/signal.c
index ee038c2399..cfda166f9c 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];
diff --git a/meson.build b/meson.build
index 728d305403..2f3b0fb2d6 100644
--- a/meson.build
+++ b/meson.build
@@ -2873,6 +2873,7 @@ foreach target : target_dirs
base_dir = 'linux-user'
target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
target_inc += include_directories('common-user/host/' / config_host['ARCH'])
+ target_inc += include_directories('common-user')
endif
if 'CONFIG_BSD_USER' in config_target
base_dir = 'bsd-user'
--
2.33.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [RFC v2 6/6] *-user: move safe-syscall.* to common-user
2021-11-10 16:31 ` [RFC v2 6/6] *-user: move safe-syscall.* to common-user Warner Losh
@ 2021-11-10 17:04 ` Richard Henderson
2021-11-10 23:02 ` Warner Losh
0 siblings, 1 reply; 16+ messages in thread
From: Richard Henderson @ 2021-11-10 17:04 UTC (permalink / raw)
To: Warner Losh, qemu-devel; +Cc: Philippe Mathieu-Daude, Laurent Vivier
On 11/10/21 5:31 PM, Warner Losh wrote:
> Move linux-user/safe-syscall.S to common-user/common-safe-syscall.S and
> replace it with a #include "common-safe-syscall.S" so that bsd-user can
> also use it. Also move safe-syscall.h so that it can define a few more
> externs.
>
> Signed-off-by: Warner Losh <imp@bsdimp.com>
> ---
> common-user/common-safe-syscall.S | 30 +++++++++++++++++++++
> {linux-user => common-user}/safe-syscall.h | 0
> linux-user/safe-syscall.S | 31 +---------------------
> linux-user/signal.c | 1 +
> meson.build | 1 +
> 5 files changed, 33 insertions(+), 30 deletions(-)
> create mode 100644 common-user/common-safe-syscall.S
> rename {linux-user => common-user}/safe-syscall.h (100%)
>
> diff --git a/common-user/common-safe-syscall.S b/common-user/common-safe-syscall.S
> new file mode 100644
> index 0000000000..42ea7c40ba
> --- /dev/null
> +++ b/common-user/common-safe-syscall.S
> @@ -0,0 +1,30 @@
> +/*
> + * safe-syscall.S : include the host-specific assembly fragment
> + * to handle signals occurring at the same time as system calls.
> + *
> + * 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.
> + */
> +
> +#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
> + * assembly needs an executable stack and the whole QEMU binary will
> + * needlessly end up with one. This should be the last thing in this file.
> + */
> +#if defined(__linux__) && defined(__ELF__)
> +.section .note.GNU-stack, "", %progbits
> +#endif
Hmm. If we're going to split this file into safe-syscall.S and common-safe-syscall.S, we
shouldn't do the ifdef thing here. (Why it was present at all for linux-user is a mystery.)
What do you have planned for bsd-user that would be more than
> +#include "common-safe-syscall.S"
this?
r~
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [RFC v2 6/6] *-user: move safe-syscall.* to common-user
2021-11-10 17:04 ` Richard Henderson
@ 2021-11-10 23:02 ` Warner Losh
0 siblings, 0 replies; 16+ messages in thread
From: Warner Losh @ 2021-11-10 23:02 UTC (permalink / raw)
To: Richard Henderson; +Cc: Laurent Vivier, QEMU Developers, Philippe Mathieu-Daude
[-- Attachment #1: Type: text/plain, Size: 2941 bytes --]
On Wed, Nov 10, 2021 at 10:04 AM Richard Henderson <
richard.henderson@linaro.org> wrote:
> On 11/10/21 5:31 PM, Warner Losh wrote:
> > Move linux-user/safe-syscall.S to common-user/common-safe-syscall.S and
> > replace it with a #include "common-safe-syscall.S" so that bsd-user can
> > also use it. Also move safe-syscall.h so that it can define a few more
> > externs.
> >
> > Signed-off-by: Warner Losh <imp@bsdimp.com>
> > ---
> > common-user/common-safe-syscall.S | 30 +++++++++++++++++++++
> > {linux-user => common-user}/safe-syscall.h | 0
> > linux-user/safe-syscall.S | 31 +---------------------
> > linux-user/signal.c | 1 +
> > meson.build | 1 +
> > 5 files changed, 33 insertions(+), 30 deletions(-)
> > create mode 100644 common-user/common-safe-syscall.S
> > rename {linux-user => common-user}/safe-syscall.h (100%)
> >
> > diff --git a/common-user/common-safe-syscall.S
> b/common-user/common-safe-syscall.S
> > new file mode 100644
> > index 0000000000..42ea7c40ba
> > --- /dev/null
> > +++ b/common-user/common-safe-syscall.S
> > @@ -0,0 +1,30 @@
> > +/*
> > + * safe-syscall.S : include the host-specific assembly fragment
> > + * to handle signals occurring at the same time as system calls.
> > + *
> > + * 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.
> > + */
> > +
> > +#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
> > + * assembly needs an executable stack and the whole QEMU binary will
> > + * needlessly end up with one. This should be the last thing in this
> file.
> > + */
> > +#if defined(__linux__) && defined(__ELF__)
> > +.section .note.GNU-stack, "", %progbits
> > +#endif
>
> Hmm. If we're going to split this file into safe-syscall.S and
> common-safe-syscall.S, we
> shouldn't do the ifdef thing here. (Why it was present at all for
> linux-user is a mystery.)
>
Yea, the #ifdef dates from the earliest days of the safe syscall stuff. I
think it can be dropped,
though I'm unsure if the the whole thing should be dropped, or just the
ifdef.
> What do you have planned for bsd-user that would be more than
>
> > +#include "common-safe-syscall.S"
>
> this?
>
Yes. I had that in mind. I wasn't sure how to do this with meson directly,
or I'd have
compiled it out of common-user tree.
Warner
[-- Attachment #2: Type: text/html, Size: 4119 bytes --]
^ permalink raw reply [flat|nested] 16+ messages in thread