Commit ca7c2b1b9f984f622c7495004483016fee61e489
1 parent
7d600c80
Handle invalid accesses as SIGILL for mips/mipsel userland emulation.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2235 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
12 additions
and
0 deletions
linux-user/main.c
| @@ -1352,6 +1352,8 @@ void cpu_loop(CPUMIPSState *env) | @@ -1352,6 +1352,8 @@ void cpu_loop(CPUMIPSState *env) | ||
| 1352 | } | 1352 | } |
| 1353 | } | 1353 | } |
| 1354 | break; | 1354 | break; |
| 1355 | + case EXCP_TLBL: | ||
| 1356 | + case EXCP_TLBS: | ||
| 1355 | case EXCP_CpU: | 1357 | case EXCP_CpU: |
| 1356 | case EXCP_RI: | 1358 | case EXCP_RI: |
| 1357 | info.si_signo = TARGET_SIGILL; | 1359 | info.si_signo = TARGET_SIGILL; |
target-mips/helper.c
| @@ -243,6 +243,12 @@ int cpu_mips_handle_mmu_fault (CPUState *env, target_ulong address, int rw, | @@ -243,6 +243,12 @@ int cpu_mips_handle_mmu_fault (CPUState *env, target_ulong address, int rw, | ||
| 243 | return ret; | 243 | return ret; |
| 244 | } | 244 | } |
| 245 | 245 | ||
| 246 | +#if defined(CONFIG_USER_ONLY) | ||
| 247 | +void do_interrupt (CPUState *env) | ||
| 248 | +{ | ||
| 249 | + env->exception_index = EXCP_NONE; | ||
| 250 | +} | ||
| 251 | +#else | ||
| 246 | void do_interrupt (CPUState *env) | 252 | void do_interrupt (CPUState *env) |
| 247 | { | 253 | { |
| 248 | target_ulong offset; | 254 | target_ulong offset; |
| @@ -409,3 +415,4 @@ void do_interrupt (CPUState *env) | @@ -409,3 +415,4 @@ void do_interrupt (CPUState *env) | ||
| 409 | } | 415 | } |
| 410 | env->exception_index = EXCP_NONE; | 416 | env->exception_index = EXCP_NONE; |
| 411 | } | 417 | } |
| 418 | +#endif /* !defined(CONFIG_USER_ONLY) */ |
target-mips/translate.c
| @@ -4072,6 +4072,7 @@ void cpu_reset (CPUMIPSState *env) | @@ -4072,6 +4072,7 @@ void cpu_reset (CPUMIPSState *env) | ||
| 4072 | tlb_flush(env, 1); | 4072 | tlb_flush(env, 1); |
| 4073 | 4073 | ||
| 4074 | /* Minimal init */ | 4074 | /* Minimal init */ |
| 4075 | +#if !defined(CONFIG_USER_ONLY) | ||
| 4075 | if (env->hflags & MIPS_HFLAG_BMASK) { | 4076 | if (env->hflags & MIPS_HFLAG_BMASK) { |
| 4076 | /* If the exception was raised from a delay slot, | 4077 | /* If the exception was raised from a delay slot, |
| 4077 | * come back to the jump. */ | 4078 | * come back to the jump. */ |
| @@ -4098,9 +4099,11 @@ void cpu_reset (CPUMIPSState *env) | @@ -4098,9 +4099,11 @@ void cpu_reset (CPUMIPSState *env) | ||
| 4098 | /* Count register increments in debug mode, EJTAG version 1 */ | 4099 | /* Count register increments in debug mode, EJTAG version 1 */ |
| 4099 | env->CP0_Debug = (1 << CP0DB_CNT) | (0x1 << CP0DB_VER); | 4100 | env->CP0_Debug = (1 << CP0DB_CNT) | (0x1 << CP0DB_VER); |
| 4100 | env->CP0_PRid = MIPS_CPU; | 4101 | env->CP0_PRid = MIPS_CPU; |
| 4102 | +#endif | ||
| 4101 | env->exception_index = EXCP_NONE; | 4103 | env->exception_index = EXCP_NONE; |
| 4102 | #if defined(CONFIG_USER_ONLY) | 4104 | #if defined(CONFIG_USER_ONLY) |
| 4103 | env->hflags |= MIPS_HFLAG_UM; | 4105 | env->hflags |= MIPS_HFLAG_UM; |
| 4106 | + env->user_mode_only = 1; | ||
| 4104 | #endif | 4107 | #endif |
| 4105 | #ifdef MIPS_USES_FPU | 4108 | #ifdef MIPS_USES_FPU |
| 4106 | env->fcr0 = MIPS_FCR0; | 4109 | env->fcr0 = MIPS_FCR0; |