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
next prev 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