> From: Max Filippov [mailto:jcmvb...@gmail.com] > On Tue, Jan 10, 2017 at 12:31 AM, Pavel Dovgalyuk <dovga...@ispras.ru> wrote: > >> From: Max Filippov [mailto:jcmvb...@gmail.com] > > > >> I'm trying to reimplement xtensa CCOUNT (cycle counter) and > >> CCOMPARE (CCOUNT-based timer interrupts) using QEMU > >> timers. That is CCOUNT value is derived from the > >> QEMU_CLOCK_VIRTUAL clock and CCOMPARE interrupts are > >> generated from the QEMU_CLOCK_VIRTUAL timer callbacks. > >> The code is here: > >> https://github.com/OSLL/qemu-xtensa/commits/xtensa-ccount > >> > >> I've got the following issues doing that: > >> > >> - I thought that could be improved in -icount mode, so I tried that. > >> It is better with -icount, but it's still not 100% accurate. That is > >> I was able to observe guest reading QEMU clock value that is > >> past QEMU timer deadline before that timer callback was > >> invoked. > > > > icount is meant to be 100% accurate. > > tcg_get_icount_limit function calculates the deadline before the soonest > > virtual timer and executes number of instructions that will fit this > > timeout. > > Ok, looks like what happens in my case is that instruction that > sets CCOMPARE and thus changes remaining icount does not > cause exit from the cpu_exec. So merely ending TB on > QEMU_CLOCK_VIRTUAL timer update is not enough, I need to > throw an exception of some kind? Or does the timer code need > to take care of that?
Yes, it seems that you should end the block with an exception, to allow icount loop recalculate the timeouts. Pavel Dovgalyuk