Message ID | 20210616011209.1446045-4-richard.henderson@linaro.org |
---|---|
State | New |
Headers | show |
Series | linux-user: Move signal trampolines to new page | expand |
Hi Richard, On 6/16/21 3:11 AM, Richard Henderson wrote: > The value of get_os_release may be controlled by a command > line option. Since fdpic was added in v4.14, and v2 frame > were added in v2.6.12, this makes no change under normal conditions. > > Split out a helper function to perform the test. > > Cc: qemu-arm@nongnu.org > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- > linux-user/arm/signal.c | 20 ++++++++++++++++---- > 1 file changed, 16 insertions(+), 4 deletions(-) > > diff --git a/linux-user/arm/signal.c b/linux-user/arm/signal.c > index 32b68ee302..2d30345fc2 100644 > --- a/linux-user/arm/signal.c > +++ b/linux-user/arm/signal.c > @@ -165,6 +165,18 @@ static inline int valid_user_regs(CPUARMState *regs) > return 1; > } > > +static bool v2_frame(void) > +{ > + /* > + * We do not create fdpic trampolines for v1 frames. > + * Thus we force v2 frames, regardless of what uname says. > + * Support for fdpic dates from Linux 4.14, so this is not > + * really a behaviour change. > + */ > + int is_fdpic = info_is_fdpic(((TaskState *)thread_cpu->opaque)->info); > + return is_fdpic || get_osversion() >= 0x020612; > +} Could you refactor v2_frame() in a previous patch and add the is_fdpic check in another one please?
diff --git a/linux-user/arm/signal.c b/linux-user/arm/signal.c index 32b68ee302..2d30345fc2 100644 --- a/linux-user/arm/signal.c +++ b/linux-user/arm/signal.c @@ -165,6 +165,18 @@ static inline int valid_user_regs(CPUARMState *regs) return 1; } +static bool v2_frame(void) +{ + /* + * We do not create fdpic trampolines for v1 frames. + * Thus we force v2 frames, regardless of what uname says. + * Support for fdpic dates from Linux 4.14, so this is not + * really a behaviour change. + */ + int is_fdpic = info_is_fdpic(((TaskState *)thread_cpu->opaque)->info); + return is_fdpic || get_osversion() >= 0x020612; +} + static void setup_sigcontext(struct target_sigcontext *sc, /*struct _fpstate *fpstate,*/ CPUARMState *env, abi_ulong mask) @@ -422,7 +434,7 @@ sigsegv: void setup_frame(int usig, struct target_sigaction *ka, target_sigset_t *set, CPUARMState *regs) { - if (get_osversion() >= 0x020612) { + if (v2_frame()) { setup_frame_v2(usig, ka, set, regs); } else { setup_frame_v1(usig, ka, set, regs); @@ -516,7 +528,7 @@ void setup_rt_frame(int usig, struct target_sigaction *ka, target_siginfo_t *info, target_sigset_t *set, CPUARMState *env) { - if (get_osversion() >= 0x020612) { + if (v2_frame()) { setup_rt_frame_v2(usig, ka, info, set, env); } else { setup_rt_frame_v1(usig, ka, info, set, env); @@ -734,7 +746,7 @@ badframe: long do_sigreturn(CPUARMState *env) { - if (get_osversion() >= 0x020612) { + if (v2_frame()) { return do_sigreturn_v2(env); } else { return do_sigreturn_v1(env); @@ -823,7 +835,7 @@ badframe: long do_rt_sigreturn(CPUARMState *env) { - if (get_osversion() >= 0x020612) { + if (v2_frame()) { return do_rt_sigreturn_v2(env); } else { return do_rt_sigreturn_v1(env);
The value of get_os_release may be controlled by a command line option. Since fdpic was added in v4.14, and v2 frame were added in v2.6.12, this makes no change under normal conditions. Split out a helper function to perform the test. Cc: qemu-arm@nongnu.org Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- linux-user/arm/signal.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) -- 2.25.1