On Thu, Jan 12, 2017 at 3:28 AM, Pavel Dovgalyuk <dovga...@ispras.ru> wrote: >> 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.
I've added raising EXCP_YIELD in the next TB: http://lists.nongnu.org/archive/html/qemu-devel/2017-01/msg02811.html With that icount timers work perfectly for me. -- Thanks. -- Max