mirror of https://github.com/xemu-project/xemu.git
i386/xen: Ignore VCPU_SSHOTTMR_future flag in set_singleshot_timer()
Upstream Xen now ignores this flag¹, since the only guest kernel ever to use it was buggy. ¹ https://xenbits.xen.org/gitweb/?p=xen.git;a=commitdiff;h=19c6cbd909 Signed-off-by: David Woodhouse <dwmw@amazon.co.uk> Reviewed-by: Paul Durrant <paul@xen.org>
This commit is contained in:
parent
8aba939e77
commit
547c9757dd
|
@ -1077,17 +1077,13 @@ static int vcpuop_stop_periodic_timer(CPUState *target)
|
|||
* Must always be called with xen_timers_lock held.
|
||||
*/
|
||||
static int do_set_singleshot_timer(CPUState *cs, uint64_t timeout_abs,
|
||||
bool future, bool linux_wa)
|
||||
bool linux_wa)
|
||||
{
|
||||
CPUX86State *env = &X86_CPU(cs)->env;
|
||||
int64_t now = kvm_get_current_ns();
|
||||
int64_t qemu_now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
|
||||
int64_t delta = timeout_abs - now;
|
||||
|
||||
if (future && timeout_abs < now) {
|
||||
return -ETIME;
|
||||
}
|
||||
|
||||
if (linux_wa && unlikely((int64_t)timeout_abs < 0 ||
|
||||
(delta > 0 && (uint32_t)(delta >> 50) != 0))) {
|
||||
/*
|
||||
|
@ -1129,9 +1125,13 @@ static int vcpuop_set_singleshot_timer(CPUState *cs, uint64_t arg)
|
|||
}
|
||||
|
||||
QEMU_LOCK_GUARD(&X86_CPU(cs)->env.xen_timers_lock);
|
||||
return do_set_singleshot_timer(cs, sst.timeout_abs_ns,
|
||||
!!(sst.flags & VCPU_SSHOTTMR_future),
|
||||
false);
|
||||
|
||||
/*
|
||||
* We ignore the VCPU_SSHOTTMR_future flag, just as Xen now does.
|
||||
* The only guest that ever used it, got it wrong.
|
||||
* https://xenbits.xen.org/gitweb/?p=xen.git;a=commitdiff;h=19c6cbd909
|
||||
*/
|
||||
return do_set_singleshot_timer(cs, sst.timeout_abs_ns, false);
|
||||
}
|
||||
|
||||
static int vcpuop_stop_singleshot_timer(CPUState *cs)
|
||||
|
@ -1156,7 +1156,7 @@ static bool kvm_xen_hcall_set_timer_op(struct kvm_xen_exit *exit, X86CPU *cpu,
|
|||
err = vcpuop_stop_singleshot_timer(CPU(cpu));
|
||||
} else {
|
||||
QEMU_LOCK_GUARD(&X86_CPU(cpu)->env.xen_timers_lock);
|
||||
err = do_set_singleshot_timer(CPU(cpu), timeout, false, true);
|
||||
err = do_set_singleshot_timer(CPU(cpu), timeout, true);
|
||||
}
|
||||
exit->u.hcall.result = err;
|
||||
return true;
|
||||
|
@ -1844,7 +1844,7 @@ int kvm_put_xen_state(CPUState *cs)
|
|||
QEMU_LOCK_GUARD(&env->xen_timers_lock);
|
||||
if (env->xen_singleshot_timer_ns) {
|
||||
ret = do_set_singleshot_timer(cs, env->xen_singleshot_timer_ns,
|
||||
false, false);
|
||||
false);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue