[PATCH 11/12] kvm/svm: handle #pf intercepts in nested_svm_exit_handled directly

From: Joerg Roedel
Date: Wed Jul 29 2009 - 08:58:38 EST


Signed-off-by: Joerg Roedel <joerg.roedel@xxxxxxx>
---
arch/x86/kvm/svm.c | 26 ++++++++++++++++++++++++--
1 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
index 1a44e43..381ed38 100644
--- a/arch/x86/kvm/svm.c
+++ b/arch/x86/kvm/svm.c
@@ -1498,6 +1498,9 @@ static int nested_svm_exit_handled_msr(struct vcpu_svm *svm,
return 0;
}

+/*
+ * If this function returns true, this #vmexit was already handled
+ */
static int nested_svm_exit_handled(struct vcpu_svm *svm, bool kvm_override)
{
u32 exit_code = svm->vmcb->control.exit_code;
@@ -1515,8 +1518,27 @@ static int nested_svm_exit_handled(struct vcpu_svm *svm, bool kvm_override)
break;
/* When we're shadowing, trap PFs */
case SVM_EXIT_EXCP_BASE + PF_VECTOR:
- if (!npt_enabled)
- return 0;
+ if (!npt_enabled) {
+ u64 fault_address;
+ u32 error_code;
+
+ fault_address = svm->vmcb->control.exit_info_2;
+ error_code = svm->vmcb->control.exit_info_1;
+
+ kvm_mmu_page_fault(&svm->vcpu,
+ fault_address,
+ error_code);
+
+ /*
+ * If we are still nested here the pending
+ * irqs/exceptions must be reinjected
+ */
+ //if (is_nested(svm))
+ // svm_complete_interrupts(svm);
+
+ return true;
+ }
+
break;
default:
break;
--
1.6.3.3


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/