public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
From: Avi Kivity <avi-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
To: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
Cc: akpm-3NddpPZAyC0@public.gmane.org,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: [PATCH 4/14] KVM: random accessors and constants
Date: Sun, 05 Nov 2006 20:32:35 -0000	[thread overview]
Message-ID: <20061105203235.01C392500A7@cleopatra.q> (raw)
In-Reply-To: <454E4941.7000108-atKUWr5tajBWk0Htik3J/w@public.gmane.org>

Define some constants and accessors to be used later on.

Signed-off-by: Yaniv Kamay <yaniv-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
Signed-off-by: Avi Kivity <avi-atKUWr5tajBWk0Htik3J/w@public.gmane.org>

Index: linux-2.6/drivers/kvm/kvm.h
===================================================================
--- linux-2.6.orig/drivers/kvm/kvm.h
+++ linux-2.6/drivers/kvm/kvm.h
@@ -7,6 +7,38 @@
 #include <linux/spinlock.h>
 #include <linux/mm.h>
 
+#include "vmx.h"
+
+#define CR0_PE_MASK (1ULL << 0)
+#define CR0_TS_MASK (1ULL << 3)
+#define CR0_NE_MASK (1ULL << 5)
+#define CR0_WP_MASK (1ULL << 16)
+#define CR0_NW_MASK (1ULL << 29)
+#define CR0_CD_MASK (1ULL << 30)
+#define CR0_PG_MASK (1ULL << 31)
+
+#define CR3_WPT_MASK (1ULL << 3)
+#define CR3_PCD_MASK (1ULL << 4)
+
+#define CR3_RESEVED_BITS 0x07ULL
+#define CR3_L_MODE_RESEVED_BITS (~((1ULL << 40) - 1) | 0x0fe7ULL)
+#define CR3_FLAGS_MASK ((1ULL << 5) - 1)
+
+#define CR4_VME_MASK (1ULL << 0)
+#define CR4_PSE_MASK (1ULL << 4)
+#define CR4_PAE_MASK (1ULL << 5)
+#define CR4_PGE_MASK (1ULL << 7)
+#define CR4_VMXE_MASK (1ULL << 13)
+
+#define KVM_GUEST_CR0_MASK \
+	(CR0_PG_MASK | CR0_PE_MASK | CR0_WP_MASK | CR0_NE_MASK)
+#define KVM_VM_CR0_ALWAYS_ON KVM_GUEST_CR0_MASK
+
+#define KVM_GUEST_CR4_MASK \
+	(CR4_PSE_MASK | CR4_PAE_MASK | CR4_PGE_MASK | CR4_VMXE_MASK | CR4_VME_MASK)
+#define KVM_PMODE_VM_CR4_ALWAYS_ON (CR4_VMXE_MASK | CR4_PAE_MASK)
+#define KVM_RMODE_VM_CR4_ALWAYS_ON (CR4_VMXE_MASK | CR4_PAE_MASK | CR4_VME_MASK)
+
 #define INVALID_PAGE (~(hpa_t)0)
 #define UNMAPPED_GVA (~(gpa_t)0)
 
@@ -18,6 +50,19 @@
 #define FX_IMAGE_ALIGN 16
 #define FX_BUF_SIZE (2 * FX_IMAGE_SIZE + FX_IMAGE_ALIGN)
 
+#define DE_VECTOR 0
+#define DF_VECTOR 8
+#define TS_VECTOR 10
+#define NP_VECTOR 11
+#define SS_VECTOR 12
+#define GP_VECTOR 13
+#define PF_VECTOR 14
+
+#define SELECTOR_TI_MASK (1 << 2)
+#define SELECTOR_RPL_MASK 0x03
+
+#define IOPL_SHIFT 12
+
 /*
  * Address types:
  *
@@ -203,4 +248,125 @@ hpa_t gva_to_hpa(struct kvm_vcpu *vcpu, 
 
 extern hpa_t bad_page_address;
 
+static inline struct page *gfn_to_page(struct kvm_memory_slot *slot, gfn_t gfn)
+{
+	return slot->phys_mem[gfn - slot->base_gfn];
+}
+
+struct kvm_memory_slot *gfn_to_memslot(struct kvm *kvm, gfn_t gfn);
+void mark_page_dirty(struct kvm *kvm, gfn_t gfn);
+
+void realmode_lgdt(struct kvm_vcpu *vcpu, u16 size, unsigned long address);
+void realmode_lidt(struct kvm_vcpu *vcpu, u16 size, unsigned long address);
+void realmode_lmsw(struct kvm_vcpu *vcpu, unsigned long msw,
+		   unsigned long *rflags);
+
+unsigned long realmode_get_cr(struct kvm_vcpu *vcpu, int cr);
+void realmode_set_cr(struct kvm_vcpu *vcpu, int cr, unsigned long value,
+		     unsigned long *rflags);
+
+int kvm_read_guest(struct kvm_vcpu *vcpu,
+	       gva_t addr,
+	       unsigned long size,
+	       void *dest);
+
+int kvm_write_guest(struct kvm_vcpu *vcpu,
+		gva_t addr,
+		unsigned long size,
+		void *data);
+
+void vmcs_writel(unsigned long field, unsigned long value);
+unsigned long vmcs_readl(unsigned long field);
+
+static inline u16 vmcs_read16(unsigned long field)
+{
+	return vmcs_readl(field);
+}
+
+static inline u32 vmcs_read32(unsigned long field)
+{
+	return vmcs_readl(field);
+}
+
+static inline u64 vmcs_read64(unsigned long field)
+{
+#ifdef __x86_64__
+	return vmcs_readl(field);
+#else
+	return vmcs_readl(field) | ((u64)vmcs_readl(field+1) << 32);
+#endif
+}
+
+static inline void vmcs_write32(unsigned long field, u32 value)
+{
+	vmcs_writel(field, value);
+}
+
+static inline int is_long_mode(void)
+{
+	return vmcs_read32(VM_ENTRY_CONTROLS) & VM_ENTRY_CONTROLS_IA32E_MASK;
+}
+
+static inline unsigned long guest_cr4(void)
+{
+	return (vmcs_readl(CR4_READ_SHADOW) & KVM_GUEST_CR4_MASK) |
+		(vmcs_readl(GUEST_CR4) & ~KVM_GUEST_CR4_MASK);
+}
+
+static inline int is_pae(void)
+{
+	return guest_cr4() & CR4_PAE_MASK;
+}
+
+static inline int is_pse(void)
+{
+	return guest_cr4() & CR4_PSE_MASK;
+}
+
+static inline unsigned long guest_cr0(void)
+{
+	return (vmcs_readl(CR0_READ_SHADOW) & KVM_GUEST_CR0_MASK) |
+		(vmcs_readl(GUEST_CR0) & ~KVM_GUEST_CR0_MASK);
+}
+
+static inline unsigned guest_cpl(void)
+{
+	return vmcs_read16(GUEST_CS_SELECTOR) & SELECTOR_RPL_MASK;
+}
+
+static inline int is_paging(void)
+{
+	return guest_cr0() & CR0_PG_MASK;
+}
+
+static inline int is_page_fault(u32 intr_info)
+{
+	return (intr_info & (INTR_INFO_INTR_TYPE_MASK | INTR_INFO_VECTOR_MASK |
+			     INTR_INFO_VALID_MASK)) ==
+		(INTR_TYPE_EXCEPTION | PF_VECTOR | INTR_INFO_VALID_MASK);
+}
+
+static inline int is_external_interrupt(u32 intr_info)
+{
+	return (intr_info & (INTR_INFO_INTR_TYPE_MASK | INTR_INFO_VALID_MASK))
+		== (INTR_TYPE_EXT_INTR | INTR_INFO_VALID_MASK);
+}
+
+static inline void flush_guest_tlb(struct kvm_vcpu *vcpu)
+{
+	vmcs_writel(GUEST_CR3, vmcs_readl(GUEST_CR3));
+}
+
+static inline int memslot_id(struct kvm *kvm, struct kvm_memory_slot *slot)
+{
+	return slot - kvm->memslots;
+}
+
+static inline struct kvm_mmu_page *page_header(hpa_t shadow_page)
+{
+	struct page *page = pfn_to_page(shadow_page >> PAGE_SHIFT);
+
+	return (struct kvm_mmu_page *)page->private;
+}
+
 #endif

-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642

  parent reply	other threads:[~2006-11-05 20:32 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-11-05 20:27 [PATCH 0/14] KVM: Kernel-based Virtual Machine (v4) Avi Kivity
     [not found] ` <454E4941.7000108-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2006-11-05 20:29   ` [PATCH 1/14] KVM: userspace interface Avi Kivity
2006-11-06 10:03     ` Arjan van de Ven
     [not found]       ` <1162807420.3160.186.camel-NIQFrBLA1CpScpXdPBN83iCwEArCW2h5@public.gmane.org>
2006-11-06 10:28         ` Avi Kivity
     [not found]           ` <454F0E4A.7030001-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2006-11-06 10:32             ` Arjan van de Ven
     [not found]               ` <1162809128.3160.201.camel-NIQFrBLA1CpScpXdPBN83iCwEArCW2h5@public.gmane.org>
2006-11-06 10:47                 ` Avi Kivity
2006-11-05 20:31   ` [PATCH 3/14] KVM: kvm data structures Avi Kivity
2006-11-05 20:32   ` Avi Kivity [this message]
2006-11-05 20:33   ` [PATCH 5/14] KVM: virtualization infrastructure Avi Kivity
2006-11-05 20:34   ` [PATCH 6/14] KVM: memory slot management Avi Kivity
2006-11-05 20:35   ` [PATCH 7/14] KVM: vcpu creation and maintenance Avi Kivity
2006-11-05 20:36   ` [PATCH 8/14] KVM: vcpu execution loop Avi Kivity
2006-11-05 20:37   ` [PATCH 9/14] KVM: define exit handlers Avi Kivity
2006-11-05 20:38   ` [PATCH 10/14] KVM: less common " Avi Kivity
2006-11-05 20:39   ` [PATCH 11/14] KVM: mmu Avi Kivity
2006-11-05 20:40   ` [PATCH 12/14] KVM: x86 emulator Avi Kivity
2006-11-07 12:49     ` Pavel Machek
2006-11-07 12:55       ` Avi Kivity
     [not found]         ` <4550823E.2070108-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2006-11-07 13:00           ` Arjan van de Ven
     [not found]             ` <1162904459.3138.142.camel-NIQFrBLA1CpScpXdPBN83iCwEArCW2h5@public.gmane.org>
2006-11-07 13:22               ` Avi Kivity
     [not found]                 ` <4550889C.2020708-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2006-11-07 13:35                   ` Miguel Ojeda
2006-11-07 13:44                   ` Arjan van de Ven
2006-11-07 13:12         ` Hesse, Christian
     [not found]           ` <200611071412.07196.mail-8oMOrB1mGocUSW6y5lq3GQ@public.gmane.org>
2006-11-08 16:54             ` David Bristow
2006-11-05 20:41   ` [PATCH 13/14] KVM: plumbing Avi Kivity
2006-11-05 20:42   ` [PATCH 14/14] KVM: Dynamically determine which msrs to load and save Avi Kivity
2006-11-07 16:59   ` [PATCH 0/14] KVM: Kernel-based Virtual Machine (v4) Yinghai Lu
     [not found]     ` <86802c440611070859g5bb3c8b0q6b05b4ef2782d682-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2006-11-07 19:56       ` Avi Kivity
2006-11-08  4:44   ` Andrew Morton
     [not found]     ` <20061107204440.090450ea.akpm-3NddpPZAyC0@public.gmane.org>
2006-11-08  4:51       ` Roland Dreier
     [not found]         ` <adafycuh77b.fsf-FYB4Gu1CFyUAvxtiuMwx3w@public.gmane.org>
2006-11-08  7:14           ` Avi Kivity
     [not found]             ` <455183EA.2020405-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2006-11-08  7:33               ` Andrew Morton
     [not found]                 ` <20061107233323.c984fa9b.akpm-3NddpPZAyC0@public.gmane.org>
2006-11-08  8:07                   ` Avi Kivity
     [not found]                     ` <45519033.3060409-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2006-11-08  8:30                       ` Andrew Morton
2006-11-08  9:39                       ` Arjan van de Ven
     [not found]                         ` <1162978754.3138.266.camel-NIQFrBLA1CpScpXdPBN83iCwEArCW2h5@public.gmane.org>
2006-11-08  9:54                           ` Avi Kivity
2006-11-08 10:01                             ` Arjan van de Ven
     [not found]                               ` <1162980101.3138.276.camel-NIQFrBLA1CpScpXdPBN83iCwEArCW2h5@public.gmane.org>
2006-11-08 10:10                                 ` Avi Kivity
2006-11-08 18:26             ` Roland Dreier
2006-11-05 20:30 ` [PATCH 2/14] KVM: Intel virtual mode extensions definitions 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=20061105203235.01C392500A7@cleopatra.q \
    --to=avi-atkuwr5tajbwk0htik3j/w@public.gmane.org \
    --cc=akpm-3NddpPZAyC0@public.gmane.org \
    --cc=kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org \
    --cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    /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