The icount option already implemented in QEMU allows the guest to run at a theoretical frequency of 1/(2^N) GHz (N is the icount parameter). The goal of this patch is to have a real guest frequency close to the one imposed by using the icount option.
The main idea behind the algorithm is that we compare the virtual monotonic clock and the host monotonic clock. For big icounts (on our test machine, an i5 CPU @ 3.10GHz, icounts starting at 6) the guest clock will be ahead of the host clock. In this case, we try to sleep QEMU for the difference between the 2 clocks. Therefore, the guest would have executed for a period almost equally to the one imposed by icount. We should point out that the algorithm works only for those icounts that allow the guest clock to be in front of the host clock. The first patch adds support for QemuOpts for the 'icount' parameter. It also adds a suboption called 'shift' that will hold the value for 'icount'. Therefore we now have -icount shift=N|auto or -icount N|auto. The second patch adds the 'align' suboption for icount. The third patch exports 'icount_time_shift' so that it can be used in places other than cpus.c; we need it in cpu-exec.c for calculating for how long we want QEMU to sleep. The forth patch implements the algorithm used for calculating the delay we want to sleep. It uses the number of instructions executed by the virtual cpu and also the icount_time_shift. The fifth patch prints to the console whenever the guest clock runs behind the host clock. The fastest printing speed is every 2 seconds, and we only print if the align option is enabled. We also have a limit to 100 printed messages. The sixth patch adds information about the difference between the host and guest clocks (taking into account the offset) in the 'info jit' command. We also print the maximum delay and advance of the guest clock compared to the host clock. v2 -> v3 * Split previous first patch into 2 patches. * Use error_abort to handle aborting on error (as suggested by Paolo Bonzini). * Change delay algorithm to use structures and function pointers in order to avoid !defined(CONFIG_USER_ONLY) (as suggested by Paolo Bonzini). * Limit the number of printed messages and add drift information in the 'info jit' command (as suggested by Paolo Bonzini). Sebastian Tanase (6): icount: Add QemuOpts for icount icount: Add align option to icount icount: Make icount_time_shift available everywhere cpu_exec: Add sleeping algorithm cpu_exec: Print to console if the guest is late monitor: Add drift info to 'info jit' cpu-exec.c | 221 ++++++++++++++++++++++++++++++++++++++++++++++++++ cpus.c | 48 ++++++++++- include/qemu-common.h | 10 ++- monitor.c | 1 + qemu-options.hx | 17 +++- qtest.c | 13 ++- vl.c | 39 +++++++-- 7 files changed, 333 insertions(+), 16 deletions(-) -- 2.0.0.rc2