提交 a8bfac37 编写于 作者: S Sebastian Tanase 提交者: Paolo Bonzini

icount: Add align option to icount

The align option is used for activating the align algorithm
in order to synchronise the host clock and the guest clock.
Signed-off-by: NSebastian Tanase <sebastian.tanase@openwide.fr>
Tested-by: NCamille Bégué <camille.begue@openwide.fr>
Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
上级 1ad9580b
...@@ -476,25 +476,30 @@ static const VMStateDescription vmstate_timers = { ...@@ -476,25 +476,30 @@ static const VMStateDescription vmstate_timers = {
void configure_icount(QemuOpts *opts, Error **errp) void configure_icount(QemuOpts *opts, Error **errp)
{ {
const char *option; const char *option;
char *rem_str = NULL;
seqlock_init(&timers_state.vm_clock_seqlock, NULL); seqlock_init(&timers_state.vm_clock_seqlock, NULL);
vmstate_register(NULL, 0, &vmstate_timers, &timers_state); vmstate_register(NULL, 0, &vmstate_timers, &timers_state);
option = qemu_opt_get(opts, "shift"); option = qemu_opt_get(opts, "shift");
if (!option) { if (!option) {
if (qemu_opt_get(opts, "align") != NULL) {
error_setg(errp, "Please specify shift option when using align");
}
return; return;
} }
/* When using -icount shift, the shift option will be icount_align_option = qemu_opt_get_bool(opts, "align", false);
misinterpreted as a boolean */
if (strcmp(option, "on") == 0 || strcmp(option, "off") == 0) {
error_setg(errp, "The shift option must be a number or auto");
}
icount_warp_timer = timer_new_ns(QEMU_CLOCK_REALTIME, icount_warp_timer = timer_new_ns(QEMU_CLOCK_REALTIME,
icount_warp_rt, NULL); icount_warp_rt, NULL);
if (strcmp(option, "auto") != 0) { if (strcmp(option, "auto") != 0) {
icount_time_shift = strtol(option, NULL, 0); errno = 0;
icount_time_shift = strtol(option, &rem_str, 0);
if (errno != 0 || *rem_str != '\0' || !strlen(option)) {
error_setg(errp, "icount: Invalid shift value");
}
use_icount = 1; use_icount = 1;
return; return;
} else if (icount_align_option) {
error_setg(errp, "shift=auto and align=on are incompatible");
} }
use_icount = 2; use_icount = 2;
......
...@@ -108,6 +108,7 @@ static inline char *realpath(const char *path, char *resolved_path) ...@@ -108,6 +108,7 @@ static inline char *realpath(const char *path, char *resolved_path)
/* icount */ /* icount */
void configure_icount(QemuOpts *opts, Error **errp); void configure_icount(QemuOpts *opts, Error **errp);
extern int use_icount; extern int use_icount;
extern int icount_align_option;
#include "qemu/osdep.h" #include "qemu/osdep.h"
#include "qemu/bswap.h" #include "qemu/bswap.h"
......
...@@ -3011,9 +3011,9 @@ re-inject them. ...@@ -3011,9 +3011,9 @@ re-inject them.
ETEXI ETEXI
DEF("icount", HAS_ARG, QEMU_OPTION_icount, \ DEF("icount", HAS_ARG, QEMU_OPTION_icount, \
"-icount [shift=N|auto]\n" \ "-icount [shift=N|auto][,align=on|off]\n" \
" enable virtual instruction counter with 2^N clock ticks per\n" \ " enable virtual instruction counter with 2^N clock ticks per\n" \
" instruction\n", QEMU_ARCH_ALL) " instruction and enable aligning the host and virtual clocks\n", QEMU_ARCH_ALL)
STEXI STEXI
@item -icount [shift=@var{N}|auto] @item -icount [shift=@var{N}|auto]
@findex -icount @findex -icount
...@@ -3026,6 +3026,17 @@ Note that while this option can give deterministic behavior, it does not ...@@ -3026,6 +3026,17 @@ 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
executed often has little or no correlation with actual performance. executed often has little or no correlation with actual performance.
@option{align=on} will activate the delay algorithm which will try to
to synchronise the host clock and the virtual clock. The goal is to
have a guest running at the real frequency imposed by the shift option.
Whenever the guest clock is behind the host clock and if
@option{align=on} is specified then we print a messsage to the user
to inform about the delay.
Currently this option does not work when @option{shift} is @code{auto}.
Note: The sync algorithm will work for those shift values for which
the guest clock runs ahead of the host clock. Typically this happens
when the shift value is high (how high depends on the host machine).
ETEXI ETEXI
DEF("watchdog", HAS_ARG, QEMU_OPTION_watchdog, \ DEF("watchdog", HAS_ARG, QEMU_OPTION_watchdog, \
......
...@@ -183,6 +183,7 @@ uint8_t *boot_splash_filedata; ...@@ -183,6 +183,7 @@ uint8_t *boot_splash_filedata;
size_t boot_splash_filedata_size; size_t boot_splash_filedata_size;
uint8_t qemu_extra_params_fw[2]; uint8_t qemu_extra_params_fw[2];
int icount_align_option;
typedef struct FWBootEntry FWBootEntry; typedef struct FWBootEntry FWBootEntry;
struct FWBootEntry { struct FWBootEntry {
...@@ -546,6 +547,9 @@ static QemuOptsList qemu_icount_opts = { ...@@ -546,6 +547,9 @@ static QemuOptsList qemu_icount_opts = {
{ {
.name = "shift", .name = "shift",
.type = QEMU_OPT_STRING, .type = QEMU_OPT_STRING,
}, {
.name = "align",
.type = QEMU_OPT_BOOL,
}, },
{ /* end of list */ } { /* end of list */ }
}, },
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册