* [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
* 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 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 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 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
* [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
* 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 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
* [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
* 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 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 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
* [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 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
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).