From c774272366209da40cbd3be6138cf712abd9608d Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Tue, 2 Nov 2021 15:40:04 +0100 Subject: [PATCH] vbox5/6: set ia32_tsc_aux for rdtscp usage Fixes #4314 --- repos/ports/src/virtualbox5/spec/nova/vcpu.h | 10 ++++++++++ repos/ports/src/virtualbox5/vcpu.h | 9 +++++++++ repos/ports/src/virtualbox6/sup_vcpu.cc | 9 +++++++++ 3 files changed, 28 insertions(+) diff --git a/repos/ports/src/virtualbox5/spec/nova/vcpu.h b/repos/ports/src/virtualbox5/spec/nova/vcpu.h index fe5d724057..56db01b0cb 100644 --- a/repos/ports/src/virtualbox5/spec/nova/vcpu.h +++ b/repos/ports/src/virtualbox5/spec/nova/vcpu.h @@ -421,6 +421,11 @@ class Vcpu_handler : public Vmm::Vcpu_dispatcher, { PCPUMCTX pCtx = CPUMQueryGuestCtxPtr(pVCpu); + ::uint64_t tsc_aux = 0; + auto const rc_tsc = CPUMQueryGuestMsr(pVCpu, MSR_K8_TSC_AUX, + &tsc_aux); + Assert(rc_tsc == VINF_SUCCESS); + /* avoid utcb corruption by requesting tpr state early */ bool interrupt_pending = false; uint8_t tpr = 0; @@ -430,6 +435,11 @@ class Vcpu_handler : public Vmm::Vcpu_dispatcher, /* don't call function hereafter which may corrupt the utcb ! */ using namespace Nova; + if (rc_tsc == VINF_SUCCESS) { + utcb->mtd |= Mtd::TSC_AUX; + utcb->tsc_aux = tsc_aux; + } + utcb->mtd |= Mtd::EIP; utcb->ip = pCtx->rip; diff --git a/repos/ports/src/virtualbox5/vcpu.h b/repos/ports/src/virtualbox5/vcpu.h index d488e78d42..7032a742ce 100644 --- a/repos/ports/src/virtualbox5/vcpu.h +++ b/repos/ports/src/virtualbox5/vcpu.h @@ -368,6 +368,15 @@ class Vcpu_handler : public Genode::List::Element _state->tpr_threshold.charge(tpr_priority); } + { + ::uint64_t tsc_aux = 0; + auto const rcStrict = CPUMQueryGuestMsr(pVCpu, MSR_K8_TSC_AUX, + &tsc_aux); + Assert(rcStrict == VINF_SUCCESS); + if (rcStrict == VINF_SUCCESS) + _state->tsc_aux.charge(tsc_aux); + } + return true; } diff --git a/repos/ports/src/virtualbox6/sup_vcpu.cc b/repos/ports/src/virtualbox6/sup_vcpu.cc index 88a16253af..5de97fee36 100644 --- a/repos/ports/src/virtualbox6/sup_vcpu.cc +++ b/repos/ports/src/virtualbox6/sup_vcpu.cc @@ -261,6 +261,15 @@ template void Sup::Vcpu_impl::_transfer_state_to_vcpu(CPUM ::memcpy(fpu._buffer, ctx.pXStateR3, sizeof(fpu)); }); + { + ::uint64_t tsc_aux = 0; + auto const rcStrict = CPUMQueryGuestMsr(&_vmcpu, MSR_K8_TSC_AUX, + &tsc_aux); + Assert(rcStrict == VINF_SUCCESS); + if (rcStrict == VINF_SUCCESS) + state.tsc_aux.charge(tsc_aux); + } + /* do SVM/VMX-specific transfers */ VIRT::transfer_state_to_vcpu(state, ctx); }