public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Avi Kivity <avi@redhat.com>
To: linux-kernel@vger.kernel.org
Cc: kvm@vger.kernel.org, Mohammed Gamal <m.gamal005@gmail.com>
Subject: [PATCH 12/39] KVM: VMX: Modify mode switching and vmentry functions
Date: Thu, 25 Sep 2008 14:54:44 +0300	[thread overview]
Message-ID: <1222343711-12508-13-git-send-email-avi@redhat.com> (raw)
In-Reply-To: <1222343711-12508-1-git-send-email-avi@redhat.com>

From: Mohammed Gamal <m.gamal005@gmail.com>

This patch modifies mode switching and vmentry function in order to
drive invalid guest state emulation.

Signed-off-by: Mohammed Gamal <m.gamal005@gmail.com>
Signed-off-by: Avi Kivity <avi@qumranet.com>
---
 arch/x86/kvm/vmx.c |   20 ++++++++++++++++++++
 1 files changed, 20 insertions(+), 0 deletions(-)

diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index eae1f2c..9840f37 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -1298,7 +1298,9 @@ static void fix_pmode_dataseg(int seg, struct kvm_save_segment *save)
 static void enter_pmode(struct kvm_vcpu *vcpu)
 {
 	unsigned long flags;
+	struct vcpu_vmx *vmx = to_vmx(vcpu);
 
+	vmx->emulation_required = 1;
 	vcpu->arch.rmode.active = 0;
 
 	vmcs_writel(GUEST_TR_BASE, vcpu->arch.rmode.tr.base);
@@ -1315,6 +1317,9 @@ static void enter_pmode(struct kvm_vcpu *vcpu)
 
 	update_exception_bitmap(vcpu);
 
+	if (emulate_invalid_guest_state)
+		return;
+
 	fix_pmode_dataseg(VCPU_SREG_ES, &vcpu->arch.rmode.es);
 	fix_pmode_dataseg(VCPU_SREG_DS, &vcpu->arch.rmode.ds);
 	fix_pmode_dataseg(VCPU_SREG_GS, &vcpu->arch.rmode.gs);
@@ -1355,7 +1360,9 @@ static void fix_rmode_seg(int seg, struct kvm_save_segment *save)
 static void enter_rmode(struct kvm_vcpu *vcpu)
 {
 	unsigned long flags;
+	struct vcpu_vmx *vmx = to_vmx(vcpu);
 
+	vmx->emulation_required = 1;
 	vcpu->arch.rmode.active = 1;
 
 	vcpu->arch.rmode.tr.base = vmcs_readl(GUEST_TR_BASE);
@@ -1377,6 +1384,9 @@ static void enter_rmode(struct kvm_vcpu *vcpu)
 	vmcs_writel(GUEST_CR4, vmcs_readl(GUEST_CR4) | X86_CR4_VME);
 	update_exception_bitmap(vcpu);
 
+	if (emulate_invalid_guest_state)
+		goto continue_rmode;
+
 	vmcs_write16(GUEST_SS_SELECTOR, vmcs_readl(GUEST_SS_BASE) >> 4);
 	vmcs_write32(GUEST_SS_LIMIT, 0xffff);
 	vmcs_write32(GUEST_SS_AR_BYTES, 0xf3);
@@ -1392,6 +1402,7 @@ static void enter_rmode(struct kvm_vcpu *vcpu)
 	fix_rmode_seg(VCPU_SREG_GS, &vcpu->arch.rmode.gs);
 	fix_rmode_seg(VCPU_SREG_FS, &vcpu->arch.rmode.fs);
 
+continue_rmode:
 	kvm_mmu_reset_context(vcpu);
 	init_rmode(vcpu->kvm);
 }
@@ -2317,6 +2328,9 @@ static int vmx_vcpu_reset(struct kvm_vcpu *vcpu)
 
 	ret = 0;
 
+	/* HACK: Don't enable emulation on guest boot/reset */
+	vmx->emulation_required = 0;
+
 out:
 	up_read(&vcpu->kvm->slots_lock);
 	return ret;
@@ -3190,6 +3204,12 @@ static void vmx_vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
 	struct vcpu_vmx *vmx = to_vmx(vcpu);
 	u32 intr_info;
 
+	/* Handle invalid guest state instead of entering VMX */
+	if (vmx->emulation_required && emulate_invalid_guest_state) {
+		handle_invalid_guest_state(vcpu, kvm_run);
+		return;
+	}
+
 	if (test_bit(VCPU_REGS_RSP, (unsigned long *)&vcpu->arch.regs_dirty))
 		vmcs_writel(GUEST_RSP, vcpu->arch.regs[VCPU_REGS_RSP]);
 	if (test_bit(VCPU_REGS_RIP, (unsigned long *)&vcpu->arch.regs_dirty))
-- 
1.6.0.1


  parent reply	other threads:[~2008-09-25 12:00 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-09-25 11:54 [PATCH 00/39] KVM Updates for 2.6.28 merge window (part 2 of 3) Avi Kivity
2008-09-25 11:54 ` [PATCH 01/39] KVM: VMX: Clean up magic number 0x66 in init_rmode_tss Avi Kivity
2008-09-25 11:54 ` [PATCH 02/39] KVM: remove unused field from the assigned dev struct Avi Kivity
2008-09-25 11:54 ` [PATCH 03/39] KVM: set debug registers after "schedulable" section Avi Kivity
2008-09-25 11:54 ` [PATCH 04/39] KVM: VMX: Use interrupt queue for !irqchip_in_kernel Avi Kivity
2008-09-25 11:54 ` [PATCH 05/39] KVM: Simplify exception entries by using __ASM_SIZE and _ASM_PTR Avi Kivity
2008-09-25 11:54 ` [PATCH 06/39] KVM: fix i8259 reset irq acking Avi Kivity
2008-09-25 11:54 ` [PATCH 07/39] KVM: Handle spurious acks for PIT interrupts Avi Kivity
2008-09-25 11:54 ` [PATCH 08/39] KVM: Device assignment: Check for privileges before assigning irq Avi Kivity
2008-09-25 11:54 ` [PATCH 09/39] KVM: VMX: Add Guest State Validity Checks Avi Kivity
2008-09-25 11:54 ` [PATCH 10/39] KVM: VMX: Add module parameter and emulation flag Avi Kivity
2008-09-25 11:54 ` [PATCH 11/39] KVM: VMX: Add invalid guest state handler Avi Kivity
2008-09-25 11:54 ` Avi Kivity [this message]
2008-09-25 11:54 ` [PATCH 13/39] KVM: SVM: Fix typo Avi Kivity
2008-09-25 11:54 ` [PATCH 14/39] KVM: Use kvm_set_irq to inject interrupts Avi Kivity
2008-09-25 11:54 ` [PATCH 15/39] KVM: make irq ack notifier functions static Avi Kivity
2008-09-25 11:54 ` [PATCH 16/39] KVM: ia64: add a dummy irq ack notification Avi Kivity
2008-09-25 11:54 ` [PATCH 17/39] KVM: VMX: Change cs reset state to be a data segment Avi Kivity
2008-09-25 11:54 ` [PATCH 18/39] KVM: VMX: Change segment dpl at reset to 3 Avi Kivity
2008-09-25 11:54 ` [PATCH 19/39] KVM: Load real mode segments correctly Avi Kivity
2008-09-25 11:54 ` [PATCH 20/39] KVM: x86 emulator: remove duplicate SrcImm Avi Kivity
2008-09-25 11:54 ` [PATCH 21/39] KVM: x86 emulator: remove bad ByteOp specifier from NEG descriptor Avi Kivity
2008-09-25 11:54 ` [PATCH 22/39] KVM: MMU: Move SHADOW_PT_INDEX to mmu.c Avi Kivity
2008-09-25 11:54 ` [PATCH 23/39] KVM: MMU: Unify direct map 4K and large page paths Avi Kivity
2008-09-25 11:54 ` [PATCH 24/39] KVM: ia64: Enable virtio driver for ia64 in Kconfig Avi Kivity
2008-09-25 11:54 ` [PATCH 25/39] KVM: MMU: Infer shadow root level in direct_map() Avi Kivity
2008-09-25 11:54 ` [PATCH 26/39] KVM: MMU: Add generic shadow walker Avi Kivity
2008-09-25 11:54 ` [PATCH 27/39] KVM: MMU: Convert direct maps to use the " Avi Kivity
2008-09-25 11:55 ` [PATCH 28/39] KVM: MMU: Convert the paging mode shadow walk to use the generic walker Avi Kivity
2008-09-25 11:55 ` [PATCH 29/39] KVM: Allocate guest memory as MAP_PRIVATE, not MAP_SHARED Avi Kivity
2008-09-25 11:55 ` [PATCH 30/39] KVM: Don't call get_user_pages(.force = 1) Avi Kivity
2008-09-25 11:55 ` [PATCH 31/39] KVM: x86 emulator: Add mov r, imm instructions (opcodes 0xb0-0xbf) Avi Kivity
2008-09-25 11:55 ` [PATCH 32/39] KVM: MMU: Account for npt/ept/realmode page faults Avi Kivity
2008-09-25 11:55 ` [PATCH 33/39] KVM: MMU: Add locking around kvm_mmu_slot_remove_write_access() Avi Kivity
2008-09-25 11:55 ` [PATCH 34/39] KVM: MMU: Flush tlbs after clearing write permission when accessing dirty log Avi Kivity
2008-09-25 11:55 ` [PATCH 35/39] KVM: MMU: Fix setting the accessed bit on non-speculative sptes Avi Kivity
2008-09-25 11:55 ` [PATCH 36/39] KVM: SVM: No need to unprotect memory during event injection when using npt Avi Kivity
2008-09-25 11:55 ` [PATCH 37/39] KVM: add MC5_MISC msr read support Avi Kivity
2008-09-25 11:55 ` [PATCH 38/39] KVM: s390: Make facility bits future-proof Avi Kivity
2008-09-25 11:55 ` [PATCH 39/39] KVM: s390: change help text of guest Kconfig Avi Kivity

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1222343711-12508-13-git-send-email-avi@redhat.com \
    --to=avi@redhat.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=m.gamal005@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox