3 void cpu_mips_irqctrl_init (void)
7 /* XXX: do not use a global */
8 uint32_t cpu_mips_get_random (CPUState
*env
)
10 static uint32_t seed
= 0;
12 seed
= seed
* 314159 + 1;
13 idx
= (seed
>> 16) % (MIPS_TLB_NB
- env
->CP0_Wired
) + env
->CP0_Wired
;
18 uint32_t cpu_mips_get_count (CPUState
*env
)
20 return env
->CP0_Count
+
21 (uint32_t)muldiv64(qemu_get_clock(vm_clock
),
22 100 * 1000 * 1000, ticks_per_sec
);
25 static void cpu_mips_update_count (CPUState
*env
, uint32_t count
,
34 now
= qemu_get_clock(vm_clock
);
35 next
= now
+ muldiv64(compare
- tmp
, ticks_per_sec
, 100 * 1000 * 1000);
40 fprintf(logfile
, "%s: 0x%08" PRIx64
" %08x %08x => 0x%08" PRIx64
"\n",
41 __func__
, now
, count
, compare
, next
- now
);
44 /* Store new count and compare registers */
45 env
->CP0_Compare
= compare
;
47 count
- (uint32_t)muldiv64(now
, 100 * 1000 * 1000, ticks_per_sec
);
49 qemu_mod_timer(env
->timer
, next
);
52 void cpu_mips_store_count (CPUState
*env
, uint32_t value
)
54 cpu_mips_update_count(env
, value
, env
->CP0_Compare
);
57 void cpu_mips_store_compare (CPUState
*env
, uint32_t value
)
59 cpu_mips_update_count(env
, cpu_mips_get_count(env
), value
);
60 cpu_mips_irq_request(env
, 7, 0);
63 static void mips_timer_cb (void *opaque
)
70 fprintf(logfile
, "%s\n", __func__
);
73 cpu_mips_update_count(env
, cpu_mips_get_count(env
), env
->CP0_Compare
);
74 cpu_mips_irq_request(env
, 7, 1);
77 void cpu_mips_clock_init (CPUState
*env
)
79 env
->timer
= qemu_new_timer(vm_clock
, &mips_timer_cb
, env
);
81 cpu_mips_update_count(env
, 1, 0);
86 void cpu_mips_irqctrl_init (void)
90 /* XXX: do not use a global */
91 uint32_t cpu_mips_get_random (CPUState
*env
)
93 static uint32_t seed
= 0;
95 seed
= seed
* 314159 + 1;
96 idx
= (seed
>> 16) % (MIPS_TLB_NB
- env
->CP0_Wired
) + env
->CP0_Wired
;
101 uint32_t cpu_mips_get_count (CPUState
*env
)
103 return env
->CP0_Count
+
104 (uint32_t)muldiv64(qemu_get_clock(vm_clock
),
105 100 * 1000 * 1000, ticks_per_sec
);
108 static void cpu_mips_update_count (CPUState
*env
, uint32_t count
,
115 if (count
== compare
)
117 now
= qemu_get_clock(vm_clock
);
118 next
= now
+ muldiv64(compare
- tmp
, ticks_per_sec
, 100 * 1000 * 1000);
123 fprintf(logfile
, "%s: 0x%08" PRIx64
" %08x %08x => 0x%08" PRIx64
"\n",
124 __func__
, now
, count
, compare
, next
- now
);
127 /* Store new count and compare registers */
128 env
->CP0_Compare
= compare
;
130 count
- (uint32_t)muldiv64(now
, 100 * 1000 * 1000, ticks_per_sec
);
132 qemu_mod_timer(env
->timer
, next
);
135 void cpu_mips_store_count (CPUState
*env
, uint32_t value
)
137 cpu_mips_update_count(env
, value
, env
->CP0_Compare
);
140 void cpu_mips_store_compare (CPUState
*env
, uint32_t value
)
142 cpu_mips_update_count(env
, cpu_mips_get_count(env
), value
);
143 cpu_mips_irq_request(env
, 7, 0);
146 static void mips_timer_cb (void *opaque
)
153 fprintf(logfile
, "%s\n", __func__
);
156 cpu_mips_update_count(env
, cpu_mips_get_count(env
), env
->CP0_Compare
);
157 cpu_mips_irq_request(env
, 7, 1);
160 void cpu_mips_clock_init (CPUState
*env
)
162 env
->timer
= qemu_new_timer(vm_clock
, &mips_timer_cb
, env
);
163 env
->CP0_Compare
= 0;
164 cpu_mips_update_count(env
, 1, 0);