qemu-devel
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]