mirror of https://gitee.com/openkylin/qemu.git
linux-user/arm: Reset CPSR_E when entering a signal handler
This fixes signal handlers running with the wrong endianness if the interrupted code used SETEND to dynamically switch endianness. Signed-off-by: Amanieu d'Antras <amanieu@gmail.com> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Message-id: 20200511131117.2486486-1-amanieu@gmail.com Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
268b1b3dfb
commit
45e2813964
|
@ -244,6 +244,11 @@ setup_return(CPUARMState *env, struct target_sigaction *ka,
|
|||
} else {
|
||||
cpsr &= ~CPSR_T;
|
||||
}
|
||||
if (env->cp15.sctlr_el[1] & SCTLR_E0E) {
|
||||
cpsr |= CPSR_E;
|
||||
} else {
|
||||
cpsr &= ~CPSR_E;
|
||||
}
|
||||
|
||||
if (ka->sa_flags & TARGET_SA_RESTORER) {
|
||||
if (is_fdpic) {
|
||||
|
@ -287,7 +292,8 @@ setup_return(CPUARMState *env, struct target_sigaction *ka,
|
|||
env->regs[13] = frame_addr;
|
||||
env->regs[14] = retcode;
|
||||
env->regs[15] = handler & (thumb ? ~1 : ~3);
|
||||
cpsr_write(env, cpsr, CPSR_IT | CPSR_T, CPSRWriteByInstr);
|
||||
cpsr_write(env, cpsr, CPSR_IT | CPSR_T | CPSR_E, CPSRWriteByInstr);
|
||||
arm_rebuild_hflags(env);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue