Commit 75b680e5234d7641105919a2a47079e9a0d5d800
1 parent
3b89f26c
Fix Thumb signal handlers.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4089 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
3 additions
and
28 deletions
linux-user/signal.c
... | ... | @@ -1129,33 +1129,7 @@ setup_return(CPUState *env, struct emulated_sigaction *ka, |
1129 | 1129 | { |
1130 | 1130 | abi_ulong handler = ka->sa._sa_handler; |
1131 | 1131 | abi_ulong retcode; |
1132 | - int thumb = 0; | |
1133 | -#if defined(TARGET_CONFIG_CPU_32) | |
1134 | -#if 0 | |
1135 | - abi_ulong cpsr = env->cpsr; | |
1136 | - | |
1137 | - /* | |
1138 | - * Maybe we need to deliver a 32-bit signal to a 26-bit task. | |
1139 | - */ | |
1140 | - if (ka->sa.sa_flags & SA_THIRTYTWO) | |
1141 | - cpsr = (cpsr & ~MODE_MASK) | USR_MODE; | |
1142 | - | |
1143 | -#ifdef CONFIG_ARM_THUMB | |
1144 | - if (elf_hwcap & HWCAP_THUMB) { | |
1145 | - /* | |
1146 | - * The LSB of the handler determines if we're going to | |
1147 | - * be using THUMB or ARM mode for this signal handler. | |
1148 | - */ | |
1149 | - thumb = handler & 1; | |
1150 | - | |
1151 | - if (thumb) | |
1152 | - cpsr |= T_BIT; | |
1153 | - else | |
1154 | - cpsr &= ~T_BIT; | |
1155 | - } | |
1156 | -#endif /* CONFIG_ARM_THUMB */ | |
1157 | -#endif /* 0 */ | |
1158 | -#endif /* TARGET_CONFIG_CPU_32 */ | |
1132 | + int thumb = handler & 1; | |
1159 | 1133 | |
1160 | 1134 | if (ka->sa.sa_flags & TARGET_SA_RESTORER) { |
1161 | 1135 | retcode = ka->sa.sa_restorer; |
... | ... | @@ -1178,6 +1152,7 @@ setup_return(CPUState *env, struct emulated_sigaction *ka, |
1178 | 1152 | env->regs[13] = frame_addr; |
1179 | 1153 | env->regs[14] = retcode; |
1180 | 1154 | env->regs[15] = handler & (thumb ? ~1 : ~3); |
1155 | + env->thumb = thumb; | |
1181 | 1156 | |
1182 | 1157 | #if 0 |
1183 | 1158 | #ifdef TARGET_CONFIG_CPU_32 |
... | ... | @@ -1295,7 +1270,7 @@ restore_sigcontext(CPUState *env, struct target_sigcontext *sc) |
1295 | 1270 | __get_user_error(env->regs[15], &sc->arm_pc, err); |
1296 | 1271 | #ifdef TARGET_CONFIG_CPU_32 |
1297 | 1272 | __get_user_error(cpsr, &sc->arm_cpsr, err); |
1298 | - cpsr_write(env, cpsr, 0xffffffff); | |
1273 | + cpsr_write(env, cpsr, CPSR_USER | CPSR_EXEC); | |
1299 | 1274 | #endif |
1300 | 1275 | |
1301 | 1276 | err |= !valid_user_regs(env); | ... | ... |