xref: /linux-6.15/include/uapi/linux/kvm.h (revision 3adaee78)
16f52b16cSGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2607ca46eSDavid Howells #ifndef __LINUX_KVM_H
3607ca46eSDavid Howells #define __LINUX_KVM_H
4607ca46eSDavid Howells 
5607ca46eSDavid Howells /*
6607ca46eSDavid Howells  * Userspace interface for /dev/kvm - kernel based virtual machine
7607ca46eSDavid Howells  *
8607ca46eSDavid Howells  * Note: you must update KVM_API_VERSION if you change this interface.
9607ca46eSDavid Howells  */
10607ca46eSDavid Howells 
11fb1070d1SJoe Richey #include <linux/const.h>
12607ca46eSDavid Howells #include <linux/types.h>
13607ca46eSDavid Howells #include <linux/compiler.h>
14607ca46eSDavid Howells #include <linux/ioctl.h>
15607ca46eSDavid Howells #include <asm/kvm.h>
16607ca46eSDavid Howells 
17607ca46eSDavid Howells #define KVM_API_VERSION 12
18607ca46eSDavid Howells 
196bda055dSPaolo Bonzini /*
206bda055dSPaolo Bonzini  * Backwards-compatible definitions.
216bda055dSPaolo Bonzini  */
226bda055dSPaolo Bonzini #define __KVM_HAVE_GUEST_DEBUG
236bda055dSPaolo Bonzini 
24607ca46eSDavid Howells /* for KVM_SET_USER_MEMORY_REGION */
25607ca46eSDavid Howells struct kvm_userspace_memory_region {
26607ca46eSDavid Howells 	__u32 slot;
27607ca46eSDavid Howells 	__u32 flags;
28607ca46eSDavid Howells 	__u64 guest_phys_addr;
29607ca46eSDavid Howells 	__u64 memory_size; /* bytes */
30607ca46eSDavid Howells 	__u64 userspace_addr; /* start of the userspace allocated memory */
31607ca46eSDavid Howells };
32607ca46eSDavid Howells 
33bb58b90bSSean Christopherson /* for KVM_SET_USER_MEMORY_REGION2 */
34bb58b90bSSean Christopherson struct kvm_userspace_memory_region2 {
35bb58b90bSSean Christopherson 	__u32 slot;
36bb58b90bSSean Christopherson 	__u32 flags;
37bb58b90bSSean Christopherson 	__u64 guest_phys_addr;
38bb58b90bSSean Christopherson 	__u64 memory_size;
39bb58b90bSSean Christopherson 	__u64 userspace_addr;
40a7800aa8SSean Christopherson 	__u64 guest_memfd_offset;
41a7800aa8SSean Christopherson 	__u32 guest_memfd;
42a7800aa8SSean Christopherson 	__u32 pad1;
43a7800aa8SSean Christopherson 	__u64 pad2[14];
44bb58b90bSSean Christopherson };
45bb58b90bSSean Christopherson 
46607ca46eSDavid Howells /*
4730ee198cSJavier Martinez Canillas  * The bit 0 ~ bit 15 of kvm_userspace_memory_region::flags are visible for
4830ee198cSJavier Martinez Canillas  * userspace, other bits are reserved for kvm internal use which are defined
4930ee198cSJavier Martinez Canillas  * in include/linux/kvm_host.h.
50607ca46eSDavid Howells  */
51607ca46eSDavid Howells #define KVM_MEM_LOG_DIRTY_PAGES	(1UL << 0)
52607ca46eSDavid Howells #define KVM_MEM_READONLY	(1UL << 1)
53a7800aa8SSean Christopherson #define KVM_MEM_GUEST_MEMFD	(1UL << 2)
54607ca46eSDavid Howells 
55607ca46eSDavid Howells /* for KVM_IRQ_LINE */
56607ca46eSDavid Howells struct kvm_irq_level {
57607ca46eSDavid Howells 	/*
58607ca46eSDavid Howells 	 * ACPI gsi notion of irq.
59607ca46eSDavid Howells 	 * For IA-64 (APIC model) IOAPIC0: irq 0-23; IOAPIC1: irq 24-47..
60607ca46eSDavid Howells 	 * For X86 (standard AT mode) PIC0/1: irq 0-15. IOAPIC0: 0-23..
613ecad8c2SMauro Carvalho Chehab 	 * For ARM: See Documentation/virt/kvm/api.rst
62607ca46eSDavid Howells 	 */
63607ca46eSDavid Howells 	union {
64607ca46eSDavid Howells 		__u32 irq;
65607ca46eSDavid Howells 		__s32 status;
66607ca46eSDavid Howells 	};
67607ca46eSDavid Howells 	__u32 level;
68607ca46eSDavid Howells };
69607ca46eSDavid Howells 
70607ca46eSDavid Howells 
71607ca46eSDavid Howells struct kvm_irqchip {
72607ca46eSDavid Howells 	__u32 chip_id;
73607ca46eSDavid Howells 	__u32 pad;
74607ca46eSDavid Howells         union {
75607ca46eSDavid Howells 		char dummy[512];  /* reserving space */
76607ca46eSDavid Howells #ifdef __KVM_HAVE_PIT
77607ca46eSDavid Howells 		struct kvm_pic_state pic;
78607ca46eSDavid Howells #endif
79607ca46eSDavid Howells #ifdef __KVM_HAVE_IOAPIC
80607ca46eSDavid Howells 		struct kvm_ioapic_state ioapic;
81607ca46eSDavid Howells #endif
82607ca46eSDavid Howells 	} chip;
83607ca46eSDavid Howells };
84607ca46eSDavid Howells 
85607ca46eSDavid Howells /* for KVM_CREATE_PIT2 */
86607ca46eSDavid Howells struct kvm_pit_config {
87607ca46eSDavid Howells 	__u32 flags;
88607ca46eSDavid Howells 	__u32 pad[15];
89607ca46eSDavid Howells };
90607ca46eSDavid Howells 
91607ca46eSDavid Howells #define KVM_PIT_SPEAKER_DUMMY     1
92607ca46eSDavid Howells 
93db397571SAndrey Smetanin struct kvm_hyperv_exit {
94db397571SAndrey Smetanin #define KVM_EXIT_HYPERV_SYNIC          1
9583326e43SAndrey Smetanin #define KVM_EXIT_HYPERV_HCALL          2
96f97f5a56SJon Doron #define KVM_EXIT_HYPERV_SYNDBG         3
97db397571SAndrey Smetanin 	__u32 type;
98f7d31e65SJon Doron 	__u32 pad1;
99db397571SAndrey Smetanin 	union {
100db397571SAndrey Smetanin 		struct {
101db397571SAndrey Smetanin 			__u32 msr;
102f7d31e65SJon Doron 			__u32 pad2;
103db397571SAndrey Smetanin 			__u64 control;
104db397571SAndrey Smetanin 			__u64 evt_page;
105db397571SAndrey Smetanin 			__u64 msg_page;
106db397571SAndrey Smetanin 		} synic;
10783326e43SAndrey Smetanin 		struct {
10883326e43SAndrey Smetanin 			__u64 input;
10983326e43SAndrey Smetanin 			__u64 result;
11083326e43SAndrey Smetanin 			__u64 params[2];
11183326e43SAndrey Smetanin 		} hcall;
112f97f5a56SJon Doron 		struct {
113f97f5a56SJon Doron 			__u32 msr;
114f97f5a56SJon Doron 			__u32 pad2;
115f97f5a56SJon Doron 			__u64 control;
116f97f5a56SJon Doron 			__u64 status;
117f97f5a56SJon Doron 			__u64 send_page;
118f97f5a56SJon Doron 			__u64 recv_page;
119f97f5a56SJon Doron 			__u64 pending_page;
120f97f5a56SJon Doron 		} syndbg;
121db397571SAndrey Smetanin 	} u;
122db397571SAndrey Smetanin };
123db397571SAndrey Smetanin 
12423200b7aSJoao Martins struct kvm_xen_exit {
12523200b7aSJoao Martins #define KVM_EXIT_XEN_HCALL          1
12623200b7aSJoao Martins 	__u32 type;
12723200b7aSJoao Martins 	union {
12823200b7aSJoao Martins 		struct {
12923200b7aSJoao Martins 			__u32 longmode;
13023200b7aSJoao Martins 			__u32 cpl;
13123200b7aSJoao Martins 			__u64 input;
13223200b7aSJoao Martins 			__u64 result;
13323200b7aSJoao Martins 			__u64 params[6];
13423200b7aSJoao Martins 		} hcall;
13523200b7aSJoao Martins 	} u;
13623200b7aSJoao Martins };
13723200b7aSJoao Martins 
13830ee2a98SJason J. Herne #define KVM_S390_GET_SKEYS_NONE   1
13930ee2a98SJason J. Herne #define KVM_S390_SKEYS_MAX        1048576
14030ee2a98SJason J. Herne 
141607ca46eSDavid Howells #define KVM_EXIT_UNKNOWN          0
142607ca46eSDavid Howells #define KVM_EXIT_EXCEPTION        1
143607ca46eSDavid Howells #define KVM_EXIT_IO               2
144607ca46eSDavid Howells #define KVM_EXIT_HYPERCALL        3
145607ca46eSDavid Howells #define KVM_EXIT_DEBUG            4
146607ca46eSDavid Howells #define KVM_EXIT_HLT              5
147607ca46eSDavid Howells #define KVM_EXIT_MMIO             6
148607ca46eSDavid Howells #define KVM_EXIT_IRQ_WINDOW_OPEN  7
149607ca46eSDavid Howells #define KVM_EXIT_SHUTDOWN         8
150607ca46eSDavid Howells #define KVM_EXIT_FAIL_ENTRY       9
151607ca46eSDavid Howells #define KVM_EXIT_INTR             10
152607ca46eSDavid Howells #define KVM_EXIT_SET_TPR          11
153607ca46eSDavid Howells #define KVM_EXIT_TPR_ACCESS       12
154607ca46eSDavid Howells #define KVM_EXIT_S390_SIEIC       13
155607ca46eSDavid Howells #define KVM_EXIT_S390_RESET       14
156ce91ddc4SAlexander Graf #define KVM_EXIT_DCR              15 /* deprecated */
157607ca46eSDavid Howells #define KVM_EXIT_NMI              16
158607ca46eSDavid Howells #define KVM_EXIT_INTERNAL_ERROR   17
159607ca46eSDavid Howells #define KVM_EXIT_OSI              18
160607ca46eSDavid Howells #define KVM_EXIT_PAPR_HCALL	  19
161607ca46eSDavid Howells #define KVM_EXIT_S390_UCONTROL	  20
16219bf7f8aSMarcelo Tosatti #define KVM_EXIT_WATCHDOG         21
163fa6b7fe9SCornelia Huck #define KVM_EXIT_S390_TSCH        22
1641c810636SAlexander Graf #define KVM_EXIT_EPR              23
1658ad6b634SAnup Patel #define KVM_EXIT_SYSTEM_EVENT     24
166e44fc8c9SEkaterina Tumanova #define KVM_EXIT_S390_STSI        25
1677543a635SSteve Rutherford #define KVM_EXIT_IOAPIC_EOI       26
168db397571SAndrey Smetanin #define KVM_EXIT_HYPERV           27
169c726200dSChristoffer Dall #define KVM_EXIT_ARM_NISV         28
1701ae09954SAlexander Graf #define KVM_EXIT_X86_RDMSR        29
1711ae09954SAlexander Graf #define KVM_EXIT_X86_WRMSR        30
172fb04a1edSPeter Xu #define KVM_EXIT_DIRTY_RING_FULL  31
173647daca2STom Lendacky #define KVM_EXIT_AP_RESET_HOLD    32
174fe6b6bc8SChenyi Qiang #define KVM_EXIT_X86_BUS_LOCK     33
17523200b7aSJoao Martins #define KVM_EXIT_XEN              34
176dea8ee31SAtish Patra #define KVM_EXIT_RISCV_SBI        35
1778a061562SAnup Patel #define KVM_EXIT_RISCV_CSR        36
17863f4b210SPaolo Bonzini #define KVM_EXIT_NOTIFY           37
179b37e6b68STianrui Zhao #define KVM_EXIT_LOONGARCH_IOCSR  38
18016f95f3bSChao Peng #define KVM_EXIT_MEMORY_FAULT     39
181607ca46eSDavid Howells 
182607ca46eSDavid Howells /* For KVM_EXIT_INTERNAL_ERROR */
18319bf7f8aSMarcelo Tosatti /* Emulate instruction failed. */
184607ca46eSDavid Howells #define KVM_INTERNAL_ERROR_EMULATION	1
18519bf7f8aSMarcelo Tosatti /* Encounter unexpected simultaneous exceptions. */
186607ca46eSDavid Howells #define KVM_INTERNAL_ERROR_SIMUL_EX	2
18719bf7f8aSMarcelo Tosatti /* Encounter unexpected vm-exit due to delivery event. */
18819bf7f8aSMarcelo Tosatti #define KVM_INTERNAL_ERROR_DELIVERY_EV	3
1897396d337SLiran Alon /* Encounter unexpected vm-exit reason */
1907396d337SLiran Alon #define KVM_INTERNAL_ERROR_UNEXPECTED_EXIT_REASON	4
191607ca46eSDavid Howells 
19219238e75SAaron Lewis /* Flags that describe what fields in emulation_failure hold valid data. */
19319238e75SAaron Lewis #define KVM_INTERNAL_ERROR_EMULATION_FLAG_INSTRUCTION_BYTES (1ULL << 0)
19419238e75SAaron Lewis 
1954b23e0c1SDavid Matlack /*
1964b23e0c1SDavid Matlack  * struct kvm_run can be modified by userspace at any time, so KVM must be
1974b23e0c1SDavid Matlack  * careful to avoid TOCTOU bugs. In order to protect KVM, HINT_UNSAFE_IN_KVM()
1984b23e0c1SDavid Matlack  * renames fields in struct kvm_run from <symbol> to <symbol>__unsafe when
1994b23e0c1SDavid Matlack  * compiled into the kernel, ensuring that any use within KVM is obvious and
2004b23e0c1SDavid Matlack  * gets extra scrutiny.
2014b23e0c1SDavid Matlack  */
2024b23e0c1SDavid Matlack #ifdef __KERNEL__
2034b23e0c1SDavid Matlack #define HINT_UNSAFE_IN_KVM(_symbol) _symbol##__unsafe
2044b23e0c1SDavid Matlack #else
2054b23e0c1SDavid Matlack #define HINT_UNSAFE_IN_KVM(_symbol) _symbol
2064b23e0c1SDavid Matlack #endif
2074b23e0c1SDavid Matlack 
208607ca46eSDavid Howells /* for KVM_RUN, returned by mmap(vcpu_fd, offset=0) */
209607ca46eSDavid Howells struct kvm_run {
210607ca46eSDavid Howells 	/* in */
211607ca46eSDavid Howells 	__u8 request_interrupt_window;
2124b23e0c1SDavid Matlack 	__u8 HINT_UNSAFE_IN_KVM(immediate_exit);
213460df4c1SPaolo Bonzini 	__u8 padding1[6];
214607ca46eSDavid Howells 
215607ca46eSDavid Howells 	/* out */
216607ca46eSDavid Howells 	__u32 exit_reason;
217607ca46eSDavid Howells 	__u8 ready_for_interrupt_injection;
218607ca46eSDavid Howells 	__u8 if_flag;
219f077825aSPaolo Bonzini 	__u16 flags;
220607ca46eSDavid Howells 
221607ca46eSDavid Howells 	/* in (pre_kvm_run), out (post_kvm_run) */
222607ca46eSDavid Howells 	__u64 cr8;
223607ca46eSDavid Howells 	__u64 apic_base;
224607ca46eSDavid Howells 
225607ca46eSDavid Howells #ifdef __KVM_S390
226607ca46eSDavid Howells 	/* the processor status word for s390 */
227607ca46eSDavid Howells 	__u64 psw_mask; /* psw upper half */
228607ca46eSDavid Howells 	__u64 psw_addr; /* psw lower half */
229607ca46eSDavid Howells #endif
230607ca46eSDavid Howells 	union {
231607ca46eSDavid Howells 		/* KVM_EXIT_UNKNOWN */
232607ca46eSDavid Howells 		struct {
233607ca46eSDavid Howells 			__u64 hardware_exit_reason;
234607ca46eSDavid Howells 		} hw;
235607ca46eSDavid Howells 		/* KVM_EXIT_FAIL_ENTRY */
236607ca46eSDavid Howells 		struct {
237607ca46eSDavid Howells 			__u64 hardware_entry_failure_reason;
2381aa561b1SJim Mattson 			__u32 cpu;
239607ca46eSDavid Howells 		} fail_entry;
240607ca46eSDavid Howells 		/* KVM_EXIT_EXCEPTION */
241607ca46eSDavid Howells 		struct {
242607ca46eSDavid Howells 			__u32 exception;
243607ca46eSDavid Howells 			__u32 error_code;
244607ca46eSDavid Howells 		} ex;
245607ca46eSDavid Howells 		/* KVM_EXIT_IO */
246607ca46eSDavid Howells 		struct {
247607ca46eSDavid Howells #define KVM_EXIT_IO_IN  0
248607ca46eSDavid Howells #define KVM_EXIT_IO_OUT 1
249607ca46eSDavid Howells 			__u8 direction;
250607ca46eSDavid Howells 			__u8 size; /* bytes */
251607ca46eSDavid Howells 			__u16 port;
252607ca46eSDavid Howells 			__u32 count;
253607ca46eSDavid Howells 			__u64 data_offset; /* relative to kvm_run start */
254607ca46eSDavid Howells 		} io;
2558ab30c15SAlex Bennée 		/* KVM_EXIT_DEBUG */
256607ca46eSDavid Howells 		struct {
257607ca46eSDavid Howells 			struct kvm_debug_exit_arch arch;
258607ca46eSDavid Howells 		} debug;
259607ca46eSDavid Howells 		/* KVM_EXIT_MMIO */
260607ca46eSDavid Howells 		struct {
261607ca46eSDavid Howells 			__u64 phys_addr;
262607ca46eSDavid Howells 			__u8  data[8];
263607ca46eSDavid Howells 			__u32 len;
264607ca46eSDavid Howells 			__u8  is_write;
265607ca46eSDavid Howells 		} mmio;
266b37e6b68STianrui Zhao 		/* KVM_EXIT_LOONGARCH_IOCSR */
267b37e6b68STianrui Zhao 		struct {
268b37e6b68STianrui Zhao 			__u64 phys_addr;
269b37e6b68STianrui Zhao 			__u8  data[8];
270b37e6b68STianrui Zhao 			__u32 len;
271b37e6b68STianrui Zhao 			__u8  is_write;
272b37e6b68STianrui Zhao 		} iocsr_io;
273607ca46eSDavid Howells 		/* KVM_EXIT_HYPERCALL */
274607ca46eSDavid Howells 		struct {
275607ca46eSDavid Howells 			__u64 nr;
276607ca46eSDavid Howells 			__u64 args[6];
277607ca46eSDavid Howells 			__u64 ret;
278e65733b5SOliver Upton 
279e65733b5SOliver Upton 			union {
280e65733b5SOliver Upton #ifndef __KERNEL__
281607ca46eSDavid Howells 				__u32 longmode;
282e65733b5SOliver Upton #endif
283e65733b5SOliver Upton 				__u64 flags;
284e65733b5SOliver Upton 			};
285607ca46eSDavid Howells 		} hypercall;
286607ca46eSDavid Howells 		/* KVM_EXIT_TPR_ACCESS */
287607ca46eSDavid Howells 		struct {
288607ca46eSDavid Howells 			__u64 rip;
289607ca46eSDavid Howells 			__u32 is_write;
290607ca46eSDavid Howells 			__u32 pad;
291607ca46eSDavid Howells 		} tpr_access;
292607ca46eSDavid Howells 		/* KVM_EXIT_S390_SIEIC */
293607ca46eSDavid Howells 		struct {
294607ca46eSDavid Howells 			__u8 icptcode;
295607ca46eSDavid Howells 			__u16 ipa;
296607ca46eSDavid Howells 			__u32 ipb;
297607ca46eSDavid Howells 		} s390_sieic;
298607ca46eSDavid Howells 		/* KVM_EXIT_S390_RESET */
299607ca46eSDavid Howells 		__u64 s390_reset_flags;
300607ca46eSDavid Howells 		/* KVM_EXIT_S390_UCONTROL */
301607ca46eSDavid Howells 		struct {
302607ca46eSDavid Howells 			__u64 trans_exc_code;
303607ca46eSDavid Howells 			__u32 pgm_code;
304607ca46eSDavid Howells 		} s390_ucontrol;
305ce91ddc4SAlexander Graf 		/* KVM_EXIT_DCR (deprecated) */
306607ca46eSDavid Howells 		struct {
307607ca46eSDavid Howells 			__u32 dcrn;
308607ca46eSDavid Howells 			__u32 data;
309607ca46eSDavid Howells 			__u8  is_write;
310607ca46eSDavid Howells 		} dcr;
3118ab30c15SAlex Bennée 		/* KVM_EXIT_INTERNAL_ERROR */
312607ca46eSDavid Howells 		struct {
313607ca46eSDavid Howells 			__u32 suberror;
314607ca46eSDavid Howells 			/* Available with KVM_CAP_INTERNAL_ERROR_DATA: */
315607ca46eSDavid Howells 			__u32 ndata;
316607ca46eSDavid Howells 			__u64 data[16];
317607ca46eSDavid Howells 		} internal;
31819238e75SAaron Lewis 		/*
31919238e75SAaron Lewis 		 * KVM_INTERNAL_ERROR_EMULATION
32019238e75SAaron Lewis 		 *
32119238e75SAaron Lewis 		 * "struct emulation_failure" is an overlay of "struct internal"
32219238e75SAaron Lewis 		 * that is used for the KVM_INTERNAL_ERROR_EMULATION sub-type of
32319238e75SAaron Lewis 		 * KVM_EXIT_INTERNAL_ERROR.  Note, unlike other internal error
32419238e75SAaron Lewis 		 * sub-types, this struct is ABI!  It also needs to be backwards
32519238e75SAaron Lewis 		 * compatible with "struct internal".  Take special care that
32619238e75SAaron Lewis 		 * "ndata" is correct, that new fields are enumerated in "flags",
32719238e75SAaron Lewis 		 * and that each flag enumerates fields that are 64-bit aligned
32819238e75SAaron Lewis 		 * and sized (so that ndata+internal.data[] is valid/accurate).
329e615e355SDavid Edmondson 		 *
330e615e355SDavid Edmondson 		 * Space beyond the defined fields may be used to store arbitrary
331e615e355SDavid Edmondson 		 * debug information relating to the emulation failure. It is
332e615e355SDavid Edmondson 		 * accounted for in "ndata" but the format is unspecified and is
333e615e355SDavid Edmondson 		 * not represented in "flags". Any such information is *not* ABI!
33419238e75SAaron Lewis 		 */
33519238e75SAaron Lewis 		struct {
33619238e75SAaron Lewis 			__u32 suberror;
33719238e75SAaron Lewis 			__u32 ndata;
33819238e75SAaron Lewis 			__u64 flags;
339a9d496d8SDavid Edmondson 			union {
340a9d496d8SDavid Edmondson 				struct {
34119238e75SAaron Lewis 					__u8  insn_size;
34219238e75SAaron Lewis 					__u8  insn_bytes[15];
343a9d496d8SDavid Edmondson 				};
344a9d496d8SDavid Edmondson 			};
345e615e355SDavid Edmondson 			/* Arbitrary debug data may follow. */
34619238e75SAaron Lewis 		} emulation_failure;
347607ca46eSDavid Howells 		/* KVM_EXIT_OSI */
348607ca46eSDavid Howells 		struct {
349607ca46eSDavid Howells 			__u64 gprs[32];
350607ca46eSDavid Howells 		} osi;
3518ab30c15SAlex Bennée 		/* KVM_EXIT_PAPR_HCALL */
352607ca46eSDavid Howells 		struct {
353607ca46eSDavid Howells 			__u64 nr;
354607ca46eSDavid Howells 			__u64 ret;
355607ca46eSDavid Howells 			__u64 args[9];
356607ca46eSDavid Howells 		} papr_hcall;
357fa6b7fe9SCornelia Huck 		/* KVM_EXIT_S390_TSCH */
358fa6b7fe9SCornelia Huck 		struct {
359fa6b7fe9SCornelia Huck 			__u16 subchannel_id;
360fa6b7fe9SCornelia Huck 			__u16 subchannel_nr;
361fa6b7fe9SCornelia Huck 			__u32 io_int_parm;
362fa6b7fe9SCornelia Huck 			__u32 io_int_word;
363fa6b7fe9SCornelia Huck 			__u32 ipb;
364fa6b7fe9SCornelia Huck 			__u8 dequeued;
365fa6b7fe9SCornelia Huck 		} s390_tsch;
3661c810636SAlexander Graf 		/* KVM_EXIT_EPR */
3671c810636SAlexander Graf 		struct {
3681c810636SAlexander Graf 			__u32 epr;
3691c810636SAlexander Graf 		} epr;
3708ad6b634SAnup Patel 		/* KVM_EXIT_SYSTEM_EVENT */
3718ad6b634SAnup Patel 		struct {
3728ad6b634SAnup Patel #define KVM_SYSTEM_EVENT_SHUTDOWN       1
3738ad6b634SAnup Patel #define KVM_SYSTEM_EVENT_RESET          2
3742ce79189SAndrey Smetanin #define KVM_SYSTEM_EVENT_CRASH          3
3757b33a09dSOliver Upton #define KVM_SYSTEM_EVENT_WAKEUP         4
376bfbab445SOliver Upton #define KVM_SYSTEM_EVENT_SUSPEND        5
37747e8eec8SPaolo Bonzini #define KVM_SYSTEM_EVENT_SEV_TERM       6
3788ad6b634SAnup Patel 			__u32 type;
379c24a950eSPeter Gonda 			__u32 ndata;
380d495f942SPaolo Bonzini 			union {
381d495f942SPaolo Bonzini #ifndef __KERNEL__
3828ad6b634SAnup Patel 				__u64 flags;
383d495f942SPaolo Bonzini #endif
384c24a950eSPeter Gonda 				__u64 data[16];
385d495f942SPaolo Bonzini 			};
3868ad6b634SAnup Patel 		} system_event;
387e44fc8c9SEkaterina Tumanova 		/* KVM_EXIT_S390_STSI */
388e44fc8c9SEkaterina Tumanova 		struct {
389e44fc8c9SEkaterina Tumanova 			__u64 addr;
390e44fc8c9SEkaterina Tumanova 			__u8 ar;
391e44fc8c9SEkaterina Tumanova 			__u8 reserved;
392e44fc8c9SEkaterina Tumanova 			__u8 fc;
393e44fc8c9SEkaterina Tumanova 			__u8 sel1;
394e44fc8c9SEkaterina Tumanova 			__u16 sel2;
395e44fc8c9SEkaterina Tumanova 		} s390_stsi;
3967543a635SSteve Rutherford 		/* KVM_EXIT_IOAPIC_EOI */
3977543a635SSteve Rutherford 		struct {
3987543a635SSteve Rutherford 			__u8 vector;
3997543a635SSteve Rutherford 		} eoi;
400db397571SAndrey Smetanin 		/* KVM_EXIT_HYPERV */
401db397571SAndrey Smetanin 		struct kvm_hyperv_exit hyperv;
402c726200dSChristoffer Dall 		/* KVM_EXIT_ARM_NISV */
403c726200dSChristoffer Dall 		struct {
404c726200dSChristoffer Dall 			__u64 esr_iss;
405c726200dSChristoffer Dall 			__u64 fault_ipa;
406c726200dSChristoffer Dall 		} arm_nisv;
4071ae09954SAlexander Graf 		/* KVM_EXIT_X86_RDMSR / KVM_EXIT_X86_WRMSR */
4081ae09954SAlexander Graf 		struct {
4091ae09954SAlexander Graf 			__u8 error; /* user -> kernel */
4101ae09954SAlexander Graf 			__u8 pad[7];
4111ae09954SAlexander Graf #define KVM_MSR_EXIT_REASON_INVAL	(1 << 0)
4121ae09954SAlexander Graf #define KVM_MSR_EXIT_REASON_UNKNOWN	(1 << 1)
4131a155254SAlexander Graf #define KVM_MSR_EXIT_REASON_FILTER	(1 << 2)
414db205f7eSAaron Lewis #define KVM_MSR_EXIT_REASON_VALID_MASK	(KVM_MSR_EXIT_REASON_INVAL   |	\
415db205f7eSAaron Lewis 					 KVM_MSR_EXIT_REASON_UNKNOWN |	\
416db205f7eSAaron Lewis 					 KVM_MSR_EXIT_REASON_FILTER)
4171ae09954SAlexander Graf 			__u32 reason; /* kernel -> user */
4181ae09954SAlexander Graf 			__u32 index; /* kernel -> user */
4191ae09954SAlexander Graf 			__u64 data; /* kernel <-> user */
4201ae09954SAlexander Graf 		} msr;
42123200b7aSJoao Martins 		/* KVM_EXIT_XEN */
42223200b7aSJoao Martins 		struct kvm_xen_exit xen;
423dea8ee31SAtish Patra 		/* KVM_EXIT_RISCV_SBI */
424dea8ee31SAtish Patra 		struct {
425dea8ee31SAtish Patra 			unsigned long extension_id;
426dea8ee31SAtish Patra 			unsigned long function_id;
427dea8ee31SAtish Patra 			unsigned long args[6];
428dea8ee31SAtish Patra 			unsigned long ret[2];
429dea8ee31SAtish Patra 		} riscv_sbi;
4308a061562SAnup Patel 		/* KVM_EXIT_RISCV_CSR */
4318a061562SAnup Patel 		struct {
4328a061562SAnup Patel 			unsigned long csr_num;
4338a061562SAnup Patel 			unsigned long new_value;
4348a061562SAnup Patel 			unsigned long write_mask;
4358a061562SAnup Patel 			unsigned long ret_value;
4368a061562SAnup Patel 		} riscv_csr;
4372f4073e0STao Xu 		/* KVM_EXIT_NOTIFY */
4382f4073e0STao Xu 		struct {
4392f4073e0STao Xu #define KVM_NOTIFY_CONTEXT_INVALID	(1 << 0)
4402f4073e0STao Xu 			__u32 flags;
4412f4073e0STao Xu 		} notify;
44216f95f3bSChao Peng 		/* KVM_EXIT_MEMORY_FAULT */
44316f95f3bSChao Peng 		struct {
4448dd2eee9SChao Peng #define KVM_MEMORY_EXIT_FLAG_PRIVATE	(1ULL << 3)
44516f95f3bSChao Peng 			__u64 flags;
44616f95f3bSChao Peng 			__u64 gpa;
44716f95f3bSChao Peng 			__u64 size;
44816f95f3bSChao Peng 		} memory_fault;
449607ca46eSDavid Howells 		/* Fix the size of the union. */
450607ca46eSDavid Howells 		char padding[256];
451607ca46eSDavid Howells 	};
452607ca46eSDavid Howells 
4537b7e3952SKen Hofsass 	/* 2048 is the size of the char array used to bound/pad the size
4547b7e3952SKen Hofsass 	 * of the union that holds sync regs.
4557b7e3952SKen Hofsass 	 */
4567b7e3952SKen Hofsass 	#define SYNC_REGS_SIZE_BYTES 2048
457607ca46eSDavid Howells 	/*
458607ca46eSDavid Howells 	 * shared registers between kvm and userspace.
459607ca46eSDavid Howells 	 * kvm_valid_regs specifies the register classes set by the host
460607ca46eSDavid Howells 	 * kvm_dirty_regs specified the register classes dirtied by userspace
461607ca46eSDavid Howells 	 * struct kvm_sync_regs is architecture specific, as well as the
462607ca46eSDavid Howells 	 * bits for kvm_valid_regs and kvm_dirty_regs
463607ca46eSDavid Howells 	 */
464607ca46eSDavid Howells 	__u64 kvm_valid_regs;
465607ca46eSDavid Howells 	__u64 kvm_dirty_regs;
466607ca46eSDavid Howells 	union {
467607ca46eSDavid Howells 		struct kvm_sync_regs regs;
4687b7e3952SKen Hofsass 		char padding[SYNC_REGS_SIZE_BYTES];
469607ca46eSDavid Howells 	} s;
470607ca46eSDavid Howells };
471607ca46eSDavid Howells 
472607ca46eSDavid Howells /* for KVM_REGISTER_COALESCED_MMIO / KVM_UNREGISTER_COALESCED_MMIO */
473607ca46eSDavid Howells 
474607ca46eSDavid Howells struct kvm_coalesced_mmio_zone {
475607ca46eSDavid Howells 	__u64 addr;
476607ca46eSDavid Howells 	__u32 size;
4770804c849SPeng Hao 	union {
478607ca46eSDavid Howells 		__u32 pad;
4790804c849SPeng Hao 		__u32 pio;
4800804c849SPeng Hao 	};
481607ca46eSDavid Howells };
482607ca46eSDavid Howells 
483607ca46eSDavid Howells struct kvm_coalesced_mmio {
484607ca46eSDavid Howells 	__u64 phys_addr;
485607ca46eSDavid Howells 	__u32 len;
4860804c849SPeng Hao 	union {
487607ca46eSDavid Howells 		__u32 pad;
4880804c849SPeng Hao 		__u32 pio;
4890804c849SPeng Hao 	};
490607ca46eSDavid Howells 	__u8  data[8];
491607ca46eSDavid Howells };
492607ca46eSDavid Howells 
493607ca46eSDavid Howells struct kvm_coalesced_mmio_ring {
494607ca46eSDavid Howells 	__u32 first, last;
49594dfc73eSGustavo A. R. Silva 	struct kvm_coalesced_mmio coalesced_mmio[];
496607ca46eSDavid Howells };
497607ca46eSDavid Howells 
498607ca46eSDavid Howells #define KVM_COALESCED_MMIO_MAX \
499607ca46eSDavid Howells 	((PAGE_SIZE - sizeof(struct kvm_coalesced_mmio_ring)) / \
500607ca46eSDavid Howells 	 sizeof(struct kvm_coalesced_mmio))
501607ca46eSDavid Howells 
502607ca46eSDavid Howells /* for KVM_TRANSLATE */
503607ca46eSDavid Howells struct kvm_translation {
504607ca46eSDavid Howells 	/* in */
505607ca46eSDavid Howells 	__u64 linear_address;
506607ca46eSDavid Howells 
507607ca46eSDavid Howells 	/* out */
508607ca46eSDavid Howells 	__u64 physical_address;
509607ca46eSDavid Howells 	__u8  valid;
510607ca46eSDavid Howells 	__u8  writeable;
511607ca46eSDavid Howells 	__u8  usermode;
512607ca46eSDavid Howells 	__u8  pad[5];
513607ca46eSDavid Howells };
514607ca46eSDavid Howells 
515607ca46eSDavid Howells /* for KVM_INTERRUPT */
516607ca46eSDavid Howells struct kvm_interrupt {
517607ca46eSDavid Howells 	/* in */
518607ca46eSDavid Howells 	__u32 irq;
519607ca46eSDavid Howells };
520607ca46eSDavid Howells 
521607ca46eSDavid Howells /* for KVM_GET_DIRTY_LOG */
522607ca46eSDavid Howells struct kvm_dirty_log {
523607ca46eSDavid Howells 	__u32 slot;
524607ca46eSDavid Howells 	__u32 padding1;
525607ca46eSDavid Howells 	union {
526607ca46eSDavid Howells 		void __user *dirty_bitmap; /* one bit per page */
527607ca46eSDavid Howells 		__u64 padding2;
528607ca46eSDavid Howells 	};
529607ca46eSDavid Howells };
530607ca46eSDavid Howells 
5312a31b9dbSPaolo Bonzini /* for KVM_CLEAR_DIRTY_LOG */
5322a31b9dbSPaolo Bonzini struct kvm_clear_dirty_log {
5332a31b9dbSPaolo Bonzini 	__u32 slot;
5342a31b9dbSPaolo Bonzini 	__u32 num_pages;
5352a31b9dbSPaolo Bonzini 	__u64 first_page;
5362a31b9dbSPaolo Bonzini 	union {
5372a31b9dbSPaolo Bonzini 		void __user *dirty_bitmap; /* one bit per page */
5382a31b9dbSPaolo Bonzini 		__u64 padding2;
5392a31b9dbSPaolo Bonzini 	};
5402a31b9dbSPaolo Bonzini };
5412a31b9dbSPaolo Bonzini 
542607ca46eSDavid Howells /* for KVM_SET_SIGNAL_MASK */
543607ca46eSDavid Howells struct kvm_signal_mask {
544607ca46eSDavid Howells 	__u32 len;
54594dfc73eSGustavo A. R. Silva 	__u8  sigset[];
546607ca46eSDavid Howells };
547607ca46eSDavid Howells 
548607ca46eSDavid Howells /* for KVM_TPR_ACCESS_REPORTING */
549607ca46eSDavid Howells struct kvm_tpr_access_ctl {
550607ca46eSDavid Howells 	__u32 enabled;
551607ca46eSDavid Howells 	__u32 flags;
552607ca46eSDavid Howells 	__u32 reserved[8];
553607ca46eSDavid Howells };
554607ca46eSDavid Howells 
555607ca46eSDavid Howells /* for KVM_SET_VAPIC_ADDR */
556607ca46eSDavid Howells struct kvm_vapic_addr {
557607ca46eSDavid Howells 	__u64 vapic_addr;
558607ca46eSDavid Howells };
559607ca46eSDavid Howells 
5600b4820d6SDavid Hildenbrand /* for KVM_SET_MP_STATE */
561607ca46eSDavid Howells 
5620b4820d6SDavid Hildenbrand /* not all states are valid on all architectures */
563607ca46eSDavid Howells #define KVM_MP_STATE_RUNNABLE          0
564607ca46eSDavid Howells #define KVM_MP_STATE_UNINITIALIZED     1
565607ca46eSDavid Howells #define KVM_MP_STATE_INIT_RECEIVED     2
566607ca46eSDavid Howells #define KVM_MP_STATE_HALTED            3
567607ca46eSDavid Howells #define KVM_MP_STATE_SIPI_RECEIVED     4
5686352e4d2SDavid Hildenbrand #define KVM_MP_STATE_STOPPED           5
5696352e4d2SDavid Hildenbrand #define KVM_MP_STATE_CHECK_STOP        6
5706352e4d2SDavid Hildenbrand #define KVM_MP_STATE_OPERATING         7
5716352e4d2SDavid Hildenbrand #define KVM_MP_STATE_LOAD              8
572647daca2STom Lendacky #define KVM_MP_STATE_AP_RESET_HOLD     9
5737b33a09dSOliver Upton #define KVM_MP_STATE_SUSPENDED         10
574607ca46eSDavid Howells 
575607ca46eSDavid Howells struct kvm_mp_state {
576607ca46eSDavid Howells 	__u32 mp_state;
577607ca46eSDavid Howells };
578607ca46eSDavid Howells 
579607ca46eSDavid Howells /* for KVM_SET_GUEST_DEBUG */
580607ca46eSDavid Howells 
581607ca46eSDavid Howells #define KVM_GUESTDBG_ENABLE		0x00000001
582607ca46eSDavid Howells #define KVM_GUESTDBG_SINGLESTEP		0x00000002
583607ca46eSDavid Howells 
584607ca46eSDavid Howells struct kvm_guest_debug {
585607ca46eSDavid Howells 	__u32 control;
586607ca46eSDavid Howells 	__u32 pad;
587607ca46eSDavid Howells 	struct kvm_guest_debug_arch arch;
588607ca46eSDavid Howells };
589607ca46eSDavid Howells 
590607ca46eSDavid Howells enum {
591607ca46eSDavid Howells 	kvm_ioeventfd_flag_nr_datamatch,
592607ca46eSDavid Howells 	kvm_ioeventfd_flag_nr_pio,
593607ca46eSDavid Howells 	kvm_ioeventfd_flag_nr_deassign,
5942b83451bSCornelia Huck 	kvm_ioeventfd_flag_nr_virtio_ccw_notify,
59568c3b4d1SMichael S. Tsirkin 	kvm_ioeventfd_flag_nr_fast_mmio,
596607ca46eSDavid Howells 	kvm_ioeventfd_flag_nr_max,
597607ca46eSDavid Howells };
598607ca46eSDavid Howells 
599607ca46eSDavid Howells #define KVM_IOEVENTFD_FLAG_DATAMATCH (1 << kvm_ioeventfd_flag_nr_datamatch)
600607ca46eSDavid Howells #define KVM_IOEVENTFD_FLAG_PIO       (1 << kvm_ioeventfd_flag_nr_pio)
601607ca46eSDavid Howells #define KVM_IOEVENTFD_FLAG_DEASSIGN  (1 << kvm_ioeventfd_flag_nr_deassign)
6022b83451bSCornelia Huck #define KVM_IOEVENTFD_FLAG_VIRTIO_CCW_NOTIFY \
6032b83451bSCornelia Huck 	(1 << kvm_ioeventfd_flag_nr_virtio_ccw_notify)
604607ca46eSDavid Howells 
605607ca46eSDavid Howells #define KVM_IOEVENTFD_VALID_FLAG_MASK  ((1 << kvm_ioeventfd_flag_nr_max) - 1)
606607ca46eSDavid Howells 
607607ca46eSDavid Howells struct kvm_ioeventfd {
608607ca46eSDavid Howells 	__u64 datamatch;
609607ca46eSDavid Howells 	__u64 addr;        /* legal pio/mmio address */
610f848a5a8SMichael S. Tsirkin 	__u32 len;         /* 1, 2, 4, or 8 bytes; or 0 to ignore length */
611607ca46eSDavid Howells 	__s32 fd;
612607ca46eSDavid Howells 	__u32 flags;
613607ca46eSDavid Howells 	__u8  pad[36];
614607ca46eSDavid Howells };
615607ca46eSDavid Howells 
6165e62493fSKarimAllah Ahmed #define KVM_X86_DISABLE_EXITS_MWAIT          (1 << 0)
617766d3571SMichael S. Tsirkin #define KVM_X86_DISABLE_EXITS_HLT            (1 << 1)
6185e62493fSKarimAllah Ahmed #define KVM_X86_DISABLE_EXITS_PAUSE          (1 << 2)
619b5170063SWanpeng Li #define KVM_X86_DISABLE_EXITS_CSTATE         (1 << 3)
6205e62493fSKarimAllah Ahmed 
621607ca46eSDavid Howells /* for KVM_ENABLE_CAP */
622607ca46eSDavid Howells struct kvm_enable_cap {
623607ca46eSDavid Howells 	/* in */
624607ca46eSDavid Howells 	__u32 cap;
625607ca46eSDavid Howells 	__u32 flags;
626607ca46eSDavid Howells 	__u64 args[4];
627607ca46eSDavid Howells 	__u8  pad[64];
628607ca46eSDavid Howells };
629607ca46eSDavid Howells 
630607ca46eSDavid Howells #define KVMIO 0xAE
631607ca46eSDavid Howells 
632607ca46eSDavid Howells /* machine type bits, to be used as argument to KVM_CREATE_VM */
633607ca46eSDavid Howells #define KVM_VM_S390_UCONTROL	1
634607ca46eSDavid Howells 
635cbbc58d4SAneesh Kumar K.V /* on ppc, 0 indicate default, 1 should force HV and 2 PR */
636cbbc58d4SAneesh Kumar K.V #define KVM_VM_PPC_HV 1
637cbbc58d4SAneesh Kumar K.V #define KVM_VM_PPC_PR 2
638cbbc58d4SAneesh Kumar K.V 
63915e9e35cSHuacai Chen /* on MIPS, 0 indicates auto, 1 forces VZ ASE, 2 forces trap & emulate */
64015e9e35cSHuacai Chen #define KVM_VM_MIPS_AUTO	0
641a8a3c426SJames Hogan #define KVM_VM_MIPS_VZ		1
64215e9e35cSHuacai Chen #define KVM_VM_MIPS_TE		2
643a8a3c426SJames Hogan 
644607ca46eSDavid Howells #define KVM_S390_SIE_PAGE_OFFSET 1
645607ca46eSDavid Howells 
646607ca46eSDavid Howells /*
647233a7cb2SSuzuki K Poulose  * On arm64, machine type can be used to request the physical
648233a7cb2SSuzuki K Poulose  * address size for the VM. Bits[7-0] are reserved for the guest
649233a7cb2SSuzuki K Poulose  * PA size shift (i.e, log2(PA_Size)). For backward compatibility,
650233a7cb2SSuzuki K Poulose  * value 0 implies the default IPA size, 40bits.
651233a7cb2SSuzuki K Poulose  */
652233a7cb2SSuzuki K Poulose #define KVM_VM_TYPE_ARM_IPA_SIZE_MASK	0xffULL
653233a7cb2SSuzuki K Poulose #define KVM_VM_TYPE_ARM_IPA_SIZE(x)		\
654233a7cb2SSuzuki K Poulose 	((x) & KVM_VM_TYPE_ARM_IPA_SIZE_MASK)
655233a7cb2SSuzuki K Poulose /*
656607ca46eSDavid Howells  * ioctls for /dev/kvm fds:
657607ca46eSDavid Howells  */
658607ca46eSDavid Howells #define KVM_GET_API_VERSION       _IO(KVMIO,   0x00)
659607ca46eSDavid Howells #define KVM_CREATE_VM             _IO(KVMIO,   0x01) /* returns a VM fd */
660607ca46eSDavid Howells #define KVM_GET_MSR_INDEX_LIST    _IOWR(KVMIO, 0x02, struct kvm_msr_list)
661607ca46eSDavid Howells 
662607ca46eSDavid Howells #define KVM_S390_ENABLE_SIE       _IO(KVMIO,   0x06)
663607ca46eSDavid Howells /*
664607ca46eSDavid Howells  * Check if a kvm extension is available.  Argument is extension number,
665607ca46eSDavid Howells  * return is 1 (yes) or 0 (no, sorry).
666607ca46eSDavid Howells  */
667607ca46eSDavid Howells #define KVM_CHECK_EXTENSION       _IO(KVMIO,   0x03)
668607ca46eSDavid Howells /*
669607ca46eSDavid Howells  * Get size for mmap(vcpu_fd)
670607ca46eSDavid Howells  */
671607ca46eSDavid Howells #define KVM_GET_VCPU_MMAP_SIZE    _IO(KVMIO,   0x04) /* in bytes */
672607ca46eSDavid Howells #define KVM_GET_SUPPORTED_CPUID   _IOWR(KVMIO, 0x05, struct kvm_cpuid2)
6739c15bb1dSBorislav Petkov #define KVM_GET_EMULATED_CPUID	  _IOWR(KVMIO, 0x09, struct kvm_cpuid2)
674801e459aSTom Lendacky #define KVM_GET_MSR_FEATURE_INDEX_LIST    _IOWR(KVMIO, 0x0a, struct kvm_msr_list)
675607ca46eSDavid Howells 
676607ca46eSDavid Howells /*
677607ca46eSDavid Howells  * Extension capability list.
678607ca46eSDavid Howells  */
679607ca46eSDavid Howells #define KVM_CAP_IRQCHIP	  0
680607ca46eSDavid Howells #define KVM_CAP_HLT	  1
681607ca46eSDavid Howells #define KVM_CAP_MMU_SHADOW_CACHE_CONTROL 2
682607ca46eSDavid Howells #define KVM_CAP_USER_MEMORY 3
683607ca46eSDavid Howells #define KVM_CAP_SET_TSS_ADDR 4
684607ca46eSDavid Howells #define KVM_CAP_VAPIC 6
685607ca46eSDavid Howells #define KVM_CAP_EXT_CPUID 7
686607ca46eSDavid Howells #define KVM_CAP_CLOCKSOURCE 8
687607ca46eSDavid Howells #define KVM_CAP_NR_VCPUS 9       /* returns recommended max vcpus per vm */
688607ca46eSDavid Howells #define KVM_CAP_NR_MEMSLOTS 10   /* returns max memory slots per vm */
689607ca46eSDavid Howells #define KVM_CAP_PIT 11
690607ca46eSDavid Howells #define KVM_CAP_NOP_IO_DELAY 12
691607ca46eSDavid Howells #define KVM_CAP_PV_MMU 13
692607ca46eSDavid Howells #define KVM_CAP_MP_STATE 14
693607ca46eSDavid Howells #define KVM_CAP_COALESCED_MMIO 15
694607ca46eSDavid Howells #define KVM_CAP_SYNC_MMU 16  /* Changes to host mmap are reflected in guest */
695607ca46eSDavid Howells #define KVM_CAP_IOMMU 18
696607ca46eSDavid Howells /* Bug in KVM_SET_USER_MEMORY_REGION fixed: */
697607ca46eSDavid Howells #define KVM_CAP_DESTROY_MEMORY_REGION_WORKS 21
698607ca46eSDavid Howells #define KVM_CAP_USER_NMI 22
699607ca46eSDavid Howells #define KVM_CAP_SET_GUEST_DEBUG 23
700607ca46eSDavid Howells #ifdef __KVM_HAVE_PIT
701607ca46eSDavid Howells #define KVM_CAP_REINJECT_CONTROL 24
702607ca46eSDavid Howells #endif
703607ca46eSDavid Howells #define KVM_CAP_IRQ_ROUTING 25
704607ca46eSDavid Howells #define KVM_CAP_IRQ_INJECT_STATUS 26
705607ca46eSDavid Howells #define KVM_CAP_ASSIGN_DEV_IRQ 29
706607ca46eSDavid Howells /* Another bug in KVM_SET_USER_MEMORY_REGION fixed: */
707607ca46eSDavid Howells #define KVM_CAP_JOIN_MEMORY_REGIONS_WORKS 30
708607ca46eSDavid Howells #ifdef __KVM_HAVE_MCE
709607ca46eSDavid Howells #define KVM_CAP_MCE 31
710607ca46eSDavid Howells #endif
711607ca46eSDavid Howells #define KVM_CAP_IRQFD 32
712607ca46eSDavid Howells #ifdef __KVM_HAVE_PIT
713607ca46eSDavid Howells #define KVM_CAP_PIT2 33
714607ca46eSDavid Howells #endif
715607ca46eSDavid Howells #define KVM_CAP_SET_BOOT_CPU_ID 34
716607ca46eSDavid Howells #ifdef __KVM_HAVE_PIT_STATE2
717607ca46eSDavid Howells #define KVM_CAP_PIT_STATE2 35
718607ca46eSDavid Howells #endif
719607ca46eSDavid Howells #define KVM_CAP_IOEVENTFD 36
720607ca46eSDavid Howells #define KVM_CAP_SET_IDENTITY_MAP_ADDR 37
721607ca46eSDavid Howells #ifdef __KVM_HAVE_XEN_HVM
722607ca46eSDavid Howells #define KVM_CAP_XEN_HVM 38
723607ca46eSDavid Howells #endif
724607ca46eSDavid Howells #define KVM_CAP_ADJUST_CLOCK 39
725607ca46eSDavid Howells #define KVM_CAP_INTERNAL_ERROR_DATA 40
726607ca46eSDavid Howells #ifdef __KVM_HAVE_VCPU_EVENTS
727607ca46eSDavid Howells #define KVM_CAP_VCPU_EVENTS 41
728607ca46eSDavid Howells #endif
729607ca46eSDavid Howells #define KVM_CAP_S390_PSW 42
730607ca46eSDavid Howells #define KVM_CAP_PPC_SEGSTATE 43
731607ca46eSDavid Howells #define KVM_CAP_HYPERV 44
732607ca46eSDavid Howells #define KVM_CAP_HYPERV_VAPIC 45
733607ca46eSDavid Howells #define KVM_CAP_HYPERV_SPIN 46
734607ca46eSDavid Howells #define KVM_CAP_PCI_SEGMENT 47
735607ca46eSDavid Howells #define KVM_CAP_PPC_PAIRED_SINGLES 48
736607ca46eSDavid Howells #define KVM_CAP_INTR_SHADOW 49
737607ca46eSDavid Howells #ifdef __KVM_HAVE_DEBUGREGS
738607ca46eSDavid Howells #define KVM_CAP_DEBUGREGS 50
739607ca46eSDavid Howells #endif
740607ca46eSDavid Howells #define KVM_CAP_X86_ROBUST_SINGLESTEP 51
741607ca46eSDavid Howells #define KVM_CAP_PPC_OSI 52
742607ca46eSDavid Howells #define KVM_CAP_PPC_UNSET_IRQ 53
743607ca46eSDavid Howells #define KVM_CAP_ENABLE_CAP 54
744607ca46eSDavid Howells #ifdef __KVM_HAVE_XSAVE
745607ca46eSDavid Howells #define KVM_CAP_XSAVE 55
746607ca46eSDavid Howells #endif
747607ca46eSDavid Howells #ifdef __KVM_HAVE_XCRS
748607ca46eSDavid Howells #define KVM_CAP_XCRS 56
749607ca46eSDavid Howells #endif
750607ca46eSDavid Howells #define KVM_CAP_PPC_GET_PVINFO 57
751607ca46eSDavid Howells #define KVM_CAP_PPC_IRQ_LEVEL 58
752607ca46eSDavid Howells #define KVM_CAP_ASYNC_PF 59
753607ca46eSDavid Howells #define KVM_CAP_TSC_CONTROL 60
754607ca46eSDavid Howells #define KVM_CAP_GET_TSC_KHZ 61
755607ca46eSDavid Howells #define KVM_CAP_PPC_BOOKE_SREGS 62
756607ca46eSDavid Howells #define KVM_CAP_SPAPR_TCE 63
757607ca46eSDavid Howells #define KVM_CAP_PPC_SMT 64
758607ca46eSDavid Howells #define KVM_CAP_PPC_RMA	65
759607ca46eSDavid Howells #define KVM_CAP_MAX_VCPUS 66       /* returns max vcpus per vm */
760607ca46eSDavid Howells #define KVM_CAP_PPC_HIOR 67
761607ca46eSDavid Howells #define KVM_CAP_PPC_PAPR 68
762607ca46eSDavid Howells #define KVM_CAP_SW_TLB 69
763607ca46eSDavid Howells #define KVM_CAP_ONE_REG 70
764607ca46eSDavid Howells #define KVM_CAP_S390_GMAP 71
765607ca46eSDavid Howells #define KVM_CAP_TSC_DEADLINE_TIMER 72
766607ca46eSDavid Howells #define KVM_CAP_S390_UCONTROL 73
767607ca46eSDavid Howells #define KVM_CAP_SYNC_REGS 74
768607ca46eSDavid Howells #define KVM_CAP_PCI_2_3 75
769607ca46eSDavid Howells #define KVM_CAP_KVMCLOCK_CTRL 76
770607ca46eSDavid Howells #define KVM_CAP_SIGNAL_MSI 77
771607ca46eSDavid Howells #define KVM_CAP_PPC_GET_SMMU_INFO 78
772607ca46eSDavid Howells #define KVM_CAP_S390_COW 79
773607ca46eSDavid Howells #define KVM_CAP_PPC_ALLOC_HTAB 80
774607ca46eSDavid Howells #define KVM_CAP_READONLY_MEM 81
775607ca46eSDavid Howells #define KVM_CAP_IRQFD_RESAMPLE 82
77619bf7f8aSMarcelo Tosatti #define KVM_CAP_PPC_BOOKE_WATCHDOG 83
777a2932923SPaul Mackerras #define KVM_CAP_PPC_HTAB_FD 84
778fa6b7fe9SCornelia Huck #define KVM_CAP_S390_CSS_SUPPORT 85
7791c810636SAlexander Graf #define KVM_CAP_PPC_EPR 86
780aa024c2fSMarc Zyngier #define KVM_CAP_ARM_PSCI 87
7813401d546SChristoffer Dall #define KVM_CAP_ARM_SET_DEVICE_ADDR 88
782852b6d57SScott Wood #define KVM_CAP_DEVICE_CTRL 89
783eb1e4f43SScott Wood #define KVM_CAP_IRQ_MPIC 90
7848e591cb7SMichael Ellerman #define KVM_CAP_PPC_RTAS 91
7855975a2e0SPaul Mackerras #define KVM_CAP_IRQ_XICS 92
7860d854a60SMarc Zyngier #define KVM_CAP_ARM_EL1_32BIT 93
7870bd50dc9SAlexey Kardashevskiy #define KVM_CAP_SPAPR_MULTITCE 94
7889c15bb1dSBorislav Petkov #define KVM_CAP_EXT_EMUL_CPUID 95
789e984097bSVadim Rozenfeld #define KVM_CAP_HYPERV_TIME 96
790100943c5SGabriel L. Somlo #define KVM_CAP_IOAPIC_POLARITY_IGNORED 97
791d938dc55SCornelia Huck #define KVM_CAP_ENABLE_CAP_VM 98
79284223598SCornelia Huck #define KVM_CAP_S390_IRQCHIP 99
793f848a5a8SMichael S. Tsirkin #define KVM_CAP_IOEVENTFD_NO_LENGTH 100
79463b5cf04SMarcelo Tosatti #define KVM_CAP_VM_ATTRIBUTES 101
795717abd20SAnup Patel #define KVM_CAP_ARM_PSCI_0_2 102
79653ea2e46SPaolo Bonzini #define KVM_CAP_PPC_FIXUP_HCALL 103
797699a0ea0SPaul Mackerras #define KVM_CAP_PPC_ENABLE_HCALL 104
79892b591a4SAlexander Graf #define KVM_CAP_CHECK_EXTENSION_VM 105
7992444b352SDavid Hildenbrand #define KVM_CAP_S390_USER_SIGP 106
80068c55750SEric Farman #define KVM_CAP_S390_VECTOR_REGISTERS 107
80141408c28SThomas Huth #define KVM_CAP_S390_MEM_OP 108
802e44fc8c9SEkaterina Tumanova #define KVM_CAP_S390_USER_STSI 109
80330ee2a98SJason J. Herne #define KVM_CAP_S390_SKEYS 110
8045fafd874SJames Hogan #define KVM_CAP_MIPS_FPU 111
805d952bd07SJames Hogan #define KVM_CAP_MIPS_MSA 112
80647b43c52SJens Freimann #define KVM_CAP_S390_INJECT_IRQ 113
807816c7667SJens Freimann #define KVM_CAP_S390_IRQ_STATE 114
808e928e9cbSMichael Ellerman #define KVM_CAP_PPC_HWRNG 115
80990de4a18SNadav Amit #define KVM_CAP_DISABLE_QUIRKS 116
810f077825aSPaolo Bonzini #define KVM_CAP_X86_SMM 117
811f481b069SPaolo Bonzini #define KVM_CAP_MULTI_ADDRESS_SPACE 118
8125540546bSAlex Bennée #define KVM_CAP_GUEST_DEBUG_HW_BPS 119
8135540546bSAlex Bennée #define KVM_CAP_GUEST_DEBUG_HW_WPS 120
81449df6397SSteve Rutherford #define KVM_CAP_SPLIT_IRQCHIP 121
815e9ea5069SJason Wang #define KVM_CAP_IOEVENTFD_ANY_LENGTH 122
8165c919412SAndrey Smetanin #define KVM_CAP_HYPERV_SYNIC 123
817c6e5f166SFan Zhang #define KVM_CAP_S390_RI 124
81801d01d69SAlexey Kardashevskiy #define KVM_CAP_SPAPR_TCE_64 125
819ab92f308SPaolo Bonzini #define KVM_CAP_ARM_PMU_V3 126
820ab92f308SPaolo Bonzini #define KVM_CAP_VCPU_ATTRIBUTES 127
8210b1b1dfdSGreg Kurz #define KVM_CAP_MAX_VCPU_ID 128
82237131313SRadim Krčmář #define KVM_CAP_X2APIC_API 129
8236502a34cSDavid Hildenbrand #define KVM_CAP_S390_USER_INSTR0 130
824912902ceSRadim Krčmář #define KVM_CAP_MSI_DEVID 131
82523528bb2SSam Bobroff #define KVM_CAP_PPC_HTM 132
826ef1ead0cSDavid Gibson #define KVM_CAP_SPAPR_RESIZE_HPT 133
827c9270132SPaul Mackerras #define KVM_CAP_PPC_MMU_RADIX 134
828c9270132SPaul Mackerras #define KVM_CAP_PPC_MMU_HASH_V3 135
829460df4c1SPaolo Bonzini #define KVM_CAP_IMMEDIATE_EXIT 136
830a8a3c426SJames Hogan #define KVM_CAP_MIPS_VZ 137
831a8a3c426SJames Hogan #define KVM_CAP_MIPS_TE 138
832578fd61dSJames Hogan #define KVM_CAP_MIPS_64BIT 139
833f7b1a77dSRadim Krčmář #define KVM_CAP_S390_GS 140
834f7b1a77dSRadim Krčmář #define KVM_CAP_S390_AIS 141
8354898d3f4SAlexey Kardashevskiy #define KVM_CAP_SPAPR_TCE_VFIO 142
8364d5422ceSWanpeng Li #define KVM_CAP_X86_DISABLE_EXITS 143
837c24a7be2SPaolo Bonzini #define KVM_CAP_ARM_USER_IRQ 144
8384036e387SClaudio Imbrenda #define KVM_CAP_S390_CMMA_MIGRATION 145
8398a53e7e5SPaolo Bonzini #define KVM_CAP_PPC_FWNMI 146
8408a53e7e5SPaolo Bonzini #define KVM_CAP_PPC_SMT_POSSIBLE 147
841efc479e6SRoman Kagan #define KVM_CAP_HYPERV_SYNIC2 148
842d3457c87SRoman Kagan #define KVM_CAP_HYPERV_VP_INDEX 149
843da9a1446SChristian Borntraeger #define KVM_CAP_S390_AIS_MIGRATION 150
8443214d01fSPaul Mackerras #define KVM_CAP_PPC_GET_CPU_CHAR 151
84535b3fde6SChristian Borntraeger #define KVM_CAP_S390_BPB 152
846801e459aSTom Lendacky #define KVM_CAP_GET_MSR_FEATURES 153
847faeb7833SRoman Kagan #define KVM_CAP_HYPERV_EVENTFD 154
848c1aea919SVitaly Kuznetsov #define KVM_CAP_HYPERV_TLBFLUSH 155
849a4499382SJanosch Frank #define KVM_CAP_S390_HPAGE_1M 156
8508fcc4b59SJim Mattson #define KVM_CAP_NESTED_STATE 157
85163198930SPaolo Bonzini #define KVM_CAP_ARM_INJECT_SERROR_ESR 158
8526fbbde9aSDrew Schmitt #define KVM_CAP_MSR_PLATFORM_INFO 159
853aa069a99SPaul Mackerras #define KVM_CAP_PPC_NESTED_HV 160
854214ff83dSVitaly Kuznetsov #define KVM_CAP_HYPERV_SEND_IPI 161
8550804c849SPeng Hao #define KVM_CAP_COALESCED_PIO 162
85657b119daSVitaly Kuznetsov #define KVM_CAP_HYPERV_ENLIGHTENED_VMCS 163
857c4f55198SJim Mattson #define KVM_CAP_EXCEPTION_PAYLOAD 164
858e42b4a50SPaolo Bonzini #define KVM_CAP_ARM_VM_IPA_SIZE 165
859d7547c55SPeter Xu #define KVM_CAP_MANUAL_DIRTY_LOG_PROTECT 166 /* Obsolete */
8602bc39970SVitaly Kuznetsov #define KVM_CAP_HYPERV_CPUID 167
861d7547c55SPeter Xu #define KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2 168
86259c5c58cSPaolo Bonzini #define KVM_CAP_PPC_IRQ_XIVE 169
863dd53f610SPaolo Bonzini #define KVM_CAP_ARM_SVE 170
864dd53f610SPaolo Bonzini #define KVM_CAP_ARM_PTRAUTH_ADDRESS 171
865dd53f610SPaolo Bonzini #define KVM_CAP_ARM_PTRAUTH_GENERIC 172
86666bb8a06SEric Hankland #define KVM_CAP_PMU_EVENT_FILTER 173
86792f35b75SMarc Zyngier #define KVM_CAP_ARM_IRQ_LINE_LAYOUT_2 174
868344c6c80STianyu Lan #define KVM_CAP_HYPERV_DIRECT_TLBFLUSH 175
8691a9167a2SFabiano Rosas #define KVM_CAP_PPC_GUEST_DEBUG_SSTEP 176
87014edff88SPaolo Bonzini #define KVM_CAP_ARM_NISV_TO_USER 177
87114edff88SPaolo Bonzini #define KVM_CAP_ARM_INJECT_EXT_DABT 178
8727de3f142SJanosch Frank #define KVM_CAP_S390_VCPU_RESETS 179
87313da9ae1SChristian Borntraeger #define KVM_CAP_S390_PROTECTED 180
8749a5788c6SPaul Mackerras #define KVM_CAP_PPC_SECURE_GUEST 181
875acd05785SDavid Matlack #define KVM_CAP_HALT_POLL 182
87672de5fa4SVitaly Kuznetsov #define KVM_CAP_ASYNC_PF_INT 183
8771aa561b1SJim Mattson #define KVM_CAP_LAST_CPU 184
8783edd6839SMohammed Gamal #define KVM_CAP_SMALLER_MAXPHYADDR 185
879f3633c26SPaolo Bonzini #define KVM_CAP_S390_DIAG318 186
880004a0124SAndrew Jones #define KVM_CAP_STEAL_TIME 187
8811ae09954SAlexander Graf #define KVM_CAP_X86_USER_SPACE_MSR 188
8821a155254SAlexander Graf #define KVM_CAP_X86_MSR_FILTER 189
88366570e96SOliver Upton #define KVM_CAP_ENFORCE_PV_FEATURE_CPUID 190
884c21d54f0SVitaly Kuznetsov #define KVM_CAP_SYS_HYPERV_CPUID 191
885fb04a1edSPeter Xu #define KVM_CAP_DIRTY_LOG_RING 192
886fe6b6bc8SChenyi Qiang #define KVM_CAP_X86_BUS_LOCK_EXIT 193
887d9a47edaSRavi Bangoria #define KVM_CAP_PPC_DAWR1 194
8888b13c364SPaolo Bonzini #define KVM_CAP_SET_GUEST_DEBUG2 195
889fe7e9488SSean Christopherson #define KVM_CAP_SGX_ATTRIBUTE 196
89054526d1fSNathan Tempelman #define KVM_CAP_VM_COPY_ENC_CONTEXT_FROM 197
891c4f71901SPaolo Bonzini #define KVM_CAP_PTP_KVM 198
892644f7067SVitaly Kuznetsov #define KVM_CAP_HYPERV_ENFORCE_CPUID 199
8936dba9403SMaxim Levitsky #define KVM_CAP_SREGS2 200
8940dbb1123SAshish Kalra #define KVM_CAP_EXIT_HYPERCALL 201
895c3ab0e28SPaolo Bonzini #define KVM_CAP_PPC_RPT_INVALIDATE 202
896cb082bfaSJing Zhang #define KVM_CAP_BINARY_STATS_FD 203
89719238e75SAaron Lewis #define KVM_CAP_EXIT_ON_EMULATION_FAILURE 204
898b8917b4aSPaolo Bonzini #define KVM_CAP_ARM_MTE 205
899b5663931SPeter Gonda #define KVM_CAP_VM_MOVE_ENC_CONTEXT_FROM 206
900a457fd56SAnup Patel #define KVM_CAP_VM_GPA_BITS 207
901be50b206SGuang Zeng #define KVM_CAP_XSAVE2 208
902dd6e6312SPaolo Bonzini #define KVM_CAP_SYS_ATTRIBUTES 209
90393b71801SNicholas Piggin #define KVM_CAP_PPC_AIL_MODE_3 210
9044dfc4ec2SPaolo Bonzini #define KVM_CAP_S390_MEM_OP_EXTENSION 211
905ba7bb663SDavid Dunn #define KVM_CAP_PMU_CAPABILITY 212
9066d849191SOliver Upton #define KVM_CAP_DISABLE_QUIRKS2 213
907ffbb61d0SDavid Woodhouse #define KVM_CAP_VM_TSC_CONTROL 214
908d495f942SPaolo Bonzini #define KVM_CAP_SYSTEM_EVENT_DATA 215
909bfbab445SOliver Upton #define KVM_CAP_ARM_SYSTEM_SUSPEND 216
910e9bf3acbSJanosch Frank #define KVM_CAP_S390_PROTECTED_DUMP 217
911ed235117SChenyi Qiang #define KVM_CAP_X86_TRIPLE_FAULT_EVENT 218
9122f4073e0STao Xu #define KVM_CAP_X86_NOTIFY_VMEXIT 219
913084cc29fSBen Gardon #define KVM_CAP_VM_DISABLE_NX_HUGE_PAGES 220
914db1c875eSMatthew Rosato #define KVM_CAP_S390_ZPCI_OP 221
915f5ecfee9SPierre Morel #define KVM_CAP_S390_CPU_TOPOLOGY 222
91617601bfeSMarc Zyngier #define KVM_CAP_DIRTY_LOG_RING_ACQ_REL 223
9178c516b25SClaudio Imbrenda #define KVM_CAP_S390_PROTECTED_ASYNC_DISABLE 224
918eb561891SPaolo Bonzini #define KVM_CAP_DIRTY_LOG_RING_WITH_BITMAP 225
91914329b82SAaron Lewis #define KVM_CAP_PMU_EVENT_MASKED_EVENTS 226
92030ec7997SMarc Zyngier #define KVM_CAP_COUNTER_OFFSET 227
9212f440b72SRicardo Koller #define KVM_CAP_ARM_EAGER_SPLIT_CHUNK_SIZE 228
9222f440b72SRicardo Koller #define KVM_CAP_ARM_SUPPORTED_BLOCK_SIZES 229
9233f9cd0caSJing Zhang #define KVM_CAP_ARM_SUPPORTED_REG_MASK_RANGES 230
924bb58b90bSSean Christopherson #define KVM_CAP_USER_MEMORY2 231
92516f95f3bSChao Peng #define KVM_CAP_MEMORY_FAULT_INFO 232
9265a475554SChao Peng #define KVM_CAP_MEMORY_ATTRIBUTES 233
927a7800aa8SSean Christopherson #define KVM_CAP_GUEST_MEMFD 234
92889ea60c2SSean Christopherson #define KVM_CAP_VM_TYPES 235
929bc1a5cd0SIsaku Yamahata #define KVM_CAP_PRE_FAULT_MEMORY 236
9305dcc1e76SPaolo Bonzini #define KVM_CAP_X86_APIC_BUS_CYCLES_NS 237
9315dcc1e76SPaolo Bonzini #define KVM_CAP_X86_GUEST_MODE 238
932*3adaee78SSebastian Ott #define KVM_CAP_ARM_WRITABLE_IMP_ID_REGS 239
933607ca46eSDavid Howells 
934607ca46eSDavid Howells struct kvm_irq_routing_irqchip {
935607ca46eSDavid Howells 	__u32 irqchip;
936607ca46eSDavid Howells 	__u32 pin;
937607ca46eSDavid Howells };
938607ca46eSDavid Howells 
939607ca46eSDavid Howells struct kvm_irq_routing_msi {
940607ca46eSDavid Howells 	__u32 address_lo;
941607ca46eSDavid Howells 	__u32 address_hi;
942607ca46eSDavid Howells 	__u32 data;
94376a10b86SEric Auger 	union {
944607ca46eSDavid Howells 		__u32 pad;
94576a10b86SEric Auger 		__u32 devid;
94676a10b86SEric Auger 	};
947607ca46eSDavid Howells };
948607ca46eSDavid Howells 
94984223598SCornelia Huck struct kvm_irq_routing_s390_adapter {
95084223598SCornelia Huck 	__u64 ind_addr;
95184223598SCornelia Huck 	__u64 summary_addr;
95284223598SCornelia Huck 	__u64 ind_offset;
95384223598SCornelia Huck 	__u32 summary_offset;
95484223598SCornelia Huck 	__u32 adapter_id;
95584223598SCornelia Huck };
95684223598SCornelia Huck 
9575c919412SAndrey Smetanin struct kvm_irq_routing_hv_sint {
9585c919412SAndrey Smetanin 	__u32 vcpu;
9595c919412SAndrey Smetanin 	__u32 sint;
9605c919412SAndrey Smetanin };
9615c919412SAndrey Smetanin 
96214243b38SDavid Woodhouse struct kvm_irq_routing_xen_evtchn {
96314243b38SDavid Woodhouse 	__u32 port;
96414243b38SDavid Woodhouse 	__u32 vcpu;
96514243b38SDavid Woodhouse 	__u32 priority;
96614243b38SDavid Woodhouse };
96714243b38SDavid Woodhouse 
96814243b38SDavid Woodhouse #define KVM_IRQ_ROUTING_XEN_EVTCHN_PRIO_2LEVEL ((__u32)(-1))
96914243b38SDavid Woodhouse 
970607ca46eSDavid Howells /* gsi routing entry types */
971607ca46eSDavid Howells #define KVM_IRQ_ROUTING_IRQCHIP 1
972607ca46eSDavid Howells #define KVM_IRQ_ROUTING_MSI 2
97384223598SCornelia Huck #define KVM_IRQ_ROUTING_S390_ADAPTER 3
9745c919412SAndrey Smetanin #define KVM_IRQ_ROUTING_HV_SINT 4
97514243b38SDavid Woodhouse #define KVM_IRQ_ROUTING_XEN_EVTCHN 5
976607ca46eSDavid Howells 
977607ca46eSDavid Howells struct kvm_irq_routing_entry {
978607ca46eSDavid Howells 	__u32 gsi;
979607ca46eSDavid Howells 	__u32 type;
980607ca46eSDavid Howells 	__u32 flags;
981607ca46eSDavid Howells 	__u32 pad;
982607ca46eSDavid Howells 	union {
983607ca46eSDavid Howells 		struct kvm_irq_routing_irqchip irqchip;
984607ca46eSDavid Howells 		struct kvm_irq_routing_msi msi;
98584223598SCornelia Huck 		struct kvm_irq_routing_s390_adapter adapter;
9865c919412SAndrey Smetanin 		struct kvm_irq_routing_hv_sint hv_sint;
98714243b38SDavid Woodhouse 		struct kvm_irq_routing_xen_evtchn xen_evtchn;
988607ca46eSDavid Howells 		__u32 pad[8];
989607ca46eSDavid Howells 	} u;
990607ca46eSDavid Howells };
991607ca46eSDavid Howells 
992607ca46eSDavid Howells struct kvm_irq_routing {
993607ca46eSDavid Howells 	__u32 nr;
994607ca46eSDavid Howells 	__u32 flags;
99594dfc73eSGustavo A. R. Silva 	struct kvm_irq_routing_entry entries[];
996607ca46eSDavid Howells };
997607ca46eSDavid Howells 
998607ca46eSDavid Howells #define KVM_IRQFD_FLAG_DEASSIGN (1 << 0)
999607ca46eSDavid Howells /*
1000607ca46eSDavid Howells  * Available with KVM_CAP_IRQFD_RESAMPLE
1001607ca46eSDavid Howells  *
1002607ca46eSDavid Howells  * KVM_IRQFD_FLAG_RESAMPLE indicates resamplefd is valid and specifies
1003607ca46eSDavid Howells  * the irqfd to operate in resampling mode for level triggered interrupt
10043ecad8c2SMauro Carvalho Chehab  * emulation.  See Documentation/virt/kvm/api.rst.
1005607ca46eSDavid Howells  */
1006607ca46eSDavid Howells #define KVM_IRQFD_FLAG_RESAMPLE (1 << 1)
1007607ca46eSDavid Howells 
1008607ca46eSDavid Howells struct kvm_irqfd {
1009607ca46eSDavid Howells 	__u32 fd;
1010607ca46eSDavid Howells 	__u32 gsi;
1011607ca46eSDavid Howells 	__u32 flags;
1012607ca46eSDavid Howells 	__u32 resamplefd;
1013607ca46eSDavid Howells 	__u8  pad[16];
1014607ca46eSDavid Howells };
1015607ca46eSDavid Howells 
1016e3fd9a93SPaolo Bonzini /* For KVM_CAP_ADJUST_CLOCK */
1017e3fd9a93SPaolo Bonzini 
1018e3fd9a93SPaolo Bonzini /* Do not use 1, KVM_CHECK_EXTENSION returned it before we had flags.  */
1019e3fd9a93SPaolo Bonzini #define KVM_CLOCK_TSC_STABLE		2
1020c68dc1b5SOliver Upton #define KVM_CLOCK_REALTIME		(1 << 2)
1021c68dc1b5SOliver Upton #define KVM_CLOCK_HOST_TSC		(1 << 3)
1022e3fd9a93SPaolo Bonzini 
1023607ca46eSDavid Howells struct kvm_clock_data {
1024607ca46eSDavid Howells 	__u64 clock;
1025607ca46eSDavid Howells 	__u32 flags;
1026c68dc1b5SOliver Upton 	__u32 pad0;
1027c68dc1b5SOliver Upton 	__u64 realtime;
1028c68dc1b5SOliver Upton 	__u64 host_tsc;
1029c68dc1b5SOliver Upton 	__u32 pad[4];
1030607ca46eSDavid Howells };
1031607ca46eSDavid Howells 
1032e3fd9a93SPaolo Bonzini /* For KVM_CAP_SW_TLB */
1033e3fd9a93SPaolo Bonzini 
1034607ca46eSDavid Howells #define KVM_MMU_FSL_BOOKE_NOHV		0
1035607ca46eSDavid Howells #define KVM_MMU_FSL_BOOKE_HV		1
1036607ca46eSDavid Howells 
1037607ca46eSDavid Howells struct kvm_config_tlb {
1038607ca46eSDavid Howells 	__u64 params;
1039607ca46eSDavid Howells 	__u64 array;
1040607ca46eSDavid Howells 	__u32 mmu_type;
1041607ca46eSDavid Howells 	__u32 array_len;
1042607ca46eSDavid Howells };
1043607ca46eSDavid Howells 
1044607ca46eSDavid Howells struct kvm_dirty_tlb {
1045607ca46eSDavid Howells 	__u64 bitmap;
1046607ca46eSDavid Howells 	__u32 num_dirty;
1047607ca46eSDavid Howells };
1048607ca46eSDavid Howells 
1049607ca46eSDavid Howells /* Available with KVM_CAP_ONE_REG */
1050607ca46eSDavid Howells 
1051607ca46eSDavid Howells #define KVM_REG_ARCH_MASK	0xff00000000000000ULL
1052607ca46eSDavid Howells #define KVM_REG_GENERIC		0x0000000000000000ULL
1053607ca46eSDavid Howells 
1054607ca46eSDavid Howells /*
1055607ca46eSDavid Howells  * Architecture specific registers are to be defined in arch headers and
1056607ca46eSDavid Howells  * ORed with the arch identifier.
1057607ca46eSDavid Howells  */
1058607ca46eSDavid Howells #define KVM_REG_PPC		0x1000000000000000ULL
1059607ca46eSDavid Howells #define KVM_REG_X86		0x2000000000000000ULL
1060607ca46eSDavid Howells #define KVM_REG_IA64		0x3000000000000000ULL
1061607ca46eSDavid Howells #define KVM_REG_ARM		0x4000000000000000ULL
1062607ca46eSDavid Howells #define KVM_REG_S390		0x5000000000000000ULL
10637c8c5e6aSMarc Zyngier #define KVM_REG_ARM64		0x6000000000000000ULL
10642a8fedd0SDavid Daney #define KVM_REG_MIPS		0x7000000000000000ULL
1065dee04eeeSAnup Patel #define KVM_REG_RISCV		0x8000000000000000ULL
1066b37e6b68STianrui Zhao #define KVM_REG_LOONGARCH	0x9000000000000000ULL
1067607ca46eSDavid Howells 
1068607ca46eSDavid Howells #define KVM_REG_SIZE_SHIFT	52
1069607ca46eSDavid Howells #define KVM_REG_SIZE_MASK	0x00f0000000000000ULL
1070915d2f07SSean Christopherson 
1071915d2f07SSean Christopherson #define KVM_REG_SIZE(id)		\
1072915d2f07SSean Christopherson 	(1U << (((id) & KVM_REG_SIZE_MASK) >> KVM_REG_SIZE_SHIFT))
1073915d2f07SSean Christopherson 
1074607ca46eSDavid Howells #define KVM_REG_SIZE_U8		0x0000000000000000ULL
1075607ca46eSDavid Howells #define KVM_REG_SIZE_U16	0x0010000000000000ULL
1076607ca46eSDavid Howells #define KVM_REG_SIZE_U32	0x0020000000000000ULL
1077607ca46eSDavid Howells #define KVM_REG_SIZE_U64	0x0030000000000000ULL
1078607ca46eSDavid Howells #define KVM_REG_SIZE_U128	0x0040000000000000ULL
1079607ca46eSDavid Howells #define KVM_REG_SIZE_U256	0x0050000000000000ULL
1080607ca46eSDavid Howells #define KVM_REG_SIZE_U512	0x0060000000000000ULL
1081607ca46eSDavid Howells #define KVM_REG_SIZE_U1024	0x0070000000000000ULL
10822b953ea3SDave Martin #define KVM_REG_SIZE_U2048	0x0080000000000000ULL
1083607ca46eSDavid Howells 
1084749cf76cSChristoffer Dall struct kvm_reg_list {
1085749cf76cSChristoffer Dall 	__u64 n; /* number of regs */
108694dfc73eSGustavo A. R. Silva 	__u64 reg[];
1087749cf76cSChristoffer Dall };
1088749cf76cSChristoffer Dall 
1089607ca46eSDavid Howells struct kvm_one_reg {
1090607ca46eSDavid Howells 	__u64 id;
1091607ca46eSDavid Howells 	__u64 addr;
1092607ca46eSDavid Howells };
1093607ca46eSDavid Howells 
10942b8ddd93SAndre Przywara #define KVM_MSI_VALID_DEVID	(1U << 0)
1095607ca46eSDavid Howells struct kvm_msi {
1096607ca46eSDavid Howells 	__u32 address_lo;
1097607ca46eSDavid Howells 	__u32 address_hi;
1098607ca46eSDavid Howells 	__u32 data;
1099607ca46eSDavid Howells 	__u32 flags;
11002b8ddd93SAndre Przywara 	__u32 devid;
11012b8ddd93SAndre Przywara 	__u8  pad[12];
1102607ca46eSDavid Howells };
1103607ca46eSDavid Howells 
11043401d546SChristoffer Dall struct kvm_arm_device_addr {
11053401d546SChristoffer Dall 	__u64 id;
11063401d546SChristoffer Dall 	__u64 addr;
11073401d546SChristoffer Dall };
11083401d546SChristoffer Dall 
1109607ca46eSDavid Howells /*
1110852b6d57SScott Wood  * Device control API, available with KVM_CAP_DEVICE_CTRL
1111852b6d57SScott Wood  */
1112852b6d57SScott Wood #define KVM_CREATE_DEVICE_TEST		1
1113852b6d57SScott Wood 
1114852b6d57SScott Wood struct kvm_create_device {
1115852b6d57SScott Wood 	__u32	type;	/* in: KVM_DEV_TYPE_xxx */
1116852b6d57SScott Wood 	__u32	fd;	/* out: device handle */
1117852b6d57SScott Wood 	__u32	flags;	/* in: KVM_CREATE_DEVICE_xxx */
1118852b6d57SScott Wood };
1119852b6d57SScott Wood 
1120852b6d57SScott Wood struct kvm_device_attr {
1121852b6d57SScott Wood 	__u32	flags;		/* no flags currently defined */
1122852b6d57SScott Wood 	__u32	group;		/* device-defined */
1123852b6d57SScott Wood 	__u64	attr;		/* group-defined */
1124852b6d57SScott Wood 	__u64	addr;		/* userspace address of attr data */
1125852b6d57SScott Wood };
1126852b6d57SScott Wood 
1127dcc31ea6SYi Liu #define  KVM_DEV_VFIO_FILE			1
1128dcc31ea6SYi Liu 
1129dcc31ea6SYi Liu #define   KVM_DEV_VFIO_FILE_ADD			1
1130dcc31ea6SYi Liu #define   KVM_DEV_VFIO_FILE_DEL			2
1131dcc31ea6SYi Liu 
1132dcc31ea6SYi Liu /* KVM_DEV_VFIO_GROUP aliases are for compile time uapi compatibility */
1133dcc31ea6SYi Liu #define  KVM_DEV_VFIO_GROUP	KVM_DEV_VFIO_FILE
1134dcc31ea6SYi Liu 
1135dcc31ea6SYi Liu #define   KVM_DEV_VFIO_GROUP_ADD	KVM_DEV_VFIO_FILE_ADD
1136dcc31ea6SYi Liu #define   KVM_DEV_VFIO_GROUP_DEL	KVM_DEV_VFIO_FILE_DEL
1137121f80baSAlexey Kardashevskiy #define   KVM_DEV_VFIO_GROUP_SET_SPAPR_TCE		3
1138d60eacb0SWill Deacon 
1139d60eacb0SWill Deacon enum kvm_device_type {
1140d60eacb0SWill Deacon 	KVM_DEV_TYPE_FSL_MPIC_20	= 1,
1141d60eacb0SWill Deacon #define KVM_DEV_TYPE_FSL_MPIC_20	KVM_DEV_TYPE_FSL_MPIC_20
1142d60eacb0SWill Deacon 	KVM_DEV_TYPE_FSL_MPIC_42,
1143d60eacb0SWill Deacon #define KVM_DEV_TYPE_FSL_MPIC_42	KVM_DEV_TYPE_FSL_MPIC_42
1144d60eacb0SWill Deacon 	KVM_DEV_TYPE_XICS,
1145d60eacb0SWill Deacon #define KVM_DEV_TYPE_XICS		KVM_DEV_TYPE_XICS
1146d60eacb0SWill Deacon 	KVM_DEV_TYPE_VFIO,
1147d60eacb0SWill Deacon #define KVM_DEV_TYPE_VFIO		KVM_DEV_TYPE_VFIO
1148d60eacb0SWill Deacon 	KVM_DEV_TYPE_ARM_VGIC_V2,
1149d60eacb0SWill Deacon #define KVM_DEV_TYPE_ARM_VGIC_V2	KVM_DEV_TYPE_ARM_VGIC_V2
1150d60eacb0SWill Deacon 	KVM_DEV_TYPE_FLIC,
1151d60eacb0SWill Deacon #define KVM_DEV_TYPE_FLIC		KVM_DEV_TYPE_FLIC
1152a0675c25SAndre Przywara 	KVM_DEV_TYPE_ARM_VGIC_V3,
1153a0675c25SAndre Przywara #define KVM_DEV_TYPE_ARM_VGIC_V3	KVM_DEV_TYPE_ARM_VGIC_V3
11541085fdc6SAndre Przywara 	KVM_DEV_TYPE_ARM_VGIC_ITS,
11551085fdc6SAndre Przywara #define KVM_DEV_TYPE_ARM_VGIC_ITS	KVM_DEV_TYPE_ARM_VGIC_ITS
115690c73795SCédric Le Goater 	KVM_DEV_TYPE_XIVE,
115790c73795SCédric Le Goater #define KVM_DEV_TYPE_XIVE		KVM_DEV_TYPE_XIVE
115858772e9aSSteven Price 	KVM_DEV_TYPE_ARM_PV_TIME,
115958772e9aSSteven Price #define KVM_DEV_TYPE_ARM_PV_TIME	KVM_DEV_TYPE_ARM_PV_TIME
116089d01306SAnup Patel 	KVM_DEV_TYPE_RISCV_AIA,
116189d01306SAnup Patel #define KVM_DEV_TYPE_RISCV_AIA		KVM_DEV_TYPE_RISCV_AIA
1162c532de5aSXianglai Li 	KVM_DEV_TYPE_LOONGARCH_IPI,
1163c532de5aSXianglai Li #define KVM_DEV_TYPE_LOONGARCH_IPI	KVM_DEV_TYPE_LOONGARCH_IPI
11642e8b9df8SXianglai Li 	KVM_DEV_TYPE_LOONGARCH_EIOINTC,
11652e8b9df8SXianglai Li #define KVM_DEV_TYPE_LOONGARCH_EIOINTC	KVM_DEV_TYPE_LOONGARCH_EIOINTC
1166e785dfacSXianglai Li 	KVM_DEV_TYPE_LOONGARCH_PCHPIC,
1167e785dfacSXianglai Li #define KVM_DEV_TYPE_LOONGARCH_PCHPIC	KVM_DEV_TYPE_LOONGARCH_PCHPIC
1168c532de5aSXianglai Li 
1169d60eacb0SWill Deacon 	KVM_DEV_TYPE_MAX,
1170c532de5aSXianglai Li 
1171d60eacb0SWill Deacon };
11725df554adSScott Wood 
1173121f80baSAlexey Kardashevskiy struct kvm_vfio_spapr_tce {
1174121f80baSAlexey Kardashevskiy 	__s32	groupfd;
1175121f80baSAlexey Kardashevskiy 	__s32	tablefd;
1176121f80baSAlexey Kardashevskiy };
1177121f80baSAlexey Kardashevskiy 
1178852b6d57SScott Wood /*
1179607ca46eSDavid Howells  * KVM_CREATE_VCPU receives as a parameter the vcpu slot, and returns
1180607ca46eSDavid Howells  * a vcpu fd.
1181607ca46eSDavid Howells  */
1182607ca46eSDavid Howells #define KVM_CREATE_VCPU           _IO(KVMIO,   0x41)
1183607ca46eSDavid Howells #define KVM_GET_DIRTY_LOG         _IOW(KVMIO,  0x42, struct kvm_dirty_log)
1184607ca46eSDavid Howells #define KVM_SET_NR_MMU_PAGES      _IO(KVMIO,   0x44)
1185c5edd753SThomas Huth #define KVM_GET_NR_MMU_PAGES      _IO(KVMIO,   0x45)  /* deprecated */
1186607ca46eSDavid Howells #define KVM_SET_USER_MEMORY_REGION _IOW(KVMIO, 0x46, \
1187607ca46eSDavid Howells 					struct kvm_userspace_memory_region)
1188607ca46eSDavid Howells #define KVM_SET_TSS_ADDR          _IO(KVMIO,   0x47)
1189607ca46eSDavid Howells #define KVM_SET_IDENTITY_MAP_ADDR _IOW(KVMIO,  0x48, __u64)
1190bb58b90bSSean Christopherson #define KVM_SET_USER_MEMORY_REGION2 _IOW(KVMIO, 0x49, \
1191bb58b90bSSean Christopherson 					 struct kvm_userspace_memory_region2)
1192607ca46eSDavid Howells 
1193607ca46eSDavid Howells /* enable ucontrol for s390 */
1194607ca46eSDavid Howells #define KVM_S390_UCAS_MAP        _IOW(KVMIO, 0x50, struct kvm_s390_ucas_mapping)
1195607ca46eSDavid Howells #define KVM_S390_UCAS_UNMAP      _IOW(KVMIO, 0x51, struct kvm_s390_ucas_mapping)
1196607ca46eSDavid Howells #define KVM_S390_VCPU_FAULT	 _IOW(KVMIO, 0x52, unsigned long)
1197607ca46eSDavid Howells 
1198607ca46eSDavid Howells /* Device model IOC */
1199607ca46eSDavid Howells #define KVM_CREATE_IRQCHIP        _IO(KVMIO,   0x60)
1200607ca46eSDavid Howells #define KVM_IRQ_LINE              _IOW(KVMIO,  0x61, struct kvm_irq_level)
1201607ca46eSDavid Howells #define KVM_GET_IRQCHIP           _IOWR(KVMIO, 0x62, struct kvm_irqchip)
1202607ca46eSDavid Howells #define KVM_SET_IRQCHIP           _IOR(KVMIO,  0x63, struct kvm_irqchip)
1203607ca46eSDavid Howells #define KVM_CREATE_PIT            _IO(KVMIO,   0x64)
1204607ca46eSDavid Howells #define KVM_GET_PIT               _IOWR(KVMIO, 0x65, struct kvm_pit_state)
1205607ca46eSDavid Howells #define KVM_SET_PIT               _IOR(KVMIO,  0x66, struct kvm_pit_state)
1206607ca46eSDavid Howells #define KVM_IRQ_LINE_STATUS       _IOWR(KVMIO, 0x67, struct kvm_irq_level)
1207607ca46eSDavid Howells #define KVM_REGISTER_COALESCED_MMIO \
1208607ca46eSDavid Howells 			_IOW(KVMIO,  0x67, struct kvm_coalesced_mmio_zone)
1209607ca46eSDavid Howells #define KVM_UNREGISTER_COALESCED_MMIO \
1210607ca46eSDavid Howells 			_IOW(KVMIO,  0x68, struct kvm_coalesced_mmio_zone)
1211607ca46eSDavid Howells #define KVM_SET_GSI_ROUTING       _IOW(KVMIO,  0x6a, struct kvm_irq_routing)
1212607ca46eSDavid Howells #define KVM_REINJECT_CONTROL      _IO(KVMIO,   0x71)
1213607ca46eSDavid Howells #define KVM_IRQFD                 _IOW(KVMIO,  0x76, struct kvm_irqfd)
1214607ca46eSDavid Howells #define KVM_CREATE_PIT2		  _IOW(KVMIO,  0x77, struct kvm_pit_config)
1215607ca46eSDavid Howells #define KVM_SET_BOOT_CPU_ID       _IO(KVMIO,   0x78)
1216607ca46eSDavid Howells #define KVM_IOEVENTFD             _IOW(KVMIO,  0x79, struct kvm_ioeventfd)
1217607ca46eSDavid Howells #define KVM_XEN_HVM_CONFIG        _IOW(KVMIO,  0x7a, struct kvm_xen_hvm_config)
1218607ca46eSDavid Howells #define KVM_SET_CLOCK             _IOW(KVMIO,  0x7b, struct kvm_clock_data)
1219607ca46eSDavid Howells #define KVM_GET_CLOCK             _IOR(KVMIO,  0x7c, struct kvm_clock_data)
1220607ca46eSDavid Howells /* Available with KVM_CAP_PIT_STATE2 */
1221607ca46eSDavid Howells #define KVM_GET_PIT2              _IOR(KVMIO,  0x9f, struct kvm_pit_state2)
1222607ca46eSDavid Howells #define KVM_SET_PIT2              _IOW(KVMIO,  0xa0, struct kvm_pit_state2)
1223607ca46eSDavid Howells /* Available with KVM_CAP_PPC_GET_PVINFO */
1224607ca46eSDavid Howells #define KVM_PPC_GET_PVINFO	  _IOW(KVMIO,  0xa1, struct kvm_ppc_pvinfo)
1225ffbb61d0SDavid Woodhouse /* Available with KVM_CAP_TSC_CONTROL for a vCPU, or with
1226ffbb61d0SDavid Woodhouse *  KVM_CAP_VM_TSC_CONTROL to set defaults for a VM */
1227607ca46eSDavid Howells #define KVM_SET_TSC_KHZ           _IO(KVMIO,  0xa2)
1228607ca46eSDavid Howells #define KVM_GET_TSC_KHZ           _IO(KVMIO,  0xa3)
1229607ca46eSDavid Howells /* Available with KVM_CAP_SIGNAL_MSI */
1230607ca46eSDavid Howells #define KVM_SIGNAL_MSI            _IOW(KVMIO,  0xa5, struct kvm_msi)
1231607ca46eSDavid Howells /* Available with KVM_CAP_PPC_GET_SMMU_INFO */
1232607ca46eSDavid Howells #define KVM_PPC_GET_SMMU_INFO	  _IOR(KVMIO,  0xa6, struct kvm_ppc_smmu_info)
1233607ca46eSDavid Howells /* Available with KVM_CAP_PPC_ALLOC_HTAB */
1234607ca46eSDavid Howells #define KVM_PPC_ALLOCATE_HTAB	  _IOWR(KVMIO, 0xa7, __u32)
123519bf7f8aSMarcelo Tosatti #define KVM_CREATE_SPAPR_TCE	  _IOW(KVMIO,  0xa8, struct kvm_create_spapr_tce)
123658ded420SAlexey Kardashevskiy #define KVM_CREATE_SPAPR_TCE_64	  _IOW(KVMIO,  0xa8, \
123758ded420SAlexey Kardashevskiy 				       struct kvm_create_spapr_tce_64)
123819bf7f8aSMarcelo Tosatti /* Available with KVM_CAP_RMA */
123919bf7f8aSMarcelo Tosatti #define KVM_ALLOCATE_RMA	  _IOR(KVMIO,  0xa9, struct kvm_allocate_rma)
1240a2932923SPaul Mackerras /* Available with KVM_CAP_PPC_HTAB_FD */
1241a2932923SPaul Mackerras #define KVM_PPC_GET_HTAB_FD	  _IOW(KVMIO,  0xaa, struct kvm_get_htab_fd)
12423401d546SChristoffer Dall /* Available with KVM_CAP_ARM_SET_DEVICE_ADDR */
12433401d546SChristoffer Dall #define KVM_ARM_SET_DEVICE_ADDR	  _IOW(KVMIO,  0xab, struct kvm_arm_device_addr)
12448e591cb7SMichael Ellerman /* Available with KVM_CAP_PPC_RTAS */
12458e591cb7SMichael Ellerman #define KVM_PPC_RTAS_DEFINE_TOKEN _IOW(KVMIO,  0xac, struct kvm_rtas_token_args)
1246ef1ead0cSDavid Gibson /* Available with KVM_CAP_SPAPR_RESIZE_HPT */
1247ef1ead0cSDavid Gibson #define KVM_PPC_RESIZE_HPT_PREPARE _IOR(KVMIO, 0xad, struct kvm_ppc_resize_hpt)
1248ef1ead0cSDavid Gibson #define KVM_PPC_RESIZE_HPT_COMMIT  _IOR(KVMIO, 0xae, struct kvm_ppc_resize_hpt)
1249651d61bcSJoel Stanley /* Available with KVM_CAP_PPC_MMU_RADIX or KVM_CAP_PPC_MMU_HASH_V3 */
1250c9270132SPaul Mackerras #define KVM_PPC_CONFIGURE_V3_MMU  _IOW(KVMIO,  0xaf, struct kvm_ppc_mmuv3_cfg)
1251651d61bcSJoel Stanley /* Available with KVM_CAP_PPC_MMU_RADIX */
1252c9270132SPaul Mackerras #define KVM_PPC_GET_RMMU_INFO	  _IOW(KVMIO,  0xb0, struct kvm_ppc_rmmu_info)
12533214d01fSPaul Mackerras /* Available with KVM_CAP_PPC_GET_CPU_CHAR */
12543214d01fSPaul Mackerras #define KVM_PPC_GET_CPU_CHAR	  _IOR(KVMIO,  0xb1, struct kvm_ppc_cpu_char)
125566bb8a06SEric Hankland /* Available with KVM_CAP_PMU_EVENT_FILTER */
125666bb8a06SEric Hankland #define KVM_SET_PMU_EVENT_FILTER  _IOW(KVMIO,  0xb2, struct kvm_pmu_event_filter)
125722945688SBharata B Rao #define KVM_PPC_SVM_OFF		  _IO(KVMIO,  0xb3)
1258f0376edbSSteven Price #define KVM_ARM_MTE_COPY_TAGS	  _IOR(KVMIO,  0xb4, struct kvm_arm_copy_mte_tags)
125930ec7997SMarc Zyngier /* Available with KVM_CAP_COUNTER_OFFSET */
126030ec7997SMarc Zyngier #define KVM_ARM_SET_COUNTER_OFFSET _IOW(KVMIO,  0xb5, struct kvm_arm_counter_offset)
12613f9cd0caSJing Zhang #define KVM_ARM_GET_REG_WRITABLE_MASKS _IOR(KVMIO,  0xb6, struct reg_mask_range)
1262607ca46eSDavid Howells 
1263852b6d57SScott Wood /* ioctl for vm fd */
1264852b6d57SScott Wood #define KVM_CREATE_DEVICE	  _IOWR(KVMIO,  0xe0, struct kvm_create_device)
1265852b6d57SScott Wood 
1266852b6d57SScott Wood /* ioctls for fds returned by KVM_CREATE_DEVICE */
1267852b6d57SScott Wood #define KVM_SET_DEVICE_ATTR	  _IOW(KVMIO,  0xe1, struct kvm_device_attr)
1268852b6d57SScott Wood #define KVM_GET_DEVICE_ATTR	  _IOW(KVMIO,  0xe2, struct kvm_device_attr)
1269852b6d57SScott Wood #define KVM_HAS_DEVICE_ATTR	  _IOW(KVMIO,  0xe3, struct kvm_device_attr)
1270852b6d57SScott Wood 
1271607ca46eSDavid Howells /*
1272607ca46eSDavid Howells  * ioctls for vcpu fds
1273607ca46eSDavid Howells  */
1274607ca46eSDavid Howells #define KVM_RUN                   _IO(KVMIO,   0x80)
1275607ca46eSDavid Howells #define KVM_GET_REGS              _IOR(KVMIO,  0x81, struct kvm_regs)
1276607ca46eSDavid Howells #define KVM_SET_REGS              _IOW(KVMIO,  0x82, struct kvm_regs)
1277607ca46eSDavid Howells #define KVM_GET_SREGS             _IOR(KVMIO,  0x83, struct kvm_sregs)
1278607ca46eSDavid Howells #define KVM_SET_SREGS             _IOW(KVMIO,  0x84, struct kvm_sregs)
1279607ca46eSDavid Howells #define KVM_TRANSLATE             _IOWR(KVMIO, 0x85, struct kvm_translation)
1280607ca46eSDavid Howells #define KVM_INTERRUPT             _IOW(KVMIO,  0x86, struct kvm_interrupt)
1281607ca46eSDavid Howells #define KVM_GET_MSRS              _IOWR(KVMIO, 0x88, struct kvm_msrs)
1282607ca46eSDavid Howells #define KVM_SET_MSRS              _IOW(KVMIO,  0x89, struct kvm_msrs)
1283607ca46eSDavid Howells #define KVM_SET_CPUID             _IOW(KVMIO,  0x8a, struct kvm_cpuid)
1284607ca46eSDavid Howells #define KVM_SET_SIGNAL_MASK       _IOW(KVMIO,  0x8b, struct kvm_signal_mask)
1285607ca46eSDavid Howells #define KVM_GET_FPU               _IOR(KVMIO,  0x8c, struct kvm_fpu)
1286607ca46eSDavid Howells #define KVM_SET_FPU               _IOW(KVMIO,  0x8d, struct kvm_fpu)
1287607ca46eSDavid Howells #define KVM_GET_LAPIC             _IOR(KVMIO,  0x8e, struct kvm_lapic_state)
1288607ca46eSDavid Howells #define KVM_SET_LAPIC             _IOW(KVMIO,  0x8f, struct kvm_lapic_state)
1289607ca46eSDavid Howells #define KVM_SET_CPUID2            _IOW(KVMIO,  0x90, struct kvm_cpuid2)
1290607ca46eSDavid Howells #define KVM_GET_CPUID2            _IOWR(KVMIO, 0x91, struct kvm_cpuid2)
1291607ca46eSDavid Howells /* Available with KVM_CAP_VAPIC */
1292607ca46eSDavid Howells #define KVM_TPR_ACCESS_REPORTING  _IOWR(KVMIO, 0x92, struct kvm_tpr_access_ctl)
1293607ca46eSDavid Howells /* Available with KVM_CAP_VAPIC */
1294607ca46eSDavid Howells #define KVM_SET_VAPIC_ADDR        _IOW(KVMIO,  0x93, struct kvm_vapic_addr)
1295607ca46eSDavid Howells /* valid for virtual machine (for floating interrupt)_and_ vcpu */
1296607ca46eSDavid Howells #define KVM_S390_INTERRUPT        _IOW(KVMIO,  0x94, struct kvm_s390_interrupt)
1297607ca46eSDavid Howells /* store status for s390 */
1298607ca46eSDavid Howells #define KVM_S390_STORE_STATUS_NOADDR    (-1ul)
1299607ca46eSDavid Howells #define KVM_S390_STORE_STATUS_PREFIXED  (-2ul)
1300607ca46eSDavid Howells #define KVM_S390_STORE_STATUS	  _IOW(KVMIO,  0x95, unsigned long)
1301607ca46eSDavid Howells /* initial ipl psw for s390 */
1302607ca46eSDavid Howells #define KVM_S390_SET_INITIAL_PSW  _IOW(KVMIO,  0x96, struct kvm_s390_psw)
1303607ca46eSDavid Howells /* initial reset for s390 */
1304607ca46eSDavid Howells #define KVM_S390_INITIAL_RESET    _IO(KVMIO,   0x97)
1305607ca46eSDavid Howells #define KVM_GET_MP_STATE          _IOR(KVMIO,  0x98, struct kvm_mp_state)
1306607ca46eSDavid Howells #define KVM_SET_MP_STATE          _IOW(KVMIO,  0x99, struct kvm_mp_state)
130744b5ce73SChristoffer Dall /* Available with KVM_CAP_USER_NMI */
1308607ca46eSDavid Howells #define KVM_NMI                   _IO(KVMIO,   0x9a)
1309607ca46eSDavid Howells /* Available with KVM_CAP_SET_GUEST_DEBUG */
1310607ca46eSDavid Howells #define KVM_SET_GUEST_DEBUG       _IOW(KVMIO,  0x9b, struct kvm_guest_debug)
1311607ca46eSDavid Howells /* MCE for x86 */
1312607ca46eSDavid Howells #define KVM_X86_SETUP_MCE         _IOW(KVMIO,  0x9c, __u64)
1313607ca46eSDavid Howells #define KVM_X86_GET_MCE_CAP_SUPPORTED _IOR(KVMIO,  0x9d, __u64)
1314607ca46eSDavid Howells #define KVM_X86_SET_MCE           _IOW(KVMIO,  0x9e, struct kvm_x86_mce)
1315607ca46eSDavid Howells /* Available with KVM_CAP_VCPU_EVENTS */
1316607ca46eSDavid Howells #define KVM_GET_VCPU_EVENTS       _IOR(KVMIO,  0x9f, struct kvm_vcpu_events)
1317607ca46eSDavid Howells #define KVM_SET_VCPU_EVENTS       _IOW(KVMIO,  0xa0, struct kvm_vcpu_events)
1318607ca46eSDavid Howells /* Available with KVM_CAP_DEBUGREGS */
1319607ca46eSDavid Howells #define KVM_GET_DEBUGREGS         _IOR(KVMIO,  0xa1, struct kvm_debugregs)
1320607ca46eSDavid Howells #define KVM_SET_DEBUGREGS         _IOW(KVMIO,  0xa2, struct kvm_debugregs)
1321d938dc55SCornelia Huck /*
132222725266SBinbin Wu  * vcpu version available with KVM_CAP_ENABLE_CAP
1323d938dc55SCornelia Huck  * vm version available with KVM_CAP_ENABLE_CAP_VM
1324d938dc55SCornelia Huck  */
1325607ca46eSDavid Howells #define KVM_ENABLE_CAP            _IOW(KVMIO,  0xa3, struct kvm_enable_cap)
1326607ca46eSDavid Howells /* Available with KVM_CAP_XSAVE */
1327607ca46eSDavid Howells #define KVM_GET_XSAVE		  _IOR(KVMIO,  0xa4, struct kvm_xsave)
1328607ca46eSDavid Howells #define KVM_SET_XSAVE		  _IOW(KVMIO,  0xa5, struct kvm_xsave)
1329607ca46eSDavid Howells /* Available with KVM_CAP_XCRS */
1330607ca46eSDavid Howells #define KVM_GET_XCRS		  _IOR(KVMIO,  0xa6, struct kvm_xcrs)
1331607ca46eSDavid Howells #define KVM_SET_XCRS		  _IOW(KVMIO,  0xa7, struct kvm_xcrs)
1332607ca46eSDavid Howells /* Available with KVM_CAP_SW_TLB */
1333607ca46eSDavid Howells #define KVM_DIRTY_TLB		  _IOW(KVMIO,  0xaa, struct kvm_dirty_tlb)
1334607ca46eSDavid Howells /* Available with KVM_CAP_ONE_REG */
1335607ca46eSDavid Howells #define KVM_GET_ONE_REG		  _IOW(KVMIO,  0xab, struct kvm_one_reg)
1336607ca46eSDavid Howells #define KVM_SET_ONE_REG		  _IOW(KVMIO,  0xac, struct kvm_one_reg)
1337607ca46eSDavid Howells /* VM is being stopped by host */
1338607ca46eSDavid Howells #define KVM_KVMCLOCK_CTRL	  _IO(KVMIO,   0xad)
1339749cf76cSChristoffer Dall #define KVM_ARM_VCPU_INIT	  _IOW(KVMIO,  0xae, struct kvm_vcpu_init)
134042c4e0c7SAnup Patel #define KVM_ARM_PREFERRED_TARGET  _IOR(KVMIO,  0xaf, struct kvm_vcpu_init)
1341749cf76cSChristoffer Dall #define KVM_GET_REG_LIST	  _IOWR(KVMIO, 0xb0, struct kvm_reg_list)
134241408c28SThomas Huth /* Available with KVM_CAP_S390_MEM_OP */
134341408c28SThomas Huth #define KVM_S390_MEM_OP		  _IOW(KVMIO,  0xb1, struct kvm_s390_mem_op)
134430ee2a98SJason J. Herne /* Available with KVM_CAP_S390_SKEYS */
134530ee2a98SJason J. Herne #define KVM_S390_GET_SKEYS      _IOW(KVMIO, 0xb2, struct kvm_s390_skeys)
134630ee2a98SJason J. Herne #define KVM_S390_SET_SKEYS      _IOW(KVMIO, 0xb3, struct kvm_s390_skeys)
134747b43c52SJens Freimann /* Available with KVM_CAP_S390_INJECT_IRQ */
134847b43c52SJens Freimann #define KVM_S390_IRQ              _IOW(KVMIO,  0xb4, struct kvm_s390_irq)
1349816c7667SJens Freimann /* Available with KVM_CAP_S390_IRQ_STATE */
1350816c7667SJens Freimann #define KVM_S390_SET_IRQ_STATE	  _IOW(KVMIO, 0xb5, struct kvm_s390_irq_state)
1351816c7667SJens Freimann #define KVM_S390_GET_IRQ_STATE	  _IOW(KVMIO, 0xb6, struct kvm_s390_irq_state)
1352f077825aSPaolo Bonzini /* Available with KVM_CAP_X86_SMM */
1353f077825aSPaolo Bonzini #define KVM_SMI                   _IO(KVMIO,   0xb7)
13544036e387SClaudio Imbrenda /* Available with KVM_CAP_S390_CMMA_MIGRATION */
1355949c0336SGleb Fotengauer-Malinovskiy #define KVM_S390_GET_CMMA_BITS      _IOWR(KVMIO, 0xb8, struct kvm_s390_cmma_log)
13564036e387SClaudio Imbrenda #define KVM_S390_SET_CMMA_BITS      _IOW(KVMIO, 0xb9, struct kvm_s390_cmma_log)
13575acc5c06SBrijesh Singh /* Memory Encryption Commands */
13585acc5c06SBrijesh Singh #define KVM_MEMORY_ENCRYPT_OP      _IOWR(KVMIO, 0xba, unsigned long)
1359607ca46eSDavid Howells 
136069eaedeeSBrijesh Singh struct kvm_enc_region {
136169eaedeeSBrijesh Singh 	__u64 addr;
136269eaedeeSBrijesh Singh 	__u64 size;
136369eaedeeSBrijesh Singh };
136469eaedeeSBrijesh Singh 
136569eaedeeSBrijesh Singh #define KVM_MEMORY_ENCRYPT_REG_REGION    _IOR(KVMIO, 0xbb, struct kvm_enc_region)
136669eaedeeSBrijesh Singh #define KVM_MEMORY_ENCRYPT_UNREG_REGION  _IOR(KVMIO, 0xbc, struct kvm_enc_region)
136769eaedeeSBrijesh Singh 
1368faeb7833SRoman Kagan /* Available with KVM_CAP_HYPERV_EVENTFD */
1369faeb7833SRoman Kagan #define KVM_HYPERV_EVENTFD        _IOW(KVMIO,  0xbd, struct kvm_hyperv_eventfd)
1370faeb7833SRoman Kagan 
13718fcc4b59SJim Mattson /* Available with KVM_CAP_NESTED_STATE */
13728fcc4b59SJim Mattson #define KVM_GET_NESTED_STATE         _IOWR(KVMIO, 0xbe, struct kvm_nested_state)
13738fcc4b59SJim Mattson #define KVM_SET_NESTED_STATE         _IOW(KVMIO,  0xbf, struct kvm_nested_state)
1374faeb7833SRoman Kagan 
1375d7547c55SPeter Xu /* Available with KVM_CAP_MANUAL_DIRTY_LOG_PROTECT_2 */
13762a31b9dbSPaolo Bonzini #define KVM_CLEAR_DIRTY_LOG          _IOWR(KVMIO, 0xc0, struct kvm_clear_dirty_log)
13772a31b9dbSPaolo Bonzini 
1378c21d54f0SVitaly Kuznetsov /* Available with KVM_CAP_HYPERV_CPUID (vcpu) / KVM_CAP_SYS_HYPERV_CPUID (system) */
13792bc39970SVitaly Kuznetsov #define KVM_GET_SUPPORTED_HV_CPUID _IOWR(KVMIO, 0xc1, struct kvm_cpuid2)
13802bc39970SVitaly Kuznetsov 
13817dd32a0dSDave Martin /* Available with KVM_CAP_ARM_SVE */
13827dd32a0dSDave Martin #define KVM_ARM_VCPU_FINALIZE	  _IOW(KVMIO,  0xc2, int)
13837dd32a0dSDave Martin 
13847de3f142SJanosch Frank /* Available with  KVM_CAP_S390_VCPU_RESETS */
13857de3f142SJanosch Frank #define KVM_S390_NORMAL_RESET	_IO(KVMIO,   0xc3)
13867de3f142SJanosch Frank #define KVM_S390_CLEAR_RESET	_IO(KVMIO,   0xc4)
13877de3f142SJanosch Frank 
138829b40f10SJanosch Frank /* Available with KVM_CAP_S390_PROTECTED */
138929b40f10SJanosch Frank #define KVM_S390_PV_COMMAND		_IOWR(KVMIO, 0xc5, struct kvm_pv_cmd)
139029b40f10SJanosch Frank 
13911a155254SAlexander Graf /* Available with KVM_CAP_X86_MSR_FILTER */
13921a155254SAlexander Graf #define KVM_X86_SET_MSR_FILTER	_IOW(KVMIO,  0xc6, struct kvm_msr_filter)
13931a155254SAlexander Graf 
1394fb04a1edSPeter Xu /* Available with KVM_CAP_DIRTY_LOG_RING */
1395fb04a1edSPeter Xu #define KVM_RESET_DIRTY_RINGS		_IO(KVMIO, 0xc7)
1396fb04a1edSPeter Xu 
13973e324615SDavid Woodhouse /* Per-VM Xen attributes */
1398a76b9641SJoao Martins #define KVM_XEN_HVM_GET_ATTR	_IOWR(KVMIO, 0xc8, struct kvm_xen_hvm_attr)
1399a76b9641SJoao Martins #define KVM_XEN_HVM_SET_ATTR	_IOW(KVMIO,  0xc9, struct kvm_xen_hvm_attr)
1400a76b9641SJoao Martins 
14013e324615SDavid Woodhouse /* Per-vCPU Xen attributes */
14023e324615SDavid Woodhouse #define KVM_XEN_VCPU_GET_ATTR	_IOWR(KVMIO, 0xca, struct kvm_xen_vcpu_attr)
14033e324615SDavid Woodhouse #define KVM_XEN_VCPU_SET_ATTR	_IOW(KVMIO,  0xcb, struct kvm_xen_vcpu_attr)
14043e324615SDavid Woodhouse 
140535025735SDavid Woodhouse /* Available with KVM_CAP_XEN_HVM / KVM_XEN_HVM_CONFIG_EVTCHN_SEND */
140635025735SDavid Woodhouse #define KVM_XEN_HVM_EVTCHN_SEND	_IOW(KVMIO,  0xd0, struct kvm_irq_routing_xen_evtchn)
140735025735SDavid Woodhouse 
14086dba9403SMaxim Levitsky #define KVM_GET_SREGS2             _IOR(KVMIO,  0xcc, struct kvm_sregs2)
14096dba9403SMaxim Levitsky #define KVM_SET_SREGS2             _IOW(KVMIO,  0xcd, struct kvm_sregs2)
14106dba9403SMaxim Levitsky 
14113c9bd400SJay Zhou #define KVM_DIRTY_LOG_MANUAL_PROTECT_ENABLE    (1 << 0)
14123c9bd400SJay Zhou #define KVM_DIRTY_LOG_INITIALLY_SET            (1 << 1)
14133c9bd400SJay Zhou 
1414fb04a1edSPeter Xu /*
1415fb04a1edSPeter Xu  * Arch needs to define the macro after implementing the dirty ring
1416fb04a1edSPeter Xu  * feature.  KVM_DIRTY_LOG_PAGE_OFFSET should be defined as the
1417fb04a1edSPeter Xu  * starting page offset of the dirty ring structures.
1418fb04a1edSPeter Xu  */
1419fb04a1edSPeter Xu #ifndef KVM_DIRTY_LOG_PAGE_OFFSET
1420fb04a1edSPeter Xu #define KVM_DIRTY_LOG_PAGE_OFFSET 0
1421fb04a1edSPeter Xu #endif
1422fb04a1edSPeter Xu 
1423fb04a1edSPeter Xu /*
1424fb04a1edSPeter Xu  * KVM dirty GFN flags, defined as:
1425fb04a1edSPeter Xu  *
1426fb04a1edSPeter Xu  * |---------------+---------------+--------------|
1427fb04a1edSPeter Xu  * | bit 1 (reset) | bit 0 (dirty) | Status       |
1428fb04a1edSPeter Xu  * |---------------+---------------+--------------|
1429fb04a1edSPeter Xu  * |             0 |             0 | Invalid GFN  |
1430fb04a1edSPeter Xu  * |             0 |             1 | Dirty GFN    |
1431fb04a1edSPeter Xu  * |             1 |             X | GFN to reset |
1432fb04a1edSPeter Xu  * |---------------+---------------+--------------|
1433fb04a1edSPeter Xu  *
1434fb04a1edSPeter Xu  * Lifecycle of a dirty GFN goes like:
1435fb04a1edSPeter Xu  *
1436fb04a1edSPeter Xu  *      dirtied         harvested        reset
1437fb04a1edSPeter Xu  * 00 -----------> 01 -------------> 1X -------+
1438fb04a1edSPeter Xu  *  ^                                          |
1439fb04a1edSPeter Xu  *  |                                          |
1440fb04a1edSPeter Xu  *  +------------------------------------------+
1441fb04a1edSPeter Xu  *
1442fb04a1edSPeter Xu  * The userspace program is only responsible for the 01->1X state
1443fb04a1edSPeter Xu  * conversion after harvesting an entry.  Also, it must not skip any
1444fb04a1edSPeter Xu  * dirty bits, so that dirty bits are always harvested in sequence.
1445fb04a1edSPeter Xu  */
1446fb1070d1SJoe Richey #define KVM_DIRTY_GFN_F_DIRTY           _BITUL(0)
1447fb1070d1SJoe Richey #define KVM_DIRTY_GFN_F_RESET           _BITUL(1)
1448fb04a1edSPeter Xu #define KVM_DIRTY_GFN_F_MASK            0x3
1449fb04a1edSPeter Xu 
1450fb04a1edSPeter Xu /*
1451fb04a1edSPeter Xu  * KVM dirty rings should be mapped at KVM_DIRTY_LOG_PAGE_OFFSET of
1452fb04a1edSPeter Xu  * per-vcpu mmaped regions as an array of struct kvm_dirty_gfn.  The
1453fb04a1edSPeter Xu  * size of the gfn buffer is decided by the first argument when
1454fb04a1edSPeter Xu  * enabling KVM_CAP_DIRTY_LOG_RING.
1455fb04a1edSPeter Xu  */
1456fb04a1edSPeter Xu struct kvm_dirty_gfn {
1457fb04a1edSPeter Xu 	__u32 flags;
1458fb04a1edSPeter Xu 	__u32 slot;
1459fb04a1edSPeter Xu 	__u64 offset;
1460fb04a1edSPeter Xu };
1461fb04a1edSPeter Xu 
1462fe6b6bc8SChenyi Qiang #define KVM_BUS_LOCK_DETECTION_OFF             (1 << 0)
1463fe6b6bc8SChenyi Qiang #define KVM_BUS_LOCK_DETECTION_EXIT            (1 << 1)
1464fe6b6bc8SChenyi Qiang 
1465ba7bb663SDavid Dunn #define KVM_PMU_CAP_DISABLE                    (1 << 0)
1466ba7bb663SDavid Dunn 
1467cb082bfaSJing Zhang /**
1468cb082bfaSJing Zhang  * struct kvm_stats_header - Header of per vm/vcpu binary statistics data.
1469cb082bfaSJing Zhang  * @flags: Some extra information for header, always 0 for now.
1470cb082bfaSJing Zhang  * @name_size: The size in bytes of the memory which contains statistics
1471cb082bfaSJing Zhang  *             name string including trailing '\0'. The memory is allocated
1472cb082bfaSJing Zhang  *             at the send of statistics descriptor.
1473cb082bfaSJing Zhang  * @num_desc: The number of statistics the vm or vcpu has.
1474cb082bfaSJing Zhang  * @id_offset: The offset of the vm/vcpu stats' id string in the file pointed
1475cb082bfaSJing Zhang  *             by vm/vcpu stats fd.
1476cb082bfaSJing Zhang  * @desc_offset: The offset of the vm/vcpu stats' descriptor block in the file
1477cb082bfaSJing Zhang  *               pointd by vm/vcpu stats fd.
1478cb082bfaSJing Zhang  * @data_offset: The offset of the vm/vcpu stats' data block in the file
1479cb082bfaSJing Zhang  *               pointed by vm/vcpu stats fd.
1480cb082bfaSJing Zhang  *
1481cb082bfaSJing Zhang  * This is the header userspace needs to read from stats fd before any other
1482cb082bfaSJing Zhang  * readings. It is used by userspace to discover all the information about the
1483cb082bfaSJing Zhang  * vm/vcpu's binary statistics.
1484cb082bfaSJing Zhang  * Userspace reads this header from the start of the vm/vcpu's stats fd.
1485cb082bfaSJing Zhang  */
1486cb082bfaSJing Zhang struct kvm_stats_header {
1487cb082bfaSJing Zhang 	__u32 flags;
1488cb082bfaSJing Zhang 	__u32 name_size;
1489cb082bfaSJing Zhang 	__u32 num_desc;
1490cb082bfaSJing Zhang 	__u32 id_offset;
1491cb082bfaSJing Zhang 	__u32 desc_offset;
1492cb082bfaSJing Zhang 	__u32 data_offset;
1493cb082bfaSJing Zhang };
1494cb082bfaSJing Zhang 
1495cb082bfaSJing Zhang #define KVM_STATS_TYPE_SHIFT		0
1496cb082bfaSJing Zhang #define KVM_STATS_TYPE_MASK		(0xF << KVM_STATS_TYPE_SHIFT)
1497cb082bfaSJing Zhang #define KVM_STATS_TYPE_CUMULATIVE	(0x0 << KVM_STATS_TYPE_SHIFT)
1498cb082bfaSJing Zhang #define KVM_STATS_TYPE_INSTANT		(0x1 << KVM_STATS_TYPE_SHIFT)
1499cb082bfaSJing Zhang #define KVM_STATS_TYPE_PEAK		(0x2 << KVM_STATS_TYPE_SHIFT)
1500f95937ccSJing Zhang #define KVM_STATS_TYPE_LINEAR_HIST	(0x3 << KVM_STATS_TYPE_SHIFT)
1501f95937ccSJing Zhang #define KVM_STATS_TYPE_LOG_HIST		(0x4 << KVM_STATS_TYPE_SHIFT)
1502f95937ccSJing Zhang #define KVM_STATS_TYPE_MAX		KVM_STATS_TYPE_LOG_HIST
1503cb082bfaSJing Zhang 
1504cb082bfaSJing Zhang #define KVM_STATS_UNIT_SHIFT		4
1505cb082bfaSJing Zhang #define KVM_STATS_UNIT_MASK		(0xF << KVM_STATS_UNIT_SHIFT)
1506cb082bfaSJing Zhang #define KVM_STATS_UNIT_NONE		(0x0 << KVM_STATS_UNIT_SHIFT)
1507cb082bfaSJing Zhang #define KVM_STATS_UNIT_BYTES		(0x1 << KVM_STATS_UNIT_SHIFT)
1508cb082bfaSJing Zhang #define KVM_STATS_UNIT_SECONDS		(0x2 << KVM_STATS_UNIT_SHIFT)
1509cb082bfaSJing Zhang #define KVM_STATS_UNIT_CYCLES		(0x3 << KVM_STATS_UNIT_SHIFT)
15101b870fa5SPaolo Bonzini #define KVM_STATS_UNIT_BOOLEAN		(0x4 << KVM_STATS_UNIT_SHIFT)
1511450a5639SOliver Upton #define KVM_STATS_UNIT_MAX		KVM_STATS_UNIT_BOOLEAN
1512cb082bfaSJing Zhang 
1513cb082bfaSJing Zhang #define KVM_STATS_BASE_SHIFT		8
1514cb082bfaSJing Zhang #define KVM_STATS_BASE_MASK		(0xF << KVM_STATS_BASE_SHIFT)
1515cb082bfaSJing Zhang #define KVM_STATS_BASE_POW10		(0x0 << KVM_STATS_BASE_SHIFT)
1516cb082bfaSJing Zhang #define KVM_STATS_BASE_POW2		(0x1 << KVM_STATS_BASE_SHIFT)
1517cb082bfaSJing Zhang #define KVM_STATS_BASE_MAX		KVM_STATS_BASE_POW2
1518cb082bfaSJing Zhang 
1519cb082bfaSJing Zhang /**
1520cb082bfaSJing Zhang  * struct kvm_stats_desc - Descriptor of a KVM statistics.
1521cb082bfaSJing Zhang  * @flags: Annotations of the stats, like type, unit, etc.
1522cb082bfaSJing Zhang  * @exponent: Used together with @flags to determine the unit.
1523cb082bfaSJing Zhang  * @size: The number of data items for this stats.
1524cb082bfaSJing Zhang  *        Every data item is of type __u64.
1525cb082bfaSJing Zhang  * @offset: The offset of the stats to the start of stat structure in
1526f95937ccSJing Zhang  *          structure kvm or kvm_vcpu.
1527f95937ccSJing Zhang  * @bucket_size: A parameter value used for histogram stats. It is only used
1528f95937ccSJing Zhang  *		for linear histogram stats, specifying the size of the bucket;
1529cb082bfaSJing Zhang  * @name: The name string for the stats. Its size is indicated by the
1530cb082bfaSJing Zhang  *        &kvm_stats_header->name_size.
1531cb082bfaSJing Zhang  */
1532cb082bfaSJing Zhang struct kvm_stats_desc {
1533cb082bfaSJing Zhang 	__u32 flags;
1534cb082bfaSJing Zhang 	__s16 exponent;
1535cb082bfaSJing Zhang 	__u16 size;
1536cb082bfaSJing Zhang 	__u32 offset;
1537f95937ccSJing Zhang 	__u32 bucket_size;
1538cb082bfaSJing Zhang 	char name[];
1539cb082bfaSJing Zhang };
1540cb082bfaSJing Zhang 
1541cb082bfaSJing Zhang #define KVM_GET_STATS_FD  _IO(KVMIO,  0xce)
1542cb082bfaSJing Zhang 
1543f6c6804cSJanosch Frank /* Available with KVM_CAP_XSAVE2 */
1544f6c6804cSJanosch Frank #define KVM_GET_XSAVE2		  _IOR(KVMIO,  0xcf, struct kvm_xsave)
1545f6c6804cSJanosch Frank 
15468aba0958SJanosch Frank /* Available with KVM_CAP_S390_PROTECTED_DUMP */
15478aba0958SJanosch Frank #define KVM_S390_PV_CPU_COMMAND	_IOWR(KVMIO, 0xd0, struct kvm_pv_cmd)
15488aba0958SJanosch Frank 
15492f4073e0STao Xu /* Available with KVM_CAP_X86_NOTIFY_VMEXIT */
15502f4073e0STao Xu #define KVM_X86_NOTIFY_VMEXIT_ENABLED		(1ULL << 0)
15512f4073e0STao Xu #define KVM_X86_NOTIFY_VMEXIT_USER		(1ULL << 1)
15522f4073e0STao Xu 
1553db1c875eSMatthew Rosato /* Available with KVM_CAP_S390_ZPCI_OP */
1554db1c875eSMatthew Rosato #define KVM_S390_ZPCI_OP         _IOW(KVMIO,  0xd1, struct kvm_s390_zpci_op)
1555db1c875eSMatthew Rosato 
15565a475554SChao Peng /* Available with KVM_CAP_MEMORY_ATTRIBUTES */
15575a475554SChao Peng #define KVM_SET_MEMORY_ATTRIBUTES              _IOW(KVMIO,  0xd2, struct kvm_memory_attributes)
15585a475554SChao Peng 
15595a475554SChao Peng struct kvm_memory_attributes {
15605a475554SChao Peng 	__u64 address;
15615a475554SChao Peng 	__u64 size;
15625a475554SChao Peng 	__u64 attributes;
15635a475554SChao Peng 	__u64 flags;
15645a475554SChao Peng };
15655a475554SChao Peng 
15665a475554SChao Peng #define KVM_MEMORY_ATTRIBUTE_PRIVATE           (1ULL << 3)
15675a475554SChao Peng 
1568a7800aa8SSean Christopherson #define KVM_CREATE_GUEST_MEMFD	_IOWR(KVMIO,  0xd4, struct kvm_create_guest_memfd)
1569a7800aa8SSean Christopherson 
1570a7800aa8SSean Christopherson struct kvm_create_guest_memfd {
1571a7800aa8SSean Christopherson 	__u64 size;
1572a7800aa8SSean Christopherson 	__u64 flags;
1573a7800aa8SSean Christopherson 	__u64 reserved[6];
1574a7800aa8SSean Christopherson };
1575a7800aa8SSean Christopherson 
1576bc1a5cd0SIsaku Yamahata #define KVM_PRE_FAULT_MEMORY	_IOWR(KVMIO, 0xd5, struct kvm_pre_fault_memory)
1577bc1a5cd0SIsaku Yamahata 
1578bc1a5cd0SIsaku Yamahata struct kvm_pre_fault_memory {
1579bc1a5cd0SIsaku Yamahata 	__u64 gpa;
1580bc1a5cd0SIsaku Yamahata 	__u64 size;
1581bc1a5cd0SIsaku Yamahata 	__u64 flags;
1582bc1a5cd0SIsaku Yamahata 	__u64 padding[5];
1583bc1a5cd0SIsaku Yamahata };
1584bc1a5cd0SIsaku Yamahata 
1585607ca46eSDavid Howells #endif /* __LINUX_KVM_H */
1586