提交 bf43330a 编写于 作者: M Mark Cave-Ayland

sun4u: split NPT and INT_DIS accesses between timer and compare registers

Accesses to the timer register high bit should only set NPT, whilst accesses
to the timer compare register high bit should only set INT_DIS. This fixes
issues with the timer being unexpectedly disabled whilst trying to boot
FreeBSD SPARC64.
Signed-off-by: NMark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Reviewed-By: NArtyom Tarasenko <atar4qemu@gmail.com>
Signed-off-by: NMark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
上级 e913cac7
......@@ -500,17 +500,17 @@ static uint64_t timer_to_cpu_ticks(int64_t timer_ticks, uint32_t frequency)
void cpu_tick_set_count(CPUTimer *timer, uint64_t count)
{
uint64_t real_count = count & ~timer->disabled_mask;
uint64_t disabled_bit = count & timer->disabled_mask;
uint64_t real_count = count & ~timer->npt_mask;
uint64_t npt_bit = count & timer->npt_mask;
int64_t vm_clock_offset = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) -
cpu_to_timer_ticks(real_count, timer->frequency);
TIMER_DPRINTF("%s set_count count=0x%016lx (%s) p=%p\n",
TIMER_DPRINTF("%s set_count count=0x%016lx (npt %s) p=%p\n",
timer->name, real_count,
timer->disabled?"disabled":"enabled", timer);
timer->npt ? "disabled" : "enabled", timer);
timer->disabled = disabled_bit ? 1 : 0;
timer->npt = npt_bit ? 1 : 0;
timer->clock_offset = vm_clock_offset;
}
......@@ -520,12 +520,13 @@ uint64_t cpu_tick_get_count(CPUTimer *timer)
qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) - timer->clock_offset,
timer->frequency);
TIMER_DPRINTF("%s get_count count=0x%016lx (%s) p=%p\n",
TIMER_DPRINTF("%s get_count count=0x%016lx (npt %s) p=%p\n",
timer->name, real_count,
timer->disabled?"disabled":"enabled", timer);
timer->npt ? "disabled" : "enabled", timer);
if (timer->disabled)
real_count |= timer->disabled_mask;
if (timer->npt) {
real_count |= timer->npt_mask;
}
return real_count;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册