user-exec: Don't reextract sigmask from usercontext pointer

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.maydell@linaro.org>
Reviewed-by: Sergey Fedorov <sergey.fedorov@linaro.org>
Acked-by: Eduardo Habkost <ehabkost@redhat.com>
Acked-by: Riku Voipio <riku.voipio@linaro.org>
Message-id: 1463494687-25947-5-git-send-email-peter.maydell@linaro.org
This commit is contained in:
Peter Maydell 2016-05-17 15:18:05 +01:00
parent 6886b98036
commit a5852dc5de
1 changed files with 16 additions and 32 deletions

View File

@ -55,25 +55,10 @@ static void exception_action(CPUState *cpu)
/* exit the current TB from a signal handler. The host registers are /* exit the current TB from a signal handler. The host registers are
restored in a state compatible with the CPU emulator 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 ? */ /* XXX: use siglongjmp ? */
#ifdef __linux__ sigprocmask(SIG_SETMASK, old_set, NULL);
#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
cpu_loop_exit_noexc(cpu); cpu_loop_exit_noexc(cpu);
} }
@ -82,8 +67,7 @@ static void cpu_exit_tb_from_sighandler(CPUState *cpu, void *puc)
write caused the exception and otherwise 0'. 'old_set' is the write caused the exception and otherwise 0'. 'old_set' is the
signal set which should be restored */ signal set which should be restored */
static inline int handle_cpu_signal(uintptr_t pc, unsigned long address, static inline int handle_cpu_signal(uintptr_t pc, unsigned long address,
int is_write, sigset_t *old_set, int is_write, sigset_t *old_set)
void *puc)
{ {
CPUState *cpu; CPUState *cpu;
CPUClass *cc; CPUClass *cc;
@ -111,7 +95,7 @@ static inline int handle_cpu_signal(uintptr_t pc, unsigned long address,
* currently executing TB was modified and must be exited * currently executing TB was modified and must be exited
* immediately. * immediately.
*/ */
cpu_exit_tb_from_sighandler(current_cpu, puc); cpu_exit_tb_from_sighandler(current_cpu, old_set);
g_assert_not_reached(); g_assert_not_reached();
default: default:
g_assert_not_reached(); g_assert_not_reached();
@ -205,7 +189,7 @@ int cpu_signal_handler(int host_signum, void *pinfo,
return handle_cpu_signal(pc, (unsigned long)info->si_addr, return handle_cpu_signal(pc, (unsigned long)info->si_addr,
trapno == 0xe ? trapno == 0xe ?
(ERROR_sig(uc) >> 1) & 1 : 0, (ERROR_sig(uc) >> 1) & 1 : 0,
&MASK_sig(uc), puc); &MASK_sig(uc));
} }
#elif defined(__x86_64__) #elif defined(__x86_64__)
@ -251,7 +235,7 @@ int cpu_signal_handler(int host_signum, void *pinfo,
return handle_cpu_signal(pc, (unsigned long)info->si_addr, return handle_cpu_signal(pc, (unsigned long)info->si_addr,
TRAP_sig(uc) == 0xe ? TRAP_sig(uc) == 0xe ?
(ERROR_sig(uc) >> 1) & 1 : 0, (ERROR_sig(uc) >> 1) & 1 : 0,
&MASK_sig(uc), puc); &MASK_sig(uc));
} }
#elif defined(_ARCH_PPC) #elif defined(_ARCH_PPC)
@ -367,7 +351,7 @@ int cpu_signal_handler(int host_signum, void *pinfo,
} }
#endif #endif
return handle_cpu_signal(pc, (unsigned long)info->si_addr, return handle_cpu_signal(pc, (unsigned long)info->si_addr,
is_write, &uc->uc_sigmask, puc); is_write, &uc->uc_sigmask);
} }
#elif defined(__alpha__) #elif defined(__alpha__)
@ -398,7 +382,7 @@ int cpu_signal_handler(int host_signum, void *pinfo,
} }
return handle_cpu_signal(pc, (unsigned long)info->si_addr, return handle_cpu_signal(pc, (unsigned long)info->si_addr,
is_write, &uc->uc_sigmask, puc); is_write, &uc->uc_sigmask);
} }
#elif defined(__sparc__) #elif defined(__sparc__)
@ -458,7 +442,7 @@ int cpu_signal_handler(int host_signum, void *pinfo,
} }
} }
return handle_cpu_signal(pc, (unsigned long)info->si_addr, return handle_cpu_signal(pc, (unsigned long)info->si_addr,
is_write, sigmask, NULL); is_write, sigmask);
} }
#elif defined(__arm__) #elif defined(__arm__)
@ -493,7 +477,7 @@ int cpu_signal_handler(int host_signum, void *pinfo,
is_write = extract32(uc->uc_mcontext.error_code, 11, 1); is_write = extract32(uc->uc_mcontext.error_code, 11, 1);
return handle_cpu_signal(pc, (unsigned long)info->si_addr, return handle_cpu_signal(pc, (unsigned long)info->si_addr,
is_write, is_write,
&uc->uc_sigmask, puc); &uc->uc_sigmask);
} }
#elif defined(__aarch64__) #elif defined(__aarch64__)
@ -521,7 +505,7 @@ int cpu_signal_handler(int host_signum, void *pinfo, void *puc)
|| (insn & 0x3a400000) == 0x28000000); /* C3.3.7,14-16 */ || (insn & 0x3a400000) == 0x28000000); /* C3.3.7,14-16 */
return handle_cpu_signal(pc, (uintptr_t)info->si_addr, return handle_cpu_signal(pc, (uintptr_t)info->si_addr,
is_write, &uc->uc_sigmask, puc); is_write, &uc->uc_sigmask);
} }
#elif defined(__mc68000) #elif defined(__mc68000)
@ -539,7 +523,7 @@ int cpu_signal_handler(int host_signum, void *pinfo,
is_write = 0; is_write = 0;
return handle_cpu_signal(pc, (unsigned long)info->si_addr, return handle_cpu_signal(pc, (unsigned long)info->si_addr,
is_write, is_write,
&uc->uc_sigmask, puc); &uc->uc_sigmask);
} }
#elif defined(__ia64) #elif defined(__ia64)
@ -574,7 +558,7 @@ int cpu_signal_handler(int host_signum, void *pinfo, void *puc)
} }
return handle_cpu_signal(ip, (unsigned long)info->si_addr, return handle_cpu_signal(ip, (unsigned long)info->si_addr,
is_write, is_write,
(sigset_t *)&uc->uc_sigmask, puc); (sigset_t *)&uc->uc_sigmask);
} }
#elif defined(__s390__) #elif defined(__s390__)
@ -627,7 +611,7 @@ int cpu_signal_handler(int host_signum, void *pinfo,
break; break;
} }
return handle_cpu_signal(pc, (unsigned long)info->si_addr, return handle_cpu_signal(pc, (unsigned long)info->si_addr,
is_write, &uc->uc_sigmask, puc); is_write, &uc->uc_sigmask);
} }
#elif defined(__mips__) #elif defined(__mips__)
@ -643,7 +627,7 @@ int cpu_signal_handler(int host_signum, void *pinfo,
/* XXX: compute is_write */ /* XXX: compute is_write */
is_write = 0; is_write = 0;
return handle_cpu_signal(pc, (unsigned long)info->si_addr, return handle_cpu_signal(pc, (unsigned long)info->si_addr,
is_write, &uc->uc_sigmask, puc); is_write, &uc->uc_sigmask);
} }
#elif defined(__hppa__) #elif defined(__hppa__)
@ -685,7 +669,7 @@ int cpu_signal_handler(int host_signum, void *pinfo,
} }
return handle_cpu_signal(pc, (unsigned long)info->si_addr, return handle_cpu_signal(pc, (unsigned long)info->si_addr,
is_write, &uc->uc_sigmask, puc); is_write, &uc->uc_sigmask);
} }
#else #else