[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 25/40] bsd-user/signal.c: Implement rewind_if_in_safe_syscall
|
From: |
Warner Losh |
|
Subject: |
[PULL 25/40] bsd-user/signal.c: Implement rewind_if_in_safe_syscall |
|
Date: |
Mon, 31 Jan 2022 12:56:21 -0700 |
Signed-off-by: Kyle Evans <kevans@freebsd.org>
Signed-off-by: Warner Losh <imp@bsdimp.com>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
---
bsd-user/qemu.h | 2 ++
bsd-user/signal.c | 13 ++++++++++++-
2 files changed, 14 insertions(+), 1 deletion(-)
diff --git a/bsd-user/qemu.h b/bsd-user/qemu.h
index 49f01932a53..8ed1bfbca89 100644
--- a/bsd-user/qemu.h
+++ b/bsd-user/qemu.h
@@ -446,4 +446,6 @@ static inline void *lock_user_string(abi_ulong guest_addr)
#include <pthread.h>
+#include "user/safe-syscall.h"
+
#endif /* QEMU_H */
diff --git a/bsd-user/signal.c b/bsd-user/signal.c
index db8cf0a08f1..454aef2993e 100644
--- a/bsd-user/signal.c
+++ b/bsd-user/signal.c
@@ -48,6 +48,18 @@ int target_to_host_signal(int sig)
return sig;
}
+/* Adjust the signal context to rewind out of safe-syscall if we're in it */
+static inline void rewind_if_in_safe_syscall(void *puc)
+{
+ ucontext_t *uc = (ucontext_t *)puc;
+ uintptr_t pcreg = host_signal_pc(uc);
+
+ if (pcreg > (uintptr_t)safe_syscall_start
+ && pcreg < (uintptr_t)safe_syscall_end) {
+ host_signal_set_pc(uc, (uintptr_t)safe_syscall_start);
+ }
+}
+
static bool has_trapno(int tsig)
{
return tsig == TARGET_SIGILL ||
@@ -57,7 +69,6 @@ static bool has_trapno(int tsig)
tsig == TARGET_SIGTRAP;
}
-
/* Siginfo conversion. */
/*
--
2.33.1
- [PULL 28/40] bsd-user/signal.c: Implement dump_core_and_abort, (continued)
- [PULL 28/40] bsd-user/signal.c: Implement dump_core_and_abort, Warner Losh, 2022/01/31
- [PULL 34/40] bsd-user/signal.c: process_pending_signals, Warner Losh, 2022/01/31
- [PULL 16/40] bsd-user/signal.c: implement abstract target / host signal translation, Warner Losh, 2022/01/31
- [PULL 13/40] bsd-user/arm/target_arch_cpu.h: Correct code pointer, Warner Losh, 2022/01/31
- [PULL 32/40] bsd-user/signal.c: handle_pending_signal, Warner Losh, 2022/01/31
- [PULL 33/40] bsd-user/signal.c: tswap_siginfo, Warner Losh, 2022/01/31
- [PULL 08/40] bsd-user/signal.c: implement force_sig_fault, Warner Losh, 2022/01/31
- [PULL 40/40] bsd-user/freebsd/target_os_ucontext.h: Prefer env as arg name for CPUArchState args, Warner Losh, 2022/01/31
- [PULL 38/40] MAINTAINERS: Add tests/vm/*bsd to the list to get reviews on, Warner Losh, 2022/01/31
- [PULL 18/40] bsd-user/signal.c: Add si_type argument to queue_signal, Warner Losh, 2022/01/31
- [PULL 25/40] bsd-user/signal.c: Implement rewind_if_in_safe_syscall,
Warner Losh <=
- [PULL 03/40] bsd-user/arm/signal.c: Implement setup_sigframe_arch for arm, Warner Losh, 2022/01/31
- [PULL 22/40] bsd-user: Add host signals to the build, Warner Losh, 2022/01/31
- [PULL 24/40] bsd-user/signal.c: host_to_target_siginfo_noswap, Warner Losh, 2022/01/31
- [PULL 09/40] bsd-user/signal-common.h: Move signal functions prototypes to here, Warner Losh, 2022/01/31