KVM: unbreak userspace that does not sets tss address
PATCH v2 1/1 KVM: unbreak userspace that does not sets tss address
Commit 6440e5967bc broke old userspaces that do not set tss address before entering vcpu. Unbreak it by setting tss address to a safe value on the first vcpu entry. New userspaces should set tss address, so print warning in case it doesn't.
Signed-off-by Gleb Natapov <[email protected]>
---
v1->v2
- Drop srcu lock during memory slots update.
arch/x86/kvm/vmx.c +13 -0
@@ -180,6 +180,7 @@ static u64 construct_eptp(unsigned long root_hpa);static void kvm_cpu_vmxon (u64 addr);static void kvm_cpu_vmxoff (void );static void vmx_set_cr3 (struct kvm_vcpu *vcpu,unsigned long cr3); +static int vmx_set_tss_addr (struct kvm *kvm,unsigned int addr); static DEFINE_PER_CPU(struct vmcs *, vmxarea); static DEFINE_PER_CPU(struct vmcs *, current_vmcs);
@@ -1762,6 +1763,18 @@ static void enter_rmode(struct kvm_vcpu *vcpu) vmx->emulation_required =1 ; vmx->rmode.vm86_active =1 ; +/* +* Very old userspace does not call KVM_SET_TSS_ADDR before entering +* vcpu. Call it here with phys address pointing 16M below 4G. +*/ +if (!vcpu->kvm->arch.tss_addr) { +printk_once (KERN_WARNING "kvm: KVM_SET_TSS_ADDR need to be " +"called before entering vcpu\n" ); +srcu_read_unlock (&vcpu->kvm->srcu, vcpu->srcu_idx); +vmx_set_tss_addr (vcpu->kvm,0xfeffd000 ); + vcpu->srcu_idx =srcu_read_lock (&vcpu->kvm->srcu); + } + vmx->rmode.tr.selector =vmcs_read16 (GUEST_TR_SELECTOR ); vmx->rmode.tr.base =vmcs_readl (GUEST_TR_BASE );vmcs_writel (GUEST_TR_BASE ,rmode_tss_base (vcpu->kvm));
--
Gleb.
Marcelo Tosatti
AppliedQuoted 6 lines · Gleb Natapov
Commit
6440e5967bcbroke old userspaces that do not set tss address before entering vcpu. Unbreak it by setting tss address to a safe value on the first vcpu entry. New userspaces should set tss address, so print warning in case it doesn't.Signed-off-by Gleb Natapov <[email protected]>
Applied, thanks.