diff options
Diffstat (limited to 'include/linux/kvm_host.h')
-rw-r--r-- | include/linux/kvm_host.h | 131 |
1 files changed, 98 insertions, 33 deletions
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index b7bbb5ddd7ae..169d07758ee5 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h | |||
@@ -38,6 +38,7 @@ | |||
38 | #define KVM_REQ_MMU_SYNC 7 | 38 | #define KVM_REQ_MMU_SYNC 7 |
39 | #define KVM_REQ_KVMCLOCK_UPDATE 8 | 39 | #define KVM_REQ_KVMCLOCK_UPDATE 8 |
40 | #define KVM_REQ_KICK 9 | 40 | #define KVM_REQ_KICK 9 |
41 | #define KVM_REQ_DEACTIVATE_FPU 10 | ||
41 | 42 | ||
42 | #define KVM_USERSPACE_IRQ_SOURCE_ID 0 | 43 | #define KVM_USERSPACE_IRQ_SOURCE_ID 0 |
43 | 44 | ||
@@ -53,24 +54,24 @@ extern struct kmem_cache *kvm_vcpu_cache; | |||
53 | */ | 54 | */ |
54 | struct kvm_io_bus { | 55 | struct kvm_io_bus { |
55 | int dev_count; | 56 | int dev_count; |
56 | #define NR_IOBUS_DEVS 6 | 57 | #define NR_IOBUS_DEVS 200 |
57 | struct kvm_io_device *devs[NR_IOBUS_DEVS]; | 58 | struct kvm_io_device *devs[NR_IOBUS_DEVS]; |
58 | }; | 59 | }; |
59 | 60 | ||
60 | void kvm_io_bus_init(struct kvm_io_bus *bus); | 61 | enum kvm_bus { |
61 | void kvm_io_bus_destroy(struct kvm_io_bus *bus); | 62 | KVM_MMIO_BUS, |
62 | int kvm_io_bus_write(struct kvm_io_bus *bus, gpa_t addr, int len, | 63 | KVM_PIO_BUS, |
63 | const void *val); | 64 | KVM_NR_BUSES |
64 | int kvm_io_bus_read(struct kvm_io_bus *bus, gpa_t addr, int len, | 65 | }; |
66 | |||
67 | int kvm_io_bus_write(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr, | ||
68 | int len, const void *val); | ||
69 | int kvm_io_bus_read(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr, int len, | ||
65 | void *val); | 70 | void *val); |
66 | int __kvm_io_bus_register_dev(struct kvm_io_bus *bus, | 71 | int kvm_io_bus_register_dev(struct kvm *kvm, enum kvm_bus bus_idx, |
67 | struct kvm_io_device *dev); | ||
68 | int kvm_io_bus_register_dev(struct kvm *kvm, struct kvm_io_bus *bus, | ||
69 | struct kvm_io_device *dev); | 72 | struct kvm_io_device *dev); |
70 | void __kvm_io_bus_unregister_dev(struct kvm_io_bus *bus, | 73 | int kvm_io_bus_unregister_dev(struct kvm *kvm, enum kvm_bus bus_idx, |
71 | struct kvm_io_device *dev); | 74 | struct kvm_io_device *dev); |
72 | void kvm_io_bus_unregister_dev(struct kvm *kvm, struct kvm_io_bus *bus, | ||
73 | struct kvm_io_device *dev); | ||
74 | 75 | ||
75 | struct kvm_vcpu { | 76 | struct kvm_vcpu { |
76 | struct kvm *kvm; | 77 | struct kvm *kvm; |
@@ -83,6 +84,8 @@ struct kvm_vcpu { | |||
83 | struct kvm_run *run; | 84 | struct kvm_run *run; |
84 | unsigned long requests; | 85 | unsigned long requests; |
85 | unsigned long guest_debug; | 86 | unsigned long guest_debug; |
87 | int srcu_idx; | ||
88 | |||
86 | int fpu_active; | 89 | int fpu_active; |
87 | int guest_fpu_loaded; | 90 | int guest_fpu_loaded; |
88 | wait_queue_head_t wq; | 91 | wait_queue_head_t wq; |
@@ -116,11 +119,16 @@ struct kvm_memory_slot { | |||
116 | int user_alloc; | 119 | int user_alloc; |
117 | }; | 120 | }; |
118 | 121 | ||
122 | static inline unsigned long kvm_dirty_bitmap_bytes(struct kvm_memory_slot *memslot) | ||
123 | { | ||
124 | return ALIGN(memslot->npages, BITS_PER_LONG) / 8; | ||
125 | } | ||
126 | |||
119 | struct kvm_kernel_irq_routing_entry { | 127 | struct kvm_kernel_irq_routing_entry { |
120 | u32 gsi; | 128 | u32 gsi; |
121 | u32 type; | 129 | u32 type; |
122 | int (*set)(struct kvm_kernel_irq_routing_entry *e, | 130 | int (*set)(struct kvm_kernel_irq_routing_entry *e, |
123 | struct kvm *kvm, int level); | 131 | struct kvm *kvm, int irq_source_id, int level); |
124 | union { | 132 | union { |
125 | struct { | 133 | struct { |
126 | unsigned irqchip; | 134 | unsigned irqchip; |
@@ -128,17 +136,41 @@ struct kvm_kernel_irq_routing_entry { | |||
128 | } irqchip; | 136 | } irqchip; |
129 | struct msi_msg msi; | 137 | struct msi_msg msi; |
130 | }; | 138 | }; |
131 | struct list_head link; | 139 | struct hlist_node link; |
132 | }; | 140 | }; |
133 | 141 | ||
134 | struct kvm { | 142 | #ifdef __KVM_HAVE_IOAPIC |
135 | spinlock_t mmu_lock; | 143 | |
136 | spinlock_t requests_lock; | 144 | struct kvm_irq_routing_table { |
137 | struct rw_semaphore slots_lock; | 145 | int chip[KVM_NR_IRQCHIPS][KVM_IOAPIC_NUM_PINS]; |
138 | struct mm_struct *mm; /* userspace tied to this vm */ | 146 | struct kvm_kernel_irq_routing_entry *rt_entries; |
147 | u32 nr_rt_entries; | ||
148 | /* | ||
149 | * Array indexed by gsi. Each entry contains list of irq chips | ||
150 | * the gsi is connected to. | ||
151 | */ | ||
152 | struct hlist_head map[0]; | ||
153 | }; | ||
154 | |||
155 | #else | ||
156 | |||
157 | struct kvm_irq_routing_table {}; | ||
158 | |||
159 | #endif | ||
160 | |||
161 | struct kvm_memslots { | ||
139 | int nmemslots; | 162 | int nmemslots; |
140 | struct kvm_memory_slot memslots[KVM_MEMORY_SLOTS + | 163 | struct kvm_memory_slot memslots[KVM_MEMORY_SLOTS + |
141 | KVM_PRIVATE_MEM_SLOTS]; | 164 | KVM_PRIVATE_MEM_SLOTS]; |
165 | }; | ||
166 | |||
167 | struct kvm { | ||
168 | spinlock_t mmu_lock; | ||
169 | raw_spinlock_t requests_lock; | ||
170 | struct mutex slots_lock; | ||
171 | struct mm_struct *mm; /* userspace tied to this vm */ | ||
172 | struct kvm_memslots *memslots; | ||
173 | struct srcu_struct srcu; | ||
142 | #ifdef CONFIG_KVM_APIC_ARCHITECTURE | 174 | #ifdef CONFIG_KVM_APIC_ARCHITECTURE |
143 | u32 bsp_vcpu_id; | 175 | u32 bsp_vcpu_id; |
144 | struct kvm_vcpu *bsp_vcpu; | 176 | struct kvm_vcpu *bsp_vcpu; |
@@ -147,8 +179,7 @@ struct kvm { | |||
147 | atomic_t online_vcpus; | 179 | atomic_t online_vcpus; |
148 | struct list_head vm_list; | 180 | struct list_head vm_list; |
149 | struct mutex lock; | 181 | struct mutex lock; |
150 | struct kvm_io_bus mmio_bus; | 182 | struct kvm_io_bus *buses[KVM_NR_BUSES]; |
151 | struct kvm_io_bus pio_bus; | ||
152 | #ifdef CONFIG_HAVE_KVM_EVENTFD | 183 | #ifdef CONFIG_HAVE_KVM_EVENTFD |
153 | struct { | 184 | struct { |
154 | spinlock_t lock; | 185 | spinlock_t lock; |
@@ -166,8 +197,9 @@ struct kvm { | |||
166 | 197 | ||
167 | struct mutex irq_lock; | 198 | struct mutex irq_lock; |
168 | #ifdef CONFIG_HAVE_KVM_IRQCHIP | 199 | #ifdef CONFIG_HAVE_KVM_IRQCHIP |
169 | struct list_head irq_routing; /* of kvm_kernel_irq_routing_entry */ | 200 | struct kvm_irq_routing_table *irq_routing; |
170 | struct hlist_head mask_notifier_list; | 201 | struct hlist_head mask_notifier_list; |
202 | struct hlist_head irq_ack_notifier_list; | ||
171 | #endif | 203 | #endif |
172 | 204 | ||
173 | #ifdef KVM_ARCH_WANT_MMU_NOTIFIER | 205 | #ifdef KVM_ARCH_WANT_MMU_NOTIFIER |
@@ -229,13 +261,20 @@ int kvm_set_memory_region(struct kvm *kvm, | |||
229 | int __kvm_set_memory_region(struct kvm *kvm, | 261 | int __kvm_set_memory_region(struct kvm *kvm, |
230 | struct kvm_userspace_memory_region *mem, | 262 | struct kvm_userspace_memory_region *mem, |
231 | int user_alloc); | 263 | int user_alloc); |
232 | int kvm_arch_set_memory_region(struct kvm *kvm, | 264 | int kvm_arch_prepare_memory_region(struct kvm *kvm, |
265 | struct kvm_memory_slot *memslot, | ||
266 | struct kvm_memory_slot old, | ||
267 | struct kvm_userspace_memory_region *mem, | ||
268 | int user_alloc); | ||
269 | void kvm_arch_commit_memory_region(struct kvm *kvm, | ||
233 | struct kvm_userspace_memory_region *mem, | 270 | struct kvm_userspace_memory_region *mem, |
234 | struct kvm_memory_slot old, | 271 | struct kvm_memory_slot old, |
235 | int user_alloc); | 272 | int user_alloc); |
236 | void kvm_disable_largepages(void); | 273 | void kvm_disable_largepages(void); |
237 | void kvm_arch_flush_shadow(struct kvm *kvm); | 274 | void kvm_arch_flush_shadow(struct kvm *kvm); |
238 | gfn_t unalias_gfn(struct kvm *kvm, gfn_t gfn); | 275 | gfn_t unalias_gfn(struct kvm *kvm, gfn_t gfn); |
276 | gfn_t unalias_gfn_instantiation(struct kvm *kvm, gfn_t gfn); | ||
277 | |||
239 | struct page *gfn_to_page(struct kvm *kvm, gfn_t gfn); | 278 | struct page *gfn_to_page(struct kvm *kvm, gfn_t gfn); |
240 | unsigned long gfn_to_hva(struct kvm *kvm, gfn_t gfn); | 279 | unsigned long gfn_to_hva(struct kvm *kvm, gfn_t gfn); |
241 | void kvm_release_page_clean(struct page *page); | 280 | void kvm_release_page_clean(struct page *page); |
@@ -244,6 +283,9 @@ void kvm_set_page_dirty(struct page *page); | |||
244 | void kvm_set_page_accessed(struct page *page); | 283 | void kvm_set_page_accessed(struct page *page); |
245 | 284 | ||
246 | pfn_t gfn_to_pfn(struct kvm *kvm, gfn_t gfn); | 285 | pfn_t gfn_to_pfn(struct kvm *kvm, gfn_t gfn); |
286 | pfn_t gfn_to_pfn_memslot(struct kvm *kvm, | ||
287 | struct kvm_memory_slot *slot, gfn_t gfn); | ||
288 | int memslot_id(struct kvm *kvm, gfn_t gfn); | ||
247 | void kvm_release_pfn_dirty(pfn_t); | 289 | void kvm_release_pfn_dirty(pfn_t); |
248 | void kvm_release_pfn_clean(pfn_t pfn); | 290 | void kvm_release_pfn_clean(pfn_t pfn); |
249 | void kvm_set_pfn_dirty(pfn_t pfn); | 291 | void kvm_set_pfn_dirty(pfn_t pfn); |
@@ -263,9 +305,11 @@ int kvm_clear_guest_page(struct kvm *kvm, gfn_t gfn, int offset, int len); | |||
263 | int kvm_clear_guest(struct kvm *kvm, gpa_t gpa, unsigned long len); | 305 | int kvm_clear_guest(struct kvm *kvm, gpa_t gpa, unsigned long len); |
264 | struct kvm_memory_slot *gfn_to_memslot(struct kvm *kvm, gfn_t gfn); | 306 | struct kvm_memory_slot *gfn_to_memslot(struct kvm *kvm, gfn_t gfn); |
265 | int kvm_is_visible_gfn(struct kvm *kvm, gfn_t gfn); | 307 | int kvm_is_visible_gfn(struct kvm *kvm, gfn_t gfn); |
308 | unsigned long kvm_host_page_size(struct kvm *kvm, gfn_t gfn); | ||
266 | void mark_page_dirty(struct kvm *kvm, gfn_t gfn); | 309 | void mark_page_dirty(struct kvm *kvm, gfn_t gfn); |
267 | 310 | ||
268 | void kvm_vcpu_block(struct kvm_vcpu *vcpu); | 311 | void kvm_vcpu_block(struct kvm_vcpu *vcpu); |
312 | void kvm_vcpu_on_spin(struct kvm_vcpu *vcpu); | ||
269 | void kvm_resched(struct kvm_vcpu *vcpu); | 313 | void kvm_resched(struct kvm_vcpu *vcpu); |
270 | void kvm_load_guest_fpu(struct kvm_vcpu *vcpu); | 314 | void kvm_load_guest_fpu(struct kvm_vcpu *vcpu); |
271 | void kvm_put_guest_fpu(struct kvm_vcpu *vcpu); | 315 | void kvm_put_guest_fpu(struct kvm_vcpu *vcpu); |
@@ -325,7 +369,7 @@ int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu); | |||
325 | void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu); | 369 | void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu); |
326 | 370 | ||
327 | int kvm_arch_vcpu_reset(struct kvm_vcpu *vcpu); | 371 | int kvm_arch_vcpu_reset(struct kvm_vcpu *vcpu); |
328 | void kvm_arch_hardware_enable(void *garbage); | 372 | int kvm_arch_hardware_enable(void *garbage); |
329 | void kvm_arch_hardware_disable(void *garbage); | 373 | void kvm_arch_hardware_disable(void *garbage); |
330 | int kvm_arch_hardware_setup(void); | 374 | int kvm_arch_hardware_setup(void); |
331 | void kvm_arch_hardware_unsetup(void); | 375 | void kvm_arch_hardware_unsetup(void); |
@@ -362,6 +406,7 @@ struct kvm_assigned_dev_kernel { | |||
362 | struct work_struct interrupt_work; | 406 | struct work_struct interrupt_work; |
363 | struct list_head list; | 407 | struct list_head list; |
364 | int assigned_dev_id; | 408 | int assigned_dev_id; |
409 | int host_segnr; | ||
365 | int host_busnr; | 410 | int host_busnr; |
366 | int host_devfn; | 411 | int host_devfn; |
367 | unsigned int entries_nr; | 412 | unsigned int entries_nr; |
@@ -390,7 +435,12 @@ void kvm_unregister_irq_mask_notifier(struct kvm *kvm, int irq, | |||
390 | struct kvm_irq_mask_notifier *kimn); | 435 | struct kvm_irq_mask_notifier *kimn); |
391 | void kvm_fire_mask_notifiers(struct kvm *kvm, int irq, bool mask); | 436 | void kvm_fire_mask_notifiers(struct kvm *kvm, int irq, bool mask); |
392 | 437 | ||
393 | int kvm_set_irq(struct kvm *kvm, int irq_source_id, int irq, int level); | 438 | #ifdef __KVM_HAVE_IOAPIC |
439 | void kvm_get_intr_delivery_bitmask(struct kvm_ioapic *ioapic, | ||
440 | union kvm_ioapic_redirect_entry *entry, | ||
441 | unsigned long *deliver_bitmask); | ||
442 | #endif | ||
443 | int kvm_set_irq(struct kvm *kvm, int irq_source_id, u32 irq, int level); | ||
394 | void kvm_notify_acked_irq(struct kvm *kvm, unsigned irqchip, unsigned pin); | 444 | void kvm_notify_acked_irq(struct kvm *kvm, unsigned irqchip, unsigned pin); |
395 | void kvm_register_irq_ack_notifier(struct kvm *kvm, | 445 | void kvm_register_irq_ack_notifier(struct kvm *kvm, |
396 | struct kvm_irq_ack_notifier *kian); | 446 | struct kvm_irq_ack_notifier *kian); |
@@ -403,8 +453,7 @@ void kvm_free_irq_source_id(struct kvm *kvm, int irq_source_id); | |||
403 | #define KVM_IOMMU_CACHE_COHERENCY 0x1 | 453 | #define KVM_IOMMU_CACHE_COHERENCY 0x1 |
404 | 454 | ||
405 | #ifdef CONFIG_IOMMU_API | 455 | #ifdef CONFIG_IOMMU_API |
406 | int kvm_iommu_map_pages(struct kvm *kvm, gfn_t base_gfn, | 456 | int kvm_iommu_map_pages(struct kvm *kvm, struct kvm_memory_slot *slot); |
407 | unsigned long npages); | ||
408 | int kvm_iommu_map_guest(struct kvm *kvm); | 457 | int kvm_iommu_map_guest(struct kvm *kvm); |
409 | int kvm_iommu_unmap_guest(struct kvm *kvm); | 458 | int kvm_iommu_unmap_guest(struct kvm *kvm); |
410 | int kvm_assign_device(struct kvm *kvm, | 459 | int kvm_assign_device(struct kvm *kvm, |
@@ -454,11 +503,6 @@ static inline void kvm_guest_exit(void) | |||
454 | current->flags &= ~PF_VCPU; | 503 | current->flags &= ~PF_VCPU; |
455 | } | 504 | } |
456 | 505 | ||
457 | static inline int memslot_id(struct kvm *kvm, struct kvm_memory_slot *slot) | ||
458 | { | ||
459 | return slot - kvm->memslots; | ||
460 | } | ||
461 | |||
462 | static inline gpa_t gfn_to_gpa(gfn_t gfn) | 506 | static inline gpa_t gfn_to_gpa(gfn_t gfn) |
463 | { | 507 | { |
464 | return (gpa_t)gfn << PAGE_SHIFT; | 508 | return (gpa_t)gfn << PAGE_SHIFT; |
@@ -506,6 +550,10 @@ static inline int mmu_notifier_retry(struct kvm_vcpu *vcpu, unsigned long mmu_se | |||
506 | } | 550 | } |
507 | #endif | 551 | #endif |
508 | 552 | ||
553 | #ifndef KVM_ARCH_HAS_UNALIAS_INSTANTIATION | ||
554 | #define unalias_gfn_instantiation unalias_gfn | ||
555 | #endif | ||
556 | |||
509 | #ifdef CONFIG_HAVE_KVM_IRQCHIP | 557 | #ifdef CONFIG_HAVE_KVM_IRQCHIP |
510 | 558 | ||
511 | #define KVM_MAX_IRQ_ROUTES 1024 | 559 | #define KVM_MAX_IRQ_ROUTES 1024 |
@@ -552,4 +600,21 @@ static inline bool kvm_vcpu_is_bsp(struct kvm_vcpu *vcpu) | |||
552 | return vcpu->kvm->bsp_vcpu_id == vcpu->vcpu_id; | 600 | return vcpu->kvm->bsp_vcpu_id == vcpu->vcpu_id; |
553 | } | 601 | } |
554 | #endif | 602 | #endif |
603 | |||
604 | #ifdef __KVM_HAVE_DEVICE_ASSIGNMENT | ||
605 | |||
606 | long kvm_vm_ioctl_assigned_device(struct kvm *kvm, unsigned ioctl, | ||
607 | unsigned long arg); | ||
608 | |||
609 | #else | ||
610 | |||
611 | static inline long kvm_vm_ioctl_assigned_device(struct kvm *kvm, unsigned ioctl, | ||
612 | unsigned long arg) | ||
613 | { | ||
614 | return -ENOTTY; | ||
615 | } | ||
616 | |||
555 | #endif | 617 | #endif |
618 | |||
619 | #endif | ||
620 | |||