Signed-off-by: Gregory Haskins <[EMAIL PROTECTED]> --- drivers/kvm/vmx.c | 32 ++++++++++++++++++++++++++------ 1 files changed, 26 insertions(+), 6 deletions(-)
diff --git a/drivers/kvm/vmx.c b/drivers/kvm/vmx.c index 1c99bc9..7745bb9 100644 --- a/drivers/kvm/vmx.c +++ b/drivers/kvm/vmx.c @@ -1159,13 +1159,26 @@ static int vmx_vcpu_setup(struct kvm_vcpu *vcpu) vmcs_write32_fixedbits(MSR_IA32_VMX_PROCBASED_CTLS, CPU_BASED_VM_EXEC_CONTROL, CPU_BASED_HLT_EXITING /* 20.6.2 */ - | CPU_BASED_CR8_LOAD_EXITING /* 20.6.2 */ - | CPU_BASED_CR8_STORE_EXITING /* 20.6.2 */ + | CPU_BASED_TPR_SHADOW /* 20.6.2 */ | CPU_BASED_ACTIVATE_IO_BITMAP /* 20.6.2 */ | CPU_BASED_MOV_DR_EXITING | CPU_BASED_USE_TSC_OFFSETING /* 21.3 */ ); + if (!(vmcs_read32(CPU_BASED_VM_EXEC_CONTROL) & CPU_BASED_TPR_SHADOW)) { + u32 cbvec; + + cbvec = vmcs_read32(CPU_BASED_VM_EXEC_CONTROL); + cbvec |= CPU_BASED_CR8_LOAD_EXITING; /* 20.6.2 */ + cbvec |= CPU_BASED_CR8_STORE_EXITING; /* 20.6.2 */ + vmcs_write32_fixedbits(MSR_IA32_VMX_PROCBASED_CTLS, + CPU_BASED_VM_EXEC_CONTROL, + cbvec); + + printk(KERN_WARNING "KVM: Warning - Host processor does " \ + "not support TPR-shadow\n"); + } + vmcs_write32(EXCEPTION_BITMAP, 1 << PF_VECTOR); vmcs_write32(PAGE_FAULT_ERROR_CODE_MASK, 0); vmcs_write32(PAGE_FAULT_ERROR_CODE_MATCH, 0); @@ -1239,7 +1252,7 @@ static int vmx_vcpu_setup(struct kvm_vcpu *vcpu) vmcs_write32(VM_ENTRY_INTR_INFO_FIELD, 0); /* 22.2.1 */ #ifdef CONFIG_X86_64 - vmcs_writel(VIRTUAL_APIC_PAGE_ADDR, 0); + vmcs_writel(VIRTUAL_APIC_PAGE_ADDR, kvm_lapic_get_regs(vcpu)); vmcs_writel(TPR_THRESHOLD, 0); #endif @@ -1346,6 +1359,9 @@ static int do_intr_requests(struct kvm_vcpu *vcpu, kvm_irqpin_t pin) { int handled = 0; + struct kvm_irqack_data ack; + + memset(&ack, 0, sizeof(ack)); vcpu->interrupt_window_open = ((vmcs_readl(GUEST_RFLAGS) & X86_EFLAGS_IF) && @@ -1357,11 +1373,8 @@ static int do_intr_requests(struct kvm_vcpu *vcpu, * If interrupts enabled, and not blocked by sti or mov ss. * Good. */ - struct kvm_irqack_data ack; int r = 0; - memset(&ack, 0, sizeof(ack)); - switch (pin) { case kvm_irqpin_localint: r = kvm_vcpu_irq_pop(vcpu, &ack); @@ -1414,6 +1427,13 @@ static int do_intr_requests(struct kvm_vcpu *vcpu, vmcs_write32(CPU_BASED_VM_EXEC_CONTROL, cbvec); } +#ifdef CONFIG_X86_64 + if (ack.flags & KVM_IRQACKDATA_NEXT_VALID) + vmcs_write32(TPR_THRESHOLD, ack.next >> 4); + else + vmcs_write32(TPR_THRESHOLD, 0); +#endif + return handled; } ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ _______________________________________________ kvm-devel mailing list kvm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/kvm-devel