KVM: X86: Introduce a tdp_set_cr3 function
[linux-2.6-block.git] / arch / x86 / include / asm / kvm_host.h
index 502e53f999cf28a25cc2b00f1766bd1ffb2f9ed2..81a51473f74554dddfe623f4d9ba9a2eeea56cd7 100644 (file)
@@ -236,6 +236,7 @@ struct kvm_pio_request {
  */
 struct kvm_mmu {
        void (*new_cr3)(struct kvm_vcpu *vcpu);
+       void (*set_cr3)(struct kvm_vcpu *vcpu, unsigned long root);
        int (*page_fault)(struct kvm_vcpu *vcpu, gva_t gva, u32 err);
        void (*free)(struct kvm_vcpu *vcpu);
        gpa_t (*gva_to_gpa)(struct kvm_vcpu *vcpu, gva_t gva, u32 access,
@@ -249,13 +250,13 @@ struct kvm_mmu {
        int root_level;
        int shadow_root_level;
        union kvm_mmu_page_role base_role;
+       bool direct_map;
 
        u64 *pae_root;
        u64 rsvd_bits_mask[2][4];
 };
 
 struct kvm_vcpu_arch {
-       u64 host_tsc;
        /*
         * rip and regs accesses must go through
         * kvm_{register,rip}_{read,write} functions.
@@ -336,9 +337,12 @@ struct kvm_vcpu_arch {
 
        gpa_t time;
        struct pvclock_vcpu_time_info hv_clock;
-       unsigned int hv_clock_tsc_khz;
+       unsigned int hw_tsc_khz;
        unsigned int time_offset;
        struct page *time_page;
+       u64 last_host_tsc;
+       u64 last_guest_tsc;
+       u64 last_kernel_ns;
 
        bool nmi_pending;
        bool nmi_injected;
@@ -367,9 +371,9 @@ struct kvm_vcpu_arch {
 };
 
 struct kvm_arch {
-       unsigned int n_free_mmu_pages;
+       unsigned int n_used_mmu_pages;
        unsigned int n_requested_mmu_pages;
-       unsigned int n_alloc_mmu_pages;
+       unsigned int n_max_mmu_pages;
        atomic_t invlpg_counter;
        struct hlist_head mmu_page_hash[KVM_NUM_MMU_PAGES];
        /*
@@ -394,8 +398,11 @@ struct kvm_arch {
        gpa_t ept_identity_map_addr;
 
        unsigned long irq_sources_bitmap;
-       u64 vm_init_tsc;
        s64 kvmclock_offset;
+       spinlock_t tsc_write_lock;
+       u64 last_tsc_nsec;
+       u64 last_tsc_offset;
+       u64 last_tsc_write;
 
        struct kvm_xen_hvm_config xen_hvm_config;
 
@@ -517,11 +524,16 @@ struct kvm_x86_ops {
        u64 (*get_mt_mask)(struct kvm_vcpu *vcpu, gfn_t gfn, bool is_mmio);
        int (*get_lpage_level)(void);
        bool (*rdtscp_supported)(void);
+       void (*adjust_tsc_offset)(struct kvm_vcpu *vcpu, s64 adjustment);
+
+       void (*set_tdp_cr3)(struct kvm_vcpu *vcpu, unsigned long cr3);
 
        void (*set_supported_cpuid)(u32 func, struct kvm_cpuid_entry2 *entry);
 
        bool (*has_wbinvd_exit)(void);
 
+       void (*write_tsc_offset)(struct kvm_vcpu *vcpu, u64 offset);
+
        const struct trace_print_flags *exit_reasons_str;
 };
 
@@ -652,20 +664,6 @@ static inline struct kvm_mmu_page *page_header(hpa_t shadow_page)
        return (struct kvm_mmu_page *)page_private(page);
 }
 
-static inline u16 kvm_read_fs(void)
-{
-       u16 seg;
-       asm("mov %%fs, %0" : "=g"(seg));
-       return seg;
-}
-
-static inline u16 kvm_read_gs(void)
-{
-       u16 seg;
-       asm("mov %%gs, %0" : "=g"(seg));
-       return seg;
-}
-
 static inline u16 kvm_read_ldt(void)
 {
        u16 ldt;
@@ -673,16 +671,6 @@ static inline u16 kvm_read_ldt(void)
        return ldt;
 }
 
-static inline void kvm_load_fs(u16 sel)
-{
-       asm("mov %0, %%fs" : : "rm"(sel));
-}
-
-static inline void kvm_load_gs(u16 sel)
-{
-       asm("mov %0, %%gs" : : "rm"(sel));
-}
-
 static inline void kvm_load_ldt(u16 sel)
 {
        asm("lldt %0" : : "rm"(sel));