1edf88417SAvi Kivity #ifndef __KVM_HOST_H 2edf88417SAvi Kivity #define __KVM_HOST_H 3edf88417SAvi Kivity 4edf88417SAvi Kivity /* 5edf88417SAvi Kivity * This work is licensed under the terms of the GNU GPL, version 2. See 6edf88417SAvi Kivity * the COPYING file in the top-level directory. 7edf88417SAvi Kivity */ 8edf88417SAvi Kivity 9edf88417SAvi Kivity #include <linux/types.h> 10edf88417SAvi Kivity #include <linux/hardirq.h> 11edf88417SAvi Kivity #include <linux/list.h> 12edf88417SAvi Kivity #include <linux/mutex.h> 13edf88417SAvi Kivity #include <linux/spinlock.h> 14edf88417SAvi Kivity #include <linux/signal.h> 15edf88417SAvi Kivity #include <linux/sched.h> 16edf88417SAvi Kivity #include <linux/mm.h> 17edf88417SAvi Kivity #include <linux/preempt.h> 18d4c9ff2dSFeng(Eric) Liu #include <linux/marker.h> 19edf88417SAvi Kivity #include <asm/signal.h> 20edf88417SAvi Kivity 21edf88417SAvi Kivity #include <linux/kvm.h> 22edf88417SAvi Kivity #include <linux/kvm_para.h> 23edf88417SAvi Kivity 24edf88417SAvi Kivity #include <linux/kvm_types.h> 25edf88417SAvi Kivity 26edf88417SAvi Kivity #include <asm/kvm_host.h> 27edf88417SAvi Kivity 28edf88417SAvi Kivity /* 29edf88417SAvi Kivity * vcpu->requests bit members 30edf88417SAvi Kivity */ 31edf88417SAvi Kivity #define KVM_REQ_TLB_FLUSH 0 322f52d58cSAvi Kivity #define KVM_REQ_MIGRATE_TIMER 1 33b209749fSAvi Kivity #define KVM_REQ_REPORT_TPR_ACCESS 2 342e53d63aSMarcelo Tosatti #define KVM_REQ_MMU_RELOAD 3 3571c4dfafSJoerg Roedel #define KVM_REQ_TRIPLE_FAULT 4 36edf88417SAvi Kivity 37edf88417SAvi Kivity struct kvm_vcpu; 38edf88417SAvi Kivity extern struct kmem_cache *kvm_vcpu_cache; 39edf88417SAvi Kivity 40edf88417SAvi Kivity /* 41edf88417SAvi Kivity * It would be nice to use something smarter than a linear search, TBD... 42edf88417SAvi Kivity * Thankfully we dont expect many devices to register (famous last words :), 43edf88417SAvi Kivity * so until then it will suffice. At least its abstracted so we can change 44edf88417SAvi Kivity * in one place. 45edf88417SAvi Kivity */ 46edf88417SAvi Kivity struct kvm_io_bus { 47edf88417SAvi Kivity int dev_count; 48edf88417SAvi Kivity #define NR_IOBUS_DEVS 6 49edf88417SAvi Kivity struct kvm_io_device *devs[NR_IOBUS_DEVS]; 50edf88417SAvi Kivity }; 51edf88417SAvi Kivity 52edf88417SAvi Kivity void kvm_io_bus_init(struct kvm_io_bus *bus); 53edf88417SAvi Kivity void kvm_io_bus_destroy(struct kvm_io_bus *bus); 54edf88417SAvi Kivity struct kvm_io_device *kvm_io_bus_find_dev(struct kvm_io_bus *bus, gpa_t addr); 55edf88417SAvi Kivity void kvm_io_bus_register_dev(struct kvm_io_bus *bus, 56edf88417SAvi Kivity struct kvm_io_device *dev); 57edf88417SAvi Kivity 58edf88417SAvi Kivity struct kvm_vcpu { 59edf88417SAvi Kivity struct kvm *kvm; 6031bb117eSHollis Blanchard #ifdef CONFIG_PREEMPT_NOTIFIERS 61edf88417SAvi Kivity struct preempt_notifier preempt_notifier; 6231bb117eSHollis Blanchard #endif 63edf88417SAvi Kivity int vcpu_id; 64edf88417SAvi Kivity struct mutex mutex; 65edf88417SAvi Kivity int cpu; 66edf88417SAvi Kivity struct kvm_run *run; 67edf88417SAvi Kivity int guest_mode; 68edf88417SAvi Kivity unsigned long requests; 69edf88417SAvi Kivity struct kvm_guest_debug guest_debug; 70edf88417SAvi Kivity int fpu_active; 71edf88417SAvi Kivity int guest_fpu_loaded; 72edf88417SAvi Kivity wait_queue_head_t wq; 73edf88417SAvi Kivity int sigset_active; 74edf88417SAvi Kivity sigset_t sigset; 75edf88417SAvi Kivity struct kvm_vcpu_stat stat; 76edf88417SAvi Kivity 77edf88417SAvi Kivity #ifdef CONFIG_HAS_IOMEM 78edf88417SAvi Kivity int mmio_needed; 79edf88417SAvi Kivity int mmio_read_completed; 80edf88417SAvi Kivity int mmio_is_write; 81edf88417SAvi Kivity int mmio_size; 82edf88417SAvi Kivity unsigned char mmio_data[8]; 83edf88417SAvi Kivity gpa_t mmio_phys_addr; 84edf88417SAvi Kivity #endif 85edf88417SAvi Kivity 86edf88417SAvi Kivity struct kvm_vcpu_arch arch; 87edf88417SAvi Kivity }; 88edf88417SAvi Kivity 89edf88417SAvi Kivity struct kvm_memory_slot { 90edf88417SAvi Kivity gfn_t base_gfn; 91edf88417SAvi Kivity unsigned long npages; 92edf88417SAvi Kivity unsigned long flags; 93edf88417SAvi Kivity unsigned long *rmap; 94edf88417SAvi Kivity unsigned long *dirty_bitmap; 9505da4558SMarcelo Tosatti struct { 9605da4558SMarcelo Tosatti unsigned long rmap_pde; 9705da4558SMarcelo Tosatti int write_count; 9805da4558SMarcelo Tosatti } *lpage_info; 99edf88417SAvi Kivity unsigned long userspace_addr; 100edf88417SAvi Kivity int user_alloc; 101edf88417SAvi Kivity }; 102edf88417SAvi Kivity 103edf88417SAvi Kivity struct kvm { 104aaee2c94SMarcelo Tosatti struct mutex lock; /* protects the vcpus array and APIC accesses */ 105aaee2c94SMarcelo Tosatti spinlock_t mmu_lock; 10672dc67a6SIzik Eidus struct rw_semaphore slots_lock; 107edf88417SAvi Kivity struct mm_struct *mm; /* userspace tied to this vm */ 108edf88417SAvi Kivity int nmemslots; 109edf88417SAvi Kivity struct kvm_memory_slot memslots[KVM_MEMORY_SLOTS + 110edf88417SAvi Kivity KVM_PRIVATE_MEM_SLOTS]; 111edf88417SAvi Kivity struct kvm_vcpu *vcpus[KVM_MAX_VCPUS]; 112edf88417SAvi Kivity struct list_head vm_list; 113edf88417SAvi Kivity struct file *filp; 114edf88417SAvi Kivity struct kvm_io_bus mmio_bus; 115edf88417SAvi Kivity struct kvm_io_bus pio_bus; 116edf88417SAvi Kivity struct kvm_vm_stat stat; 117edf88417SAvi Kivity struct kvm_arch arch; 118d39f13b0SIzik Eidus atomic_t users_count; 119edf88417SAvi Kivity }; 120edf88417SAvi Kivity 121edf88417SAvi Kivity /* The guest did something we don't support. */ 122edf88417SAvi Kivity #define pr_unimpl(vcpu, fmt, ...) \ 123edf88417SAvi Kivity do { \ 124edf88417SAvi Kivity if (printk_ratelimit()) \ 125edf88417SAvi Kivity printk(KERN_ERR "kvm: %i: cpu%i " fmt, \ 126edf88417SAvi Kivity current->tgid, (vcpu)->vcpu_id , ## __VA_ARGS__); \ 127edf88417SAvi Kivity } while (0) 128edf88417SAvi Kivity 129edf88417SAvi Kivity #define kvm_printf(kvm, fmt ...) printk(KERN_DEBUG fmt) 130edf88417SAvi Kivity #define vcpu_printf(vcpu, fmt...) kvm_printf(vcpu->kvm, fmt) 131edf88417SAvi Kivity 132edf88417SAvi Kivity int kvm_vcpu_init(struct kvm_vcpu *vcpu, struct kvm *kvm, unsigned id); 133edf88417SAvi Kivity void kvm_vcpu_uninit(struct kvm_vcpu *vcpu); 134edf88417SAvi Kivity 135edf88417SAvi Kivity void vcpu_load(struct kvm_vcpu *vcpu); 136edf88417SAvi Kivity void vcpu_put(struct kvm_vcpu *vcpu); 137edf88417SAvi Kivity 138edf88417SAvi Kivity void decache_vcpus_on_cpu(int cpu); 139edf88417SAvi Kivity 140edf88417SAvi Kivity 141edf88417SAvi Kivity int kvm_init(void *opaque, unsigned int vcpu_size, 142edf88417SAvi Kivity struct module *module); 143edf88417SAvi Kivity void kvm_exit(void); 144edf88417SAvi Kivity 145d39f13b0SIzik Eidus void kvm_get_kvm(struct kvm *kvm); 146d39f13b0SIzik Eidus void kvm_put_kvm(struct kvm *kvm); 147d39f13b0SIzik Eidus 148edf88417SAvi Kivity #define HPA_MSB ((sizeof(hpa_t) * 8) - 1) 149edf88417SAvi Kivity #define HPA_ERR_MASK ((hpa_t)1 << HPA_MSB) 150edf88417SAvi Kivity static inline int is_error_hpa(hpa_t hpa) { return hpa >> HPA_MSB; } 151edf88417SAvi Kivity struct page *gva_to_page(struct kvm_vcpu *vcpu, gva_t gva); 152edf88417SAvi Kivity 153edf88417SAvi Kivity extern struct page *bad_page; 15435149e21SAnthony Liguori extern pfn_t bad_pfn; 155edf88417SAvi Kivity 156edf88417SAvi Kivity int is_error_page(struct page *page); 15735149e21SAnthony Liguori int is_error_pfn(pfn_t pfn); 158edf88417SAvi Kivity int kvm_is_error_hva(unsigned long addr); 159edf88417SAvi Kivity int kvm_set_memory_region(struct kvm *kvm, 160edf88417SAvi Kivity struct kvm_userspace_memory_region *mem, 161edf88417SAvi Kivity int user_alloc); 162edf88417SAvi Kivity int __kvm_set_memory_region(struct kvm *kvm, 163edf88417SAvi Kivity struct kvm_userspace_memory_region *mem, 164edf88417SAvi Kivity int user_alloc); 165edf88417SAvi Kivity int kvm_arch_set_memory_region(struct kvm *kvm, 166edf88417SAvi Kivity struct kvm_userspace_memory_region *mem, 167edf88417SAvi Kivity struct kvm_memory_slot old, 168edf88417SAvi Kivity int user_alloc); 169edf88417SAvi Kivity gfn_t unalias_gfn(struct kvm *kvm, gfn_t gfn); 170edf88417SAvi Kivity struct page *gfn_to_page(struct kvm *kvm, gfn_t gfn); 17105da4558SMarcelo Tosatti unsigned long gfn_to_hva(struct kvm *kvm, gfn_t gfn); 172edf88417SAvi Kivity void kvm_release_page_clean(struct page *page); 173edf88417SAvi Kivity void kvm_release_page_dirty(struct page *page); 17435149e21SAnthony Liguori void kvm_set_page_dirty(struct page *page); 17535149e21SAnthony Liguori void kvm_set_page_accessed(struct page *page); 17635149e21SAnthony Liguori 17735149e21SAnthony Liguori pfn_t gfn_to_pfn(struct kvm *kvm, gfn_t gfn); 17835149e21SAnthony Liguori void kvm_release_pfn_dirty(pfn_t); 17935149e21SAnthony Liguori void kvm_release_pfn_clean(pfn_t pfn); 18035149e21SAnthony Liguori void kvm_set_pfn_dirty(pfn_t pfn); 18135149e21SAnthony Liguori void kvm_set_pfn_accessed(pfn_t pfn); 18235149e21SAnthony Liguori void kvm_get_pfn(pfn_t pfn); 18335149e21SAnthony Liguori 184edf88417SAvi Kivity int kvm_read_guest_page(struct kvm *kvm, gfn_t gfn, void *data, int offset, 185edf88417SAvi Kivity int len); 1867ec54588SMarcelo Tosatti int kvm_read_guest_atomic(struct kvm *kvm, gpa_t gpa, void *data, 1877ec54588SMarcelo Tosatti unsigned long len); 188edf88417SAvi Kivity int kvm_read_guest(struct kvm *kvm, gpa_t gpa, void *data, unsigned long len); 189edf88417SAvi Kivity int kvm_write_guest_page(struct kvm *kvm, gfn_t gfn, const void *data, 190edf88417SAvi Kivity int offset, int len); 191edf88417SAvi Kivity int kvm_write_guest(struct kvm *kvm, gpa_t gpa, const void *data, 192edf88417SAvi Kivity unsigned long len); 193edf88417SAvi Kivity int kvm_clear_guest_page(struct kvm *kvm, gfn_t gfn, int offset, int len); 194edf88417SAvi Kivity int kvm_clear_guest(struct kvm *kvm, gpa_t gpa, unsigned long len); 195edf88417SAvi Kivity struct kvm_memory_slot *gfn_to_memslot(struct kvm *kvm, gfn_t gfn); 196edf88417SAvi Kivity int kvm_is_visible_gfn(struct kvm *kvm, gfn_t gfn); 197edf88417SAvi Kivity void mark_page_dirty(struct kvm *kvm, gfn_t gfn); 198edf88417SAvi Kivity 199edf88417SAvi Kivity void kvm_vcpu_block(struct kvm_vcpu *vcpu); 200edf88417SAvi Kivity void kvm_resched(struct kvm_vcpu *vcpu); 201edf88417SAvi Kivity void kvm_load_guest_fpu(struct kvm_vcpu *vcpu); 202edf88417SAvi Kivity void kvm_put_guest_fpu(struct kvm_vcpu *vcpu); 203edf88417SAvi Kivity void kvm_flush_remote_tlbs(struct kvm *kvm); 2042e53d63aSMarcelo Tosatti void kvm_reload_remote_mmus(struct kvm *kvm); 205edf88417SAvi Kivity 206edf88417SAvi Kivity long kvm_arch_dev_ioctl(struct file *filp, 207edf88417SAvi Kivity unsigned int ioctl, unsigned long arg); 208edf88417SAvi Kivity long kvm_arch_vcpu_ioctl(struct file *filp, 209edf88417SAvi Kivity unsigned int ioctl, unsigned long arg); 210edf88417SAvi Kivity void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu); 211edf88417SAvi Kivity void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu); 212edf88417SAvi Kivity 213edf88417SAvi Kivity int kvm_dev_ioctl_check_extension(long ext); 214edf88417SAvi Kivity 215edf88417SAvi Kivity int kvm_get_dirty_log(struct kvm *kvm, 216edf88417SAvi Kivity struct kvm_dirty_log *log, int *is_dirty); 217edf88417SAvi Kivity int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, 218edf88417SAvi Kivity struct kvm_dirty_log *log); 219edf88417SAvi Kivity 220edf88417SAvi Kivity int kvm_vm_ioctl_set_memory_region(struct kvm *kvm, 221edf88417SAvi Kivity struct 222edf88417SAvi Kivity kvm_userspace_memory_region *mem, 223edf88417SAvi Kivity int user_alloc); 224edf88417SAvi Kivity long kvm_arch_vm_ioctl(struct file *filp, 225edf88417SAvi Kivity unsigned int ioctl, unsigned long arg); 226edf88417SAvi Kivity void kvm_arch_destroy_vm(struct kvm *kvm); 227edf88417SAvi Kivity 228edf88417SAvi Kivity int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu); 229edf88417SAvi Kivity int kvm_arch_vcpu_ioctl_set_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu); 230edf88417SAvi Kivity 231edf88417SAvi Kivity int kvm_arch_vcpu_ioctl_translate(struct kvm_vcpu *vcpu, 232edf88417SAvi Kivity struct kvm_translation *tr); 233edf88417SAvi Kivity 234edf88417SAvi Kivity int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs); 235edf88417SAvi Kivity int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs); 236edf88417SAvi Kivity int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu, 237edf88417SAvi Kivity struct kvm_sregs *sregs); 238edf88417SAvi Kivity int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, 239edf88417SAvi Kivity struct kvm_sregs *sregs); 240*62d9f0dbSMarcelo Tosatti int kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu, 241*62d9f0dbSMarcelo Tosatti struct kvm_mp_state *mp_state); 242*62d9f0dbSMarcelo Tosatti int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu, 243*62d9f0dbSMarcelo Tosatti struct kvm_mp_state *mp_state); 244edf88417SAvi Kivity int kvm_arch_vcpu_ioctl_debug_guest(struct kvm_vcpu *vcpu, 245edf88417SAvi Kivity struct kvm_debug_guest *dbg); 246edf88417SAvi Kivity int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run); 247edf88417SAvi Kivity 248edf88417SAvi Kivity int kvm_arch_init(void *opaque); 249edf88417SAvi Kivity void kvm_arch_exit(void); 250edf88417SAvi Kivity 251edf88417SAvi Kivity int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu); 252edf88417SAvi Kivity void kvm_arch_vcpu_uninit(struct kvm_vcpu *vcpu); 253edf88417SAvi Kivity 254edf88417SAvi Kivity void kvm_arch_vcpu_free(struct kvm_vcpu *vcpu); 255edf88417SAvi Kivity void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu); 256edf88417SAvi Kivity void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu); 257edf88417SAvi Kivity struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm, unsigned int id); 258edf88417SAvi Kivity int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu); 259edf88417SAvi Kivity void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu); 260edf88417SAvi Kivity 261edf88417SAvi Kivity int kvm_arch_vcpu_reset(struct kvm_vcpu *vcpu); 262edf88417SAvi Kivity void kvm_arch_hardware_enable(void *garbage); 263edf88417SAvi Kivity void kvm_arch_hardware_disable(void *garbage); 264edf88417SAvi Kivity int kvm_arch_hardware_setup(void); 265edf88417SAvi Kivity void kvm_arch_hardware_unsetup(void); 266edf88417SAvi Kivity void kvm_arch_check_processor_compat(void *rtn); 267edf88417SAvi Kivity int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu); 268edf88417SAvi Kivity 269edf88417SAvi Kivity void kvm_free_physmem(struct kvm *kvm); 270edf88417SAvi Kivity 271edf88417SAvi Kivity struct kvm *kvm_arch_create_vm(void); 272edf88417SAvi Kivity void kvm_arch_destroy_vm(struct kvm *kvm); 273edf88417SAvi Kivity 274edf88417SAvi Kivity int kvm_cpu_get_interrupt(struct kvm_vcpu *v); 275edf88417SAvi Kivity int kvm_cpu_has_interrupt(struct kvm_vcpu *v); 2763d80840dSMarcelo Tosatti int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu); 2775736199aSZhang Xiantao void kvm_vcpu_kick(struct kvm_vcpu *vcpu); 278edf88417SAvi Kivity 279edf88417SAvi Kivity static inline void kvm_guest_enter(void) 280edf88417SAvi Kivity { 281edf88417SAvi Kivity account_system_vtime(current); 282edf88417SAvi Kivity current->flags |= PF_VCPU; 283edf88417SAvi Kivity } 284edf88417SAvi Kivity 285edf88417SAvi Kivity static inline void kvm_guest_exit(void) 286edf88417SAvi Kivity { 287edf88417SAvi Kivity account_system_vtime(current); 288edf88417SAvi Kivity current->flags &= ~PF_VCPU; 289edf88417SAvi Kivity } 290edf88417SAvi Kivity 291edf88417SAvi Kivity static inline int memslot_id(struct kvm *kvm, struct kvm_memory_slot *slot) 292edf88417SAvi Kivity { 293edf88417SAvi Kivity return slot - kvm->memslots; 294edf88417SAvi Kivity } 295edf88417SAvi Kivity 296edf88417SAvi Kivity static inline gpa_t gfn_to_gpa(gfn_t gfn) 297edf88417SAvi Kivity { 298edf88417SAvi Kivity return (gpa_t)gfn << PAGE_SHIFT; 299edf88417SAvi Kivity } 300edf88417SAvi Kivity 3012f52d58cSAvi Kivity static inline void kvm_migrate_apic_timer(struct kvm_vcpu *vcpu) 3022f52d58cSAvi Kivity { 3032f52d58cSAvi Kivity set_bit(KVM_REQ_MIGRATE_TIMER, &vcpu->requests); 3042f52d58cSAvi Kivity } 3052f52d58cSAvi Kivity 306edf88417SAvi Kivity enum kvm_stat_kind { 307edf88417SAvi Kivity KVM_STAT_VM, 308edf88417SAvi Kivity KVM_STAT_VCPU, 309edf88417SAvi Kivity }; 310edf88417SAvi Kivity 311edf88417SAvi Kivity struct kvm_stats_debugfs_item { 312edf88417SAvi Kivity const char *name; 313edf88417SAvi Kivity int offset; 314edf88417SAvi Kivity enum kvm_stat_kind kind; 315edf88417SAvi Kivity struct dentry *dentry; 316edf88417SAvi Kivity }; 317edf88417SAvi Kivity extern struct kvm_stats_debugfs_item debugfs_entries[]; 318d4c9ff2dSFeng(Eric) Liu extern struct dentry *debugfs_dir; 319d4c9ff2dSFeng(Eric) Liu 320d4c9ff2dSFeng(Eric) Liu #ifdef CONFIG_KVM_TRACE 321d4c9ff2dSFeng(Eric) Liu int kvm_trace_ioctl(unsigned int ioctl, unsigned long arg); 322d4c9ff2dSFeng(Eric) Liu void kvm_trace_cleanup(void); 323d4c9ff2dSFeng(Eric) Liu #else 324d4c9ff2dSFeng(Eric) Liu static inline 325d4c9ff2dSFeng(Eric) Liu int kvm_trace_ioctl(unsigned int ioctl, unsigned long arg) 326d4c9ff2dSFeng(Eric) Liu { 327d4c9ff2dSFeng(Eric) Liu return -EINVAL; 328d4c9ff2dSFeng(Eric) Liu } 329d4c9ff2dSFeng(Eric) Liu #define kvm_trace_cleanup() ((void)0) 330d4c9ff2dSFeng(Eric) Liu #endif 331edf88417SAvi Kivity 332edf88417SAvi Kivity #endif 333