icount: add sleep parameter to the icount option to set icount_sleep mode

The 'sleep' parameter sets the icount_sleep mode, which is enabled by
default. To disable it, add the 'sleep=no' parameter (or 'nosleep') to the
qemu -icount option.

Signed-off-by: Victor CLEMENT <victor.clement@openwide.fr>
Message-Id: <1432912446-9811-3-git-send-email-victor.clement@openwide.fr>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Victor CLEMENT 2015-05-29 17:14:05 +02:00 committed by Paolo Bonzini
parent 5045e9d912
commit f1f4b57e88
3 changed files with 22 additions and 2 deletions

9
cpus.c
View File

@ -520,11 +520,18 @@ void configure_icount(QemuOpts *opts, Error **errp)
} }
return; return;
} }
icount_sleep = qemu_opt_get_bool(opts, "sleep", true);
if (icount_sleep) { if (icount_sleep) {
icount_warp_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL_RT, icount_warp_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL_RT,
icount_warp_rt, NULL); icount_warp_rt, NULL);
} }
icount_align_option = qemu_opt_get_bool(opts, "align", false); icount_align_option = qemu_opt_get_bool(opts, "align", false);
if (icount_align_option && !icount_sleep) {
error_setg(errp, "align=on and sleep=no are incompatible");
}
if (strcmp(option, "auto") != 0) { if (strcmp(option, "auto") != 0) {
errno = 0; errno = 0;
icount_time_shift = strtol(option, &rem_str, 0); icount_time_shift = strtol(option, &rem_str, 0);
@ -535,6 +542,8 @@ void configure_icount(QemuOpts *opts, Error **errp)
return; return;
} else if (icount_align_option) { } else if (icount_align_option) {
error_setg(errp, "shift=auto and align=on are incompatible"); error_setg(errp, "shift=auto and align=on are incompatible");
} else if (!icount_sleep) {
error_setg(errp, "shift=auto and sleep=no are incompatible");
} }
use_icount = 2; use_icount = 2;

View File

@ -3100,9 +3100,10 @@ re-inject them.
ETEXI ETEXI
DEF("icount", HAS_ARG, QEMU_OPTION_icount, \ DEF("icount", HAS_ARG, QEMU_OPTION_icount, \
"-icount [shift=N|auto][,align=on|off]\n" \ "-icount [shift=N|auto][,align=on|off][,sleep=no]\n" \
" enable virtual instruction counter with 2^N clock ticks per\n" \ " enable virtual instruction counter with 2^N clock ticks per\n" \
" instruction and enable aligning the host and virtual clocks\n", QEMU_ARCH_ALL) " instruction, enable aligning the host and virtual clocks\n" \
" or disable real time cpu sleeping\n", QEMU_ARCH_ALL)
STEXI STEXI
@item -icount [shift=@var{N}|auto] @item -icount [shift=@var{N}|auto]
@findex -icount @findex -icount
@ -3111,6 +3112,13 @@ instruction every 2^@var{N} ns of virtual time. If @code{auto} is specified
then the virtual cpu speed will be automatically adjusted to keep virtual then the virtual cpu speed will be automatically adjusted to keep virtual
time within a few seconds of real time. time within a few seconds of real time.
When the virtual cpu is sleeping, the virtual time will advance at default
speed unless @option{sleep=no} is specified.
With @option{sleep=no}, the virtual time will jump to the next timer deadline
instantly whenever the virtual cpu goes to sleep mode and will not advance
if no timer is enabled. This behavior give deterministic execution times from
the guest point of view.
Note that while this option can give deterministic behavior, it does not Note that while this option can give deterministic behavior, it does not
provide cycle accurate emulation. Modern CPUs contain superscalar out of provide cycle accurate emulation. Modern CPUs contain superscalar out of
order cores with complex cache hierarchies. The number of instructions order cores with complex cache hierarchies. The number of instructions

3
vl.c
View File

@ -468,6 +468,9 @@ static QemuOptsList qemu_icount_opts = {
}, { }, {
.name = "align", .name = "align",
.type = QEMU_OPT_BOOL, .type = QEMU_OPT_BOOL,
}, {
.name = "sleep",
.type = QEMU_OPT_BOOL,
}, },
{ /* end of list */ } { /* end of list */ }
}, },