Blame view
include/linux/kvm_host.h
20 KB
edf884172 KVM: Move arch de... |
1 2 |
#ifndef __KVM_HOST_H #define __KVM_HOST_H |
6aa8b732c [PATCH] kvm: user... |
3 4 5 6 7 8 9 |
/* * This work is licensed under the terms of the GNU GPL, version 2. See * the COPYING file in the top-level directory. */ #include <linux/types.h> |
e56a7a28e KVM: Use virtual ... |
10 |
#include <linux/hardirq.h> |
6aa8b732c [PATCH] kvm: user... |
11 12 13 |
#include <linux/list.h> #include <linux/mutex.h> #include <linux/spinlock.h> |
06ff0d372 KVM: Fix includes |
14 15 |
#include <linux/signal.h> #include <linux/sched.h> |
6aa8b732c [PATCH] kvm: user... |
16 |
#include <linux/mm.h> |
15ad71460 KVM: Use the sche... |
17 |
#include <linux/preempt.h> |
0937c48d0 KVM: Add fields f... |
18 |
#include <linux/msi.h> |
d89f5eff7 KVM: Clean up vm ... |
19 |
#include <linux/slab.h> |
bd2b53b20 KVM: fast-path ms... |
20 |
#include <linux/rcupdate.h> |
e8edc6e03 Detach sched.h fr... |
21 |
#include <asm/signal.h> |
6aa8b732c [PATCH] kvm: user... |
22 |
|
6aa8b732c [PATCH] kvm: user... |
23 |
#include <linux/kvm.h> |
102d8325a KVM: add MSR base... |
24 |
#include <linux/kvm_para.h> |
6aa8b732c [PATCH] kvm: user... |
25 |
|
edf884172 KVM: Move arch de... |
26 |
#include <linux/kvm_types.h> |
d77a39d98 KVM: Portability:... |
27 |
|
edf884172 KVM: Move arch de... |
28 |
#include <asm/kvm_host.h> |
d657a98e3 KVM: Portability:... |
29 |
|
6aa8b732c [PATCH] kvm: user... |
30 |
/* |
d9e368d61 KVM: Flush remote... |
31 32 |
* vcpu->requests bit members */ |
3176bc3e5 KVM: Rename KVM_T... |
33 |
#define KVM_REQ_TLB_FLUSH 0 |
2f52d58c9 KVM: Move apic ti... |
34 |
#define KVM_REQ_MIGRATE_TIMER 1 |
b209749f5 KVM: local APIC T... |
35 |
#define KVM_REQ_REPORT_TPR_ACCESS 2 |
2e53d63ac KVM: MMU: ignore ... |
36 |
#define KVM_REQ_MMU_RELOAD 3 |
71c4dfafc KVM: detect if VC... |
37 |
#define KVM_REQ_TRIPLE_FAULT 4 |
06e056456 KVM: close timer ... |
38 |
#define KVM_REQ_PENDING_TIMER 5 |
d76901750 KVM: x86: do not ... |
39 |
#define KVM_REQ_UNHALT 6 |
4731d4c7a KVM: MMU: out of ... |
40 |
#define KVM_REQ_MMU_SYNC 7 |
34c238a1d KVM: x86: Rename ... |
41 |
#define KVM_REQ_CLOCK_UPDATE 8 |
32f884006 KVM: use smp_send... |
42 |
#define KVM_REQ_KICK 9 |
02daab21d KVM: Lazify fpu a... |
43 |
#define KVM_REQ_DEACTIVATE_FPU 10 |
3842d135f KVM: Check for pe... |
44 |
#define KVM_REQ_EVENT 11 |
af585b921 KVM: Halt vcpu if... |
45 |
#define KVM_REQ_APF_HALT 12 |
f86368493 KVM: Fix race bet... |
46 |
#define KVM_REQ_NMI 13 |
6aa8b732c [PATCH] kvm: user... |
47 |
|
5550af4df KVM: Fix guest sh... |
48 |
#define KVM_USERSPACE_IRQ_SOURCE_ID 0 |
6c4746945 KVM: convert bus ... |
49 |
struct kvm; |
6aa8b732c [PATCH] kvm: user... |
50 |
struct kvm_vcpu; |
c16f862d0 KVM: Use kmem cac... |
51 |
extern struct kmem_cache *kvm_vcpu_cache; |
6aa8b732c [PATCH] kvm: user... |
52 |
|
2eeb2e94e KVM: Adds support... |
53 54 55 56 57 58 59 60 |
/* * It would be nice to use something smarter than a linear search, TBD... * Thankfully we dont expect many devices to register (famous last words :), * so until then it will suffice. At least its abstracted so we can change * in one place. */ struct kvm_io_bus { int dev_count; |
e80e2a60f KVM: Increase NR_... |
61 |
#define NR_IOBUS_DEVS 200 |
2eeb2e94e KVM: Adds support... |
62 63 |
struct kvm_io_device *devs[NR_IOBUS_DEVS]; }; |
e93f8a0f8 KVM: convert io_b... |
64 65 66 67 68 69 70 71 72 |
enum kvm_bus { KVM_MMIO_BUS, KVM_PIO_BUS, KVM_NR_BUSES }; int kvm_io_bus_write(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr, int len, const void *val); int kvm_io_bus_read(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr, int len, |
bda9020e2 KVM: remove in_ra... |
73 |
void *val); |
e93f8a0f8 KVM: convert io_b... |
74 |
int kvm_io_bus_register_dev(struct kvm *kvm, enum kvm_bus bus_idx, |
090b7aff2 KVM: make io_bus ... |
75 |
struct kvm_io_device *dev); |
e93f8a0f8 KVM: convert io_b... |
76 77 |
int kvm_io_bus_unregister_dev(struct kvm *kvm, enum kvm_bus bus_idx, struct kvm_io_device *dev); |
2eeb2e94e KVM: Adds support... |
78 |
|
af585b921 KVM: Halt vcpu if... |
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
#ifdef CONFIG_KVM_ASYNC_PF struct kvm_async_pf { struct work_struct work; struct list_head link; struct list_head queue; struct kvm_vcpu *vcpu; struct mm_struct *mm; gva_t gva; unsigned long addr; struct kvm_arch_async_pf arch; struct page *page; bool done; }; void kvm_clear_async_pf_completion_queue(struct kvm_vcpu *vcpu); void kvm_check_async_pf_completion(struct kvm_vcpu *vcpu); int kvm_setup_async_pf(struct kvm_vcpu *vcpu, gva_t gva, gfn_t gfn, struct kvm_arch_async_pf *arch); |
344d9588a KVM: Add PV MSR t... |
97 |
int kvm_async_pf_wakeup_all(struct kvm_vcpu *vcpu); |
af585b921 KVM: Halt vcpu if... |
98 |
#endif |
6b7e2d099 KVM: Add "exiting... |
99 100 101 102 103 |
enum { OUTSIDE_GUEST_MODE, IN_GUEST_MODE, EXITING_GUEST_MODE }; |
d17fbbf73 KVM: Portability:... |
104 105 |
struct kvm_vcpu { struct kvm *kvm; |
31bb117eb KVM: Use CONFIG_P... |
106 |
#ifdef CONFIG_PREEMPT_NOTIFIERS |
d17fbbf73 KVM: Portability:... |
107 |
struct preempt_notifier preempt_notifier; |
31bb117eb KVM: Use CONFIG_P... |
108 |
#endif |
6b7e2d099 KVM: Add "exiting... |
109 |
int cpu; |
d17fbbf73 KVM: Portability:... |
110 |
int vcpu_id; |
6b7e2d099 KVM: Add "exiting... |
111 112 |
int srcu_idx; int mode; |
d17fbbf73 KVM: Portability:... |
113 |
unsigned long requests; |
d0bfb940e KVM: New guest de... |
114 |
unsigned long guest_debug; |
6b7e2d099 KVM: Add "exiting... |
115 116 117 |
struct mutex mutex; struct kvm_run *run; |
f656ce018 KVM: switch vcpu ... |
118 |
|
d17fbbf73 KVM: Portability:... |
119 |
int fpu_active; |
2acf923e3 KVM: VMX: Enable ... |
120 |
int guest_fpu_loaded, guest_xcr0_loaded; |
d17fbbf73 KVM: Portability:... |
121 |
wait_queue_head_t wq; |
34bb10b79 KVM: keep track o... |
122 |
struct pid *pid; |
d17fbbf73 KVM: Portability:... |
123 124 125 |
int sigset_active; sigset_t sigset; struct kvm_vcpu_stat stat; |
34c16eecf KVM: Portability:... |
126 |
#ifdef CONFIG_HAS_IOMEM |
d17fbbf73 KVM: Portability:... |
127 128 129 130 131 |
int mmio_needed; int mmio_read_completed; int mmio_is_write; int mmio_size; unsigned char mmio_data[8]; |
6aa8b732c [PATCH] kvm: user... |
132 |
gpa_t mmio_phys_addr; |
34c16eecf KVM: Portability:... |
133 |
#endif |
1165f5fec KVM: Per-vcpu sta... |
134 |
|
af585b921 KVM: Halt vcpu if... |
135 136 137 138 139 140 141 142 |
#ifdef CONFIG_KVM_ASYNC_PF struct { u32 queued; struct list_head queue; struct list_head done; spinlock_t lock; } async_pf; #endif |
d657a98e3 KVM: Portability:... |
143 144 |
struct kvm_vcpu_arch arch; }; |
6b7e2d099 KVM: Add "exiting... |
145 146 147 148 |
static inline int kvm_vcpu_exiting_guest_mode(struct kvm_vcpu *vcpu) { return cmpxchg(&vcpu->mode, IN_GUEST_MODE, EXITING_GUEST_MODE); } |
660c22c42 KVM: limit the nu... |
149 150 151 152 153 |
/* * Some of the bitops functions do not support too long bitmaps. * This number must be determined not to exceed such limits. */ #define KVM_MEM_MAX_NR_PAGES ((1UL << 31) - 1) |
d4dbf4700 KVM: MMU: Make th... |
154 155 156 157 |
struct kvm_lpage_info { unsigned long rmap_pde; int write_count; }; |
6aa8b732c [PATCH] kvm: user... |
158 159 160 161 |
struct kvm_memory_slot { gfn_t base_gfn; unsigned long npages; unsigned long flags; |
290fc38da KVM: Remove the u... |
162 |
unsigned long *rmap; |
6aa8b732c [PATCH] kvm: user... |
163 |
unsigned long *dirty_bitmap; |
515a01279 KVM: pre-allocate... |
164 |
unsigned long *dirty_bitmap_head; |
d4dbf4700 KVM: MMU: Make th... |
165 |
struct kvm_lpage_info *lpage_info[KVM_NR_PAGE_SIZES - 1]; |
8a7ae055f KVM: MMU: Partial... |
166 |
unsigned long userspace_addr; |
80b14b5b3 KVM: Unmap kernel... |
167 |
int user_alloc; |
e36d96f7c KVM: Keep slot ID... |
168 |
int id; |
6aa8b732c [PATCH] kvm: user... |
169 |
}; |
87bf6e7de KVM: fix the hand... |
170 171 172 173 |
static inline unsigned long kvm_dirty_bitmap_bytes(struct kvm_memory_slot *memslot) { return ALIGN(memslot->npages, BITS_PER_LONG) / 8; } |
399ec807d KVM: Userspace co... |
174 175 |
struct kvm_kernel_irq_routing_entry { u32 gsi; |
5116d8f6b KVM: fix ack not ... |
176 |
u32 type; |
4925663a0 KVM: Report IRQ i... |
177 |
int (*set)(struct kvm_kernel_irq_routing_entry *e, |
1a6e4a8c2 KVM: Move irq sha... |
178 |
struct kvm *kvm, int irq_source_id, int level); |
399ec807d KVM: Userspace co... |
179 180 181 182 183 |
union { struct { unsigned irqchip; unsigned pin; } irqchip; |
79950e107 KVM: Use irq rout... |
184 |
struct msi_msg msi; |
399ec807d KVM: Userspace co... |
185 |
}; |
46e624b95 KVM: Change irq r... |
186 187 |
struct hlist_node link; }; |
3e71f88bc KVM: Maintain bac... |
188 |
#ifdef __KVM_HAVE_IOAPIC |
46e624b95 KVM: Change irq r... |
189 |
struct kvm_irq_routing_table { |
3e71f88bc KVM: Maintain bac... |
190 |
int chip[KVM_NR_IRQCHIPS][KVM_IOAPIC_NUM_PINS]; |
46e624b95 KVM: Change irq r... |
191 192 193 194 195 196 197 |
struct kvm_kernel_irq_routing_entry *rt_entries; u32 nr_rt_entries; /* * Array indexed by gsi. Each entry contains list of irq chips * the gsi is connected to. */ struct hlist_head map[0]; |
399ec807d KVM: Userspace co... |
198 |
}; |
3e71f88bc KVM: Maintain bac... |
199 200 201 202 203 |
#else struct kvm_irq_routing_table {}; #endif |
46a26bf55 KVM: modify memsl... |
204 205 |
struct kvm_memslots { int nmemslots; |
49c7754ce KVM: Add memory s... |
206 |
u64 generation; |
46a26bf55 KVM: modify memsl... |
207 208 209 |
struct kvm_memory_slot memslots[KVM_MEMORY_SLOTS + KVM_PRIVATE_MEM_SLOTS]; }; |
6aa8b732c [PATCH] kvm: user... |
210 |
struct kvm { |
aaee2c94f KVM: MMU: Switch ... |
211 |
spinlock_t mmu_lock; |
79fac95ec KVM: convert slot... |
212 |
struct mutex slots_lock; |
6d4e4c4fc KVM: Disallow for... |
213 |
struct mm_struct *mm; /* userspace tied to this vm */ |
46a26bf55 KVM: modify memsl... |
214 |
struct kvm_memslots *memslots; |
bc6678a33 KVM: introduce kv... |
215 |
struct srcu_struct srcu; |
73880c80a KVM: Break depend... |
216 217 |
#ifdef CONFIG_KVM_APIC_ARCHITECTURE u32 bsp_vcpu_id; |
c5af89b68 KVM: Introduce kv... |
218 |
struct kvm_vcpu *bsp_vcpu; |
73880c80a KVM: Break depend... |
219 |
#endif |
fb3f0f51d KVM: Dynamically ... |
220 |
struct kvm_vcpu *vcpus[KVM_MAX_VCPUS]; |
73880c80a KVM: Break depend... |
221 |
atomic_t online_vcpus; |
217ece612 KVM: use yield_to... |
222 |
int last_boosted_vcpu; |
133de9021 [PATCH] KVM: Add ... |
223 |
struct list_head vm_list; |
60eead79a KVM: introduce ir... |
224 |
struct mutex lock; |
e93f8a0f8 KVM: convert io_b... |
225 |
struct kvm_io_bus *buses[KVM_NR_BUSES]; |
721eecbf4 KVM: irqfd |
226 227 228 229 230 |
#ifdef CONFIG_HAVE_KVM_EVENTFD struct { spinlock_t lock; struct list_head items; } irqfds; |
d34e6b175 KVM: add ioeventf... |
231 |
struct list_head ioeventfds; |
721eecbf4 KVM: irqfd |
232 |
#endif |
ba1389b7a KVM: Extend stats... |
233 |
struct kvm_vm_stat stat; |
d69fb81f0 KVM: Portability:... |
234 |
struct kvm_arch arch; |
d39f13b0d KVM: add vm refco... |
235 |
atomic_t users_count; |
5f94c1741 KVM: Add coalesce... |
236 237 238 239 |
#ifdef KVM_COALESCED_MMIO_PAGE_OFFSET struct kvm_coalesced_mmio_dev *coalesced_mmio_dev; struct kvm_coalesced_mmio_ring *coalesced_mmio_ring; #endif |
e930bffe9 KVM: Synchronize ... |
240 |
|
60eead79a KVM: introduce ir... |
241 |
struct mutex irq_lock; |
75858a84a KVM: Interrupt ma... |
242 |
#ifdef CONFIG_HAVE_KVM_IRQCHIP |
bd2b53b20 KVM: fast-path ms... |
243 244 245 246 |
/* * Update side is protected by irq_lock and, * if configured, irqfds.lock. */ |
4b6a2872a kvm: add __rcu an... |
247 |
struct kvm_irq_routing_table __rcu *irq_routing; |
75858a84a KVM: Interrupt ma... |
248 |
struct hlist_head mask_notifier_list; |
136bdfeee KVM: Move irq ack... |
249 |
struct hlist_head irq_ack_notifier_list; |
75858a84a KVM: Interrupt ma... |
250 |
#endif |
e930bffe9 KVM: Synchronize ... |
251 252 253 254 255 |
#ifdef KVM_ARCH_WANT_MMU_NOTIFIER struct mmu_notifier mmu_notifier; unsigned long mmu_notifier_seq; long mmu_notifier_count; #endif |
5c663a153 KVM: Fix build er... |
256 |
long tlbs_dirty; |
6aa8b732c [PATCH] kvm: user... |
257 |
}; |
f02424785 KVM: Add and use ... |
258 259 260 261 262 263 |
/* The guest did something we don't support. */ #define pr_unimpl(vcpu, fmt, ...) \ do { \ if (printk_ratelimit()) \ printk(KERN_ERR "kvm: %i: cpu%i " fmt, \ current->tgid, (vcpu)->vcpu_id , ## __VA_ARGS__); \ |
d77c26fce KVM: CodingStyle ... |
264 |
} while (0) |
f02424785 KVM: Add and use ... |
265 |
|
6aa8b732c [PATCH] kvm: user... |
266 267 |
#define kvm_printf(kvm, fmt ...) printk(KERN_DEBUG fmt) #define vcpu_printf(vcpu, fmt...) kvm_printf(vcpu->kvm, fmt) |
988a2cae6 KVM: Use macro to... |
268 269 270 271 272 273 274 275 276 277 |
static inline struct kvm_vcpu *kvm_get_vcpu(struct kvm *kvm, int i) { smp_rmb(); return kvm->vcpus[i]; } #define kvm_for_each_vcpu(idx, vcpup, kvm) \ for (idx = 0, vcpup = kvm_get_vcpu(kvm, idx); \ idx < atomic_read(&kvm->online_vcpus) && vcpup; \ vcpup = kvm_get_vcpu(kvm, ++idx)) |
fb3f0f51d KVM: Dynamically ... |
278 279 |
int kvm_vcpu_init(struct kvm_vcpu *vcpu, struct kvm *kvm, unsigned id); void kvm_vcpu_uninit(struct kvm_vcpu *vcpu); |
313a3dc75 KVM: Portability:... |
280 281 |
void vcpu_load(struct kvm_vcpu *vcpu); void vcpu_put(struct kvm_vcpu *vcpu); |
0ee75bead KVM: Let vcpu str... |
282 |
int kvm_init(void *opaque, unsigned vcpu_size, unsigned vcpu_align, |
c16f862d0 KVM: Use kmem cac... |
283 |
struct module *module); |
cb498ea2c KVM: Portability:... |
284 |
void kvm_exit(void); |
6aa8b732c [PATCH] kvm: user... |
285 |
|
d39f13b0d KVM: add vm refco... |
286 287 |
void kvm_get_kvm(struct kvm *kvm); void kvm_put_kvm(struct kvm *kvm); |
90d83dc3d KVM: use the corr... |
288 289 290 291 292 293 |
static inline struct kvm_memslots *kvm_memslots(struct kvm *kvm) { return rcu_dereference_check(kvm->memslots, srcu_read_lock_held(&kvm->srcu) || lockdep_is_held(&kvm->slots_lock)); } |
6aa8b732c [PATCH] kvm: user... |
294 295 296 |
#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; } |
6aa8b732c [PATCH] kvm: user... |
297 |
|
cea7bb212 KVM: MMU: Make gf... |
298 |
extern struct page *bad_page; |
35149e212 KVM: MMU: Don't a... |
299 |
extern pfn_t bad_pfn; |
6aa8b732c [PATCH] kvm: user... |
300 |
|
cea7bb212 KVM: MMU: Make gf... |
301 |
int is_error_page(struct page *page); |
35149e212 KVM: MMU: Don't a... |
302 |
int is_error_pfn(pfn_t pfn); |
bf998156d KVM: Avoid killin... |
303 |
int is_hwpoison_pfn(pfn_t pfn); |
edba23e51 KVM: Return EFAUL... |
304 |
int is_fault_pfn(pfn_t pfn); |
f9d46eb0e KVM: add kvm_is_e... |
305 |
int kvm_is_error_hva(unsigned long addr); |
210c7c4d7 KVM: Export memor... |
306 307 308 |
int kvm_set_memory_region(struct kvm *kvm, struct kvm_userspace_memory_region *mem, int user_alloc); |
f78e0e2ee KVM: VMX: Enable ... |
309 310 311 |
int __kvm_set_memory_region(struct kvm *kvm, struct kvm_userspace_memory_region *mem, int user_alloc); |
f7784b8ec KVM: split kvm_ar... |
312 313 314 315 316 317 |
int kvm_arch_prepare_memory_region(struct kvm *kvm, struct kvm_memory_slot *memslot, struct kvm_memory_slot old, struct kvm_userspace_memory_region *mem, int user_alloc); void kvm_arch_commit_memory_region(struct kvm *kvm, |
0de10343b KVM: Portability:... |
318 319 320 |
struct kvm_userspace_memory_region *mem, struct kvm_memory_slot old, int user_alloc); |
54dee9933 KVM: VMX: conditi... |
321 |
void kvm_disable_largepages(void); |
34d4cb8fc KVM: MMU: nuke sh... |
322 |
void kvm_arch_flush_shadow(struct kvm *kvm); |
a983fb238 KVM: x86: switch ... |
323 |
|
48987781e KVM: MMU: introdu... |
324 325 |
int gfn_to_page_many_atomic(struct kvm *kvm, gfn_t gfn, struct page **pages, int nr_pages); |
954bbbc23 KVM: Simply gfn_t... |
326 |
struct page *gfn_to_page(struct kvm *kvm, gfn_t gfn); |
05da45583 KVM: MMU: large p... |
327 |
unsigned long gfn_to_hva(struct kvm *kvm, gfn_t gfn); |
b4231d618 KVM: MMU: Selecti... |
328 329 |
void kvm_release_page_clean(struct page *page); void kvm_release_page_dirty(struct page *page); |
35149e212 KVM: MMU: Don't a... |
330 331 |
void kvm_set_page_dirty(struct page *page); void kvm_set_page_accessed(struct page *page); |
887c08ac1 KVM: MMU: introdu... |
332 |
pfn_t hva_to_pfn_atomic(struct kvm *kvm, unsigned long addr); |
365fb3fdf KVM: MMU: rewrite... |
333 |
pfn_t gfn_to_pfn_atomic(struct kvm *kvm, gfn_t gfn); |
612819c3c KVM: propagate fa... |
334 335 |
pfn_t gfn_to_pfn_async(struct kvm *kvm, gfn_t gfn, bool *async, bool write_fault, bool *writable); |
35149e212 KVM: MMU: Don't a... |
336 |
pfn_t gfn_to_pfn(struct kvm *kvm, gfn_t gfn); |
612819c3c KVM: propagate fa... |
337 338 |
pfn_t gfn_to_pfn_prot(struct kvm *kvm, gfn_t gfn, bool write_fault, bool *writable); |
506f0d6f9 KVM: introduce gf... |
339 340 |
pfn_t gfn_to_pfn_memslot(struct kvm *kvm, struct kvm_memory_slot *slot, gfn_t gfn); |
bc6678a33 KVM: introduce kv... |
341 |
int memslot_id(struct kvm *kvm, gfn_t gfn); |
35149e212 KVM: MMU: Don't a... |
342 343 344 345 346 |
void kvm_release_pfn_dirty(pfn_t); void kvm_release_pfn_clean(pfn_t pfn); void kvm_set_pfn_dirty(pfn_t pfn); void kvm_set_pfn_accessed(pfn_t pfn); void kvm_get_pfn(pfn_t pfn); |
195aefde9 KVM: Add general ... |
347 348 |
int kvm_read_guest_page(struct kvm *kvm, gfn_t gfn, void *data, int offset, int len); |
7ec545882 KVM: Add kvm_read... |
349 350 |
int kvm_read_guest_atomic(struct kvm *kvm, gpa_t gpa, void *data, unsigned long len); |
195aefde9 KVM: Add general ... |
351 352 353 354 355 |
int kvm_read_guest(struct kvm *kvm, gpa_t gpa, void *data, unsigned long len); int kvm_write_guest_page(struct kvm *kvm, gfn_t gfn, const void *data, int offset, int len); int kvm_write_guest(struct kvm *kvm, gpa_t gpa, const void *data, unsigned long len); |
49c7754ce KVM: Add memory s... |
356 357 358 359 |
int kvm_write_guest_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc, void *data, unsigned long len); int kvm_gfn_to_hva_cache_init(struct kvm *kvm, struct gfn_to_hva_cache *ghc, gpa_t gpa); |
195aefde9 KVM: Add general ... |
360 361 |
int kvm_clear_guest_page(struct kvm *kvm, gfn_t gfn, int offset, int len); int kvm_clear_guest(struct kvm *kvm, gpa_t gpa, unsigned long len); |
6aa8b732c [PATCH] kvm: user... |
362 |
struct kvm_memory_slot *gfn_to_memslot(struct kvm *kvm, gfn_t gfn); |
e0d62c7f4 KVM: Add kernel-i... |
363 |
int kvm_is_visible_gfn(struct kvm *kvm, gfn_t gfn); |
8f0b1ab6f KVM: Introduce kv... |
364 |
unsigned long kvm_host_page_size(struct kvm *kvm, gfn_t gfn); |
6aa8b732c [PATCH] kvm: user... |
365 |
void mark_page_dirty(struct kvm *kvm, gfn_t gfn); |
49c7754ce KVM: Add memory s... |
366 367 |
void mark_page_dirty_in_slot(struct kvm *kvm, struct kvm_memory_slot *memslot, gfn_t gfn); |
6aa8b732c [PATCH] kvm: user... |
368 |
|
8776e5194 KVM: Portability:... |
369 |
void kvm_vcpu_block(struct kvm_vcpu *vcpu); |
d255f4f2b KVM: introduce kv... |
370 |
void kvm_vcpu_on_spin(struct kvm_vcpu *vcpu); |
6aa8b732c [PATCH] kvm: user... |
371 |
void kvm_resched(struct kvm_vcpu *vcpu); |
7702fd1f6 KVM: Prevent gues... |
372 373 |
void kvm_load_guest_fpu(struct kvm_vcpu *vcpu); void kvm_put_guest_fpu(struct kvm_vcpu *vcpu); |
a4ee1ca4a KVM: MMU: delay f... |
374 |
|
d9e368d61 KVM: Flush remote... |
375 |
void kvm_flush_remote_tlbs(struct kvm *kvm); |
2e53d63ac KVM: MMU: ignore ... |
376 |
void kvm_reload_remote_mmus(struct kvm *kvm); |
6aa8b732c [PATCH] kvm: user... |
377 |
|
043405e10 KVM: Move x86 msr... |
378 379 |
long kvm_arch_dev_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg); |
313a3dc75 KVM: Portability:... |
380 381 |
long kvm_arch_vcpu_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg); |
018d00d2f KVM: Portability:... |
382 383 |
int kvm_dev_ioctl_check_extension(long ext); |
5bb064dcd KVM: Portability:... |
384 385 386 387 |
int kvm_get_dirty_log(struct kvm *kvm, struct kvm_dirty_log *log, int *is_dirty); int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, struct kvm_dirty_log *log); |
1fe779f8e KVM: Portability:... |
388 389 390 391 392 393 |
int kvm_vm_ioctl_set_memory_region(struct kvm *kvm, struct kvm_userspace_memory_region *mem, int user_alloc); long kvm_arch_vm_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg); |
313a3dc75 KVM: Portability:... |
394 |
|
d07520607 KVM: Portability:... |
395 396 |
int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu); int kvm_arch_vcpu_ioctl_set_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu); |
8b0067913 KVM: Portability:... |
397 398 |
int kvm_arch_vcpu_ioctl_translate(struct kvm_vcpu *vcpu, struct kvm_translation *tr); |
b6c7a5dcc KVM: Portability:... |
399 400 401 402 403 404 |
int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs); int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs); int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs); int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs); |
62d9f0dbc KVM: add ioctls t... |
405 406 407 408 |
int kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu, struct kvm_mp_state *mp_state); int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu, struct kvm_mp_state *mp_state); |
d0bfb940e KVM: New guest de... |
409 410 |
int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu, struct kvm_guest_debug *dbg); |
b6c7a5dcc KVM: Portability:... |
411 |
int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run); |
f8c16bbaa KVM: Portability:... |
412 413 |
int kvm_arch_init(void *opaque); void kvm_arch_exit(void); |
043405e10 KVM: Move x86 msr... |
414 |
|
e9b11c175 KVM: Portability:... |
415 416 417 418 419 420 421 |
int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu); void kvm_arch_vcpu_uninit(struct kvm_vcpu *vcpu); void kvm_arch_vcpu_free(struct kvm_vcpu *vcpu); void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu); void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu); struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm, unsigned int id); |
26e5215fd KVM: Split vcpu c... |
422 |
int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu); |
d40ccc624 KVM: Correct cons... |
423 |
void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu); |
e9b11c175 KVM: Portability:... |
424 425 |
int kvm_arch_vcpu_reset(struct kvm_vcpu *vcpu); |
10474ae89 KVM: Activate Vir... |
426 |
int kvm_arch_hardware_enable(void *garbage); |
e9b11c175 KVM: Portability:... |
427 428 429 430 |
void kvm_arch_hardware_disable(void *garbage); int kvm_arch_hardware_setup(void); void kvm_arch_hardware_unsetup(void); void kvm_arch_check_processor_compat(void *rtn); |
1d737c8a6 KVM: Portability:... |
431 |
int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu); |
e9b11c175 KVM: Portability:... |
432 |
|
d19a9cd27 KVM: Portability:... |
433 |
void kvm_free_physmem(struct kvm *kvm); |
d89f5eff7 KVM: Clean up vm ... |
434 435 436 437 438 439 440 441 442 443 444 445 446 |
#ifndef __KVM_HAVE_ARCH_VM_ALLOC static inline struct kvm *kvm_arch_alloc_vm(void) { return kzalloc(sizeof(struct kvm), GFP_KERNEL); } static inline void kvm_arch_free_vm(struct kvm *kvm) { kfree(kvm); } #endif int kvm_arch_init_vm(struct kvm *kvm); |
d19a9cd27 KVM: Portability:... |
447 |
void kvm_arch_destroy_vm(struct kvm *kvm); |
8a98f6648 KVM: Move device ... |
448 |
void kvm_free_all_assigned_devices(struct kvm *kvm); |
ad8ba2cd4 KVM: Add kvm_arch... |
449 |
void kvm_arch_sync_events(struct kvm *kvm); |
e9b11c175 KVM: Portability:... |
450 |
|
3d80840d9 KVM: hlt emulatio... |
451 |
int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu); |
5736199af KVM: Move kvm_vcp... |
452 |
void kvm_vcpu_kick(struct kvm_vcpu *vcpu); |
682c59a3f KVM: Portability:... |
453 |
|
c77fb9dc7 KVM: Change is_mm... |
454 |
int kvm_is_mmio_pfn(pfn_t pfn); |
62c476c7c KVM: Device Assig... |
455 456 457 458 459 460 461 462 |
struct kvm_irq_ack_notifier { struct hlist_node link; unsigned gsi; void (*irq_acked)(struct kvm_irq_ack_notifier *kian); }; struct kvm_assigned_dev_kernel { struct kvm_irq_ack_notifier ack_notifier; |
62c476c7c KVM: Device Assig... |
463 464 |
struct list_head list; int assigned_dev_id; |
ab9f4ecbb KVM: enable PCI m... |
465 |
int host_segnr; |
62c476c7c KVM: Device Assig... |
466 467 |
int host_busnr; int host_devfn; |
c1e015142 KVM: Ioctls for i... |
468 |
unsigned int entries_nr; |
62c476c7c KVM: Device Assig... |
469 |
int host_irq; |
defaf1587 KVM: fix handling... |
470 |
bool host_irq_disabled; |
c1e015142 KVM: Ioctls for i... |
471 |
struct msix_entry *host_msix_entries; |
62c476c7c KVM: Device Assig... |
472 |
int guest_irq; |
0645211c4 KVM: Switch assig... |
473 |
struct msix_entry *guest_msix_entries; |
4f906c19a KVM: Replace irq_... |
474 |
unsigned long irq_requested_type; |
5550af4df KVM: Fix guest sh... |
475 |
int irq_source_id; |
b653574a7 Deassign device i... |
476 |
int flags; |
62c476c7c KVM: Device Assig... |
477 478 |
struct pci_dev *dev; struct kvm *kvm; |
0645211c4 KVM: Switch assig... |
479 |
spinlock_t intx_lock; |
1e001d49f KVM: Refactor IRQ... |
480 |
char irq_name[32]; |
62c476c7c KVM: Device Assig... |
481 |
}; |
75858a84a KVM: Interrupt ma... |
482 483 484 485 486 487 488 489 490 491 492 |
struct kvm_irq_mask_notifier { void (*func)(struct kvm_irq_mask_notifier *kimn, bool masked); int irq; struct hlist_node link; }; void kvm_register_irq_mask_notifier(struct kvm *kvm, int irq, struct kvm_irq_mask_notifier *kimn); void kvm_unregister_irq_mask_notifier(struct kvm *kvm, int irq, struct kvm_irq_mask_notifier *kimn); |
4a994358b KVM: Convert mask... |
493 494 |
void kvm_fire_mask_notifiers(struct kvm *kvm, unsigned irqchip, unsigned pin, bool mask); |
75858a84a KVM: Interrupt ma... |
495 |
|
46e624b95 KVM: Change irq r... |
496 497 498 499 500 501 |
#ifdef __KVM_HAVE_IOAPIC void kvm_get_intr_delivery_bitmask(struct kvm_ioapic *ioapic, union kvm_ioapic_redirect_entry *entry, unsigned long *deliver_bitmask); #endif int kvm_set_irq(struct kvm *kvm, int irq_source_id, u32 irq, int level); |
bd2b53b20 KVM: fast-path ms... |
502 503 |
int kvm_set_msi(struct kvm_kernel_irq_routing_entry *irq_entry, struct kvm *kvm, int irq_source_id, int level); |
44882eed2 KVM: make irq ack... |
504 |
void kvm_notify_acked_irq(struct kvm *kvm, unsigned irqchip, unsigned pin); |
3de42dc09 KVM: Separate irq... |
505 506 |
void kvm_register_irq_ack_notifier(struct kvm *kvm, struct kvm_irq_ack_notifier *kian); |
fa40a8214 KVM: switch irq i... |
507 508 |
void kvm_unregister_irq_ack_notifier(struct kvm *kvm, struct kvm_irq_ack_notifier *kian); |
5550af4df KVM: Fix guest sh... |
509 510 |
int kvm_request_irq_source_id(struct kvm *kvm); void kvm_free_irq_source_id(struct kvm *kvm, int irq_source_id); |
62c476c7c KVM: Device Assig... |
511 |
|
522c68c44 KVM: Enable snoop... |
512 513 |
/* For vcpu->arch.iommu_flags */ #define KVM_IOMMU_CACHE_COHERENCY 0x1 |
19de40a84 KVM: change KVM t... |
514 |
#ifdef CONFIG_IOMMU_API |
3ad26d813 KVM: use gfn_to_p... |
515 |
int kvm_iommu_map_pages(struct kvm *kvm, struct kvm_memory_slot *slot); |
260782bcf KVM: use the new ... |
516 |
int kvm_iommu_map_guest(struct kvm *kvm); |
62c476c7c KVM: Device Assig... |
517 |
int kvm_iommu_unmap_guest(struct kvm *kvm); |
260782bcf KVM: use the new ... |
518 519 |
int kvm_assign_device(struct kvm *kvm, struct kvm_assigned_dev_kernel *assigned_dev); |
0a9203567 KVM: support devi... |
520 521 |
int kvm_deassign_device(struct kvm *kvm, struct kvm_assigned_dev_kernel *assigned_dev); |
19de40a84 KVM: change KVM t... |
522 |
#else /* CONFIG_IOMMU_API */ |
62c476c7c KVM: Device Assig... |
523 |
static inline int kvm_iommu_map_pages(struct kvm *kvm, |
d7a79b6c8 KVM: Fix signatur... |
524 |
struct kvm_memory_slot *slot) |
62c476c7c KVM: Device Assig... |
525 526 527 |
{ return 0; } |
260782bcf KVM: use the new ... |
528 |
static inline int kvm_iommu_map_guest(struct kvm *kvm) |
62c476c7c KVM: Device Assig... |
529 530 531 532 533 534 535 536 |
{ return -ENODEV; } static inline int kvm_iommu_unmap_guest(struct kvm *kvm) { return 0; } |
260782bcf KVM: use the new ... |
537 538 539 540 541 542 |
static inline int kvm_assign_device(struct kvm *kvm, struct kvm_assigned_dev_kernel *assigned_dev) { return 0; } |
0a9203567 KVM: support devi... |
543 544 545 546 547 548 |
static inline int kvm_deassign_device(struct kvm *kvm, struct kvm_assigned_dev_kernel *assigned_dev) { return 0; } |
19de40a84 KVM: change KVM t... |
549 |
#endif /* CONFIG_IOMMU_API */ |
62c476c7c KVM: Device Assig... |
550 |
|
d172fcd3a sched: guest CPU ... |
551 552 |
static inline void kvm_guest_enter(void) { |
e56a7a28e KVM: Use virtual ... |
553 |
account_system_vtime(current); |
d172fcd3a sched: guest CPU ... |
554 555 556 557 558 |
current->flags |= PF_VCPU; } static inline void kvm_guest_exit(void) { |
e56a7a28e KVM: Use virtual ... |
559 |
account_system_vtime(current); |
d172fcd3a sched: guest CPU ... |
560 561 |
current->flags &= ~PF_VCPU; } |
887c08ac1 KVM: MMU: introdu... |
562 563 564 565 566 |
static inline unsigned long gfn_to_hva_memslot(struct kvm_memory_slot *slot, gfn_t gfn) { return slot->userspace_addr + (gfn - slot->base_gfn) * PAGE_SIZE; } |
1755fbcc6 KVM: MMU: Introdu... |
567 568 569 570 |
static inline gpa_t gfn_to_gpa(gfn_t gfn) { return (gpa_t)gfn << PAGE_SHIFT; } |
6aa8b732c [PATCH] kvm: user... |
571 |
|
c30a358d3 KVM: MMU: Add inf... |
572 573 574 575 |
static inline gfn_t gpa_to_gfn(gpa_t gpa) { return (gfn_t)(gpa >> PAGE_SHIFT); } |
62c476c7c KVM: Device Assig... |
576 577 578 579 |
static inline hpa_t pfn_to_hpa(pfn_t pfn) { return (hpa_t)pfn << PAGE_SHIFT; } |
2f5997140 KVM: migrate PIT ... |
580 |
static inline void kvm_migrate_timers(struct kvm_vcpu *vcpu) |
2f52d58c9 KVM: Move apic ti... |
581 582 583 |
{ set_bit(KVM_REQ_MIGRATE_TIMER, &vcpu->requests); } |
ba1389b7a KVM: Extend stats... |
584 585 586 587 |
enum kvm_stat_kind { KVM_STAT_VM, KVM_STAT_VCPU, }; |
417bc3041 KVM: Portability:... |
588 589 590 |
struct kvm_stats_debugfs_item { const char *name; int offset; |
ba1389b7a KVM: Extend stats... |
591 |
enum kvm_stat_kind kind; |
417bc3041 KVM: Portability:... |
592 593 594 |
struct dentry *dentry; }; extern struct kvm_stats_debugfs_item debugfs_entries[]; |
76f7c8790 KVM: Rename debug... |
595 |
extern struct dentry *kvm_debugfs_dir; |
d4c9ff2d1 KVM: Add kvm trac... |
596 |
|
e930bffe9 KVM: Synchronize ... |
597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 |
#ifdef KVM_ARCH_WANT_MMU_NOTIFIER static inline int mmu_notifier_retry(struct kvm_vcpu *vcpu, unsigned long mmu_seq) { if (unlikely(vcpu->kvm->mmu_notifier_count)) return 1; /* * Both reads happen under the mmu_lock and both values are * modified under mmu_lock, so there's no need of smb_rmb() * here in between, otherwise mmu_notifier_count should be * read before mmu_notifier_seq, see * mmu_notifier_invalidate_range_end write side. */ if (vcpu->kvm->mmu_notifier_seq != mmu_seq) return 1; return 0; } #endif |
399ec807d KVM: Userspace co... |
614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 |
#ifdef CONFIG_HAVE_KVM_IRQCHIP #define KVM_MAX_IRQ_ROUTES 1024 int kvm_setup_default_irq_routing(struct kvm *kvm); int kvm_set_irq_routing(struct kvm *kvm, const struct kvm_irq_routing_entry *entries, unsigned nr, unsigned flags); void kvm_free_irq_routing(struct kvm *kvm); #else static inline void kvm_free_irq_routing(struct kvm *kvm) {} #endif |
721eecbf4 KVM: irqfd |
630 |
#ifdef CONFIG_HAVE_KVM_EVENTFD |
d34e6b175 KVM: add ioeventf... |
631 |
void kvm_eventfd_init(struct kvm *kvm); |
721eecbf4 KVM: irqfd |
632 633 |
int kvm_irqfd(struct kvm *kvm, int fd, int gsi, int flags); void kvm_irqfd_release(struct kvm *kvm); |
bd2b53b20 KVM: fast-path ms... |
634 |
void kvm_irq_routing_update(struct kvm *, struct kvm_irq_routing_table *); |
d34e6b175 KVM: add ioeventf... |
635 |
int kvm_ioeventfd(struct kvm *kvm, struct kvm_ioeventfd *args); |
721eecbf4 KVM: irqfd |
636 637 |
#else |
d34e6b175 KVM: add ioeventf... |
638 |
static inline void kvm_eventfd_init(struct kvm *kvm) {} |
bd2b53b20 KVM: fast-path ms... |
639 |
|
721eecbf4 KVM: irqfd |
640 641 642 643 644 645 |
static inline int kvm_irqfd(struct kvm *kvm, int fd, int gsi, int flags) { return -EINVAL; } static inline void kvm_irqfd_release(struct kvm *kvm) {} |
bd2b53b20 KVM: fast-path ms... |
646 |
|
27923eb19 KVM: PPC: Fix com... |
647 |
#ifdef CONFIG_HAVE_KVM_IRQCHIP |
bd2b53b20 KVM: fast-path ms... |
648 649 650 651 652 |
static inline void kvm_irq_routing_update(struct kvm *kvm, struct kvm_irq_routing_table *irq_rt) { rcu_assign_pointer(kvm->irq_routing, irq_rt); } |
27923eb19 KVM: PPC: Fix com... |
653 |
#endif |
bd2b53b20 KVM: fast-path ms... |
654 |
|
d34e6b175 KVM: add ioeventf... |
655 656 657 658 |
static inline int kvm_ioeventfd(struct kvm *kvm, struct kvm_ioeventfd *args) { return -ENOSYS; } |
721eecbf4 KVM: irqfd |
659 660 |
#endif /* CONFIG_HAVE_KVM_EVENTFD */ |
73880c80a KVM: Break depend... |
661 |
#ifdef CONFIG_KVM_APIC_ARCHITECTURE |
c5af89b68 KVM: Introduce kv... |
662 663 |
static inline bool kvm_vcpu_is_bsp(struct kvm_vcpu *vcpu) { |
d3efc8efd KVM: use vcpu_id ... |
664 |
return vcpu->kvm->bsp_vcpu_id == vcpu->vcpu_id; |
c5af89b68 KVM: Introduce kv... |
665 |
} |
6aa8b732c [PATCH] kvm: user... |
666 |
#endif |
bfd99ff5d KVM: Move assigne... |
667 668 669 670 671 672 673 674 675 676 677 678 679 |
#ifdef __KVM_HAVE_DEVICE_ASSIGNMENT long kvm_vm_ioctl_assigned_device(struct kvm *kvm, unsigned ioctl, unsigned long arg); #else static inline long kvm_vm_ioctl_assigned_device(struct kvm *kvm, unsigned ioctl, unsigned long arg) { return -ENOTTY; } |
73880c80a KVM: Break depend... |
680 |
#endif |
bfd99ff5d KVM: Move assigne... |
681 |
|
a8eeb04a4 KVM: Add mini-API... |
682 683 684 685 |
static inline void kvm_make_request(int req, struct kvm_vcpu *vcpu) { set_bit(req, &vcpu->requests); } |
a8eeb04a4 KVM: Add mini-API... |
686 687 |
static inline bool kvm_check_request(int req, struct kvm_vcpu *vcpu) { |
0719837c0 KVM: Reduce atomi... |
688 689 690 691 692 693 |
if (test_bit(req, &vcpu->requests)) { clear_bit(req, &vcpu->requests); return true; } else { return false; } |
a8eeb04a4 KVM: Add mini-API... |
694 |
} |
bfd99ff5d KVM: Move assigne... |
695 |
#endif |