kvm.h 11.5 KB
Newer Older
A
Avi Kivity 已提交
1 2 3 4 5 6
#ifndef __LINUX_KVM_H
#define __LINUX_KVM_H

/*
 * Userspace interface for /dev/kvm - kernel based virtual machine
 *
7
 * Note: you must update KVM_API_VERSION if you change this interface.
A
Avi Kivity 已提交
8 9 10
 */

#include <asm/types.h>
11
#include <linux/compiler.h>
A
Avi Kivity 已提交
12
#include <linux/ioctl.h>
13
#include <asm/kvm.h>
A
Avi Kivity 已提交
14

15
#define KVM_API_VERSION 12
A
Avi Kivity 已提交
16

F
Feng (Eric) Liu 已提交
17 18 19 20 21 22
/* for KVM_TRACE_ENABLE */
struct kvm_user_trace_setup {
	__u32 buf_size; /* sub_buffer size of each per-cpu */
	__u32 buf_nr; /* the number of sub_buffers of each per-cpu */
};

A
Avi Kivity 已提交
23 24 25 26 27 28 29 30
/* for KVM_CREATE_MEMORY_REGION */
struct kvm_memory_region {
	__u32 slot;
	__u32 flags;
	__u64 guest_phys_addr;
	__u64 memory_size; /* bytes */
};

31 32 33 34 35 36 37 38 39
/* for KVM_SET_USER_MEMORY_REGION */
struct kvm_userspace_memory_region {
	__u32 slot;
	__u32 flags;
	__u64 guest_phys_addr;
	__u64 memory_size; /* bytes */
	__u64 userspace_addr; /* start of the userspace allocated memory */
};

A
Avi Kivity 已提交
40 41 42 43
/* for kvm_memory_region::flags */
#define KVM_MEM_LOG_DIRTY_PAGES  1UL


E
Eddie Dong 已提交
44
/* for KVM_IRQ_LINE */
45 46 47 48 49 50 51 52 53 54
struct kvm_irq_level {
	/*
	 * ACPI gsi notion of irq.
	 * For IA-64 (APIC model) IOAPIC0: irq 0-23; IOAPIC1: irq 24-47..
	 * For X86 (standard AT mode) PIC0/1: irq 0-15. IOAPIC0: 0-23..
	 */
	__u32 irq;
	__u32 level;
};

55 56 57 58 59 60

struct kvm_irqchip {
	__u32 chip_id;
	__u32 pad;
        union {
		char dummy[512];  /* reserving space */
61
#ifdef CONFIG_X86
62
		struct kvm_pic_state pic;
63 64
#endif
#if defined(CONFIG_X86) || defined(CONFIG_IA64)
65
		struct kvm_ioapic_state ioapic;
66
#endif
67 68 69
	} chip;
};

A
Avi Kivity 已提交
70 71 72 73 74 75 76 77 78 79 80 81
#define KVM_EXIT_UNKNOWN          0
#define KVM_EXIT_EXCEPTION        1
#define KVM_EXIT_IO               2
#define KVM_EXIT_HYPERCALL        3
#define KVM_EXIT_DEBUG            4
#define KVM_EXIT_HLT              5
#define KVM_EXIT_MMIO             6
#define KVM_EXIT_IRQ_WINDOW_OPEN  7
#define KVM_EXIT_SHUTDOWN         8
#define KVM_EXIT_FAIL_ENTRY       9
#define KVM_EXIT_INTR             10
#define KVM_EXIT_SET_TPR          11
82
#define KVM_EXIT_TPR_ACCESS       12
83
#define KVM_EXIT_S390_SIEIC       13
84
#define KVM_EXIT_S390_RESET       14
85
#define KVM_EXIT_DCR              15
A
Avi Kivity 已提交
86

87
/* for KVM_RUN, returned by mmap(vcpu_fd, offset=0) */
A
Avi Kivity 已提交
88 89
struct kvm_run {
	/* in */
90
	__u8 request_interrupt_window;
91
	__u8 padding1[7];
A
Avi Kivity 已提交
92 93 94

	/* out */
	__u32 exit_reason;
95 96
	__u8 ready_for_interrupt_injection;
	__u8 if_flag;
97
	__u8 padding2[2];
98 99

	/* in (pre_kvm_run), out (post_kvm_run) */
100 101 102
	__u64 cr8;
	__u64 apic_base;

A
Avi Kivity 已提交
103 104 105
	union {
		/* KVM_EXIT_UNKNOWN */
		struct {
106
			__u64 hardware_exit_reason;
A
Avi Kivity 已提交
107
		} hw;
108 109 110 111
		/* KVM_EXIT_FAIL_ENTRY */
		struct {
			__u64 hardware_entry_failure_reason;
		} fail_entry;
A
Avi Kivity 已提交
112 113 114 115 116 117
		/* KVM_EXIT_EXCEPTION */
		struct {
			__u32 exception;
			__u32 error_code;
		} ex;
		/* KVM_EXIT_IO */
118
		struct kvm_io {
A
Avi Kivity 已提交
119 120 121 122 123
#define KVM_EXIT_IO_IN  0
#define KVM_EXIT_IO_OUT 1
			__u8 direction;
			__u8 size; /* bytes */
			__u16 port;
124 125
			__u32 count;
			__u64 data_offset; /* relative to kvm_run start */
A
Avi Kivity 已提交
126 127 128 129 130 131 132 133 134 135
		} io;
		struct {
		} debug;
		/* KVM_EXIT_MMIO */
		struct {
			__u64 phys_addr;
			__u8  data[8];
			__u32 len;
			__u8  is_write;
		} mmio;
136 137
		/* KVM_EXIT_HYPERCALL */
		struct {
J
Jeff Dike 已提交
138
			__u64 nr;
139 140 141 142 143
			__u64 args[6];
			__u64 ret;
			__u32 longmode;
			__u32 pad;
		} hypercall;
144 145 146 147 148 149
		/* KVM_EXIT_TPR_ACCESS */
		struct {
			__u64 rip;
			__u32 is_write;
			__u32 pad;
		} tpr_access;
150 151 152 153 154 155 156 157
		/* KVM_EXIT_S390_SIEIC */
		struct {
			__u8 icptcode;
			__u64 mask; /* psw upper half */
			__u64 addr; /* psw lower half */
			__u16 ipa;
			__u32 ipb;
		} s390_sieic;
158 159 160 161 162 163 164
		/* KVM_EXIT_S390_RESET */
#define KVM_S390_RESET_POR       1
#define KVM_S390_RESET_CLEAR     2
#define KVM_S390_RESET_SUBSYSTEM 4
#define KVM_S390_RESET_CPU_INIT  8
#define KVM_S390_RESET_IPL       16
		__u64 s390_reset_flags;
165 166 167 168 169 170
		/* KVM_EXIT_DCR */
		struct {
			__u32 dcrn;
			__u32 data;
			__u8  is_write;
		} dcr;
171 172
		/* Fix the size of the union. */
		char padding[256];
A
Avi Kivity 已提交
173 174 175
	};
};

176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199
/* for KVM_REGISTER_COALESCED_MMIO / KVM_UNREGISTER_COALESCED_MMIO */

struct kvm_coalesced_mmio_zone {
	__u64 addr;
	__u32 size;
	__u32 pad;
};

struct kvm_coalesced_mmio {
	__u64 phys_addr;
	__u32 len;
	__u32 pad;
	__u8  data[8];
};

struct kvm_coalesced_mmio_ring {
	__u32 first, last;
	struct kvm_coalesced_mmio coalesced_mmio[0];
};

#define KVM_COALESCED_MMIO_MAX \
	((PAGE_SIZE - sizeof(struct kvm_coalesced_mmio_ring)) / \
	 sizeof(struct kvm_coalesced_mmio))

A
Avi Kivity 已提交
200 201 202 203 204 205 206 207 208 209
/* for KVM_TRANSLATE */
struct kvm_translation {
	/* in */
	__u64 linear_address;

	/* out */
	__u64 physical_address;
	__u8  valid;
	__u8  writeable;
	__u8  usermode;
210
	__u8  pad[5];
A
Avi Kivity 已提交
211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228
};

/* for KVM_INTERRUPT */
struct kvm_interrupt {
	/* in */
	__u32 irq;
};

struct kvm_breakpoint {
	__u32 enabled;
	__u32 padding;
	__u64 address;
};

/* for KVM_DEBUG_GUEST */
struct kvm_debug_guest {
	/* int */
	__u32 enabled;
A
Avi Kivity 已提交
229
	__u32 pad;
A
Avi Kivity 已提交
230 231 232 233 234 235 236 237 238 239 240 241 242 243
	struct kvm_breakpoint breakpoints[4];
	__u32 singlestep;
};

/* for KVM_GET_DIRTY_LOG */
struct kvm_dirty_log {
	__u32 slot;
	__u32 padding;
	union {
		void __user *dirty_bitmap; /* one bit per page */
		__u64 padding;
	};
};

A
Avi Kivity 已提交
244 245 246 247 248 249
/* for KVM_SET_SIGNAL_MASK */
struct kvm_signal_mask {
	__u32 len;
	__u8  sigset[0];
};

250 251 252 253 254 255 256
/* for KVM_TPR_ACCESS_REPORTING */
struct kvm_tpr_access_ctl {
	__u32 enabled;
	__u32 flags;
	__u32 reserved[8];
};

A
Avi Kivity 已提交
257 258 259 260 261
/* for KVM_SET_VAPIC_ADDR */
struct kvm_vapic_addr {
	__u64 vapic_addr;
};

262 263 264 265 266 267 268 269 270 271 272 273
/* for KVM_SET_MPSTATE */

#define KVM_MP_STATE_RUNNABLE          0
#define KVM_MP_STATE_UNINITIALIZED     1
#define KVM_MP_STATE_INIT_RECEIVED     2
#define KVM_MP_STATE_HALTED            3
#define KVM_MP_STATE_SIPI_RECEIVED     4

struct kvm_mp_state {
	__u32 mp_state;
};

274 275 276 277 278
struct kvm_s390_psw {
	__u64 mask;
	__u64 addr;
};

279 280 281 282 283 284 285 286 287 288 289 290 291 292 293
/* valid values for type in kvm_s390_interrupt */
#define KVM_S390_SIGP_STOP		0xfffe0000u
#define KVM_S390_PROGRAM_INT		0xfffe0001u
#define KVM_S390_SIGP_SET_PREFIX	0xfffe0002u
#define KVM_S390_RESTART		0xfffe0003u
#define KVM_S390_INT_VIRTIO		0xffff2603u
#define KVM_S390_INT_SERVICE		0xffff2401u
#define KVM_S390_INT_EMERGENCY		0xffff1201u

struct kvm_s390_interrupt {
	__u32 type;
	__u32 parm;
	__u64 parm64;
};

F
Feng (Eric) Liu 已提交
294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320
#define KVM_TRC_SHIFT           16
/*
 * kvm trace categories
 */
#define KVM_TRC_ENTRYEXIT       (1 << KVM_TRC_SHIFT)
#define KVM_TRC_HANDLER         (1 << (KVM_TRC_SHIFT + 1)) /* only 12 bits */

/*
 * kvm trace action
 */
#define KVM_TRC_VMENTRY         (KVM_TRC_ENTRYEXIT + 0x01)
#define KVM_TRC_VMEXIT          (KVM_TRC_ENTRYEXIT + 0x02)
#define KVM_TRC_PAGE_FAULT      (KVM_TRC_HANDLER + 0x01)

#define KVM_TRC_HEAD_SIZE       12
#define KVM_TRC_CYCLE_SIZE      8
#define KVM_TRC_EXTRA_MAX       7

/* This structure represents a single trace buffer record. */
struct kvm_trace_rec {
	__u32 event:28;
	__u32 extra_u32:3;
	__u32 cycle_in:1;
	__u32 pid;
	__u32 vcpu_id;
	union {
		struct {
T
Tan, Li 已提交
321
			__u64 cycle_u64;
F
Feng (Eric) Liu 已提交
322 323 324 325 326 327
			__u32 extra_u32[KVM_TRC_EXTRA_MAX];
		} cycle;
		struct {
			__u32 extra_u32[KVM_TRC_EXTRA_MAX];
		} nocycle;
	} u;
T
Tan, Li 已提交
328
} __attribute__((packed));
F
Feng (Eric) Liu 已提交
329

A
Avi Kivity 已提交
330 331
#define KVMIO 0xAE

332 333 334
/*
 * ioctls for /dev/kvm fds:
 */
A
Avi Kivity 已提交
335 336 337
#define KVM_GET_API_VERSION       _IO(KVMIO,   0x00)
#define KVM_CREATE_VM             _IO(KVMIO,   0x01) /* returns a VM fd */
#define KVM_GET_MSR_INDEX_LIST    _IOWR(KVMIO, 0x02, struct kvm_msr_list)
338 339

#define KVM_S390_ENABLE_SIE       _IO(KVMIO,   0x06)
340 341 342 343 344
/*
 * Check if a kvm extension is available.  Argument is extension number,
 * return is 1 (yes) or 0 (no, sorry).
 */
#define KVM_CHECK_EXTENSION       _IO(KVMIO,   0x03)
345 346 347 348
/*
 * Get size for mmap(vcpu_fd)
 */
#define KVM_GET_VCPU_MMAP_SIZE    _IO(KVMIO,   0x04) /* in bytes */
349
#define KVM_GET_SUPPORTED_CPUID   _IOWR(KVMIO, 0x05, struct kvm_cpuid2)
F
Feng (Eric) Liu 已提交
350 351 352 353 354 355
/*
 * ioctls for kvm trace
 */
#define KVM_TRACE_ENABLE          _IOW(KVMIO, 0x06, struct kvm_user_trace_setup)
#define KVM_TRACE_PAUSE           _IO(KVMIO,  0x07)
#define KVM_TRACE_DISABLE         _IO(KVMIO,  0x08)
356 357 358 359
/*
 * Extension capability list.
 */
#define KVM_CAP_IRQCHIP	  0
E
Eddie Dong 已提交
360
#define KVM_CAP_HLT	  1
361
#define KVM_CAP_MMU_SHADOW_CACHE_CONTROL 2
362
#define KVM_CAP_USER_MEMORY 3
363
#define KVM_CAP_SET_TSS_ADDR 4
364
#define KVM_CAP_VAPIC 6
365
#define KVM_CAP_EXT_CPUID 7
366
#define KVM_CAP_CLOCKSOURCE 8
367
#define KVM_CAP_NR_VCPUS 9       /* returns max vcpus per vm */
368
#define KVM_CAP_NR_MEMSLOTS 10   /* returns max memory slots per vm */
S
Sheng Yang 已提交
369
#define KVM_CAP_PIT 11
370
#define KVM_CAP_NOP_IO_DELAY 12
371
#define KVM_CAP_PV_MMU 13
372
#define KVM_CAP_MP_STATE 14
373
#define KVM_CAP_COALESCED_MMIO 15
374
#define KVM_CAP_SYNC_MMU 16  /* Changes to host mmap are reflected in guest */
375

376 377 378
/*
 * ioctls for VM fds
 */
A
Avi Kivity 已提交
379
#define KVM_SET_MEMORY_REGION     _IOW(KVMIO, 0x40, struct kvm_memory_region)
380 381
#define KVM_SET_NR_MMU_PAGES      _IO(KVMIO, 0x44)
#define KVM_GET_NR_MMU_PAGES      _IO(KVMIO, 0x45)
382 383
#define KVM_SET_USER_MEMORY_REGION _IOW(KVMIO, 0x46,\
					struct kvm_userspace_memory_region)
384
#define KVM_SET_TSS_ADDR          _IO(KVMIO, 0x47)
A
Avi Kivity 已提交
385 386 387 388
/*
 * KVM_CREATE_VCPU receives as a parameter the vcpu slot, and returns
 * a vcpu fd.
 */
A
Avi Kivity 已提交
389 390
#define KVM_CREATE_VCPU           _IO(KVMIO,  0x41)
#define KVM_GET_DIRTY_LOG         _IOW(KVMIO, 0x42, struct kvm_dirty_log)
391
#define KVM_SET_MEMORY_ALIAS      _IOW(KVMIO, 0x43, struct kvm_memory_alias)
392 393
/* Device model IOC */
#define KVM_CREATE_IRQCHIP	  _IO(KVMIO,  0x60)
E
Eddie Dong 已提交
394
#define KVM_IRQ_LINE		  _IOW(KVMIO, 0x61, struct kvm_irq_level)
395 396
#define KVM_GET_IRQCHIP		  _IOWR(KVMIO, 0x62, struct kvm_irqchip)
#define KVM_SET_IRQCHIP		  _IOR(KVMIO,  0x63, struct kvm_irqchip)
S
Sheng Yang 已提交
397
#define KVM_CREATE_PIT		  _IO(KVMIO,  0x64)
398 399
#define KVM_GET_PIT		  _IOWR(KVMIO, 0x65, struct kvm_pit_state)
#define KVM_SET_PIT		  _IOR(KVMIO,  0x66, struct kvm_pit_state)
400 401 402 403
#define KVM_REGISTER_COALESCED_MMIO \
			_IOW(KVMIO,  0x67, struct kvm_coalesced_mmio_zone)
#define KVM_UNREGISTER_COALESCED_MMIO \
			_IOW(KVMIO,  0x68, struct kvm_coalesced_mmio_zone)
A
Avi Kivity 已提交
404 405 406 407

/*
 * ioctls for vcpu fds
 */
A
Avi Kivity 已提交
408 409 410 411 412 413 414 415 416 417 418
#define KVM_RUN                   _IO(KVMIO,   0x80)
#define KVM_GET_REGS              _IOR(KVMIO,  0x81, struct kvm_regs)
#define KVM_SET_REGS              _IOW(KVMIO,  0x82, struct kvm_regs)
#define KVM_GET_SREGS             _IOR(KVMIO,  0x83, struct kvm_sregs)
#define KVM_SET_SREGS             _IOW(KVMIO,  0x84, struct kvm_sregs)
#define KVM_TRANSLATE             _IOWR(KVMIO, 0x85, struct kvm_translation)
#define KVM_INTERRUPT             _IOW(KVMIO,  0x86, struct kvm_interrupt)
#define KVM_DEBUG_GUEST           _IOW(KVMIO,  0x87, struct kvm_debug_guest)
#define KVM_GET_MSRS              _IOWR(KVMIO, 0x88, struct kvm_msrs)
#define KVM_SET_MSRS              _IOW(KVMIO,  0x89, struct kvm_msrs)
#define KVM_SET_CPUID             _IOW(KVMIO,  0x8a, struct kvm_cpuid)
A
Avi Kivity 已提交
419
#define KVM_SET_SIGNAL_MASK       _IOW(KVMIO,  0x8b, struct kvm_signal_mask)
A
Avi Kivity 已提交
420 421
#define KVM_GET_FPU               _IOR(KVMIO,  0x8c, struct kvm_fpu)
#define KVM_SET_FPU               _IOW(KVMIO,  0x8d, struct kvm_fpu)
422 423
#define KVM_GET_LAPIC             _IOR(KVMIO,  0x8e, struct kvm_lapic_state)
#define KVM_SET_LAPIC             _IOW(KVMIO,  0x8f, struct kvm_lapic_state)
424 425
#define KVM_SET_CPUID2            _IOW(KVMIO,  0x90, struct kvm_cpuid2)
#define KVM_GET_CPUID2            _IOWR(KVMIO, 0x91, struct kvm_cpuid2)
426 427
/* Available with KVM_CAP_VAPIC */
#define KVM_TPR_ACCESS_REPORTING  _IOWR(KVMIO,  0x92, struct kvm_tpr_access_ctl)
A
Avi Kivity 已提交
428 429
/* Available with KVM_CAP_VAPIC */
#define KVM_SET_VAPIC_ADDR        _IOW(KVMIO,  0x93, struct kvm_vapic_addr)
430 431
/* valid for virtual machine (for floating interrupt)_and_ vcpu */
#define KVM_S390_INTERRUPT        _IOW(KVMIO,  0x94, struct kvm_s390_interrupt)
432 433 434 435 436 437 438 439
/* store status for s390 */
#define KVM_S390_STORE_STATUS_NOADDR    (-1ul)
#define KVM_S390_STORE_STATUS_PREFIXED  (-2ul)
#define KVM_S390_STORE_STATUS	  _IOW(KVMIO,  0x95, unsigned long)
/* initial ipl psw for s390 */
#define KVM_S390_SET_INITIAL_PSW  _IOW(KVMIO,  0x96, struct kvm_s390_psw)
/* initial reset for s390 */
#define KVM_S390_INITIAL_RESET    _IO(KVMIO,  0x97)
440 441
#define KVM_GET_MP_STATE          _IOR(KVMIO,  0x98, struct kvm_mp_state)
#define KVM_SET_MP_STATE          _IOW(KVMIO,  0x99, struct kvm_mp_state)
A
Avi Kivity 已提交
442 443

#endif