linux-user/arm: Drop v1 signal frames
Version 2 signal frames are used from 2.6.12 and since cbc14e6f28
,
we have set UNAME_MINIMUM_RELEASE to 2.6.32.
Suggested-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Message-Id: <20210929130553.121567-4-richard.henderson@linaro.org>
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
This commit is contained in:
parent
c70887a382
commit
eef9790007
|
@ -46,14 +46,6 @@ struct target_sigcontext {
|
|||
abi_ulong fault_address;
|
||||
};
|
||||
|
||||
struct target_ucontext_v1 {
|
||||
abi_ulong tuc_flags;
|
||||
abi_ulong tuc_link;
|
||||
target_stack_t tuc_stack;
|
||||
struct target_sigcontext tuc_mcontext;
|
||||
target_sigset_t tuc_sigmask; /* mask last for extensibility */
|
||||
};
|
||||
|
||||
struct target_ucontext_v2 {
|
||||
abi_ulong tuc_flags;
|
||||
abi_ulong tuc_link;
|
||||
|
@ -98,28 +90,12 @@ struct target_iwmmxt_sigframe {
|
|||
#define TARGET_VFP_MAGIC 0x56465001
|
||||
#define TARGET_IWMMXT_MAGIC 0x12ef842a
|
||||
|
||||
struct sigframe_v1
|
||||
{
|
||||
struct target_sigcontext sc;
|
||||
abi_ulong extramask[TARGET_NSIG_WORDS-1];
|
||||
abi_ulong retcode[4];
|
||||
};
|
||||
|
||||
struct sigframe_v2
|
||||
{
|
||||
struct target_ucontext_v2 uc;
|
||||
abi_ulong retcode[4];
|
||||
};
|
||||
|
||||
struct rt_sigframe_v1
|
||||
{
|
||||
abi_ulong pinfo;
|
||||
abi_ulong puc;
|
||||
struct target_siginfo info;
|
||||
struct target_ucontext_v1 uc;
|
||||
abi_ulong retcode[4];
|
||||
};
|
||||
|
||||
struct rt_sigframe_v2
|
||||
{
|
||||
struct target_siginfo info;
|
||||
|
@ -363,37 +339,6 @@ static void setup_sigframe_v2(struct target_ucontext_v2 *uc,
|
|||
}
|
||||
}
|
||||
|
||||
/* compare linux/arch/arm/kernel/signal.c:setup_frame() */
|
||||
static void setup_frame_v1(int usig, struct target_sigaction *ka,
|
||||
target_sigset_t *set, CPUARMState *regs)
|
||||
{
|
||||
struct sigframe_v1 *frame;
|
||||
abi_ulong frame_addr = get_sigframe(ka, regs, sizeof(*frame));
|
||||
int i;
|
||||
|
||||
trace_user_setup_frame(regs, frame_addr);
|
||||
if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) {
|
||||
goto sigsegv;
|
||||
}
|
||||
|
||||
setup_sigcontext(&frame->sc, regs, set->sig[0]);
|
||||
|
||||
for(i = 1; i < TARGET_NSIG_WORDS; i++) {
|
||||
__put_user(set->sig[i], &frame->extramask[i - 1]);
|
||||
}
|
||||
|
||||
if (setup_return(regs, ka, frame->retcode, frame_addr, usig,
|
||||
frame_addr + offsetof(struct sigframe_v1, retcode))) {
|
||||
goto sigsegv;
|
||||
}
|
||||
|
||||
unlock_user_struct(frame, frame_addr, 1);
|
||||
return;
|
||||
sigsegv:
|
||||
unlock_user_struct(frame, frame_addr, 1);
|
||||
force_sigsegv(usig);
|
||||
}
|
||||
|
||||
static void setup_frame_v2(int usig, struct target_sigaction *ka,
|
||||
target_sigset_t *set, CPUARMState *regs)
|
||||
{
|
||||
|
@ -422,60 +367,7 @@ sigsegv:
|
|||
void setup_frame(int usig, struct target_sigaction *ka,
|
||||
target_sigset_t *set, CPUARMState *regs)
|
||||
{
|
||||
if (get_osversion() >= 0x020612) {
|
||||
setup_frame_v2(usig, ka, set, regs);
|
||||
} else {
|
||||
setup_frame_v1(usig, ka, set, regs);
|
||||
}
|
||||
}
|
||||
|
||||
/* compare linux/arch/arm/kernel/signal.c:setup_rt_frame() */
|
||||
static void setup_rt_frame_v1(int usig, struct target_sigaction *ka,
|
||||
target_siginfo_t *info,
|
||||
target_sigset_t *set, CPUARMState *env)
|
||||
{
|
||||
struct rt_sigframe_v1 *frame;
|
||||
abi_ulong frame_addr = get_sigframe(ka, env, sizeof(*frame));
|
||||
struct target_sigaltstack stack;
|
||||
int i;
|
||||
abi_ulong info_addr, uc_addr;
|
||||
|
||||
trace_user_setup_rt_frame(env, frame_addr);
|
||||
if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) {
|
||||
goto sigsegv;
|
||||
}
|
||||
|
||||
info_addr = frame_addr + offsetof(struct rt_sigframe_v1, info);
|
||||
__put_user(info_addr, &frame->pinfo);
|
||||
uc_addr = frame_addr + offsetof(struct rt_sigframe_v1, uc);
|
||||
__put_user(uc_addr, &frame->puc);
|
||||
tswap_siginfo(&frame->info, info);
|
||||
|
||||
/* Clear all the bits of the ucontext we don't use. */
|
||||
memset(&frame->uc, 0, offsetof(struct target_ucontext_v1, tuc_mcontext));
|
||||
|
||||
memset(&stack, 0, sizeof(stack));
|
||||
target_save_altstack(&stack, env);
|
||||
memcpy(&frame->uc.tuc_stack, &stack, sizeof(stack));
|
||||
|
||||
setup_sigcontext(&frame->uc.tuc_mcontext, env, set->sig[0]);
|
||||
for(i = 0; i < TARGET_NSIG_WORDS; i++) {
|
||||
__put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]);
|
||||
}
|
||||
|
||||
if (setup_return(env, ka, frame->retcode, frame_addr, usig,
|
||||
frame_addr + offsetof(struct rt_sigframe_v1, retcode))) {
|
||||
goto sigsegv;
|
||||
}
|
||||
|
||||
env->regs[1] = info_addr;
|
||||
env->regs[2] = uc_addr;
|
||||
|
||||
unlock_user_struct(frame, frame_addr, 1);
|
||||
return;
|
||||
sigsegv:
|
||||
unlock_user_struct(frame, frame_addr, 1);
|
||||
force_sigsegv(usig);
|
||||
setup_frame_v2(usig, ka, set, regs);
|
||||
}
|
||||
|
||||
static void setup_rt_frame_v2(int usig, struct target_sigaction *ka,
|
||||
|
@ -516,11 +408,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) {
|
||||
setup_rt_frame_v2(usig, ka, info, set, env);
|
||||
} else {
|
||||
setup_rt_frame_v1(usig, ka, info, set, env);
|
||||
}
|
||||
setup_rt_frame_v2(usig, ka, info, set, env);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -553,54 +441,6 @@ restore_sigcontext(CPUARMState *env, struct target_sigcontext *sc)
|
|||
return err;
|
||||
}
|
||||
|
||||
static long do_sigreturn_v1(CPUARMState *env)
|
||||
{
|
||||
abi_ulong frame_addr;
|
||||
struct sigframe_v1 *frame = NULL;
|
||||
target_sigset_t set;
|
||||
sigset_t host_set;
|
||||
int i;
|
||||
|
||||
/*
|
||||
* Since we stacked the signal on a 64-bit boundary,
|
||||
* then 'sp' should be word aligned here. If it's
|
||||
* not, then the user is trying to mess with us.
|
||||
*/
|
||||
frame_addr = env->regs[13];
|
||||
trace_user_do_sigreturn(env, frame_addr);
|
||||
if (frame_addr & 7) {
|
||||
goto badframe;
|
||||
}
|
||||
|
||||
if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1)) {
|
||||
goto badframe;
|
||||
}
|
||||
|
||||
__get_user(set.sig[0], &frame->sc.oldmask);
|
||||
for(i = 1; i < TARGET_NSIG_WORDS; i++) {
|
||||
__get_user(set.sig[i], &frame->extramask[i - 1]);
|
||||
}
|
||||
|
||||
target_to_host_sigset_internal(&host_set, &set);
|
||||
set_sigmask(&host_set);
|
||||
|
||||
if (restore_sigcontext(env, &frame->sc)) {
|
||||
goto badframe;
|
||||
}
|
||||
|
||||
#if 0
|
||||
/* Send SIGTRAP if we're single-stepping */
|
||||
if (ptrace_cancel_bpt(current))
|
||||
send_sig(SIGTRAP, current, 1);
|
||||
#endif
|
||||
unlock_user_struct(frame, frame_addr, 0);
|
||||
return -TARGET_QEMU_ESIGRETURN;
|
||||
|
||||
badframe:
|
||||
force_sig(TARGET_SIGSEGV);
|
||||
return -TARGET_QEMU_ESIGRETURN;
|
||||
}
|
||||
|
||||
static abi_ulong *restore_sigframe_v2_vfp(CPUARMState *env, abi_ulong *regspace)
|
||||
{
|
||||
int i;
|
||||
|
@ -733,55 +573,7 @@ badframe:
|
|||
|
||||
long do_sigreturn(CPUARMState *env)
|
||||
{
|
||||
if (get_osversion() >= 0x020612) {
|
||||
return do_sigreturn_v2(env);
|
||||
} else {
|
||||
return do_sigreturn_v1(env);
|
||||
}
|
||||
}
|
||||
|
||||
static long do_rt_sigreturn_v1(CPUARMState *env)
|
||||
{
|
||||
abi_ulong frame_addr;
|
||||
struct rt_sigframe_v1 *frame = NULL;
|
||||
sigset_t host_set;
|
||||
|
||||
/*
|
||||
* Since we stacked the signal on a 64-bit boundary,
|
||||
* then 'sp' should be word aligned here. If it's
|
||||
* not, then the user is trying to mess with us.
|
||||
*/
|
||||
frame_addr = env->regs[13];
|
||||
trace_user_do_rt_sigreturn(env, frame_addr);
|
||||
if (frame_addr & 7) {
|
||||
goto badframe;
|
||||
}
|
||||
|
||||
if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1)) {
|
||||
goto badframe;
|
||||
}
|
||||
|
||||
target_to_host_sigset(&host_set, &frame->uc.tuc_sigmask);
|
||||
set_sigmask(&host_set);
|
||||
|
||||
if (restore_sigcontext(env, &frame->uc.tuc_mcontext)) {
|
||||
goto badframe;
|
||||
}
|
||||
|
||||
target_restore_altstack(&frame->uc.tuc_stack, env);
|
||||
|
||||
#if 0
|
||||
/* Send SIGTRAP if we're single-stepping */
|
||||
if (ptrace_cancel_bpt(current))
|
||||
send_sig(SIGTRAP, current, 1);
|
||||
#endif
|
||||
unlock_user_struct(frame, frame_addr, 0);
|
||||
return -TARGET_QEMU_ESIGRETURN;
|
||||
|
||||
badframe:
|
||||
unlock_user_struct(frame, frame_addr, 0);
|
||||
force_sig(TARGET_SIGSEGV);
|
||||
return -TARGET_QEMU_ESIGRETURN;
|
||||
return do_sigreturn_v2(env);
|
||||
}
|
||||
|
||||
static long do_rt_sigreturn_v2(CPUARMState *env)
|
||||
|
@ -822,9 +614,5 @@ badframe:
|
|||
|
||||
long do_rt_sigreturn(CPUARMState *env)
|
||||
{
|
||||
if (get_osversion() >= 0x020612) {
|
||||
return do_rt_sigreturn_v2(env);
|
||||
} else {
|
||||
return do_rt_sigreturn_v1(env);
|
||||
}
|
||||
return do_rt_sigreturn_v2(env);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue