linux-user: Use target_restore_altstack in all sigreturn
Note that target_restore_altstack uses the host memory pointer that we have already verified, so TARGET_EFAULT is not a possible return value. Note that using -EFAULT was a bug. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20210426025334.1168495-3-richard.henderson@linaro.org> Signed-off-by: Laurent Vivier <laurent@vivier.eu>
This commit is contained in:
parent
92bad94836
commit
56384cf3ad
@ -561,11 +561,7 @@ long do_rt_sigreturn(CPUARMState *env)
|
||||
goto badframe;
|
||||
}
|
||||
|
||||
if (do_sigaltstack(frame_addr +
|
||||
offsetof(struct target_rt_sigframe, uc.tuc_stack),
|
||||
0, get_sp_from_cpustate(env)) == -EFAULT) {
|
||||
goto badframe;
|
||||
}
|
||||
target_restore_altstack(&frame->uc.tuc_stack, get_sp_from_cpustate(env));
|
||||
|
||||
unlock_user_struct(frame, frame_addr, 0);
|
||||
return -TARGET_QEMU_ESIGRETURN;
|
||||
|
@ -257,11 +257,7 @@ long do_rt_sigreturn(CPUAlphaState *env)
|
||||
set_sigmask(&set);
|
||||
|
||||
restore_sigcontext(env, &frame->uc.tuc_mcontext);
|
||||
if (do_sigaltstack(frame_addr + offsetof(struct target_rt_sigframe,
|
||||
uc.tuc_stack),
|
||||
0, env->ir[IR_SP]) == -EFAULT) {
|
||||
goto badframe;
|
||||
}
|
||||
target_restore_altstack(&frame->uc.tuc_stack, env->ir[IR_SP]);
|
||||
|
||||
unlock_user_struct(frame, frame_addr, 0);
|
||||
return -TARGET_QEMU_ESIGRETURN;
|
||||
|
@ -685,11 +685,7 @@ static int do_sigframe_return_v2(CPUARMState *env,
|
||||
}
|
||||
}
|
||||
|
||||
if (do_sigaltstack(context_addr
|
||||
+ offsetof(struct target_ucontext_v2, tuc_stack),
|
||||
0, get_sp_from_cpustate(env)) == -EFAULT) {
|
||||
return 1;
|
||||
}
|
||||
target_restore_altstack(&uc->tuc_stack, get_sp_from_cpustate(env));
|
||||
|
||||
#if 0
|
||||
/* Send SIGTRAP if we're single-stepping */
|
||||
@ -773,8 +769,7 @@ static long do_rt_sigreturn_v1(CPUARMState *env)
|
||||
goto badframe;
|
||||
}
|
||||
|
||||
if (do_sigaltstack(frame_addr + offsetof(struct rt_sigframe_v1, uc.tuc_stack), 0, get_sp_from_cpustate(env)) == -EFAULT)
|
||||
goto badframe;
|
||||
target_restore_altstack(&frame->uc.tuc_stack, get_sp_from_cpustate(env));
|
||||
|
||||
#if 0
|
||||
/* Send SIGTRAP if we're single-stepping */
|
||||
|
@ -260,11 +260,7 @@ long do_rt_sigreturn(CPUHexagonState *env)
|
||||
}
|
||||
|
||||
restore_ucontext(env, &frame->uc);
|
||||
|
||||
if (do_sigaltstack(frame_addr + offsetof(struct target_rt_sigframe,
|
||||
uc.uc_stack), 0, get_sp_from_cpustate(env)) == -EFAULT) {
|
||||
goto badframe;
|
||||
}
|
||||
target_restore_altstack(&frame->uc.uc_stack, get_sp_from_cpustate(env));
|
||||
|
||||
unlock_user_struct(frame, frame_addr, 0);
|
||||
return -TARGET_QEMU_ESIGRETURN;
|
||||
|
@ -187,13 +187,7 @@ long do_rt_sigreturn(CPUArchState *env)
|
||||
set_sigmask(&set);
|
||||
|
||||
restore_sigcontext(env, &frame->uc.tuc_mcontext);
|
||||
unlock_user_struct(frame, frame_addr, 0);
|
||||
|
||||
if (do_sigaltstack(frame_addr + offsetof(struct target_rt_sigframe,
|
||||
uc.tuc_stack),
|
||||
0, env->gr[30]) == -EFAULT) {
|
||||
goto badframe;
|
||||
}
|
||||
target_restore_altstack(&frame->uc.tuc_stack, env->gr[30]);
|
||||
|
||||
unlock_user_struct(frame, frame_addr, 0);
|
||||
return -TARGET_QEMU_ESIGRETURN;
|
||||
|
@ -581,10 +581,7 @@ long do_rt_sigreturn(CPUX86State *env)
|
||||
goto badframe;
|
||||
}
|
||||
|
||||
if (do_sigaltstack(frame_addr + offsetof(struct rt_sigframe, uc.tuc_stack), 0,
|
||||
get_sp_from_cpustate(env)) == -EFAULT) {
|
||||
goto badframe;
|
||||
}
|
||||
target_restore_altstack(&frame->uc.tuc_stack, get_sp_from_cpustate(env));
|
||||
|
||||
unlock_user_struct(frame, frame_addr, 0);
|
||||
return -TARGET_QEMU_ESIGRETURN;
|
||||
|
@ -400,10 +400,7 @@ long do_rt_sigreturn(CPUM68KState *env)
|
||||
if (target_rt_restore_ucontext(env, &frame->uc))
|
||||
goto badframe;
|
||||
|
||||
if (do_sigaltstack(frame_addr +
|
||||
offsetof(struct target_rt_sigframe, uc.tuc_stack),
|
||||
0, get_sp_from_cpustate(env)) == -EFAULT)
|
||||
goto badframe;
|
||||
target_restore_altstack(&frame->uc.tuc_stack, get_sp_from_cpustate(env));
|
||||
|
||||
unlock_user_struct(frame, frame_addr, 0);
|
||||
return -TARGET_QEMU_ESIGRETURN;
|
||||
|
@ -209,11 +209,7 @@ long do_rt_sigreturn(CPUMBState *env)
|
||||
|
||||
restore_sigcontext(&frame->uc.tuc_mcontext, env);
|
||||
|
||||
if (do_sigaltstack(frame_addr +
|
||||
offsetof(struct target_rt_sigframe, uc.tuc_stack),
|
||||
0, get_sp_from_cpustate(env)) == -EFAULT) {
|
||||
goto badframe;
|
||||
}
|
||||
target_restore_altstack(&frame->uc.tuc_stack, get_sp_from_cpustate(env));
|
||||
|
||||
unlock_user_struct(frame, frame_addr, 0);
|
||||
return -TARGET_QEMU_ESIGRETURN;
|
||||
|
@ -368,11 +368,7 @@ long do_rt_sigreturn(CPUMIPSState *env)
|
||||
set_sigmask(&blocked);
|
||||
|
||||
restore_sigcontext(env, &frame->rs_uc.tuc_mcontext);
|
||||
|
||||
if (do_sigaltstack(frame_addr +
|
||||
offsetof(struct target_rt_sigframe, rs_uc.tuc_stack),
|
||||
0, get_sp_from_cpustate(env)) == -EFAULT)
|
||||
goto badframe;
|
||||
target_restore_altstack(&frame->rs_uc.tuc_stack, get_sp_from_cpustate(env));
|
||||
|
||||
env->active_tc.PC = env->CP0_EPC;
|
||||
mips_set_hflags_isa_mode_from_pc(env);
|
||||
|
@ -82,9 +82,7 @@ static int rt_restore_ucontext(CPUNios2State *env, struct target_ucontext *uc,
|
||||
int *pr2)
|
||||
{
|
||||
int temp;
|
||||
abi_ulong off, frame_addr = env->regs[R_SP];
|
||||
unsigned long *gregs = uc->tuc_mcontext.gregs;
|
||||
int err;
|
||||
|
||||
/* Always make any pending restarted system calls return -EINTR */
|
||||
/* current->restart_block.fn = do_no_restart_syscall; */
|
||||
@ -130,11 +128,7 @@ static int rt_restore_ucontext(CPUNios2State *env, struct target_ucontext *uc,
|
||||
__get_user(env->regs[R_RA], &gregs[23]);
|
||||
__get_user(env->regs[R_SP], &gregs[28]);
|
||||
|
||||
off = offsetof(struct target_rt_sigframe, uc.tuc_stack);
|
||||
err = do_sigaltstack(frame_addr + off, 0, get_sp_from_cpustate(env));
|
||||
if (err == -EFAULT) {
|
||||
return 1;
|
||||
}
|
||||
target_restore_altstack(&uc->tuc_stack, get_sp_from_cpustate(env));
|
||||
|
||||
*pr2 = env->regs[2];
|
||||
return 0;
|
||||
|
@ -158,10 +158,7 @@ long do_rt_sigreturn(CPUOpenRISCState *env)
|
||||
set_sigmask(&set);
|
||||
|
||||
restore_sigcontext(env, &frame->uc.tuc_mcontext);
|
||||
if (do_sigaltstack(frame_addr + offsetof(target_rt_sigframe, uc.tuc_stack),
|
||||
0, frame_addr) == -EFAULT) {
|
||||
goto badframe;
|
||||
}
|
||||
target_restore_altstack(&frame->uc.tuc_stack, frame_addr);
|
||||
|
||||
unlock_user_struct(frame, frame_addr, 0);
|
||||
return cpu_get_gpr(env, 11);
|
||||
|
@ -655,9 +655,7 @@ long do_rt_sigreturn(CPUPPCState *env)
|
||||
if (do_setcontext(&rt_sf->uc, env, 1))
|
||||
goto sigsegv;
|
||||
|
||||
do_sigaltstack(rt_sf_addr
|
||||
+ offsetof(struct target_rt_sigframe, uc.tuc_stack),
|
||||
0, env->gpr[1]);
|
||||
target_restore_altstack(&rt_sf->uc.tuc_stack, env->gpr[1]);
|
||||
|
||||
unlock_user_struct(rt_sf, rt_sf_addr, 1);
|
||||
return -TARGET_QEMU_ESIGRETURN;
|
||||
|
@ -192,11 +192,7 @@ long do_rt_sigreturn(CPURISCVState *env)
|
||||
}
|
||||
|
||||
restore_ucontext(env, &frame->uc);
|
||||
|
||||
if (do_sigaltstack(frame_addr + offsetof(struct target_rt_sigframe,
|
||||
uc.uc_stack), 0, get_sp_from_cpustate(env)) == -EFAULT) {
|
||||
goto badframe;
|
||||
}
|
||||
target_restore_altstack(&frame->uc.uc_stack, get_sp_from_cpustate(env));
|
||||
|
||||
unlock_user_struct(frame, frame_addr, 0);
|
||||
return -TARGET_QEMU_ESIGRETURN;
|
||||
|
@ -307,10 +307,8 @@ long do_rt_sigreturn(CPUS390XState *env)
|
||||
goto badframe;
|
||||
}
|
||||
|
||||
if (do_sigaltstack(frame_addr + offsetof(rt_sigframe, uc.tuc_stack), 0,
|
||||
get_sp_from_cpustate(env)) == -EFAULT) {
|
||||
goto badframe;
|
||||
}
|
||||
target_restore_altstack(&frame->uc.tuc_stack, get_sp_from_cpustate(env));
|
||||
|
||||
unlock_user_struct(frame, frame_addr, 0);
|
||||
return -TARGET_QEMU_ESIGRETURN;
|
||||
|
||||
|
@ -323,12 +323,7 @@ long do_rt_sigreturn(CPUSH4State *regs)
|
||||
set_sigmask(&blocked);
|
||||
|
||||
restore_sigcontext(regs, &frame->uc.tuc_mcontext);
|
||||
|
||||
if (do_sigaltstack(frame_addr +
|
||||
offsetof(struct target_rt_sigframe, uc.tuc_stack),
|
||||
0, get_sp_from_cpustate(regs)) == -EFAULT) {
|
||||
goto badframe;
|
||||
}
|
||||
target_restore_altstack(&frame->uc.tuc_stack, get_sp_from_cpustate(regs));
|
||||
|
||||
unlock_user_struct(frame, frame_addr, 0);
|
||||
return -TARGET_QEMU_ESIGRETURN;
|
||||
|
@ -253,12 +253,8 @@ long do_rt_sigreturn(CPUXtensaState *env)
|
||||
set_sigmask(&set);
|
||||
|
||||
restore_sigcontext(env, frame);
|
||||
target_restore_altstack(&frame->uc.tuc_stack, get_sp_from_cpustate(env));
|
||||
|
||||
if (do_sigaltstack(frame_addr +
|
||||
offsetof(struct target_rt_sigframe, uc.tuc_stack),
|
||||
0, get_sp_from_cpustate(env)) == -TARGET_EFAULT) {
|
||||
goto badframe;
|
||||
}
|
||||
unlock_user_struct(frame, frame_addr, 0);
|
||||
return -TARGET_QEMU_ESIGRETURN;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user