kvm_host.h 13.1 KB
Newer Older
1 2
#ifndef __KVM_HOST_H
#define __KVM_HOST_H
A
Avi Kivity 已提交
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>
10
#include <linux/hardirq.h>
A
Avi Kivity 已提交
11 12 13
#include <linux/list.h>
#include <linux/mutex.h>
#include <linux/spinlock.h>
M
Markus Rechberger 已提交
14 15
#include <linux/signal.h>
#include <linux/sched.h>
A
Avi Kivity 已提交
16
#include <linux/mm.h>
17
#include <linux/preempt.h>
18
#include <linux/marker.h>
A
Alexey Dobriyan 已提交
19
#include <asm/signal.h>
A
Avi Kivity 已提交
20 21

#include <linux/kvm.h>
I
Ingo Molnar 已提交
22
#include <linux/kvm_para.h>
A
Avi Kivity 已提交
23

24
#include <linux/kvm_types.h>
25

26
#include <asm/kvm_host.h>
27

28 29 30
/*
 * vcpu->requests bit members
 */
31
#define KVM_REQ_TLB_FLUSH          0
32
#define KVM_REQ_MIGRATE_TIMER      1
33
#define KVM_REQ_REPORT_TPR_ACCESS  2
34
#define KVM_REQ_MMU_RELOAD         3
J
Joerg Roedel 已提交
35
#define KVM_REQ_TRIPLE_FAULT       4
36
#define KVM_REQ_PENDING_TIMER      5
37
#define KVM_REQ_UNHALT             6
38
#define KVM_REQ_MMU_SYNC           7
A
Avi Kivity 已提交
39

40 41
#define KVM_USERSPACE_IRQ_SOURCE_ID	0

A
Avi Kivity 已提交
42
struct kvm_vcpu;
43
extern struct kmem_cache *kvm_vcpu_cache;
A
Avi Kivity 已提交
44

45 46 47 48 49 50 51 52 53 54 55 56 57 58
/*
 * 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;
#define NR_IOBUS_DEVS 6
	struct kvm_io_device *devs[NR_IOBUS_DEVS];
};

void kvm_io_bus_init(struct kvm_io_bus *bus);
void kvm_io_bus_destroy(struct kvm_io_bus *bus);
59 60
struct kvm_io_device *kvm_io_bus_find_dev(struct kvm_io_bus *bus,
					  gpa_t addr, int len, int is_write);
61 62 63
void kvm_io_bus_register_dev(struct kvm_io_bus *bus,
			     struct kvm_io_device *dev);

64 65
struct kvm_vcpu {
	struct kvm *kvm;
66
#ifdef CONFIG_PREEMPT_NOTIFIERS
67
	struct preempt_notifier preempt_notifier;
68
#endif
69 70 71 72 73 74 75 76 77 78 79 80 81 82
	int vcpu_id;
	struct mutex mutex;
	int   cpu;
	struct kvm_run *run;
	int guest_mode;
	unsigned long requests;
	struct kvm_guest_debug guest_debug;
	int fpu_active;
	int guest_fpu_loaded;
	wait_queue_head_t wq;
	int sigset_active;
	sigset_t sigset;
	struct kvm_vcpu_stat stat;

83
#ifdef CONFIG_HAS_IOMEM
84 85 86 87 88
	int mmio_needed;
	int mmio_read_completed;
	int mmio_is_write;
	int mmio_size;
	unsigned char mmio_data[8];
A
Avi Kivity 已提交
89
	gpa_t mmio_phys_addr;
90
#endif
A
Avi Kivity 已提交
91

92 93 94
	struct kvm_vcpu_arch arch;
};

A
Avi Kivity 已提交
95 96 97 98
struct kvm_memory_slot {
	gfn_t base_gfn;
	unsigned long npages;
	unsigned long flags;
99
	unsigned long *rmap;
A
Avi Kivity 已提交
100
	unsigned long *dirty_bitmap;
M
Marcelo Tosatti 已提交
101 102 103 104
	struct {
		unsigned long rmap_pde;
		int write_count;
	} *lpage_info;
105
	unsigned long userspace_addr;
106
	int user_alloc;
A
Avi Kivity 已提交
107 108 109
};

struct kvm {
110 111
	struct mutex lock; /* protects the vcpus array and APIC accesses */
	spinlock_t mmu_lock;
112
	struct rw_semaphore slots_lock;
113
	struct mm_struct *mm; /* userspace tied to this vm */
A
Avi Kivity 已提交
114
	int nmemslots;
115 116
	struct kvm_memory_slot memslots[KVM_MEMORY_SLOTS +
					KVM_PRIVATE_MEM_SLOTS];
R
Rusty Russell 已提交
117
	struct kvm_vcpu *vcpus[KVM_MAX_VCPUS];
118
	struct list_head vm_list;
119
	struct kvm_io_bus mmio_bus;
120
	struct kvm_io_bus pio_bus;
121
	struct kvm_vm_stat stat;
122
	struct kvm_arch arch;
I
Izik Eidus 已提交
123
	atomic_t users_count;
124 125 126 127
#ifdef KVM_COALESCED_MMIO_PAGE_OFFSET
	struct kvm_coalesced_mmio_dev *coalesced_mmio_dev;
	struct kvm_coalesced_mmio_ring *coalesced_mmio_ring;
#endif
128 129 130 131 132 133

#ifdef KVM_ARCH_WANT_MMU_NOTIFIER
	struct mmu_notifier mmu_notifier;
	unsigned long mmu_notifier_seq;
	long mmu_notifier_count;
#endif
A
Avi Kivity 已提交
134 135
};

136 137 138 139 140 141
/* 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__); \
M
Mike Day 已提交
142
 } while (0)
143

A
Avi Kivity 已提交
144 145 146
#define kvm_printf(kvm, fmt ...) printk(KERN_DEBUG fmt)
#define vcpu_printf(vcpu, fmt...) kvm_printf(vcpu->kvm, fmt)

R
Rusty Russell 已提交
147 148 149
int kvm_vcpu_init(struct kvm_vcpu *vcpu, struct kvm *kvm, unsigned id);
void kvm_vcpu_uninit(struct kvm_vcpu *vcpu);

150 151 152
void vcpu_load(struct kvm_vcpu *vcpu);
void vcpu_put(struct kvm_vcpu *vcpu);

153
int kvm_init(void *opaque, unsigned int vcpu_size,
154
		  struct module *module);
155
void kvm_exit(void);
A
Avi Kivity 已提交
156

I
Izik Eidus 已提交
157 158 159
void kvm_get_kvm(struct kvm *kvm);
void kvm_put_kvm(struct kvm *kvm);

A
Avi Kivity 已提交
160 161 162
#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; }
163
struct page *gva_to_page(struct kvm_vcpu *vcpu, gva_t gva);
A
Avi Kivity 已提交
164

165
extern struct page *bad_page;
166
extern pfn_t bad_pfn;
A
Avi Kivity 已提交
167

168
int is_error_page(struct page *page);
169
int is_error_pfn(pfn_t pfn);
I
Izik Eidus 已提交
170
int kvm_is_error_hva(unsigned long addr);
171 172 173
int kvm_set_memory_region(struct kvm *kvm,
			  struct kvm_userspace_memory_region *mem,
			  int user_alloc);
174 175 176
int __kvm_set_memory_region(struct kvm *kvm,
			    struct kvm_userspace_memory_region *mem,
			    int user_alloc);
177 178 179 180
int kvm_arch_set_memory_region(struct kvm *kvm,
				struct kvm_userspace_memory_region *mem,
				struct kvm_memory_slot old,
				int user_alloc);
181
void kvm_arch_flush_shadow(struct kvm *kvm);
182
gfn_t unalias_gfn(struct kvm *kvm, gfn_t gfn);
A
Avi Kivity 已提交
183
struct page *gfn_to_page(struct kvm *kvm, gfn_t gfn);
M
Marcelo Tosatti 已提交
184
unsigned long gfn_to_hva(struct kvm *kvm, gfn_t gfn);
185 186
void kvm_release_page_clean(struct page *page);
void kvm_release_page_dirty(struct page *page);
187 188 189 190 191 192 193 194 195 196
void kvm_set_page_dirty(struct page *page);
void kvm_set_page_accessed(struct page *page);

pfn_t gfn_to_pfn(struct kvm *kvm, gfn_t gfn);
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);

197 198
int kvm_read_guest_page(struct kvm *kvm, gfn_t gfn, void *data, int offset,
			int len);
199 200
int kvm_read_guest_atomic(struct kvm *kvm, gpa_t gpa, void *data,
			  unsigned long len);
201 202 203 204 205 206 207
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);
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);
A
Avi Kivity 已提交
208
struct kvm_memory_slot *gfn_to_memslot(struct kvm *kvm, gfn_t gfn);
209
int kvm_is_visible_gfn(struct kvm *kvm, gfn_t gfn);
A
Avi Kivity 已提交
210 211
void mark_page_dirty(struct kvm *kvm, gfn_t gfn);

212
void kvm_vcpu_block(struct kvm_vcpu *vcpu);
A
Avi Kivity 已提交
213
void kvm_resched(struct kvm_vcpu *vcpu);
214 215
void kvm_load_guest_fpu(struct kvm_vcpu *vcpu);
void kvm_put_guest_fpu(struct kvm_vcpu *vcpu);
216
void kvm_flush_remote_tlbs(struct kvm *kvm);
217
void kvm_reload_remote_mmus(struct kvm *kvm);
A
Avi Kivity 已提交
218

219 220
long kvm_arch_dev_ioctl(struct file *filp,
			unsigned int ioctl, unsigned long arg);
221 222 223 224
long kvm_arch_vcpu_ioctl(struct file *filp,
			 unsigned int ioctl, unsigned long arg);
void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu);
void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu);
225 226 227

int kvm_dev_ioctl_check_extension(long ext);

228 229 230 231 232
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);

233 234 235 236 237 238 239
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);
void kvm_arch_destroy_vm(struct kvm *kvm);
240

241 242 243
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);

244 245 246
int kvm_arch_vcpu_ioctl_translate(struct kvm_vcpu *vcpu,
				    struct kvm_translation *tr);

247 248 249 250 251 252
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);
253 254 255 256
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);
257 258 259 260
int kvm_arch_vcpu_ioctl_debug_guest(struct kvm_vcpu *vcpu,
				    struct kvm_debug_guest *dbg);
int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run);

261 262
int kvm_arch_init(void *opaque);
void kvm_arch_exit(void);
263

264 265 266 267 268 269 270
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);
271
int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu);
272
void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu);
273 274 275 276 277 278 279

int kvm_arch_vcpu_reset(struct kvm_vcpu *vcpu);
void kvm_arch_hardware_enable(void *garbage);
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);
280
int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu);
281

282 283 284 285
void kvm_free_physmem(struct kvm *kvm);

struct  kvm *kvm_arch_create_vm(void);
void kvm_arch_destroy_vm(struct kvm *kvm);
286
void kvm_free_all_assigned_devices(struct kvm *kvm);
287

288 289
int kvm_cpu_get_interrupt(struct kvm_vcpu *v);
int kvm_cpu_has_interrupt(struct kvm_vcpu *v);
290
int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu);
291
void kvm_vcpu_kick(struct kvm_vcpu *vcpu);
292

293 294
int kvm_is_mmio_pfn(pfn_t pfn);

B
Ben-Ami Yassour 已提交
295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310
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;
	struct work_struct interrupt_work;
	struct list_head list;
	int assigned_dev_id;
	int host_busnr;
	int host_devfn;
	int host_irq;
	int guest_irq;
	int irq_requested;
311
	int irq_source_id;
B
Ben-Ami Yassour 已提交
312 313 314
	struct pci_dev *dev;
	struct kvm *kvm;
};
315
void kvm_set_irq(struct kvm *kvm, int irq_source_id, int irq, int level);
316 317 318 319 320
void kvm_notify_acked_irq(struct kvm *kvm, unsigned gsi);
void kvm_register_irq_ack_notifier(struct kvm *kvm,
				   struct kvm_irq_ack_notifier *kian);
void kvm_unregister_irq_ack_notifier(struct kvm *kvm,
				     struct kvm_irq_ack_notifier *kian);
321 322
int kvm_request_irq_source_id(struct kvm *kvm);
void kvm_free_irq_source_id(struct kvm *kvm, int irq_source_id);
B
Ben-Ami Yassour 已提交
323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350

#ifdef CONFIG_DMAR
int kvm_iommu_map_pages(struct kvm *kvm, gfn_t base_gfn,
			unsigned long npages);
int kvm_iommu_map_guest(struct kvm *kvm,
			struct kvm_assigned_dev_kernel *assigned_dev);
int kvm_iommu_unmap_guest(struct kvm *kvm);
#else /* CONFIG_DMAR */
static inline int kvm_iommu_map_pages(struct kvm *kvm,
				      gfn_t base_gfn,
				      unsigned long npages)
{
	return 0;
}

static inline int kvm_iommu_map_guest(struct kvm *kvm,
				      struct kvm_assigned_dev_kernel
				      *assigned_dev)
{
	return -ENODEV;
}

static inline int kvm_iommu_unmap_guest(struct kvm *kvm)
{
	return 0;
}
#endif /* CONFIG_DMAR */

351 352
static inline void kvm_guest_enter(void)
{
353
	account_system_vtime(current);
354 355 356 357 358
	current->flags |= PF_VCPU;
}

static inline void kvm_guest_exit(void)
{
359
	account_system_vtime(current);
360 361 362
	current->flags &= ~PF_VCPU;
}

A
Avi Kivity 已提交
363 364 365 366 367
static inline int memslot_id(struct kvm *kvm, struct kvm_memory_slot *slot)
{
	return slot - kvm->memslots;
}

A
Avi Kivity 已提交
368 369 370 371
static inline gpa_t gfn_to_gpa(gfn_t gfn)
{
	return (gpa_t)gfn << PAGE_SHIFT;
}
A
Avi Kivity 已提交
372

B
Ben-Ami Yassour 已提交
373 374 375 376 377
static inline hpa_t pfn_to_hpa(pfn_t pfn)
{
	return (hpa_t)pfn << PAGE_SHIFT;
}

M
Marcelo Tosatti 已提交
378
static inline void kvm_migrate_timers(struct kvm_vcpu *vcpu)
379 380 381 382
{
	set_bit(KVM_REQ_MIGRATE_TIMER, &vcpu->requests);
}

383 384 385 386 387
enum kvm_stat_kind {
	KVM_STAT_VM,
	KVM_STAT_VCPU,
};

388 389 390
struct kvm_stats_debugfs_item {
	const char *name;
	int offset;
391
	enum kvm_stat_kind kind;
392 393 394
	struct dentry *dentry;
};
extern struct kvm_stats_debugfs_item debugfs_entries[];
395
extern struct dentry *kvm_debugfs_dir;
396

397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415
#define KVMTRACE_5D(evt, vcpu, d1, d2, d3, d4, d5, name) \
	trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \
						vcpu, 5, d1, d2, d3, d4, d5)
#define KVMTRACE_4D(evt, vcpu, d1, d2, d3, d4, name) \
	trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \
						vcpu, 4, d1, d2, d3, d4, 0)
#define KVMTRACE_3D(evt, vcpu, d1, d2, d3, name) \
	trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \
						vcpu, 3, d1, d2, d3, 0, 0)
#define KVMTRACE_2D(evt, vcpu, d1, d2, name) \
	trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \
						vcpu, 2, d1, d2, 0, 0, 0)
#define KVMTRACE_1D(evt, vcpu, d1, name) \
	trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \
						vcpu, 1, d1, 0, 0, 0, 0)
#define KVMTRACE_0D(evt, vcpu, name) \
	trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \
						vcpu, 0, 0, 0, 0, 0, 0)

416 417 418 419 420 421 422 423 424 425 426
#ifdef CONFIG_KVM_TRACE
int kvm_trace_ioctl(unsigned int ioctl, unsigned long arg);
void kvm_trace_cleanup(void);
#else
static inline
int kvm_trace_ioctl(unsigned int ioctl, unsigned long arg)
{
	return -EINVAL;
}
#define kvm_trace_cleanup() ((void)0)
#endif
427

428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445
#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

A
Avi Kivity 已提交
446
#endif