[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 4/5] user-exec: Don't reextract sigmask from use
From: |
Sergey Fedorov |
Subject: |
Re: [Qemu-devel] [PATCH 4/5] user-exec: Don't reextract sigmask from usercontext pointer |
Date: |
Mon, 16 May 2016 21:00:06 +0300 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.7.2 |
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 <address@hidden>
Reviewed-by: Sergey Fedorov <address@hidden>
> ---
> 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
[Qemu-devel] [PATCH 2/5] user-exec: Push resume-from-signal code out to handle_cpu_signal(), Peter Maydell, 2016/05/16