Commit 3529b538ce91df31b7300ce2fbd838a2ca36e1fc
1 parent
1579a72e
Fix disabling of the Cause register for R2.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2612 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
11 additions
and
11 deletions
hw/mips_timer.c
| ... | ... | @@ -22,14 +22,11 @@ uint32_t cpu_mips_get_count (CPUState *env) |
| 22 | 22 | 100 * 1000 * 1000, ticks_per_sec); |
| 23 | 23 | } |
| 24 | 24 | |
| 25 | -static void cpu_mips_update_count (CPUState *env, uint32_t count, | |
| 26 | - uint32_t compare) | |
| 25 | +void cpu_mips_store_count (CPUState *env, uint32_t count) | |
| 27 | 26 | { |
| 28 | 27 | uint64_t now, next; |
| 29 | 28 | uint32_t tmp; |
| 30 | - | |
| 31 | - if (env->CP0_Cause & (1 << CP0Ca_DC)) | |
| 32 | - return; | |
| 29 | + uint32_t compare = env->CP0_Compare; | |
| 33 | 30 | |
| 34 | 31 | tmp = count; |
| 35 | 32 | if (count == compare) |
| ... | ... | @@ -52,14 +49,18 @@ static void cpu_mips_update_count (CPUState *env, uint32_t count, |
| 52 | 49 | qemu_mod_timer(env->timer, next); |
| 53 | 50 | } |
| 54 | 51 | |
| 55 | -void cpu_mips_store_count (CPUState *env, uint32_t value) | |
| 52 | +static void cpu_mips_update_count (CPUState *env, uint32_t count) | |
| 56 | 53 | { |
| 57 | - cpu_mips_update_count(env, value, env->CP0_Compare); | |
| 54 | + if (env->CP0_Cause & (1 << CP0Ca_DC)) | |
| 55 | + return; | |
| 56 | + | |
| 57 | + cpu_mips_store_count(env, count); | |
| 58 | 58 | } |
| 59 | 59 | |
| 60 | 60 | void cpu_mips_store_compare (CPUState *env, uint32_t value) |
| 61 | 61 | { |
| 62 | - cpu_mips_update_count(env, cpu_mips_get_count(env), value); | |
| 62 | + env->CP0_Compare = value; | |
| 63 | + cpu_mips_update_count(env, cpu_mips_get_count(env)); | |
| 63 | 64 | if ((env->CP0_Config0 & (0x7 << CP0C0_AR)) == (1 << CP0C0_AR)) |
| 64 | 65 | env->CP0_Cause &= ~(1 << CP0Ca_TI); |
| 65 | 66 | cpu_mips_irq_request(env, 7, 0); |
| ... | ... | @@ -75,7 +76,7 @@ static void mips_timer_cb (void *opaque) |
| 75 | 76 | fprintf(logfile, "%s\n", __func__); |
| 76 | 77 | } |
| 77 | 78 | #endif |
| 78 | - cpu_mips_update_count(env, cpu_mips_get_count(env), env->CP0_Compare); | |
| 79 | + cpu_mips_update_count(env, cpu_mips_get_count(env)); | |
| 79 | 80 | if ((env->CP0_Config0 & (0x7 << CP0C0_AR)) == (1 << CP0C0_AR)) |
| 80 | 81 | env->CP0_Cause |= 1 << CP0Ca_TI; |
| 81 | 82 | cpu_mips_irq_request(env, 7, 1); |
| ... | ... | @@ -85,6 +86,5 @@ void cpu_mips_clock_init (CPUState *env) |
| 85 | 86 | { |
| 86 | 87 | env->timer = qemu_new_timer(vm_clock, &mips_timer_cb, env); |
| 87 | 88 | env->CP0_Compare = 0; |
| 88 | - cpu_mips_update_count(env, 1, 0); | |
| 89 | + cpu_mips_update_count(env, 1); | |
| 89 | 90 | } |
| 90 | - | ... | ... |