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 3/14] KVM: kvm data structures
Date: Sun, 05 Nov 2006 20:31:34 -0000 [thread overview]
Message-ID: <20061105203134.DA9FC2500A7@cleopatra.q> (raw)
In-Reply-To: <454E4941.7000108-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
Define data structures and some constants for a virtual machine.
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
===================================================================
--- /dev/null
+++ linux-2.6/drivers/kvm/kvm.h
@@ -0,0 +1,206 @@
+#ifndef __KVM_H
+#define __KVM_H
+
+#include <linux/types.h>
+#include <linux/list.h>
+#include <linux/mutex.h>
+#include <linux/spinlock.h>
+#include <linux/mm.h>
+
+#define INVALID_PAGE (~(hpa_t)0)
+#define UNMAPPED_GVA (~(gpa_t)0)
+
+#define KVM_MAX_VCPUS 1
+#define KVM_MEMORY_SLOTS 4
+#define KVM_NUM_MMU_PAGES 256
+
+#define FX_IMAGE_SIZE 512
+#define FX_IMAGE_ALIGN 16
+#define FX_BUF_SIZE (2 * FX_IMAGE_SIZE + FX_IMAGE_ALIGN)
+
+/*
+ * Address types:
+ *
+ * gva - guest virtual address
+ * gpa - guest physical address
+ * gfn - guest frame number
+ * hva - host virtual address
+ * hpa - host physical address
+ * hfn - host frame number
+ */
+
+typedef unsigned long gva_t;
+typedef u64 gpa_t;
+typedef unsigned long gfn_t;
+
+typedef unsigned long hva_t;
+typedef u64 hpa_t;
+typedef unsigned long hfn_t;
+
+struct kvm_mmu_page {
+ struct list_head link;
+ hpa_t page_hpa;
+ unsigned long slot_bitmap; /* One bit set per slot which has memory
+ * in this shadow page.
+ */
+ int global; /* Set if all ptes in this page are global */
+ u64 *parent_pte;
+};
+
+struct vmcs {
+ u32 revision_id;
+ u32 abort;
+ char data[0];
+};
+
+struct vmx_msr_entry {
+ u32 index;
+ u32 reserved;
+ u64 data;
+};
+
+struct kvm_vcpu;
+
+/*
+ * x86 supports 3 paging modes (4-level 64-bit, 3-level 64-bit, and 2-level
+ * 32-bit). The kvm_mmu structure abstracts the details of the current mmu
+ * mode.
+ */
+struct kvm_mmu {
+ void (*new_cr3)(struct kvm_vcpu *vcpu);
+ int (*page_fault)(struct kvm_vcpu *vcpu, gva_t gva, u32 err);
+ void (*inval_page)(struct kvm_vcpu *vcpu, gva_t gva);
+ void (*free)(struct kvm_vcpu *vcpu);
+ gpa_t (*gva_to_gpa)(struct kvm_vcpu *vcpu, gva_t gva);
+ hpa_t root_hpa;
+ int root_level;
+ int shadow_root_level;
+};
+
+struct kvm_guest_debug {
+ int enabled;
+ unsigned long bp[4];
+ int singlestep;
+};
+
+enum {
+ VCPU_REGS_RAX = 0,
+ VCPU_REGS_RCX = 1,
+ VCPU_REGS_RDX = 2,
+ VCPU_REGS_RBX = 3,
+ VCPU_REGS_RSP = 4,
+ VCPU_REGS_RBP = 5,
+ VCPU_REGS_RSI = 6,
+ VCPU_REGS_RDI = 7,
+#ifdef __x86_64__
+ VCPU_REGS_R8 = 8,
+ VCPU_REGS_R9 = 9,
+ VCPU_REGS_R10 = 10,
+ VCPU_REGS_R11 = 11,
+ VCPU_REGS_R12 = 12,
+ VCPU_REGS_R13 = 13,
+ VCPU_REGS_R14 = 14,
+ VCPU_REGS_R15 = 15,
+#endif
+ NR_VCPU_REGS
+};
+
+struct kvm_vcpu {
+ struct kvm *kvm;
+ struct vmcs *vmcs;
+ struct mutex mutex;
+ int cpu;
+ int launched;
+ unsigned long irq_summary; /* bit vector: 1 per word in irq_pending */
+#define NR_IRQ_WORDS (256 / BITS_PER_LONG)
+ unsigned long irq_pending[NR_IRQ_WORDS];
+ unsigned long regs[NR_VCPU_REGS]; /* for rsp: vcpu_load_rsp_rip() */
+ unsigned long rip; /* needs vcpu_load_rsp_rip() */
+
+ unsigned long cr2;
+ unsigned long cr3;
+ unsigned long cr8;
+ u64 shadow_efer;
+ u64 apic_base;
+ struct vmx_msr_entry *guest_msrs;
+ struct vmx_msr_entry *host_msrs;
+
+ struct list_head free_pages;
+ struct kvm_mmu_page page_header_buf[KVM_NUM_MMU_PAGES];
+ struct kvm_mmu mmu;
+
+ struct kvm_guest_debug guest_debug;
+
+ char fx_buf[FX_BUF_SIZE];
+ char *host_fx_image;
+ char *guest_fx_image;
+
+ int mmio_needed;
+ int mmio_read_completed;
+ int mmio_is_write;
+ int mmio_size;
+ unsigned char mmio_data[8];
+ gpa_t mmio_phys_addr;
+
+ struct{
+ int active;
+ u8 save_iopl;
+ struct {
+ unsigned long base;
+ u32 limit;
+ u32 ar;
+ } tr;
+ } rmode;
+};
+
+struct kvm_memory_slot {
+ gfn_t base_gfn;
+ unsigned long npages;
+ unsigned long flags;
+ struct page **phys_mem;
+ unsigned long *dirty_bitmap;
+};
+
+struct kvm {
+ spinlock_t lock; /* protects everything except vcpus */
+ int nmemslots;
+ struct kvm_memory_slot memslots[KVM_MEMORY_SLOTS];
+ struct list_head active_mmu_pages;
+ struct kvm_vcpu vcpus[KVM_MAX_VCPUS];
+ int memory_config_version;
+ int busy;
+};
+
+struct kvm_stat {
+ u32 pf_fixed;
+ u32 pf_guest;
+ u32 tlb_flush;
+ u32 invlpg;
+
+ u32 exits;
+ u32 io_exits;
+ u32 mmio_exits;
+ u32 signal_exits;
+ u32 irq_exits;
+};
+
+extern struct kvm_stat kvm_stat;
+
+#define kvm_printf(kvm, fmt ...) printk(KERN_DEBUG fmt)
+#define vcpu_printf(vcpu, fmt...) kvm_printf(vcpu->kvm, fmt)
+
+void kvm_mmu_destroy(struct kvm_vcpu *vcpu);
+int kvm_mmu_init(struct kvm_vcpu *vcpu);
+
+int kvm_mmu_reset_context(struct kvm_vcpu *vcpu);
+void kvm_mmu_slot_remove_write_access(struct kvm *kvm, int slot);
+
+hpa_t gpa_to_hpa(struct kvm_vcpu *vcpu, gpa_t gpa);
+#define HPA_MSB ((sizeof(hpa_t) * 8) - 1)
+#define HPA_ERR_MASK ((hpa_t)1 << HPA_MSB)
+static inline int is_error_hpa(hpa_t hpa) { return hpa >> HPA_MSB; }
+hpa_t gva_to_hpa(struct kvm_vcpu *vcpu, gva_t gva);
+
+extern hpa_t bad_page_address;
+
+#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:31 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
2006-11-05 20:30 ` [PATCH 2/14] KVM: Intel virtual mode extensions definitions 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 ` Avi Kivity [this message]
2006-11-05 20:32 ` [PATCH 4/14] KVM: random accessors and constants Avi Kivity
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
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=20061105203134.DA9FC2500A7@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