提交 b1dfe643 编写于 作者: E Edgar E. Iglesias

mips: Break out cpu_mips_timer_expire

Reorganize for future patches, no functional change.
Acked-by: NAurelien Jarno <aurelien@aurel32.net>
Signed-off-by: NEdgar E. Iglesias <edgar.iglesias@gmail.com>
上级 4a6648f4
...@@ -42,16 +42,6 @@ uint32_t cpu_mips_get_random (CPUState *env) ...@@ -42,16 +42,6 @@ uint32_t cpu_mips_get_random (CPUState *env)
} }
/* MIPS R4K timer */ /* MIPS R4K timer */
uint32_t cpu_mips_get_count (CPUState *env)
{
if (env->CP0_Cause & (1 << CP0Ca_DC))
return env->CP0_Count;
else
return env->CP0_Count +
(uint32_t)muldiv64(qemu_get_clock(vm_clock),
TIMER_FREQ, get_ticks_per_sec());
}
static void cpu_mips_timer_update(CPUState *env) static void cpu_mips_timer_update(CPUState *env)
{ {
uint64_t now, next; uint64_t now, next;
...@@ -64,6 +54,27 @@ static void cpu_mips_timer_update(CPUState *env) ...@@ -64,6 +54,27 @@ static void cpu_mips_timer_update(CPUState *env)
qemu_mod_timer(env->timer, next); qemu_mod_timer(env->timer, next);
} }
/* Expire the timer. */
static void cpu_mips_timer_expire(CPUState *env)
{
cpu_mips_timer_update(env);
if (env->insn_flags & ISA_MIPS32R2) {
env->CP0_Cause |= 1 << CP0Ca_TI;
}
qemu_irq_raise(env->irq[(env->CP0_IntCtl >> CP0IntCtl_IPTI) & 0x7]);
}
uint32_t cpu_mips_get_count (CPUState *env)
{
if (env->CP0_Cause & (1 << CP0Ca_DC)) {
return env->CP0_Count;
} else {
return env->CP0_Count +
(uint32_t)muldiv64(qemu_get_clock(vm_clock),
TIMER_FREQ, get_ticks_per_sec());
}
}
void cpu_mips_store_count (CPUState *env, uint32_t count) void cpu_mips_store_count (CPUState *env, uint32_t count)
{ {
if (env->CP0_Cause & (1 << CP0Ca_DC)) if (env->CP0_Cause & (1 << CP0Ca_DC))
...@@ -116,11 +127,8 @@ static void mips_timer_cb (void *opaque) ...@@ -116,11 +127,8 @@ static void mips_timer_cb (void *opaque)
the comparator value. Offset the count by one to avoid immediately the comparator value. Offset the count by one to avoid immediately
retriggering the callback before any virtual time has passed. */ retriggering the callback before any virtual time has passed. */
env->CP0_Count++; env->CP0_Count++;
cpu_mips_timer_update(env); cpu_mips_timer_expire(env);
env->CP0_Count--; env->CP0_Count--;
if (env->insn_flags & ISA_MIPS32R2)
env->CP0_Cause |= 1 << CP0Ca_TI;
qemu_irq_raise(env->irq[(env->CP0_IntCtl >> CP0IntCtl_IPTI) & 0x7]);
} }
void cpu_mips_clock_init (CPUState *env) void cpu_mips_clock_init (CPUState *env)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册