hw/ppc: Always store the decrementer value
When writing a value to the decrementer that raises an exception, the irq is raised, but the value is not stored so the store doesn't appear to have changed the register when it is read again. Always store the write value to the register. Fixes:e81a982aa5
("PPC: Clean up DECR implementation") Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Signed-off-by: Cédric Le Goater <clg@kaod.org> (cherry picked from commitfebb71d543
) Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
This commit is contained in:
parent
97fec8f2c4
commit
1c2343cc61
20
hw/ppc/ppc.c
20
hw/ppc/ppc.c
@ -835,6 +835,16 @@ static void __cpu_ppc_store_decr(PowerPCCPU *cpu, uint64_t *nextp,
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Calculate the next decrementer event and set a timer.
|
||||
* decr_next is in timebase units to keep rounding simple. Note it is
|
||||
* not adjusted by tb_offset because if TB changes via tb_offset changing,
|
||||
* decrementer does not change, so not directly comparable with TB.
|
||||
*/
|
||||
now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
|
||||
next = ns_to_tb(tb_env->decr_freq, now) + value;
|
||||
*nextp = next; /* nextp is in timebase units */
|
||||
|
||||
/*
|
||||
* Going from 1 -> 0 or 0 -> -1 is the event to generate a DEC interrupt.
|
||||
*
|
||||
@ -856,16 +866,6 @@ static void __cpu_ppc_store_decr(PowerPCCPU *cpu, uint64_t *nextp,
|
||||
(*lower_excp)(cpu);
|
||||
}
|
||||
|
||||
/*
|
||||
* Calculate the next decrementer event and set a timer.
|
||||
* decr_next is in timebase units to keep rounding simple. Note it is
|
||||
* not adjusted by tb_offset because if TB changes via tb_offset changing,
|
||||
* decrementer does not change, so not directly comparable with TB.
|
||||
*/
|
||||
now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
|
||||
next = ns_to_tb(tb_env->decr_freq, now) + value;
|
||||
*nextp = next;
|
||||
|
||||
/* Adjust timer */
|
||||
timer_mod(timer, tb_to_ns_round_up(tb_env->decr_freq, next));
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user