lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Tue, 11 Jun 2019 15:34:08 +0800 From: Wanpeng Li <kernellwp@...il.com> To: linux-kernel@...r.kernel.org, kvm@...r.kernel.org Cc: Paolo Bonzini <pbonzini@...hat.com>, Radim Krčmář <rkrcmar@...hat.com> Subject: [PATCH v2 2/5] KVM: X86: Introduce residency msrs read/write operations From: Wanpeng Li <wanpengli@...cent.com> Both live migration and vCPU migrates between pCPUs possibly to set the MSRs in the host to change the delta between the host and guest values. This patch introduces msrs read/write operations in the host. Cc: Paolo Bonzini <pbonzini@...hat.com> Cc: Radim Krčmář <rkrcmar@...hat.com> Signed-off-by: Wanpeng Li <wanpengli@...cent.com> --- arch/x86/kvm/x86.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index cc97aae..841a794 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -1331,6 +1331,51 @@ void kvm_enable_efer_bits(u64 mask) } EXPORT_SYMBOL_GPL(kvm_enable_efer_bits); +u64 kvm_residency_read_host(struct kvm_vcpu *vcpu, + struct kvm_residency_msr *msr) +{ + u64 host_value; + rdmsrl_safe(msr->index, &host_value); + return kvm_scale_tsc(vcpu, host_value); +} + +struct kvm_residency_msr *find_residency_msr_index(struct kvm_vcpu *vcpu, + u32 msr_index) +{ + int i; + struct kvm_residency_msr *msr; + + for (i = 0; i < NR_CORE_RESIDENCY_MSRS; i++) + if (vcpu->arch.core_cstate_msrs[i].index == msr_index) { + msr = &vcpu->arch.core_cstate_msrs[i]; + return msr; + } + + return NULL; +} + +u64 kvm_residency_read(struct kvm_vcpu *vcpu, u32 msr_index) +{ + struct kvm_residency_msr *msr = find_residency_msr_index(vcpu, msr_index); + + if (msr) + return msr->value + + (msr->delta_from_host ? kvm_residency_read_host(vcpu, msr) : 0); + return 0; +} +EXPORT_SYMBOL_GPL(kvm_residency_read); + +void kvm_residency_write(struct kvm_vcpu *vcpu, + u32 msr_index, u64 value) +{ + struct kvm_residency_msr *msr = find_residency_msr_index(vcpu, msr_index); + + if (msr) + msr->value = value - + (msr->delta_from_host ? kvm_residency_read_host(vcpu, msr) : 0); +} +EXPORT_SYMBOL_GPL(kvm_residency_write); + /* * Writes msr value into into the appropriate "register". * Returns 0 on success, non-0 otherwise. -- 2.7.4
Powered by blists - more mailing lists