mirror of https://github.com/xemu-project/xemu.git
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:
parent
6886b98036
commit
a5852dc5de
48
user-exec.c
48
user-exec.c
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue