On 16/05/16 19:09, Peter Maydell wrote: > Extracting the old signal mask from the usercontext pointer passed to > a signal handler is a pain because it is OS and CPU dependent. > Since we've already done it once and passed it to handle_cpu_signal(), > there's no need to do it again in cpu_exit_tb_from_sighandler(). > This then means we don't need to pass a usercontext pointer in to > handle_cpu_signal() at all. > > Signed-off-by: Peter Maydell <peter.mayd...@linaro.org>
Reviewed-by: Sergey Fedorov <sergey.fedo...@linaro.org> > --- > user-exec.c | 48 ++++++++++++++++-------------------------------- > 1 file changed, 16 insertions(+), 32 deletions(-) > > diff --git a/user-exec.c b/user-exec.c > index 40b5e7c..ad669f4 100644 > --- a/user-exec.c > +++ b/user-exec.c > @@ -54,25 +54,10 @@ static void exception_action(CPUState *cpu) > /* exit the current TB from a signal handler. The host registers are > restored in a state compatible with the CPU emulator > */ > -static void cpu_exit_tb_from_sighandler(CPUState *cpu, void *puc) > +static void cpu_exit_tb_from_sighandler(CPUState *cpu, sigset_t *old_set) > { > -#ifdef __linux__ > - struct ucontext *uc = puc; > -#elif defined(__OpenBSD__) > - struct sigcontext *uc = puc; > -#endif > - > /* XXX: use siglongjmp ? */ > -#ifdef __linux__ > -#ifdef __ia64 > - sigprocmask(SIG_SETMASK, (sigset_t *)&uc->uc_sigmask, NULL); > -#else > - sigprocmask(SIG_SETMASK, &uc->uc_sigmask, NULL); > -#endif > -#elif defined(__OpenBSD__) > - sigprocmask(SIG_SETMASK, &uc->sc_mask, NULL); > -#endif > - > + sigprocmask(SIG_SETMASK, old_set, NULL); > cpu_loop_exit_noexc(cpu); > } > > @@ -81,8 +66,7 @@ static void cpu_exit_tb_from_sighandler(CPUState *cpu, void > *puc) > write caused the exception and otherwise 0'. 'old_set' is the > signal set which should be restored */ > static inline int handle_cpu_signal(uintptr_t pc, unsigned long address, > - int is_write, sigset_t *old_set, > - void *puc) > + int is_write, sigset_t *old_set) > { > CPUState *cpu; > CPUClass *cc; > @@ -110,7 +94,7 @@ static inline int handle_cpu_signal(uintptr_t pc, unsigned > long address, > * currently executing TB was modified and must be exited > * immediately. > */ > - cpu_exit_tb_from_sighandler(current_cpu, puc); > + cpu_exit_tb_from_sighandler(current_cpu, old_set); > g_assert_not_reached(); > default: > g_assert_not_reached(); > @@ -204,7 +188,7 @@ int cpu_signal_handler(int host_signum, void *pinfo, > return handle_cpu_signal(pc, (unsigned long)info->si_addr, > trapno == 0xe ? > (ERROR_sig(uc) >> 1) & 1 : 0, > - &MASK_sig(uc), puc); > + &MASK_sig(uc)); > } > > #elif defined(__x86_64__) > @@ -250,7 +234,7 @@ int cpu_signal_handler(int host_signum, void *pinfo, > return handle_cpu_signal(pc, (unsigned long)info->si_addr, > TRAP_sig(uc) == 0xe ? > (ERROR_sig(uc) >> 1) & 1 : 0, > - &MASK_sig(uc), puc); > + &MASK_sig(uc)); > } > > #elif defined(_ARCH_PPC) > @@ -366,7 +350,7 @@ int cpu_signal_handler(int host_signum, void *pinfo, > } > #endif > return handle_cpu_signal(pc, (unsigned long)info->si_addr, > - is_write, &uc->uc_sigmask, puc); > + is_write, &uc->uc_sigmask); > } > > #elif defined(__alpha__) > @@ -397,7 +381,7 @@ int cpu_signal_handler(int host_signum, void *pinfo, > } > > return handle_cpu_signal(pc, (unsigned long)info->si_addr, > - is_write, &uc->uc_sigmask, puc); > + is_write, &uc->uc_sigmask); > } > #elif defined(__sparc__) > > @@ -457,7 +441,7 @@ int cpu_signal_handler(int host_signum, void *pinfo, > } > } > return handle_cpu_signal(pc, (unsigned long)info->si_addr, > - is_write, sigmask, NULL); > + is_write, sigmask); > } > > #elif defined(__arm__) > @@ -492,7 +476,7 @@ int cpu_signal_handler(int host_signum, void *pinfo, > is_write = extract32(uc->uc_mcontext.error_code, 11, 1); > return handle_cpu_signal(pc, (unsigned long)info->si_addr, > is_write, > - &uc->uc_sigmask, puc); > + &uc->uc_sigmask); > } > > #elif defined(__aarch64__) > @@ -520,7 +504,7 @@ int cpu_signal_handler(int host_signum, void *pinfo, void > *puc) > || (insn & 0x3a400000) == 0x28000000); /* C3.3.7,14-16 */ > > return handle_cpu_signal(pc, (uintptr_t)info->si_addr, > - is_write, &uc->uc_sigmask, puc); > + is_write, &uc->uc_sigmask); > } > > #elif defined(__mc68000) > @@ -538,7 +522,7 @@ int cpu_signal_handler(int host_signum, void *pinfo, > is_write = 0; > return handle_cpu_signal(pc, (unsigned long)info->si_addr, > is_write, > - &uc->uc_sigmask, puc); > + &uc->uc_sigmask); > } > > #elif defined(__ia64) > @@ -573,7 +557,7 @@ int cpu_signal_handler(int host_signum, void *pinfo, void > *puc) > } > return handle_cpu_signal(ip, (unsigned long)info->si_addr, > is_write, > - (sigset_t *)&uc->uc_sigmask, puc); > + (sigset_t *)&uc->uc_sigmask); > } > > #elif defined(__s390__) > @@ -626,7 +610,7 @@ int cpu_signal_handler(int host_signum, void *pinfo, > break; > } > return handle_cpu_signal(pc, (unsigned long)info->si_addr, > - is_write, &uc->uc_sigmask, puc); > + is_write, &uc->uc_sigmask); > } > > #elif defined(__mips__) > @@ -642,7 +626,7 @@ int cpu_signal_handler(int host_signum, void *pinfo, > /* XXX: compute is_write */ > is_write = 0; > return handle_cpu_signal(pc, (unsigned long)info->si_addr, > - is_write, &uc->uc_sigmask, puc); > + is_write, &uc->uc_sigmask); > } > > #elif defined(__hppa__) > @@ -684,7 +668,7 @@ int cpu_signal_handler(int host_signum, void *pinfo, > } > > return handle_cpu_signal(pc, (unsigned long)info->si_addr, > - is_write, &uc->uc_sigmask, puc); > + is_write, &uc->uc_sigmask); > } > > #else