bsd-user/signal.c: Implement rewind_if_in_safe_syscall

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>
master
Warner Losh 2022-01-08 17:55:56 -07:00
parent c34f2aaff6
commit aae57ac37a
2 changed files with 14 additions and 1 deletions

View File

@ -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 */

View File

@ -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. */
/*