device: 0.874 x86: 0.867 virtual: 0.783 performance: 0.770 ppc: 0.732 files: 0.709 boot: 0.705 risc-v: 0.701 kernel: 0.694 graphic: 0.682 socket: 0.672 register: 0.670 PID: 0.662 vnc: 0.624 network: 0.594 architecture: 0.574 hypervisor: 0.571 peripherals: 0.558 arm: 0.517 VMM: 0.476 semantic: 0.457 debug: 0.436 TCG: 0.434 KVM: 0.401 i386: 0.389 permissions: 0.352 mistranslation: 0.318 assembly: 0.212 user-level: 0.125 ptimer period sporadically too long Description of problem: A ptimer in a custom device with a frequency of 10kHz is sporadically called after more than 100,000ns in virtual time have elapsed. With a icount shift of 4 or 5 this happens almost everytime before the linux guest can even finish booting. With a shift of 0 this happens very rarely, but it does occur from time to time. Steps to reproduce: 1. setup a ptimer with a frequency of 10kHz and assert that the time passed between callbacks is exactly 100,000ns 2. run 3. wait for boom Additional information: ``` // Timer setup ptimer_transaction_begin(state->timer); ptimer_set_freq(state->timer, 10000); ptimer_run(state->timer, 0); ptimer_transaction_commit(state->timer); ``` ``` // timer callback int64_t now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); static int64_t last = 0; if (last > 0) { if (now - last != 100000) { fprintf(stderr, "error tick %ld after %ld is incorrect: %ld\n", now, last, now - last); assert(0); } } last = now; ``` ``` error tick 47867503135 after 47867400000 is incorrect: 103135 qemu-system-x86_64: ../...file.c:119: timer_callback: Assertion `0' failed. ```