Message ID | 20210918184527.408540-10-richard.henderson@linaro.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | linux-user: Streamline handling of SIGSEGV | expand |
On 9/18/21 20:44, Richard Henderson wrote: > Split host_signal_pc and host_signal_write out of user-exec.c. > > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- > linux-user/host/alpha/host-signal.h | 41 +++++++++++++++++++++++++++++ > accel/tcg/user-exec.c | 31 +--------------------- > 2 files changed, 42 insertions(+), 30 deletions(-) > create mode 100644 linux-user/host/alpha/host-signal.h Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
On 9/19/21 11:03 AM, Philippe Mathieu-Daudé wrote: > On 9/18/21 20:44, Richard Henderson wrote: >> Split host_signal_pc and host_signal_write out of user-exec.c. >> >> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> >> --- >> linux-user/host/alpha/host-signal.h | 41 +++++++++++++++++++++++++++++ >> accel/tcg/user-exec.c | 31 +--------------------- >> 2 files changed, 42 insertions(+), 30 deletions(-) >> create mode 100644 linux-user/host/alpha/host-signal.h > > Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> > Amusingly, this is one bit that we might want to simply drop. The remaining required entries in linux-user/host/arch/ are missing, so one can't actually build with alpha host at the moment. Similarly, linux-user/host/ia64/ is also unusable, because we would have hit the #error in accel/tcg/user-exec.c, missing the host signal handling. r~
On 9/19/21 20:07, Richard Henderson wrote: > On 9/19/21 11:03 AM, Philippe Mathieu-Daudé wrote: >> On 9/18/21 20:44, Richard Henderson wrote: >>> Split host_signal_pc and host_signal_write out of user-exec.c. >>> >>> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> >>> --- >>> linux-user/host/alpha/host-signal.h | 41 +++++++++++++++++++++++++++++ >>> accel/tcg/user-exec.c | 31 +--------------------- >>> 2 files changed, 42 insertions(+), 30 deletions(-) >>> create mode 100644 linux-user/host/alpha/host-signal.h >> >> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> >> > > Amusingly, this is one bit that we might want to simply drop. The > remaining required entries in linux-user/host/arch/ are missing, so one > can't actually build with alpha host at the moment. > > Similarly, linux-user/host/ia64/ is also unusable, because we would have > hit the #error in accel/tcg/user-exec.c, missing the host signal handling. Understandable. Since part of the work is done, I'd rather keep the patches in this series and drop them after in another series (easier to revert for someone interested in fixing these targets).
On 9/18/21 20:44, Richard Henderson wrote: > Split host_signal_pc and host_signal_write out of user-exec.c. > > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- > linux-user/host/alpha/host-signal.h | 41 +++++++++++++++++++++++++++++ > accel/tcg/user-exec.c | 31 +--------------------- > 2 files changed, 42 insertions(+), 30 deletions(-) > create mode 100644 linux-user/host/alpha/host-signal.h > +#ifndef ALPHA_HOST_SIGNAL_H > +#define ALPHA_HOST_SIGNAL_H > + > +static inline uintptr_t host_signal_pc(ucontext_t *uc) > +{ > + return uc->uc_mcontext.sc_pc; > +} > + > +static inline bool host_signal_write(siginfo_t *info, ucontext_t *uc) > +{ > + uint32_t *pc = uc->uc_mcontext.sc_pc; BTW I'd use host_signal_pc() here for consistency with other targets. > + uint32_t insn = *pc; > + > + /* XXX: need kernel patch to get write flag faster */ > + switch (insn >> 26) { > + case 0x0d: /* stw */ > + case 0x0e: /* stb */ > + case 0x0f: /* stq_u */ > + case 0x24: /* stf */ > + case 0x25: /* stg */ [...]
diff --git a/linux-user/host/alpha/host-signal.h b/linux-user/host/alpha/host-signal.h new file mode 100644 index 0000000000..b0b488e004 --- /dev/null +++ b/linux-user/host/alpha/host-signal.h @@ -0,0 +1,41 @@ +/* + * host-signal.h: signal info dependent on the host architecture + * + * Copyright (C) 2021 Linaro Limited + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + */ + +#ifndef ALPHA_HOST_SIGNAL_H +#define ALPHA_HOST_SIGNAL_H + +static inline uintptr_t host_signal_pc(ucontext_t *uc) +{ + return uc->uc_mcontext.sc_pc; +} + +static inline bool host_signal_write(siginfo_t *info, ucontext_t *uc) +{ + uint32_t *pc = uc->uc_mcontext.sc_pc; + uint32_t insn = *pc; + + /* XXX: need kernel patch to get write flag faster */ + switch (insn >> 26) { + case 0x0d: /* stw */ + case 0x0e: /* stb */ + case 0x0f: /* stq_u */ + case 0x24: /* stf */ + case 0x25: /* stg */ + case 0x26: /* sts */ + case 0x27: /* stt */ + case 0x2c: /* stl */ + case 0x2d: /* stq */ + case 0x2e: /* stl_c */ + case 0x2f: /* stq_c */ + return true; + } + return false; +} + +#endif diff --git a/accel/tcg/user-exec.c b/accel/tcg/user-exec.c index e9e530e2e1..b895b5c8bd 100644 --- a/accel/tcg/user-exec.c +++ b/accel/tcg/user-exec.c @@ -255,36 +255,7 @@ void *probe_access(CPUArchState *env, target_ulong addr, int size, return size ? g2h(env_cpu(env), addr) : NULL; } -#if defined(__alpha__) - -int cpu_signal_handler(int host_signum, void *pinfo, - void *puc) -{ - siginfo_t *info = pinfo; - ucontext_t *uc = puc; - uint32_t *pc = uc->uc_mcontext.sc_pc; - uint32_t insn = *pc; - int is_write = 0; - - /* XXX: need kernel patch to get write flag faster */ - switch (insn >> 26) { - case 0x0d: /* stw */ - case 0x0e: /* stb */ - case 0x0f: /* stq_u */ - case 0x24: /* stf */ - case 0x25: /* stg */ - case 0x26: /* sts */ - case 0x27: /* stt */ - case 0x2c: /* stl */ - case 0x2d: /* stq */ - case 0x2e: /* stl_c */ - case 0x2f: /* stq_c */ - is_write = 1; - } - - return handle_cpu_signal(pc, info, is_write, &uc->uc_sigmask); -} -#elif defined(__sparc__) +#if defined(__sparc__) int cpu_signal_handler(int host_signum, void *pinfo, void *puc)
Split host_signal_pc and host_signal_write out of user-exec.c. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- linux-user/host/alpha/host-signal.h | 41 +++++++++++++++++++++++++++++ accel/tcg/user-exec.c | 31 +--------------------- 2 files changed, 42 insertions(+), 30 deletions(-) create mode 100644 linux-user/host/alpha/host-signal.h