xref: /linux/include/uapi/linux/kvm.h (revision 100c85421b52e41269ada88f7d71a6b8a06c7a11)
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 
19*6bda055dSPaolo Bonzini /*
20*6bda055dSPaolo Bonzini  * Backwards-compatible definitions.
21*6bda055dSPaolo Bonzini  */
22*6bda055dSPaolo Bonzini #define __KVM_HAVE_GUEST_DEBUG
23*6bda055dSPaolo 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 
195607ca46eSDavid Howells /* for KVM_RUN, returned by mmap(vcpu_fd, offset=0) */
196607ca46eSDavid Howells struct kvm_run {
197607ca46eSDavid Howells 	/* in */
198607ca46eSDavid Howells 	__u8 request_interrupt_window;
199460df4c1SPaolo Bonzini 	__u8 immediate_exit;
200460df4c1SPaolo Bonzini 	__u8 padding1[6];
201607ca46eSDavid Howells 
202607ca46eSDavid Howells 	/* out */
203607ca46eSDavid Howells 	__u32 exit_reason;
204607ca46eSDavid Howells 	__u8 ready_for_interrupt_injection;
205607ca46eSDavid Howells 	__u8 if_flag;
206f077825aSPaolo Bonzini 	__u16 flags;
207607ca46eSDavid Howells 
208607ca46eSDavid Howells 	/* in (pre_kvm_run), out (post_kvm_run) */
209607ca46eSDavid Howells 	__u64 cr8;
210607ca46eSDavid Howells 	__u64 apic_base;
211607ca46eSDavid Howells 
212607ca46eSDavid Howells #ifdef __KVM_S390
213607ca46eSDavid Howells 	/* the processor status word for s390 */
214607ca46eSDavid Howells 	__u64 psw_mask; /* psw upper half */
215607ca46eSDavid Howells 	__u64 psw_addr; /* psw lower half */
216607ca46eSDavid Howells #endif
217607ca46eSDavid Howells 	union {
218607ca46eSDavid Howells 		/* KVM_EXIT_UNKNOWN */
219607ca46eSDavid Howells 		struct {
220607ca46eSDavid Howells 			__u64 hardware_exit_reason;
221607ca46eSDavid Howells 		} hw;
222607ca46eSDavid Howells 		/* KVM_EXIT_FAIL_ENTRY */
223607ca46eSDavid Howells 		struct {
224607ca46eSDavid Howells 			__u64 hardware_entry_failure_reason;
2251aa561b1SJim Mattson 			__u32 cpu;
226607ca46eSDavid Howells 		} fail_entry;
227607ca46eSDavid Howells 		/* KVM_EXIT_EXCEPTION */
228607ca46eSDavid Howells 		struct {
229607ca46eSDavid Howells 			__u32 exception;
230607ca46eSDavid Howells 			__u32 error_code;
231607ca46eSDavid Howells 		} ex;
232607ca46eSDavid Howells 		/* KVM_EXIT_IO */
233607ca46eSDavid Howells 		struct {
234607ca46eSDavid Howells #define KVM_EXIT_IO_IN  0
235607ca46eSDavid Howells #define KVM_EXIT_IO_OUT 1
236607ca46eSDavid Howells 			__u8 direction;
237607ca46eSDavid Howells 			__u8 size; /* bytes */
238607ca46eSDavid Howells 			__u16 port;
239607ca46eSDavid Howells 			__u32 count;
240607ca46eSDavid Howells 			__u64 data_offset; /* relative to kvm_run start */
241607ca46eSDavid Howells 		} io;
2428ab30c15SAlex Bennée 		/* KVM_EXIT_DEBUG */
243607ca46eSDavid Howells 		struct {
244607ca46eSDavid Howells 			struct kvm_debug_exit_arch arch;
245607ca46eSDavid Howells 		} debug;
246607ca46eSDavid Howells 		/* KVM_EXIT_MMIO */
247607ca46eSDavid Howells 		struct {
248607ca46eSDavid Howells 			__u64 phys_addr;
249607ca46eSDavid Howells 			__u8  data[8];
250607ca46eSDavid Howells 			__u32 len;
251607ca46eSDavid Howells 			__u8  is_write;
252607ca46eSDavid Howells 		} mmio;
253b37e6b68STianrui Zhao 		/* KVM_EXIT_LOONGARCH_IOCSR */
254b37e6b68STianrui Zhao 		struct {
255b37e6b68STianrui Zhao 			__u64 phys_addr;
256b37e6b68STianrui Zhao 			__u8  data[8];
257b37e6b68STianrui Zhao 			__u32 len;
258b37e6b68STianrui Zhao 			__u8  is_write;
259b37e6b68STianrui Zhao 		} iocsr_io;
260607ca46eSDavid Howells 		/* KVM_EXIT_HYPERCALL */
261607ca46eSDavid Howells 		struct {
262607ca46eSDavid Howells 			__u64 nr;
263607ca46eSDavid Howells 			__u64 args[6];
264607ca46eSDavid Howells 			__u64 ret;
265e65733b5SOliver Upton 
266e65733b5SOliver Upton 			union {
267e65733b5SOliver Upton #ifndef __KERNEL__
268607ca46eSDavid Howells 				__u32 longmode;
269e65733b5SOliver Upton #endif
270e65733b5SOliver Upton 				__u64 flags;
271e65733b5SOliver Upton 			};
272607ca46eSDavid Howells 		} hypercall;
273607ca46eSDavid Howells 		/* KVM_EXIT_TPR_ACCESS */
274607ca46eSDavid Howells 		struct {
275607ca46eSDavid Howells 			__u64 rip;
276607ca46eSDavid Howells 			__u32 is_write;
277607ca46eSDavid Howells 			__u32 pad;
278607ca46eSDavid Howells 		} tpr_access;
279607ca46eSDavid Howells 		/* KVM_EXIT_S390_SIEIC */
280607ca46eSDavid Howells 		struct {
281607ca46eSDavid Howells 			__u8 icptcode;
282607ca46eSDavid Howells 			__u16 ipa;
283607ca46eSDavid Howells 			__u32 ipb;
284607ca46eSDavid Howells 		} s390_sieic;
285607ca46eSDavid Howells 		/* KVM_EXIT_S390_RESET */
286607ca46eSDavid Howells 		__u64 s390_reset_flags;
287607ca46eSDavid Howells 		/* KVM_EXIT_S390_UCONTROL */
288607ca46eSDavid Howells 		struct {
289607ca46eSDavid Howells 			__u64 trans_exc_code;
290607ca46eSDavid Howells 			__u32 pgm_code;
291607ca46eSDavid Howells 		} s390_ucontrol;
292ce91ddc4SAlexander Graf 		/* KVM_EXIT_DCR (deprecated) */
293607ca46eSDavid Howells 		struct {
294607ca46eSDavid Howells 			__u32 dcrn;
295607ca46eSDavid Howells 			__u32 data;
296607ca46eSDavid Howells 			__u8  is_write;
297607ca46eSDavid Howells 		} dcr;
2988ab30c15SAlex Bennée 		/* KVM_EXIT_INTERNAL_ERROR */
299607ca46eSDavid Howells 		struct {
300607ca46eSDavid Howells 			__u32 suberror;
301607ca46eSDavid Howells 			/* Available with KVM_CAP_INTERNAL_ERROR_DATA: */
302607ca46eSDavid Howells 			__u32 ndata;
303607ca46eSDavid Howells 			__u64 data[16];
304607ca46eSDavid Howells 		} internal;
30519238e75SAaron Lewis 		/*
30619238e75SAaron Lewis 		 * KVM_INTERNAL_ERROR_EMULATION
30719238e75SAaron Lewis 		 *
30819238e75SAaron Lewis 		 * "struct emulation_failure" is an overlay of "struct internal"
30919238e75SAaron Lewis 		 * that is used for the KVM_INTERNAL_ERROR_EMULATION sub-type of
31019238e75SAaron Lewis 		 * KVM_EXIT_INTERNAL_ERROR.  Note, unlike other internal error
31119238e75SAaron Lewis 		 * sub-types, this struct is ABI!  It also needs to be backwards
31219238e75SAaron Lewis 		 * compatible with "struct internal".  Take special care that
31319238e75SAaron Lewis 		 * "ndata" is correct, that new fields are enumerated in "flags",
31419238e75SAaron Lewis 		 * and that each flag enumerates fields that are 64-bit aligned
31519238e75SAaron Lewis 		 * and sized (so that ndata+internal.data[] is valid/accurate).
316e615e355SDavid Edmondson 		 *
317e615e355SDavid Edmondson 		 * Space beyond the defined fields may be used to store arbitrary
318e615e355SDavid Edmondson 		 * debug information relating to the emulation failure. It is
319e615e355SDavid Edmondson 		 * accounted for in "ndata" but the format is unspecified and is
320e615e355SDavid Edmondson 		 * not represented in "flags". Any such information is *not* ABI!
32119238e75SAaron Lewis 		 */
32219238e75SAaron Lewis 		struct {
32319238e75SAaron Lewis 			__u32 suberror;
32419238e75SAaron Lewis 			__u32 ndata;
32519238e75SAaron Lewis 			__u64 flags;
326a9d496d8SDavid Edmondson 			union {
327a9d496d8SDavid Edmondson 				struct {
32819238e75SAaron Lewis 					__u8  insn_size;
32919238e75SAaron Lewis 					__u8  insn_bytes[15];
330a9d496d8SDavid Edmondson 				};
331a9d496d8SDavid Edmondson 			};
332e615e355SDavid Edmondson 			/* Arbitrary debug data may follow. */
33319238e75SAaron Lewis 		} emulation_failure;
334607ca46eSDavid Howells 		/* KVM_EXIT_OSI */
335607ca46eSDavid Howells 		struct {
336607ca46eSDavid Howells 			__u64 gprs[32];
337607ca46eSDavid Howells 		} osi;
3388ab30c15SAlex Bennée 		/* KVM_EXIT_PAPR_HCALL */
339607ca46eSDavid Howells 		struct {
340607ca46eSDavid Howells 			__u64 nr;
341607ca46eSDavid Howells 			__u64 ret;
342607ca46eSDavid Howells 			__u64 args[9];
343607ca46eSDavid Howells 		} papr_hcall;
344fa6b7fe9SCornelia Huck 		/* KVM_EXIT_S390_TSCH */
345fa6b7fe9SCornelia Huck 		struct {
346fa6b7fe9SCornelia Huck 			__u16 subchannel_id;
347fa6b7fe9SCornelia Huck 			__u16 subchannel_nr;
348fa6b7fe9SCornelia Huck 			__u32 io_int_parm;
349fa6b7fe9SCornelia Huck 			__u32 io_int_word;
350fa6b7fe9SCornelia Huck 			__u32 ipb;
351fa6b7fe9SCornelia Huck 			__u8 dequeued;
352fa6b7fe9SCornelia Huck 		} s390_tsch;
3531c810636SAlexander Graf 		/* KVM_EXIT_EPR */
3541c810636SAlexander Graf 		struct {
3551c810636SAlexander Graf 			__u32 epr;
3561c810636SAlexander Graf 		} epr;
3578ad6b634SAnup Patel 		/* KVM_EXIT_SYSTEM_EVENT */
3588ad6b634SAnup Patel 		struct {
3598ad6b634SAnup Patel #define KVM_SYSTEM_EVENT_SHUTDOWN       1
3608ad6b634SAnup Patel #define KVM_SYSTEM_EVENT_RESET          2
3612ce79189SAndrey Smetanin #define KVM_SYSTEM_EVENT_CRASH          3
3627b33a09dSOliver Upton #define KVM_SYSTEM_EVENT_WAKEUP         4
363bfbab445SOliver Upton #define KVM_SYSTEM_EVENT_SUSPEND        5
36447e8eec8SPaolo Bonzini #define KVM_SYSTEM_EVENT_SEV_TERM       6
3658ad6b634SAnup Patel 			__u32 type;
366c24a950eSPeter Gonda 			__u32 ndata;
367d495f942SPaolo Bonzini 			union {
368d495f942SPaolo Bonzini #ifndef __KERNEL__
3698ad6b634SAnup Patel 				__u64 flags;
370d495f942SPaolo Bonzini #endif
371c24a950eSPeter Gonda 				__u64 data[16];
372d495f942SPaolo Bonzini 			};
3738ad6b634SAnup Patel 		} system_event;
374e44fc8c9SEkaterina Tumanova 		/* KVM_EXIT_S390_STSI */
375e44fc8c9SEkaterina Tumanova 		struct {
376e44fc8c9SEkaterina Tumanova 			__u64 addr;
377e44fc8c9SEkaterina Tumanova 			__u8 ar;
378e44fc8c9SEkaterina Tumanova 			__u8 reserved;
379e44fc8c9SEkaterina Tumanova 			__u8 fc;
380e44fc8c9SEkaterina Tumanova 			__u8 sel1;
381e44fc8c9SEkaterina Tumanova 			__u16 sel2;
382e44fc8c9SEkaterina Tumanova 		} s390_stsi;
3837543a635SSteve Rutherford 		/* KVM_EXIT_IOAPIC_EOI */
3847543a635SSteve Rutherford 		struct {
3857543a635SSteve Rutherford 			__u8 vector;
3867543a635SSteve Rutherford 		} eoi;
387db397571SAndrey Smetanin 		/* KVM_EXIT_HYPERV */
388db397571SAndrey Smetanin 		struct kvm_hyperv_exit hyperv;
389c726200dSChristoffer Dall 		/* KVM_EXIT_ARM_NISV */
390c726200dSChristoffer Dall 		struct {
391c726200dSChristoffer Dall 			__u64 esr_iss;
392c726200dSChristoffer Dall 			__u64 fault_ipa;
393c726200dSChristoffer Dall 		} arm_nisv;
3941ae09954SAlexander Graf 		/* KVM_EXIT_X86_RDMSR / KVM_EXIT_X86_WRMSR */
3951ae09954SAlexander Graf 		struct {
3961ae09954SAlexander Graf 			__u8 error; /* user -> kernel */
3971ae09954SAlexander Graf 			__u8 pad[7];
3981ae09954SAlexander Graf #define KVM_MSR_EXIT_REASON_INVAL	(1 << 0)
3991ae09954SAlexander Graf #define KVM_MSR_EXIT_REASON_UNKNOWN	(1 << 1)
4001a155254SAlexander Graf #define KVM_MSR_EXIT_REASON_FILTER	(1 << 2)
401db205f7eSAaron Lewis #define KVM_MSR_EXIT_REASON_VALID_MASK	(KVM_MSR_EXIT_REASON_INVAL   |	\
402db205f7eSAaron Lewis 					 KVM_MSR_EXIT_REASON_UNKNOWN |	\
403db205f7eSAaron Lewis 					 KVM_MSR_EXIT_REASON_FILTER)
4041ae09954SAlexander Graf 			__u32 reason; /* kernel -> user */
4051ae09954SAlexander Graf 			__u32 index; /* kernel -> user */
4061ae09954SAlexander Graf 			__u64 data; /* kernel <-> user */
4071ae09954SAlexander Graf 		} msr;
40823200b7aSJoao Martins 		/* KVM_EXIT_XEN */
40923200b7aSJoao Martins 		struct kvm_xen_exit xen;
410dea8ee31SAtish Patra 		/* KVM_EXIT_RISCV_SBI */
411dea8ee31SAtish Patra 		struct {
412dea8ee31SAtish Patra 			unsigned long extension_id;
413dea8ee31SAtish Patra 			unsigned long function_id;
414dea8ee31SAtish Patra 			unsigned long args[6];
415dea8ee31SAtish Patra 			unsigned long ret[2];
416dea8ee31SAtish Patra 		} riscv_sbi;
4178a061562SAnup Patel 		/* KVM_EXIT_RISCV_CSR */
4188a061562SAnup Patel 		struct {
4198a061562SAnup Patel 			unsigned long csr_num;
4208a061562SAnup Patel 			unsigned long new_value;
4218a061562SAnup Patel 			unsigned long write_mask;
4228a061562SAnup Patel 			unsigned long ret_value;
4238a061562SAnup Patel 		} riscv_csr;
4242f4073e0STao Xu 		/* KVM_EXIT_NOTIFY */
4252f4073e0STao Xu 		struct {
4262f4073e0STao Xu #define KVM_NOTIFY_CONTEXT_INVALID	(1 << 0)
4272f4073e0STao Xu 			__u32 flags;
4282f4073e0STao Xu 		} notify;
42916f95f3bSChao Peng 		/* KVM_EXIT_MEMORY_FAULT */
43016f95f3bSChao Peng 		struct {
4318dd2eee9SChao Peng #define KVM_MEMORY_EXIT_FLAG_PRIVATE	(1ULL << 3)
43216f95f3bSChao Peng 			__u64 flags;
43316f95f3bSChao Peng 			__u64 gpa;
43416f95f3bSChao Peng 			__u64 size;
43516f95f3bSChao Peng 		} memory_fault;
436607ca46eSDavid Howells 		/* Fix the size of the union. */
437607ca46eSDavid Howells 		char padding[256];
438607ca46eSDavid Howells 	};
439607ca46eSDavid Howells 
4407b7e3952SKen Hofsass 	/* 2048 is the size of the char array used to bound/pad the size
4417b7e3952SKen Hofsass 	 * of the union that holds sync regs.
4427b7e3952SKen Hofsass 	 */
4437b7e3952SKen Hofsass 	#define SYNC_REGS_SIZE_BYTES 2048
444607ca46eSDavid Howells 	/*
445607ca46eSDavid Howells 	 * shared registers between kvm and userspace.
446607ca46eSDavid Howells 	 * kvm_valid_regs specifies the register classes set by the host
447607ca46eSDavid Howells 	 * kvm_dirty_regs specified the register classes dirtied by userspace
448607ca46eSDavid Howells 	 * struct kvm_sync_regs is architecture specific, as well as the
449607ca46eSDavid Howells 	 * bits for kvm_valid_regs and kvm_dirty_regs
450607ca46eSDavid Howells 	 */
451607ca46eSDavid Howells 	__u64 kvm_valid_regs;
452607ca46eSDavid Howells 	__u64 kvm_dirty_regs;
453607ca46eSDavid Howells 	union {
454607ca46eSDavid Howells 		struct kvm_sync_regs regs;
4557b7e3952SKen Hofsass 		char padding[SYNC_REGS_SIZE_BYTES];
456607ca46eSDavid Howells 	} s;
457607ca46eSDavid Howells };
458607ca46eSDavid Howells 
459607ca46eSDavid Howells /* for KVM_REGISTER_COALESCED_MMIO / KVM_UNREGISTER_COALESCED_MMIO */
460607ca46eSDavid Howells 
461607ca46eSDavid Howells struct kvm_coalesced_mmio_zone {
462607ca46eSDavid Howells 	__u64 addr;
463607ca46eSDavid Howells 	__u32 size;
4640804c849SPeng Hao 	union {
465607ca46eSDavid Howells 		__u32 pad;
4660804c849SPeng Hao 		__u32 pio;
4670804c849SPeng Hao 	};
468607ca46eSDavid Howells };
469607ca46eSDavid Howells 
470607ca46eSDavid Howells struct kvm_coalesced_mmio {
471607ca46eSDavid Howells 	__u64 phys_addr;
472607ca46eSDavid Howells 	__u32 len;
4730804c849SPeng Hao 	union {
474607ca46eSDavid Howells 		__u32 pad;
4750804c849SPeng Hao 		__u32 pio;
4760804c849SPeng Hao 	};
477607ca46eSDavid Howells 	__u8  data[8];
478607ca46eSDavid Howells };
479607ca46eSDavid Howells 
480607ca46eSDavid Howells struct kvm_coalesced_mmio_ring {
481607ca46eSDavid Howells 	__u32 first, last;
48294dfc73eSGustavo A. R. Silva 	struct kvm_coalesced_mmio coalesced_mmio[];
483607ca46eSDavid Howells };
484607ca46eSDavid Howells 
485607ca46eSDavid Howells #define KVM_COALESCED_MMIO_MAX \
486607ca46eSDavid Howells 	((PAGE_SIZE - sizeof(struct kvm_coalesced_mmio_ring)) / \
487607ca46eSDavid Howells 	 sizeof(struct kvm_coalesced_mmio))
488607ca46eSDavid Howells 
489607ca46eSDavid Howells /* for KVM_TRANSLATE */
490607ca46eSDavid Howells struct kvm_translation {
491607ca46eSDavid Howells 	/* in */
492607ca46eSDavid Howells 	__u64 linear_address;
493607ca46eSDavid Howells 
494607ca46eSDavid Howells 	/* out */
495607ca46eSDavid Howells 	__u64 physical_address;
496607ca46eSDavid Howells 	__u8  valid;
497607ca46eSDavid Howells 	__u8  writeable;
498607ca46eSDavid Howells 	__u8  usermode;
499607ca46eSDavid Howells 	__u8  pad[5];
500607ca46eSDavid Howells };
501607ca46eSDavid Howells 
502607ca46eSDavid Howells /* for KVM_INTERRUPT */
503607ca46eSDavid Howells struct kvm_interrupt {
504607ca46eSDavid Howells 	/* in */
505607ca46eSDavid Howells 	__u32 irq;
506607ca46eSDavid Howells };
507607ca46eSDavid Howells 
508607ca46eSDavid Howells /* for KVM_GET_DIRTY_LOG */
509607ca46eSDavid Howells struct kvm_dirty_log {
510607ca46eSDavid Howells 	__u32 slot;
511607ca46eSDavid Howells 	__u32 padding1;
512607ca46eSDavid Howells 	union {
513607ca46eSDavid Howells 		void __user *dirty_bitmap; /* one bit per page */
514607ca46eSDavid Howells 		__u64 padding2;
515607ca46eSDavid Howells 	};
516607ca46eSDavid Howells };
517607ca46eSDavid Howells 
5182a31b9dbSPaolo Bonzini /* for KVM_CLEAR_DIRTY_LOG */
5192a31b9dbSPaolo Bonzini struct kvm_clear_dirty_log {
5202a31b9dbSPaolo Bonzini 	__u32 slot;
5212a31b9dbSPaolo Bonzini 	__u32 num_pages;
5222a31b9dbSPaolo Bonzini 	__u64 first_page;
5232a31b9dbSPaolo Bonzini 	union {
5242a31b9dbSPaolo Bonzini 		void __user *dirty_bitmap; /* one bit per page */
5252a31b9dbSPaolo Bonzini 		__u64 padding2;
5262a31b9dbSPaolo Bonzini 	};
5272a31b9dbSPaolo Bonzini };
5282a31b9dbSPaolo Bonzini 
529607ca46eSDavid Howells /* for KVM_SET_SIGNAL_MASK */
530607ca46eSDavid Howells struct kvm_signal_mask {
531607ca46eSDavid Howells 	__u32 len;
53294dfc73eSGustavo A. R. Silva 	__u8  sigset[];
533607ca46eSDavid Howells };
534607ca46eSDavid Howells 
535607ca46eSDavid Howells /* for KVM_TPR_ACCESS_REPORTING */
536607ca46eSDavid Howells struct kvm_tpr_access_ctl {
537607ca46eSDavid Howells 	__u32 enabled;
538607ca46eSDavid Howells 	__u32 flags;
539607ca46eSDavid Howells 	__u32 reserved[8];
540607ca46eSDavid Howells };
541607ca46eSDavid Howells 
542607ca46eSDavid Howells /* for KVM_SET_VAPIC_ADDR */
543607ca46eSDavid Howells struct kvm_vapic_addr {
544607ca46eSDavid Howells 	__u64 vapic_addr;
545607ca46eSDavid Howells };
546607ca46eSDavid Howells 
5470b4820d6SDavid Hildenbrand /* for KVM_SET_MP_STATE */
548607ca46eSDavid Howells 
5490b4820d6SDavid Hildenbrand /* not all states are valid on all architectures */
550607ca46eSDavid Howells #define KVM_MP_STATE_RUNNABLE          0
551607ca46eSDavid Howells #define KVM_MP_STATE_UNINITIALIZED     1
552607ca46eSDavid Howells #define KVM_MP_STATE_INIT_RECEIVED     2
553607ca46eSDavid Howells #define KVM_MP_STATE_HALTED            3
554607ca46eSDavid Howells #define KVM_MP_STATE_SIPI_RECEIVED     4
5556352e4d2SDavid Hildenbrand #define KVM_MP_STATE_STOPPED           5
5566352e4d2SDavid Hildenbrand #define KVM_MP_STATE_CHECK_STOP        6
5576352e4d2SDavid Hildenbrand #define KVM_MP_STATE_OPERATING         7
5586352e4d2SDavid Hildenbrand #define KVM_MP_STATE_LOAD              8
559647daca2STom Lendacky #define KVM_MP_STATE_AP_RESET_HOLD     9
5607b33a09dSOliver Upton #define KVM_MP_STATE_SUSPENDED         10
561607ca46eSDavid Howells 
562607ca46eSDavid Howells struct kvm_mp_state {
563607ca46eSDavid Howells 	__u32 mp_state;
564607ca46eSDavid Howells };
565607ca46eSDavid Howells 
566607ca46eSDavid Howells /* for KVM_SET_GUEST_DEBUG */
567607ca46eSDavid Howells 
568607ca46eSDavid Howells #define KVM_GUESTDBG_ENABLE		0x00000001
569607ca46eSDavid Howells #define KVM_GUESTDBG_SINGLESTEP		0x00000002
570607ca46eSDavid Howells 
571607ca46eSDavid Howells struct kvm_guest_debug {
572607ca46eSDavid Howells 	__u32 control;
573607ca46eSDavid Howells 	__u32 pad;
574607ca46eSDavid Howells 	struct kvm_guest_debug_arch arch;
575607ca46eSDavid Howells };
576607ca46eSDavid Howells 
577607ca46eSDavid Howells enum {
578607ca46eSDavid Howells 	kvm_ioeventfd_flag_nr_datamatch,
579607ca46eSDavid Howells 	kvm_ioeventfd_flag_nr_pio,
580607ca46eSDavid Howells 	kvm_ioeventfd_flag_nr_deassign,
5812b83451bSCornelia Huck 	kvm_ioeventfd_flag_nr_virtio_ccw_notify,
58268c3b4d1SMichael S. Tsirkin 	kvm_ioeventfd_flag_nr_fast_mmio,
583607ca46eSDavid Howells 	kvm_ioeventfd_flag_nr_max,
584607ca46eSDavid Howells };
585607ca46eSDavid Howells 
586607ca46eSDavid Howells #define KVM_IOEVENTFD_FLAG_DATAMATCH (1 << kvm_ioeventfd_flag_nr_datamatch)
587607ca46eSDavid Howells #define KVM_IOEVENTFD_FLAG_PIO       (1 << kvm_ioeventfd_flag_nr_pio)
588607ca46eSDavid Howells #define KVM_IOEVENTFD_FLAG_DEASSIGN  (1 << kvm_ioeventfd_flag_nr_deassign)
5892b83451bSCornelia Huck #define KVM_IOEVENTFD_FLAG_VIRTIO_CCW_NOTIFY \
5902b83451bSCornelia Huck 	(1 << kvm_ioeventfd_flag_nr_virtio_ccw_notify)
591607ca46eSDavid Howells 
592607ca46eSDavid Howells #define KVM_IOEVENTFD_VALID_FLAG_MASK  ((1 << kvm_ioeventfd_flag_nr_max) - 1)
593607ca46eSDavid Howells 
594607ca46eSDavid Howells struct kvm_ioeventfd {
595607ca46eSDavid Howells 	__u64 datamatch;
596607ca46eSDavid Howells 	__u64 addr;        /* legal pio/mmio address */
597f848a5a8SMichael S. Tsirkin 	__u32 len;         /* 1, 2, 4, or 8 bytes; or 0 to ignore length */
598607ca46eSDavid Howells 	__s32 fd;
599607ca46eSDavid Howells 	__u32 flags;
600607ca46eSDavid Howells 	__u8  pad[36];
601607ca46eSDavid Howells };
602607ca46eSDavid Howells 
6035e62493fSKarimAllah Ahmed #define KVM_X86_DISABLE_EXITS_MWAIT          (1 << 0)
604766d3571SMichael S. Tsirkin #define KVM_X86_DISABLE_EXITS_HLT            (1 << 1)
6055e62493fSKarimAllah Ahmed #define KVM_X86_DISABLE_EXITS_PAUSE          (1 << 2)
606b5170063SWanpeng Li #define KVM_X86_DISABLE_EXITS_CSTATE         (1 << 3)
6075e62493fSKarimAllah Ahmed #define KVM_X86_DISABLE_VALID_EXITS          (KVM_X86_DISABLE_EXITS_MWAIT | \
608766d3571SMichael S. Tsirkin                                               KVM_X86_DISABLE_EXITS_HLT | \
609b5170063SWanpeng Li                                               KVM_X86_DISABLE_EXITS_PAUSE | \
610b5170063SWanpeng Li                                               KVM_X86_DISABLE_EXITS_CSTATE)
6115e62493fSKarimAllah Ahmed 
612607ca46eSDavid Howells /* for KVM_ENABLE_CAP */
613607ca46eSDavid Howells struct kvm_enable_cap {
614607ca46eSDavid Howells 	/* in */
615607ca46eSDavid Howells 	__u32 cap;
616607ca46eSDavid Howells 	__u32 flags;
617607ca46eSDavid Howells 	__u64 args[4];
618607ca46eSDavid Howells 	__u8  pad[64];
619607ca46eSDavid Howells };
620607ca46eSDavid Howells 
621607ca46eSDavid Howells #define KVMIO 0xAE
622607ca46eSDavid Howells 
623607ca46eSDavid Howells /* machine type bits, to be used as argument to KVM_CREATE_VM */
624607ca46eSDavid Howells #define KVM_VM_S390_UCONTROL	1
625607ca46eSDavid Howells 
626cbbc58d4SAneesh Kumar K.V /* on ppc, 0 indicate default, 1 should force HV and 2 PR */
627cbbc58d4SAneesh Kumar K.V #define KVM_VM_PPC_HV 1
628cbbc58d4SAneesh Kumar K.V #define KVM_VM_PPC_PR 2
629cbbc58d4SAneesh Kumar K.V 
63015e9e35cSHuacai Chen /* on MIPS, 0 indicates auto, 1 forces VZ ASE, 2 forces trap & emulate */
63115e9e35cSHuacai Chen #define KVM_VM_MIPS_AUTO	0
632a8a3c426SJames Hogan #define KVM_VM_MIPS_VZ		1
63315e9e35cSHuacai Chen #define KVM_VM_MIPS_TE		2
634a8a3c426SJames Hogan 
635607ca46eSDavid Howells #define KVM_S390_SIE_PAGE_OFFSET 1
636607ca46eSDavid Howells 
637607ca46eSDavid Howells /*
638233a7cb2SSuzuki K Poulose  * On arm64, machine type can be used to request the physical
639233a7cb2SSuzuki K Poulose  * address size for the VM. Bits[7-0] are reserved for the guest
640233a7cb2SSuzuki K Poulose  * PA size shift (i.e, log2(PA_Size)). For backward compatibility,
641233a7cb2SSuzuki K Poulose  * value 0 implies the default IPA size, 40bits.
642233a7cb2SSuzuki K Poulose  */
643233a7cb2SSuzuki K Poulose #define KVM_VM_TYPE_ARM_IPA_SIZE_MASK	0xffULL
644233a7cb2SSuzuki K Poulose #define KVM_VM_TYPE_ARM_IPA_SIZE(x)		\
645233a7cb2SSuzuki K Poulose 	((x) & KVM_VM_TYPE_ARM_IPA_SIZE_MASK)
646233a7cb2SSuzuki K Poulose /*
647607ca46eSDavid Howells  * ioctls for /dev/kvm fds:
648607ca46eSDavid Howells  */
649607ca46eSDavid Howells #define KVM_GET_API_VERSION       _IO(KVMIO,   0x00)
650607ca46eSDavid Howells #define KVM_CREATE_VM             _IO(KVMIO,   0x01) /* returns a VM fd */
651607ca46eSDavid Howells #define KVM_GET_MSR_INDEX_LIST    _IOWR(KVMIO, 0x02, struct kvm_msr_list)
652607ca46eSDavid Howells 
653607ca46eSDavid Howells #define KVM_S390_ENABLE_SIE       _IO(KVMIO,   0x06)
654607ca46eSDavid Howells /*
655607ca46eSDavid Howells  * Check if a kvm extension is available.  Argument is extension number,
656607ca46eSDavid Howells  * return is 1 (yes) or 0 (no, sorry).
657607ca46eSDavid Howells  */
658607ca46eSDavid Howells #define KVM_CHECK_EXTENSION       _IO(KVMIO,   0x03)
659607ca46eSDavid Howells /*
660607ca46eSDavid Howells  * Get size for mmap(vcpu_fd)
661607ca46eSDavid Howells  */
662607ca46eSDavid Howells #define KVM_GET_VCPU_MMAP_SIZE    _IO(KVMIO,   0x04) /* in bytes */
663607ca46eSDavid Howells #define KVM_GET_SUPPORTED_CPUID   _IOWR(KVMIO, 0x05, struct kvm_cpuid2)
6649c15bb1dSBorislav Petkov #define KVM_GET_EMULATED_CPUID	  _IOWR(KVMIO, 0x09, struct kvm_cpuid2)
665801e459aSTom Lendacky #define KVM_GET_MSR_FEATURE_INDEX_LIST    _IOWR(KVMIO, 0x0a, struct kvm_msr_list)
666607ca46eSDavid Howells 
667607ca46eSDavid Howells /*
668607ca46eSDavid Howells  * Extension capability list.
669607ca46eSDavid Howells  */
670607ca46eSDavid Howells #define KVM_CAP_IRQCHIP	  0
671607ca46eSDavid Howells #define KVM_CAP_HLT	  1
672607ca46eSDavid Howells #define KVM_CAP_MMU_SHADOW_CACHE_CONTROL 2
673607ca46eSDavid Howells #define KVM_CAP_USER_MEMORY 3
674607ca46eSDavid Howells #define KVM_CAP_SET_TSS_ADDR 4
675607ca46eSDavid Howells #define KVM_CAP_VAPIC 6
676607ca46eSDavid Howells #define KVM_CAP_EXT_CPUID 7
677607ca46eSDavid Howells #define KVM_CAP_CLOCKSOURCE 8
678607ca46eSDavid Howells #define KVM_CAP_NR_VCPUS 9       /* returns recommended max vcpus per vm */
679607ca46eSDavid Howells #define KVM_CAP_NR_MEMSLOTS 10   /* returns max memory slots per vm */
680607ca46eSDavid Howells #define KVM_CAP_PIT 11
681607ca46eSDavid Howells #define KVM_CAP_NOP_IO_DELAY 12
682607ca46eSDavid Howells #define KVM_CAP_PV_MMU 13
683607ca46eSDavid Howells #define KVM_CAP_MP_STATE 14
684607ca46eSDavid Howells #define KVM_CAP_COALESCED_MMIO 15
685607ca46eSDavid Howells #define KVM_CAP_SYNC_MMU 16  /* Changes to host mmap are reflected in guest */
686607ca46eSDavid Howells #define KVM_CAP_IOMMU 18
687607ca46eSDavid Howells /* Bug in KVM_SET_USER_MEMORY_REGION fixed: */
688607ca46eSDavid Howells #define KVM_CAP_DESTROY_MEMORY_REGION_WORKS 21
689607ca46eSDavid Howells #define KVM_CAP_USER_NMI 22
690607ca46eSDavid Howells #define KVM_CAP_SET_GUEST_DEBUG 23
691607ca46eSDavid Howells #ifdef __KVM_HAVE_PIT
692607ca46eSDavid Howells #define KVM_CAP_REINJECT_CONTROL 24
693607ca46eSDavid Howells #endif
694607ca46eSDavid Howells #define KVM_CAP_IRQ_ROUTING 25
695607ca46eSDavid Howells #define KVM_CAP_IRQ_INJECT_STATUS 26
696607ca46eSDavid Howells #define KVM_CAP_ASSIGN_DEV_IRQ 29
697607ca46eSDavid Howells /* Another bug in KVM_SET_USER_MEMORY_REGION fixed: */
698607ca46eSDavid Howells #define KVM_CAP_JOIN_MEMORY_REGIONS_WORKS 30
699607ca46eSDavid Howells #ifdef __KVM_HAVE_MCE
700607ca46eSDavid Howells #define KVM_CAP_MCE 31
701607ca46eSDavid Howells #endif
702607ca46eSDavid Howells #define KVM_CAP_IRQFD 32
703607ca46eSDavid Howells #ifdef __KVM_HAVE_PIT
704607ca46eSDavid Howells #define KVM_CAP_PIT2 33
705607ca46eSDavid Howells #endif
706607ca46eSDavid Howells #define KVM_CAP_SET_BOOT_CPU_ID 34
707607ca46eSDavid Howells #ifdef __KVM_HAVE_PIT_STATE2
708607ca46eSDavid Howells #define KVM_CAP_PIT_STATE2 35
709607ca46eSDavid Howells #endif
710607ca46eSDavid Howells #define KVM_CAP_IOEVENTFD 36
711607ca46eSDavid Howells #define KVM_CAP_SET_IDENTITY_MAP_ADDR 37
712607ca46eSDavid Howells #ifdef __KVM_HAVE_XEN_HVM
713607ca46eSDavid Howells #define KVM_CAP_XEN_HVM 38
714607ca46eSDavid Howells #endif
715607ca46eSDavid Howells #define KVM_CAP_ADJUST_CLOCK 39
716607ca46eSDavid Howells #define KVM_CAP_INTERNAL_ERROR_DATA 40
717607ca46eSDavid Howells #ifdef __KVM_HAVE_VCPU_EVENTS
718607ca46eSDavid Howells #define KVM_CAP_VCPU_EVENTS 41
719607ca46eSDavid Howells #endif
720607ca46eSDavid Howells #define KVM_CAP_S390_PSW 42
721607ca46eSDavid Howells #define KVM_CAP_PPC_SEGSTATE 43
722607ca46eSDavid Howells #define KVM_CAP_HYPERV 44
723607ca46eSDavid Howells #define KVM_CAP_HYPERV_VAPIC 45
724607ca46eSDavid Howells #define KVM_CAP_HYPERV_SPIN 46
725607ca46eSDavid Howells #define KVM_CAP_PCI_SEGMENT 47
726607ca46eSDavid Howells #define KVM_CAP_PPC_PAIRED_SINGLES 48
727607ca46eSDavid Howells #define KVM_CAP_INTR_SHADOW 49
728607ca46eSDavid Howells #ifdef __KVM_HAVE_DEBUGREGS
729607ca46eSDavid Howells #define KVM_CAP_DEBUGREGS 50
730607ca46eSDavid Howells #endif
731607ca46eSDavid Howells #define KVM_CAP_X86_ROBUST_SINGLESTEP 51
732607ca46eSDavid Howells #define KVM_CAP_PPC_OSI 52
733607ca46eSDavid Howells #define KVM_CAP_PPC_UNSET_IRQ 53
734607ca46eSDavid Howells #define KVM_CAP_ENABLE_CAP 54
735607ca46eSDavid Howells #ifdef __KVM_HAVE_XSAVE
736607ca46eSDavid Howells #define KVM_CAP_XSAVE 55
737607ca46eSDavid Howells #endif
738607ca46eSDavid Howells #ifdef __KVM_HAVE_XCRS
739607ca46eSDavid Howells #define KVM_CAP_XCRS 56
740607ca46eSDavid Howells #endif
741607ca46eSDavid Howells #define KVM_CAP_PPC_GET_PVINFO 57
742607ca46eSDavid Howells #define KVM_CAP_PPC_IRQ_LEVEL 58
743607ca46eSDavid Howells #define KVM_CAP_ASYNC_PF 59
744607ca46eSDavid Howells #define KVM_CAP_TSC_CONTROL 60
745607ca46eSDavid Howells #define KVM_CAP_GET_TSC_KHZ 61
746607ca46eSDavid Howells #define KVM_CAP_PPC_BOOKE_SREGS 62
747607ca46eSDavid Howells #define KVM_CAP_SPAPR_TCE 63
748607ca46eSDavid Howells #define KVM_CAP_PPC_SMT 64
749607ca46eSDavid Howells #define KVM_CAP_PPC_RMA	65
750607ca46eSDavid Howells #define KVM_CAP_MAX_VCPUS 66       /* returns max vcpus per vm */
751607ca46eSDavid Howells #define KVM_CAP_PPC_HIOR 67
752607ca46eSDavid Howells #define KVM_CAP_PPC_PAPR 68
753607ca46eSDavid Howells #define KVM_CAP_SW_TLB 69
754607ca46eSDavid Howells #define KVM_CAP_ONE_REG 70
755607ca46eSDavid Howells #define KVM_CAP_S390_GMAP 71
756607ca46eSDavid Howells #define KVM_CAP_TSC_DEADLINE_TIMER 72
757607ca46eSDavid Howells #define KVM_CAP_S390_UCONTROL 73
758607ca46eSDavid Howells #define KVM_CAP_SYNC_REGS 74
759607ca46eSDavid Howells #define KVM_CAP_PCI_2_3 75
760607ca46eSDavid Howells #define KVM_CAP_KVMCLOCK_CTRL 76
761607ca46eSDavid Howells #define KVM_CAP_SIGNAL_MSI 77
762607ca46eSDavid Howells #define KVM_CAP_PPC_GET_SMMU_INFO 78
763607ca46eSDavid Howells #define KVM_CAP_S390_COW 79
764607ca46eSDavid Howells #define KVM_CAP_PPC_ALLOC_HTAB 80
765607ca46eSDavid Howells #define KVM_CAP_READONLY_MEM 81
766607ca46eSDavid Howells #define KVM_CAP_IRQFD_RESAMPLE 82
76719bf7f8aSMarcelo Tosatti #define KVM_CAP_PPC_BOOKE_WATCHDOG 83
768a2932923SPaul Mackerras #define KVM_CAP_PPC_HTAB_FD 84
769fa6b7fe9SCornelia Huck #define KVM_CAP_S390_CSS_SUPPORT 85
7701c810636SAlexander Graf #define KVM_CAP_PPC_EPR 86
771aa024c2fSMarc Zyngier #define KVM_CAP_ARM_PSCI 87
7723401d546SChristoffer Dall #define KVM_CAP_ARM_SET_DEVICE_ADDR 88
773852b6d57SScott Wood #define KVM_CAP_DEVICE_CTRL 89
774eb1e4f43SScott Wood #define KVM_CAP_IRQ_MPIC 90
7758e591cb7SMichael Ellerman #define KVM_CAP_PPC_RTAS 91
7765975a2e0SPaul Mackerras #define KVM_CAP_IRQ_XICS 92
7770d854a60SMarc Zyngier #define KVM_CAP_ARM_EL1_32BIT 93
7780bd50dc9SAlexey Kardashevskiy #define KVM_CAP_SPAPR_MULTITCE 94
7799c15bb1dSBorislav Petkov #define KVM_CAP_EXT_EMUL_CPUID 95
780e984097bSVadim Rozenfeld #define KVM_CAP_HYPERV_TIME 96
781100943c5SGabriel L. Somlo #define KVM_CAP_IOAPIC_POLARITY_IGNORED 97
782d938dc55SCornelia Huck #define KVM_CAP_ENABLE_CAP_VM 98
78384223598SCornelia Huck #define KVM_CAP_S390_IRQCHIP 99
784f848a5a8SMichael S. Tsirkin #define KVM_CAP_IOEVENTFD_NO_LENGTH 100
78563b5cf04SMarcelo Tosatti #define KVM_CAP_VM_ATTRIBUTES 101
786717abd20SAnup Patel #define KVM_CAP_ARM_PSCI_0_2 102
78753ea2e46SPaolo Bonzini #define KVM_CAP_PPC_FIXUP_HCALL 103
788699a0ea0SPaul Mackerras #define KVM_CAP_PPC_ENABLE_HCALL 104
78992b591a4SAlexander Graf #define KVM_CAP_CHECK_EXTENSION_VM 105
7902444b352SDavid Hildenbrand #define KVM_CAP_S390_USER_SIGP 106
79168c55750SEric Farman #define KVM_CAP_S390_VECTOR_REGISTERS 107
79241408c28SThomas Huth #define KVM_CAP_S390_MEM_OP 108
793e44fc8c9SEkaterina Tumanova #define KVM_CAP_S390_USER_STSI 109
79430ee2a98SJason J. Herne #define KVM_CAP_S390_SKEYS 110
7955fafd874SJames Hogan #define KVM_CAP_MIPS_FPU 111
796d952bd07SJames Hogan #define KVM_CAP_MIPS_MSA 112
79747b43c52SJens Freimann #define KVM_CAP_S390_INJECT_IRQ 113
798816c7667SJens Freimann #define KVM_CAP_S390_IRQ_STATE 114
799e928e9cbSMichael Ellerman #define KVM_CAP_PPC_HWRNG 115
80090de4a18SNadav Amit #define KVM_CAP_DISABLE_QUIRKS 116
801f077825aSPaolo Bonzini #define KVM_CAP_X86_SMM 117
802f481b069SPaolo Bonzini #define KVM_CAP_MULTI_ADDRESS_SPACE 118
8035540546bSAlex Bennée #define KVM_CAP_GUEST_DEBUG_HW_BPS 119
8045540546bSAlex Bennée #define KVM_CAP_GUEST_DEBUG_HW_WPS 120
80549df6397SSteve Rutherford #define KVM_CAP_SPLIT_IRQCHIP 121
806e9ea5069SJason Wang #define KVM_CAP_IOEVENTFD_ANY_LENGTH 122
8075c919412SAndrey Smetanin #define KVM_CAP_HYPERV_SYNIC 123
808c6e5f166SFan Zhang #define KVM_CAP_S390_RI 124
80901d01d69SAlexey Kardashevskiy #define KVM_CAP_SPAPR_TCE_64 125
810ab92f308SPaolo Bonzini #define KVM_CAP_ARM_PMU_V3 126
811ab92f308SPaolo Bonzini #define KVM_CAP_VCPU_ATTRIBUTES 127
8120b1b1dfdSGreg Kurz #define KVM_CAP_MAX_VCPU_ID 128
81337131313SRadim Krčmář #define KVM_CAP_X2APIC_API 129
8146502a34cSDavid Hildenbrand #define KVM_CAP_S390_USER_INSTR0 130
815912902ceSRadim Krčmář #define KVM_CAP_MSI_DEVID 131
81623528bb2SSam Bobroff #define KVM_CAP_PPC_HTM 132
817ef1ead0cSDavid Gibson #define KVM_CAP_SPAPR_RESIZE_HPT 133
818c9270132SPaul Mackerras #define KVM_CAP_PPC_MMU_RADIX 134
819c9270132SPaul Mackerras #define KVM_CAP_PPC_MMU_HASH_V3 135
820460df4c1SPaolo Bonzini #define KVM_CAP_IMMEDIATE_EXIT 136
821a8a3c426SJames Hogan #define KVM_CAP_MIPS_VZ 137
822a8a3c426SJames Hogan #define KVM_CAP_MIPS_TE 138
823578fd61dSJames Hogan #define KVM_CAP_MIPS_64BIT 139
824f7b1a77dSRadim Krčmář #define KVM_CAP_S390_GS 140
825f7b1a77dSRadim Krčmář #define KVM_CAP_S390_AIS 141
8264898d3f4SAlexey Kardashevskiy #define KVM_CAP_SPAPR_TCE_VFIO 142
8274d5422ceSWanpeng Li #define KVM_CAP_X86_DISABLE_EXITS 143
828c24a7be2SPaolo Bonzini #define KVM_CAP_ARM_USER_IRQ 144
8294036e387SClaudio Imbrenda #define KVM_CAP_S390_CMMA_MIGRATION 145
8308a53e7e5SPaolo Bonzini #define KVM_CAP_PPC_FWNMI 146
8318a53e7e5SPaolo Bonzini #define KVM_CAP_PPC_SMT_POSSIBLE 147
832efc479e6SRoman Kagan #define KVM_CAP_HYPERV_SYNIC2 148
833d3457c87SRoman Kagan #define KVM_CAP_HYPERV_VP_INDEX 149
834da9a1446SChristian Borntraeger #define KVM_CAP_S390_AIS_MIGRATION 150
8353214d01fSPaul Mackerras #define KVM_CAP_PPC_GET_CPU_CHAR 151
83635b3fde6SChristian Borntraeger #define KVM_CAP_S390_BPB 152
837801e459aSTom Lendacky #define KVM_CAP_GET_MSR_FEATURES 153
838faeb7833SRoman Kagan #define KVM_CAP_HYPERV_EVENTFD 154
839c1aea919SVitaly Kuznetsov #define KVM_CAP_HYPERV_TLBFLUSH 155
840a4499382SJanosch Frank #define KVM_CAP_S390_HPAGE_1M 156
8418fcc4b59SJim Mattson #define KVM_CAP_NESTED_STATE 157
84263198930SPaolo Bonzini #define KVM_CAP_ARM_INJECT_SERROR_ESR 158
8436fbbde9aSDrew Schmitt #define KVM_CAP_MSR_PLATFORM_INFO 159
844aa069a99SPaul Mackerras #define KVM_CAP_PPC_NESTED_HV 160
845214ff83dSVitaly Kuznetsov #define KVM_CAP_HYPERV_SEND_IPI 161
8460804c849SPeng Hao #define KVM_CAP_COALESCED_PIO 162
84757b119daSVitaly Kuznetsov #define KVM_CAP_HYPERV_ENLIGHTENED_VMCS 163
848c4f55198SJim Mattson #define KVM_CAP_EXCEPTION_PAYLOAD 164
849e42b4a50SPaolo Bonzini #define KVM_CAP_ARM_VM_IPA_SIZE 165
850d7547c55SPeter Xu #define KVM_CAP_MANUAL_DIRTY_LOG_PROTECT 166 /* Obsolete */
8512bc39970SVitaly Kuznetsov #define KVM_CAP_HYPERV_CPUID 167
852d7547c55SPeter Xu #define KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2 168
85359c5c58cSPaolo Bonzini #define KVM_CAP_PPC_IRQ_XIVE 169
854dd53f610SPaolo Bonzini #define KVM_CAP_ARM_SVE 170
855dd53f610SPaolo Bonzini #define KVM_CAP_ARM_PTRAUTH_ADDRESS 171
856dd53f610SPaolo Bonzini #define KVM_CAP_ARM_PTRAUTH_GENERIC 172
85766bb8a06SEric Hankland #define KVM_CAP_PMU_EVENT_FILTER 173
85892f35b75SMarc Zyngier #define KVM_CAP_ARM_IRQ_LINE_LAYOUT_2 174
859344c6c80STianyu Lan #define KVM_CAP_HYPERV_DIRECT_TLBFLUSH 175
8601a9167a2SFabiano Rosas #define KVM_CAP_PPC_GUEST_DEBUG_SSTEP 176
86114edff88SPaolo Bonzini #define KVM_CAP_ARM_NISV_TO_USER 177
86214edff88SPaolo Bonzini #define KVM_CAP_ARM_INJECT_EXT_DABT 178
8637de3f142SJanosch Frank #define KVM_CAP_S390_VCPU_RESETS 179
86413da9ae1SChristian Borntraeger #define KVM_CAP_S390_PROTECTED 180
8659a5788c6SPaul Mackerras #define KVM_CAP_PPC_SECURE_GUEST 181
866acd05785SDavid Matlack #define KVM_CAP_HALT_POLL 182
86772de5fa4SVitaly Kuznetsov #define KVM_CAP_ASYNC_PF_INT 183
8681aa561b1SJim Mattson #define KVM_CAP_LAST_CPU 184
8693edd6839SMohammed Gamal #define KVM_CAP_SMALLER_MAXPHYADDR 185
870f3633c26SPaolo Bonzini #define KVM_CAP_S390_DIAG318 186
871004a0124SAndrew Jones #define KVM_CAP_STEAL_TIME 187
8721ae09954SAlexander Graf #define KVM_CAP_X86_USER_SPACE_MSR 188
8731a155254SAlexander Graf #define KVM_CAP_X86_MSR_FILTER 189
87466570e96SOliver Upton #define KVM_CAP_ENFORCE_PV_FEATURE_CPUID 190
875c21d54f0SVitaly Kuznetsov #define KVM_CAP_SYS_HYPERV_CPUID 191
876fb04a1edSPeter Xu #define KVM_CAP_DIRTY_LOG_RING 192
877fe6b6bc8SChenyi Qiang #define KVM_CAP_X86_BUS_LOCK_EXIT 193
878d9a47edaSRavi Bangoria #define KVM_CAP_PPC_DAWR1 194
8798b13c364SPaolo Bonzini #define KVM_CAP_SET_GUEST_DEBUG2 195
880fe7e9488SSean Christopherson #define KVM_CAP_SGX_ATTRIBUTE 196
88154526d1fSNathan Tempelman #define KVM_CAP_VM_COPY_ENC_CONTEXT_FROM 197
882c4f71901SPaolo Bonzini #define KVM_CAP_PTP_KVM 198
883644f7067SVitaly Kuznetsov #define KVM_CAP_HYPERV_ENFORCE_CPUID 199
8846dba9403SMaxim Levitsky #define KVM_CAP_SREGS2 200
8850dbb1123SAshish Kalra #define KVM_CAP_EXIT_HYPERCALL 201
886c3ab0e28SPaolo Bonzini #define KVM_CAP_PPC_RPT_INVALIDATE 202
887cb082bfaSJing Zhang #define KVM_CAP_BINARY_STATS_FD 203
88819238e75SAaron Lewis #define KVM_CAP_EXIT_ON_EMULATION_FAILURE 204
889b8917b4aSPaolo Bonzini #define KVM_CAP_ARM_MTE 205
890b5663931SPeter Gonda #define KVM_CAP_VM_MOVE_ENC_CONTEXT_FROM 206
891a457fd56SAnup Patel #define KVM_CAP_VM_GPA_BITS 207
892be50b206SGuang Zeng #define KVM_CAP_XSAVE2 208
893dd6e6312SPaolo Bonzini #define KVM_CAP_SYS_ATTRIBUTES 209
89493b71801SNicholas Piggin #define KVM_CAP_PPC_AIL_MODE_3 210
8954dfc4ec2SPaolo Bonzini #define KVM_CAP_S390_MEM_OP_EXTENSION 211
896ba7bb663SDavid Dunn #define KVM_CAP_PMU_CAPABILITY 212
8976d849191SOliver Upton #define KVM_CAP_DISABLE_QUIRKS2 213
898ffbb61d0SDavid Woodhouse #define KVM_CAP_VM_TSC_CONTROL 214
899d495f942SPaolo Bonzini #define KVM_CAP_SYSTEM_EVENT_DATA 215
900bfbab445SOliver Upton #define KVM_CAP_ARM_SYSTEM_SUSPEND 216
901e9bf3acbSJanosch Frank #define KVM_CAP_S390_PROTECTED_DUMP 217
902ed235117SChenyi Qiang #define KVM_CAP_X86_TRIPLE_FAULT_EVENT 218
9032f4073e0STao Xu #define KVM_CAP_X86_NOTIFY_VMEXIT 219
904084cc29fSBen Gardon #define KVM_CAP_VM_DISABLE_NX_HUGE_PAGES 220
905db1c875eSMatthew Rosato #define KVM_CAP_S390_ZPCI_OP 221
906f5ecfee9SPierre Morel #define KVM_CAP_S390_CPU_TOPOLOGY 222
90717601bfeSMarc Zyngier #define KVM_CAP_DIRTY_LOG_RING_ACQ_REL 223
9088c516b25SClaudio Imbrenda #define KVM_CAP_S390_PROTECTED_ASYNC_DISABLE 224
909eb561891SPaolo Bonzini #define KVM_CAP_DIRTY_LOG_RING_WITH_BITMAP 225
91014329b82SAaron Lewis #define KVM_CAP_PMU_EVENT_MASKED_EVENTS 226
91130ec7997SMarc Zyngier #define KVM_CAP_COUNTER_OFFSET 227
9122f440b72SRicardo Koller #define KVM_CAP_ARM_EAGER_SPLIT_CHUNK_SIZE 228
9132f440b72SRicardo Koller #define KVM_CAP_ARM_SUPPORTED_BLOCK_SIZES 229
9143f9cd0caSJing Zhang #define KVM_CAP_ARM_SUPPORTED_REG_MASK_RANGES 230
915bb58b90bSSean Christopherson #define KVM_CAP_USER_MEMORY2 231
91616f95f3bSChao Peng #define KVM_CAP_MEMORY_FAULT_INFO 232
9175a475554SChao Peng #define KVM_CAP_MEMORY_ATTRIBUTES 233
918a7800aa8SSean Christopherson #define KVM_CAP_GUEST_MEMFD 234
91989ea60c2SSean Christopherson #define KVM_CAP_VM_TYPES 235
920607ca46eSDavid Howells 
921607ca46eSDavid Howells struct kvm_irq_routing_irqchip {
922607ca46eSDavid Howells 	__u32 irqchip;
923607ca46eSDavid Howells 	__u32 pin;
924607ca46eSDavid Howells };
925607ca46eSDavid Howells 
926607ca46eSDavid Howells struct kvm_irq_routing_msi {
927607ca46eSDavid Howells 	__u32 address_lo;
928607ca46eSDavid Howells 	__u32 address_hi;
929607ca46eSDavid Howells 	__u32 data;
93076a10b86SEric Auger 	union {
931607ca46eSDavid Howells 		__u32 pad;
93276a10b86SEric Auger 		__u32 devid;
93376a10b86SEric Auger 	};
934607ca46eSDavid Howells };
935607ca46eSDavid Howells 
93684223598SCornelia Huck struct kvm_irq_routing_s390_adapter {
93784223598SCornelia Huck 	__u64 ind_addr;
93884223598SCornelia Huck 	__u64 summary_addr;
93984223598SCornelia Huck 	__u64 ind_offset;
94084223598SCornelia Huck 	__u32 summary_offset;
94184223598SCornelia Huck 	__u32 adapter_id;
94284223598SCornelia Huck };
94384223598SCornelia Huck 
9445c919412SAndrey Smetanin struct kvm_irq_routing_hv_sint {
9455c919412SAndrey Smetanin 	__u32 vcpu;
9465c919412SAndrey Smetanin 	__u32 sint;
9475c919412SAndrey Smetanin };
9485c919412SAndrey Smetanin 
94914243b38SDavid Woodhouse struct kvm_irq_routing_xen_evtchn {
95014243b38SDavid Woodhouse 	__u32 port;
95114243b38SDavid Woodhouse 	__u32 vcpu;
95214243b38SDavid Woodhouse 	__u32 priority;
95314243b38SDavid Woodhouse };
95414243b38SDavid Woodhouse 
95514243b38SDavid Woodhouse #define KVM_IRQ_ROUTING_XEN_EVTCHN_PRIO_2LEVEL ((__u32)(-1))
95614243b38SDavid Woodhouse 
957607ca46eSDavid Howells /* gsi routing entry types */
958607ca46eSDavid Howells #define KVM_IRQ_ROUTING_IRQCHIP 1
959607ca46eSDavid Howells #define KVM_IRQ_ROUTING_MSI 2
96084223598SCornelia Huck #define KVM_IRQ_ROUTING_S390_ADAPTER 3
9615c919412SAndrey Smetanin #define KVM_IRQ_ROUTING_HV_SINT 4
96214243b38SDavid Woodhouse #define KVM_IRQ_ROUTING_XEN_EVTCHN 5
963607ca46eSDavid Howells 
964607ca46eSDavid Howells struct kvm_irq_routing_entry {
965607ca46eSDavid Howells 	__u32 gsi;
966607ca46eSDavid Howells 	__u32 type;
967607ca46eSDavid Howells 	__u32 flags;
968607ca46eSDavid Howells 	__u32 pad;
969607ca46eSDavid Howells 	union {
970607ca46eSDavid Howells 		struct kvm_irq_routing_irqchip irqchip;
971607ca46eSDavid Howells 		struct kvm_irq_routing_msi msi;
97284223598SCornelia Huck 		struct kvm_irq_routing_s390_adapter adapter;
9735c919412SAndrey Smetanin 		struct kvm_irq_routing_hv_sint hv_sint;
97414243b38SDavid Woodhouse 		struct kvm_irq_routing_xen_evtchn xen_evtchn;
975607ca46eSDavid Howells 		__u32 pad[8];
976607ca46eSDavid Howells 	} u;
977607ca46eSDavid Howells };
978607ca46eSDavid Howells 
979607ca46eSDavid Howells struct kvm_irq_routing {
980607ca46eSDavid Howells 	__u32 nr;
981607ca46eSDavid Howells 	__u32 flags;
98294dfc73eSGustavo A. R. Silva 	struct kvm_irq_routing_entry entries[];
983607ca46eSDavid Howells };
984607ca46eSDavid Howells 
985607ca46eSDavid Howells #define KVM_IRQFD_FLAG_DEASSIGN (1 << 0)
986607ca46eSDavid Howells /*
987607ca46eSDavid Howells  * Available with KVM_CAP_IRQFD_RESAMPLE
988607ca46eSDavid Howells  *
989607ca46eSDavid Howells  * KVM_IRQFD_FLAG_RESAMPLE indicates resamplefd is valid and specifies
990607ca46eSDavid Howells  * the irqfd to operate in resampling mode for level triggered interrupt
9913ecad8c2SMauro Carvalho Chehab  * emulation.  See Documentation/virt/kvm/api.rst.
992607ca46eSDavid Howells  */
993607ca46eSDavid Howells #define KVM_IRQFD_FLAG_RESAMPLE (1 << 1)
994607ca46eSDavid Howells 
995607ca46eSDavid Howells struct kvm_irqfd {
996607ca46eSDavid Howells 	__u32 fd;
997607ca46eSDavid Howells 	__u32 gsi;
998607ca46eSDavid Howells 	__u32 flags;
999607ca46eSDavid Howells 	__u32 resamplefd;
1000607ca46eSDavid Howells 	__u8  pad[16];
1001607ca46eSDavid Howells };
1002607ca46eSDavid Howells 
1003e3fd9a93SPaolo Bonzini /* For KVM_CAP_ADJUST_CLOCK */
1004e3fd9a93SPaolo Bonzini 
1005e3fd9a93SPaolo Bonzini /* Do not use 1, KVM_CHECK_EXTENSION returned it before we had flags.  */
1006e3fd9a93SPaolo Bonzini #define KVM_CLOCK_TSC_STABLE		2
1007c68dc1b5SOliver Upton #define KVM_CLOCK_REALTIME		(1 << 2)
1008c68dc1b5SOliver Upton #define KVM_CLOCK_HOST_TSC		(1 << 3)
1009e3fd9a93SPaolo Bonzini 
1010607ca46eSDavid Howells struct kvm_clock_data {
1011607ca46eSDavid Howells 	__u64 clock;
1012607ca46eSDavid Howells 	__u32 flags;
1013c68dc1b5SOliver Upton 	__u32 pad0;
1014c68dc1b5SOliver Upton 	__u64 realtime;
1015c68dc1b5SOliver Upton 	__u64 host_tsc;
1016c68dc1b5SOliver Upton 	__u32 pad[4];
1017607ca46eSDavid Howells };
1018607ca46eSDavid Howells 
1019e3fd9a93SPaolo Bonzini /* For KVM_CAP_SW_TLB */
1020e3fd9a93SPaolo Bonzini 
1021607ca46eSDavid Howells #define KVM_MMU_FSL_BOOKE_NOHV		0
1022607ca46eSDavid Howells #define KVM_MMU_FSL_BOOKE_HV		1
1023607ca46eSDavid Howells 
1024607ca46eSDavid Howells struct kvm_config_tlb {
1025607ca46eSDavid Howells 	__u64 params;
1026607ca46eSDavid Howells 	__u64 array;
1027607ca46eSDavid Howells 	__u32 mmu_type;
1028607ca46eSDavid Howells 	__u32 array_len;
1029607ca46eSDavid Howells };
1030607ca46eSDavid Howells 
1031607ca46eSDavid Howells struct kvm_dirty_tlb {
1032607ca46eSDavid Howells 	__u64 bitmap;
1033607ca46eSDavid Howells 	__u32 num_dirty;
1034607ca46eSDavid Howells };
1035607ca46eSDavid Howells 
1036607ca46eSDavid Howells /* Available with KVM_CAP_ONE_REG */
1037607ca46eSDavid Howells 
1038607ca46eSDavid Howells #define KVM_REG_ARCH_MASK	0xff00000000000000ULL
1039607ca46eSDavid Howells #define KVM_REG_GENERIC		0x0000000000000000ULL
1040607ca46eSDavid Howells 
1041607ca46eSDavid Howells /*
1042607ca46eSDavid Howells  * Architecture specific registers are to be defined in arch headers and
1043607ca46eSDavid Howells  * ORed with the arch identifier.
1044607ca46eSDavid Howells  */
1045607ca46eSDavid Howells #define KVM_REG_PPC		0x1000000000000000ULL
1046607ca46eSDavid Howells #define KVM_REG_X86		0x2000000000000000ULL
1047607ca46eSDavid Howells #define KVM_REG_IA64		0x3000000000000000ULL
1048607ca46eSDavid Howells #define KVM_REG_ARM		0x4000000000000000ULL
1049607ca46eSDavid Howells #define KVM_REG_S390		0x5000000000000000ULL
10507c8c5e6aSMarc Zyngier #define KVM_REG_ARM64		0x6000000000000000ULL
10512a8fedd0SDavid Daney #define KVM_REG_MIPS		0x7000000000000000ULL
1052dee04eeeSAnup Patel #define KVM_REG_RISCV		0x8000000000000000ULL
1053b37e6b68STianrui Zhao #define KVM_REG_LOONGARCH	0x9000000000000000ULL
1054607ca46eSDavid Howells 
1055607ca46eSDavid Howells #define KVM_REG_SIZE_SHIFT	52
1056607ca46eSDavid Howells #define KVM_REG_SIZE_MASK	0x00f0000000000000ULL
1057607ca46eSDavid Howells #define KVM_REG_SIZE_U8		0x0000000000000000ULL
1058607ca46eSDavid Howells #define KVM_REG_SIZE_U16	0x0010000000000000ULL
1059607ca46eSDavid Howells #define KVM_REG_SIZE_U32	0x0020000000000000ULL
1060607ca46eSDavid Howells #define KVM_REG_SIZE_U64	0x0030000000000000ULL
1061607ca46eSDavid Howells #define KVM_REG_SIZE_U128	0x0040000000000000ULL
1062607ca46eSDavid Howells #define KVM_REG_SIZE_U256	0x0050000000000000ULL
1063607ca46eSDavid Howells #define KVM_REG_SIZE_U512	0x0060000000000000ULL
1064607ca46eSDavid Howells #define KVM_REG_SIZE_U1024	0x0070000000000000ULL
10652b953ea3SDave Martin #define KVM_REG_SIZE_U2048	0x0080000000000000ULL
1066607ca46eSDavid Howells 
1067749cf76cSChristoffer Dall struct kvm_reg_list {
1068749cf76cSChristoffer Dall 	__u64 n; /* number of regs */
106994dfc73eSGustavo A. R. Silva 	__u64 reg[];
1070749cf76cSChristoffer Dall };
1071749cf76cSChristoffer Dall 
1072607ca46eSDavid Howells struct kvm_one_reg {
1073607ca46eSDavid Howells 	__u64 id;
1074607ca46eSDavid Howells 	__u64 addr;
1075607ca46eSDavid Howells };
1076607ca46eSDavid Howells 
10772b8ddd93SAndre Przywara #define KVM_MSI_VALID_DEVID	(1U << 0)
1078607ca46eSDavid Howells struct kvm_msi {
1079607ca46eSDavid Howells 	__u32 address_lo;
1080607ca46eSDavid Howells 	__u32 address_hi;
1081607ca46eSDavid Howells 	__u32 data;
1082607ca46eSDavid Howells 	__u32 flags;
10832b8ddd93SAndre Przywara 	__u32 devid;
10842b8ddd93SAndre Przywara 	__u8  pad[12];
1085607ca46eSDavid Howells };
1086607ca46eSDavid Howells 
10873401d546SChristoffer Dall struct kvm_arm_device_addr {
10883401d546SChristoffer Dall 	__u64 id;
10893401d546SChristoffer Dall 	__u64 addr;
10903401d546SChristoffer Dall };
10913401d546SChristoffer Dall 
1092607ca46eSDavid Howells /*
1093852b6d57SScott Wood  * Device control API, available with KVM_CAP_DEVICE_CTRL
1094852b6d57SScott Wood  */
1095852b6d57SScott Wood #define KVM_CREATE_DEVICE_TEST		1
1096852b6d57SScott Wood 
1097852b6d57SScott Wood struct kvm_create_device {
1098852b6d57SScott Wood 	__u32	type;	/* in: KVM_DEV_TYPE_xxx */
1099852b6d57SScott Wood 	__u32	fd;	/* out: device handle */
1100852b6d57SScott Wood 	__u32	flags;	/* in: KVM_CREATE_DEVICE_xxx */
1101852b6d57SScott Wood };
1102852b6d57SScott Wood 
1103852b6d57SScott Wood struct kvm_device_attr {
1104852b6d57SScott Wood 	__u32	flags;		/* no flags currently defined */
1105852b6d57SScott Wood 	__u32	group;		/* device-defined */
1106852b6d57SScott Wood 	__u64	attr;		/* group-defined */
1107852b6d57SScott Wood 	__u64	addr;		/* userspace address of attr data */
1108852b6d57SScott Wood };
1109852b6d57SScott Wood 
1110dcc31ea6SYi Liu #define  KVM_DEV_VFIO_FILE			1
1111dcc31ea6SYi Liu 
1112dcc31ea6SYi Liu #define   KVM_DEV_VFIO_FILE_ADD			1
1113dcc31ea6SYi Liu #define   KVM_DEV_VFIO_FILE_DEL			2
1114dcc31ea6SYi Liu 
1115dcc31ea6SYi Liu /* KVM_DEV_VFIO_GROUP aliases are for compile time uapi compatibility */
1116dcc31ea6SYi Liu #define  KVM_DEV_VFIO_GROUP	KVM_DEV_VFIO_FILE
1117dcc31ea6SYi Liu 
1118dcc31ea6SYi Liu #define   KVM_DEV_VFIO_GROUP_ADD	KVM_DEV_VFIO_FILE_ADD
1119dcc31ea6SYi Liu #define   KVM_DEV_VFIO_GROUP_DEL	KVM_DEV_VFIO_FILE_DEL
1120121f80baSAlexey Kardashevskiy #define   KVM_DEV_VFIO_GROUP_SET_SPAPR_TCE		3
1121d60eacb0SWill Deacon 
1122d60eacb0SWill Deacon enum kvm_device_type {
1123d60eacb0SWill Deacon 	KVM_DEV_TYPE_FSL_MPIC_20	= 1,
1124d60eacb0SWill Deacon #define KVM_DEV_TYPE_FSL_MPIC_20	KVM_DEV_TYPE_FSL_MPIC_20
1125d60eacb0SWill Deacon 	KVM_DEV_TYPE_FSL_MPIC_42,
1126d60eacb0SWill Deacon #define KVM_DEV_TYPE_FSL_MPIC_42	KVM_DEV_TYPE_FSL_MPIC_42
1127d60eacb0SWill Deacon 	KVM_DEV_TYPE_XICS,
1128d60eacb0SWill Deacon #define KVM_DEV_TYPE_XICS		KVM_DEV_TYPE_XICS
1129d60eacb0SWill Deacon 	KVM_DEV_TYPE_VFIO,
1130d60eacb0SWill Deacon #define KVM_DEV_TYPE_VFIO		KVM_DEV_TYPE_VFIO
1131d60eacb0SWill Deacon 	KVM_DEV_TYPE_ARM_VGIC_V2,
1132d60eacb0SWill Deacon #define KVM_DEV_TYPE_ARM_VGIC_V2	KVM_DEV_TYPE_ARM_VGIC_V2
1133d60eacb0SWill Deacon 	KVM_DEV_TYPE_FLIC,
1134d60eacb0SWill Deacon #define KVM_DEV_TYPE_FLIC		KVM_DEV_TYPE_FLIC
1135a0675c25SAndre Przywara 	KVM_DEV_TYPE_ARM_VGIC_V3,
1136a0675c25SAndre Przywara #define KVM_DEV_TYPE_ARM_VGIC_V3	KVM_DEV_TYPE_ARM_VGIC_V3
11371085fdc6SAndre Przywara 	KVM_DEV_TYPE_ARM_VGIC_ITS,
11381085fdc6SAndre Przywara #define KVM_DEV_TYPE_ARM_VGIC_ITS	KVM_DEV_TYPE_ARM_VGIC_ITS
113990c73795SCédric Le Goater 	KVM_DEV_TYPE_XIVE,
114090c73795SCédric Le Goater #define KVM_DEV_TYPE_XIVE		KVM_DEV_TYPE_XIVE
114158772e9aSSteven Price 	KVM_DEV_TYPE_ARM_PV_TIME,
114258772e9aSSteven Price #define KVM_DEV_TYPE_ARM_PV_TIME	KVM_DEV_TYPE_ARM_PV_TIME
114389d01306SAnup Patel 	KVM_DEV_TYPE_RISCV_AIA,
114489d01306SAnup Patel #define KVM_DEV_TYPE_RISCV_AIA		KVM_DEV_TYPE_RISCV_AIA
1145d60eacb0SWill Deacon 	KVM_DEV_TYPE_MAX,
1146d60eacb0SWill Deacon };
11475df554adSScott Wood 
1148121f80baSAlexey Kardashevskiy struct kvm_vfio_spapr_tce {
1149121f80baSAlexey Kardashevskiy 	__s32	groupfd;
1150121f80baSAlexey Kardashevskiy 	__s32	tablefd;
1151121f80baSAlexey Kardashevskiy };
1152121f80baSAlexey Kardashevskiy 
1153852b6d57SScott Wood /*
1154607ca46eSDavid Howells  * KVM_CREATE_VCPU receives as a parameter the vcpu slot, and returns
1155607ca46eSDavid Howells  * a vcpu fd.
1156607ca46eSDavid Howells  */
1157607ca46eSDavid Howells #define KVM_CREATE_VCPU           _IO(KVMIO,   0x41)
1158607ca46eSDavid Howells #define KVM_GET_DIRTY_LOG         _IOW(KVMIO,  0x42, struct kvm_dirty_log)
1159607ca46eSDavid Howells #define KVM_SET_NR_MMU_PAGES      _IO(KVMIO,   0x44)
1160c5edd753SThomas Huth #define KVM_GET_NR_MMU_PAGES      _IO(KVMIO,   0x45)  /* deprecated */
1161607ca46eSDavid Howells #define KVM_SET_USER_MEMORY_REGION _IOW(KVMIO, 0x46, \
1162607ca46eSDavid Howells 					struct kvm_userspace_memory_region)
1163607ca46eSDavid Howells #define KVM_SET_TSS_ADDR          _IO(KVMIO,   0x47)
1164607ca46eSDavid Howells #define KVM_SET_IDENTITY_MAP_ADDR _IOW(KVMIO,  0x48, __u64)
1165bb58b90bSSean Christopherson #define KVM_SET_USER_MEMORY_REGION2 _IOW(KVMIO, 0x49, \
1166bb58b90bSSean Christopherson 					 struct kvm_userspace_memory_region2)
1167607ca46eSDavid Howells 
1168607ca46eSDavid Howells /* enable ucontrol for s390 */
1169607ca46eSDavid Howells #define KVM_S390_UCAS_MAP        _IOW(KVMIO, 0x50, struct kvm_s390_ucas_mapping)
1170607ca46eSDavid Howells #define KVM_S390_UCAS_UNMAP      _IOW(KVMIO, 0x51, struct kvm_s390_ucas_mapping)
1171607ca46eSDavid Howells #define KVM_S390_VCPU_FAULT	 _IOW(KVMIO, 0x52, unsigned long)
1172607ca46eSDavid Howells 
1173607ca46eSDavid Howells /* Device model IOC */
1174607ca46eSDavid Howells #define KVM_CREATE_IRQCHIP        _IO(KVMIO,   0x60)
1175607ca46eSDavid Howells #define KVM_IRQ_LINE              _IOW(KVMIO,  0x61, struct kvm_irq_level)
1176607ca46eSDavid Howells #define KVM_GET_IRQCHIP           _IOWR(KVMIO, 0x62, struct kvm_irqchip)
1177607ca46eSDavid Howells #define KVM_SET_IRQCHIP           _IOR(KVMIO,  0x63, struct kvm_irqchip)
1178607ca46eSDavid Howells #define KVM_CREATE_PIT            _IO(KVMIO,   0x64)
1179607ca46eSDavid Howells #define KVM_GET_PIT               _IOWR(KVMIO, 0x65, struct kvm_pit_state)
1180607ca46eSDavid Howells #define KVM_SET_PIT               _IOR(KVMIO,  0x66, struct kvm_pit_state)
1181607ca46eSDavid Howells #define KVM_IRQ_LINE_STATUS       _IOWR(KVMIO, 0x67, struct kvm_irq_level)
1182607ca46eSDavid Howells #define KVM_REGISTER_COALESCED_MMIO \
1183607ca46eSDavid Howells 			_IOW(KVMIO,  0x67, struct kvm_coalesced_mmio_zone)
1184607ca46eSDavid Howells #define KVM_UNREGISTER_COALESCED_MMIO \
1185607ca46eSDavid Howells 			_IOW(KVMIO,  0x68, struct kvm_coalesced_mmio_zone)
1186607ca46eSDavid Howells #define KVM_SET_GSI_ROUTING       _IOW(KVMIO,  0x6a, struct kvm_irq_routing)
1187607ca46eSDavid Howells #define KVM_REINJECT_CONTROL      _IO(KVMIO,   0x71)
1188607ca46eSDavid Howells #define KVM_IRQFD                 _IOW(KVMIO,  0x76, struct kvm_irqfd)
1189607ca46eSDavid Howells #define KVM_CREATE_PIT2		  _IOW(KVMIO,  0x77, struct kvm_pit_config)
1190607ca46eSDavid Howells #define KVM_SET_BOOT_CPU_ID       _IO(KVMIO,   0x78)
1191607ca46eSDavid Howells #define KVM_IOEVENTFD             _IOW(KVMIO,  0x79, struct kvm_ioeventfd)
1192607ca46eSDavid Howells #define KVM_XEN_HVM_CONFIG        _IOW(KVMIO,  0x7a, struct kvm_xen_hvm_config)
1193607ca46eSDavid Howells #define KVM_SET_CLOCK             _IOW(KVMIO,  0x7b, struct kvm_clock_data)
1194607ca46eSDavid Howells #define KVM_GET_CLOCK             _IOR(KVMIO,  0x7c, struct kvm_clock_data)
1195607ca46eSDavid Howells /* Available with KVM_CAP_PIT_STATE2 */
1196607ca46eSDavid Howells #define KVM_GET_PIT2              _IOR(KVMIO,  0x9f, struct kvm_pit_state2)
1197607ca46eSDavid Howells #define KVM_SET_PIT2              _IOW(KVMIO,  0xa0, struct kvm_pit_state2)
1198607ca46eSDavid Howells /* Available with KVM_CAP_PPC_GET_PVINFO */
1199607ca46eSDavid Howells #define KVM_PPC_GET_PVINFO	  _IOW(KVMIO,  0xa1, struct kvm_ppc_pvinfo)
1200ffbb61d0SDavid Woodhouse /* Available with KVM_CAP_TSC_CONTROL for a vCPU, or with
1201ffbb61d0SDavid Woodhouse *  KVM_CAP_VM_TSC_CONTROL to set defaults for a VM */
1202607ca46eSDavid Howells #define KVM_SET_TSC_KHZ           _IO(KVMIO,  0xa2)
1203607ca46eSDavid Howells #define KVM_GET_TSC_KHZ           _IO(KVMIO,  0xa3)
1204607ca46eSDavid Howells /* Available with KVM_CAP_SIGNAL_MSI */
1205607ca46eSDavid Howells #define KVM_SIGNAL_MSI            _IOW(KVMIO,  0xa5, struct kvm_msi)
1206607ca46eSDavid Howells /* Available with KVM_CAP_PPC_GET_SMMU_INFO */
1207607ca46eSDavid Howells #define KVM_PPC_GET_SMMU_INFO	  _IOR(KVMIO,  0xa6, struct kvm_ppc_smmu_info)
1208607ca46eSDavid Howells /* Available with KVM_CAP_PPC_ALLOC_HTAB */
1209607ca46eSDavid Howells #define KVM_PPC_ALLOCATE_HTAB	  _IOWR(KVMIO, 0xa7, __u32)
121019bf7f8aSMarcelo Tosatti #define KVM_CREATE_SPAPR_TCE	  _IOW(KVMIO,  0xa8, struct kvm_create_spapr_tce)
121158ded420SAlexey Kardashevskiy #define KVM_CREATE_SPAPR_TCE_64	  _IOW(KVMIO,  0xa8, \
121258ded420SAlexey Kardashevskiy 				       struct kvm_create_spapr_tce_64)
121319bf7f8aSMarcelo Tosatti /* Available with KVM_CAP_RMA */
121419bf7f8aSMarcelo Tosatti #define KVM_ALLOCATE_RMA	  _IOR(KVMIO,  0xa9, struct kvm_allocate_rma)
1215a2932923SPaul Mackerras /* Available with KVM_CAP_PPC_HTAB_FD */
1216a2932923SPaul Mackerras #define KVM_PPC_GET_HTAB_FD	  _IOW(KVMIO,  0xaa, struct kvm_get_htab_fd)
12173401d546SChristoffer Dall /* Available with KVM_CAP_ARM_SET_DEVICE_ADDR */
12183401d546SChristoffer Dall #define KVM_ARM_SET_DEVICE_ADDR	  _IOW(KVMIO,  0xab, struct kvm_arm_device_addr)
12198e591cb7SMichael Ellerman /* Available with KVM_CAP_PPC_RTAS */
12208e591cb7SMichael Ellerman #define KVM_PPC_RTAS_DEFINE_TOKEN _IOW(KVMIO,  0xac, struct kvm_rtas_token_args)
1221ef1ead0cSDavid Gibson /* Available with KVM_CAP_SPAPR_RESIZE_HPT */
1222ef1ead0cSDavid Gibson #define KVM_PPC_RESIZE_HPT_PREPARE _IOR(KVMIO, 0xad, struct kvm_ppc_resize_hpt)
1223ef1ead0cSDavid Gibson #define KVM_PPC_RESIZE_HPT_COMMIT  _IOR(KVMIO, 0xae, struct kvm_ppc_resize_hpt)
1224c9270132SPaul Mackerras /* Available with KVM_CAP_PPC_RADIX_MMU or KVM_CAP_PPC_HASH_MMU_V3 */
1225c9270132SPaul Mackerras #define KVM_PPC_CONFIGURE_V3_MMU  _IOW(KVMIO,  0xaf, struct kvm_ppc_mmuv3_cfg)
1226c9270132SPaul Mackerras /* Available with KVM_CAP_PPC_RADIX_MMU */
1227c9270132SPaul Mackerras #define KVM_PPC_GET_RMMU_INFO	  _IOW(KVMIO,  0xb0, struct kvm_ppc_rmmu_info)
12283214d01fSPaul Mackerras /* Available with KVM_CAP_PPC_GET_CPU_CHAR */
12293214d01fSPaul Mackerras #define KVM_PPC_GET_CPU_CHAR	  _IOR(KVMIO,  0xb1, struct kvm_ppc_cpu_char)
123066bb8a06SEric Hankland /* Available with KVM_CAP_PMU_EVENT_FILTER */
123166bb8a06SEric Hankland #define KVM_SET_PMU_EVENT_FILTER  _IOW(KVMIO,  0xb2, struct kvm_pmu_event_filter)
123222945688SBharata B Rao #define KVM_PPC_SVM_OFF		  _IO(KVMIO,  0xb3)
1233f0376edbSSteven Price #define KVM_ARM_MTE_COPY_TAGS	  _IOR(KVMIO,  0xb4, struct kvm_arm_copy_mte_tags)
123430ec7997SMarc Zyngier /* Available with KVM_CAP_COUNTER_OFFSET */
123530ec7997SMarc Zyngier #define KVM_ARM_SET_COUNTER_OFFSET _IOW(KVMIO,  0xb5, struct kvm_arm_counter_offset)
12363f9cd0caSJing Zhang #define KVM_ARM_GET_REG_WRITABLE_MASKS _IOR(KVMIO,  0xb6, struct reg_mask_range)
1237607ca46eSDavid Howells 
1238852b6d57SScott Wood /* ioctl for vm fd */
1239852b6d57SScott Wood #define KVM_CREATE_DEVICE	  _IOWR(KVMIO,  0xe0, struct kvm_create_device)
1240852b6d57SScott Wood 
1241852b6d57SScott Wood /* ioctls for fds returned by KVM_CREATE_DEVICE */
1242852b6d57SScott Wood #define KVM_SET_DEVICE_ATTR	  _IOW(KVMIO,  0xe1, struct kvm_device_attr)
1243852b6d57SScott Wood #define KVM_GET_DEVICE_ATTR	  _IOW(KVMIO,  0xe2, struct kvm_device_attr)
1244852b6d57SScott Wood #define KVM_HAS_DEVICE_ATTR	  _IOW(KVMIO,  0xe3, struct kvm_device_attr)
1245852b6d57SScott Wood 
1246607ca46eSDavid Howells /*
1247607ca46eSDavid Howells  * ioctls for vcpu fds
1248607ca46eSDavid Howells  */
1249607ca46eSDavid Howells #define KVM_RUN                   _IO(KVMIO,   0x80)
1250607ca46eSDavid Howells #define KVM_GET_REGS              _IOR(KVMIO,  0x81, struct kvm_regs)
1251607ca46eSDavid Howells #define KVM_SET_REGS              _IOW(KVMIO,  0x82, struct kvm_regs)
1252607ca46eSDavid Howells #define KVM_GET_SREGS             _IOR(KVMIO,  0x83, struct kvm_sregs)
1253607ca46eSDavid Howells #define KVM_SET_SREGS             _IOW(KVMIO,  0x84, struct kvm_sregs)
1254607ca46eSDavid Howells #define KVM_TRANSLATE             _IOWR(KVMIO, 0x85, struct kvm_translation)
1255607ca46eSDavid Howells #define KVM_INTERRUPT             _IOW(KVMIO,  0x86, struct kvm_interrupt)
1256607ca46eSDavid Howells #define KVM_GET_MSRS              _IOWR(KVMIO, 0x88, struct kvm_msrs)
1257607ca46eSDavid Howells #define KVM_SET_MSRS              _IOW(KVMIO,  0x89, struct kvm_msrs)
1258607ca46eSDavid Howells #define KVM_SET_CPUID             _IOW(KVMIO,  0x8a, struct kvm_cpuid)
1259607ca46eSDavid Howells #define KVM_SET_SIGNAL_MASK       _IOW(KVMIO,  0x8b, struct kvm_signal_mask)
1260607ca46eSDavid Howells #define KVM_GET_FPU               _IOR(KVMIO,  0x8c, struct kvm_fpu)
1261607ca46eSDavid Howells #define KVM_SET_FPU               _IOW(KVMIO,  0x8d, struct kvm_fpu)
1262607ca46eSDavid Howells #define KVM_GET_LAPIC             _IOR(KVMIO,  0x8e, struct kvm_lapic_state)
1263607ca46eSDavid Howells #define KVM_SET_LAPIC             _IOW(KVMIO,  0x8f, struct kvm_lapic_state)
1264607ca46eSDavid Howells #define KVM_SET_CPUID2            _IOW(KVMIO,  0x90, struct kvm_cpuid2)
1265607ca46eSDavid Howells #define KVM_GET_CPUID2            _IOWR(KVMIO, 0x91, struct kvm_cpuid2)
1266607ca46eSDavid Howells /* Available with KVM_CAP_VAPIC */
1267607ca46eSDavid Howells #define KVM_TPR_ACCESS_REPORTING  _IOWR(KVMIO, 0x92, struct kvm_tpr_access_ctl)
1268607ca46eSDavid Howells /* Available with KVM_CAP_VAPIC */
1269607ca46eSDavid Howells #define KVM_SET_VAPIC_ADDR        _IOW(KVMIO,  0x93, struct kvm_vapic_addr)
1270607ca46eSDavid Howells /* valid for virtual machine (for floating interrupt)_and_ vcpu */
1271607ca46eSDavid Howells #define KVM_S390_INTERRUPT        _IOW(KVMIO,  0x94, struct kvm_s390_interrupt)
1272607ca46eSDavid Howells /* store status for s390 */
1273607ca46eSDavid Howells #define KVM_S390_STORE_STATUS_NOADDR    (-1ul)
1274607ca46eSDavid Howells #define KVM_S390_STORE_STATUS_PREFIXED  (-2ul)
1275607ca46eSDavid Howells #define KVM_S390_STORE_STATUS	  _IOW(KVMIO,  0x95, unsigned long)
1276607ca46eSDavid Howells /* initial ipl psw for s390 */
1277607ca46eSDavid Howells #define KVM_S390_SET_INITIAL_PSW  _IOW(KVMIO,  0x96, struct kvm_s390_psw)
1278607ca46eSDavid Howells /* initial reset for s390 */
1279607ca46eSDavid Howells #define KVM_S390_INITIAL_RESET    _IO(KVMIO,   0x97)
1280607ca46eSDavid Howells #define KVM_GET_MP_STATE          _IOR(KVMIO,  0x98, struct kvm_mp_state)
1281607ca46eSDavid Howells #define KVM_SET_MP_STATE          _IOW(KVMIO,  0x99, struct kvm_mp_state)
128244b5ce73SChristoffer Dall /* Available with KVM_CAP_USER_NMI */
1283607ca46eSDavid Howells #define KVM_NMI                   _IO(KVMIO,   0x9a)
1284607ca46eSDavid Howells /* Available with KVM_CAP_SET_GUEST_DEBUG */
1285607ca46eSDavid Howells #define KVM_SET_GUEST_DEBUG       _IOW(KVMIO,  0x9b, struct kvm_guest_debug)
1286607ca46eSDavid Howells /* MCE for x86 */
1287607ca46eSDavid Howells #define KVM_X86_SETUP_MCE         _IOW(KVMIO,  0x9c, __u64)
1288607ca46eSDavid Howells #define KVM_X86_GET_MCE_CAP_SUPPORTED _IOR(KVMIO,  0x9d, __u64)
1289607ca46eSDavid Howells #define KVM_X86_SET_MCE           _IOW(KVMIO,  0x9e, struct kvm_x86_mce)
1290607ca46eSDavid Howells /* Available with KVM_CAP_VCPU_EVENTS */
1291607ca46eSDavid Howells #define KVM_GET_VCPU_EVENTS       _IOR(KVMIO,  0x9f, struct kvm_vcpu_events)
1292607ca46eSDavid Howells #define KVM_SET_VCPU_EVENTS       _IOW(KVMIO,  0xa0, struct kvm_vcpu_events)
1293607ca46eSDavid Howells /* Available with KVM_CAP_DEBUGREGS */
1294607ca46eSDavid Howells #define KVM_GET_DEBUGREGS         _IOR(KVMIO,  0xa1, struct kvm_debugregs)
1295607ca46eSDavid Howells #define KVM_SET_DEBUGREGS         _IOW(KVMIO,  0xa2, struct kvm_debugregs)
1296d938dc55SCornelia Huck /*
129722725266SBinbin Wu  * vcpu version available with KVM_CAP_ENABLE_CAP
1298d938dc55SCornelia Huck  * vm version available with KVM_CAP_ENABLE_CAP_VM
1299d938dc55SCornelia Huck  */
1300607ca46eSDavid Howells #define KVM_ENABLE_CAP            _IOW(KVMIO,  0xa3, struct kvm_enable_cap)
1301607ca46eSDavid Howells /* Available with KVM_CAP_XSAVE */
1302607ca46eSDavid Howells #define KVM_GET_XSAVE		  _IOR(KVMIO,  0xa4, struct kvm_xsave)
1303607ca46eSDavid Howells #define KVM_SET_XSAVE		  _IOW(KVMIO,  0xa5, struct kvm_xsave)
1304607ca46eSDavid Howells /* Available with KVM_CAP_XCRS */
1305607ca46eSDavid Howells #define KVM_GET_XCRS		  _IOR(KVMIO,  0xa6, struct kvm_xcrs)
1306607ca46eSDavid Howells #define KVM_SET_XCRS		  _IOW(KVMIO,  0xa7, struct kvm_xcrs)
1307607ca46eSDavid Howells /* Available with KVM_CAP_SW_TLB */
1308607ca46eSDavid Howells #define KVM_DIRTY_TLB		  _IOW(KVMIO,  0xaa, struct kvm_dirty_tlb)
1309607ca46eSDavid Howells /* Available with KVM_CAP_ONE_REG */
1310607ca46eSDavid Howells #define KVM_GET_ONE_REG		  _IOW(KVMIO,  0xab, struct kvm_one_reg)
1311607ca46eSDavid Howells #define KVM_SET_ONE_REG		  _IOW(KVMIO,  0xac, struct kvm_one_reg)
1312607ca46eSDavid Howells /* VM is being stopped by host */
1313607ca46eSDavid Howells #define KVM_KVMCLOCK_CTRL	  _IO(KVMIO,   0xad)
1314749cf76cSChristoffer Dall #define KVM_ARM_VCPU_INIT	  _IOW(KVMIO,  0xae, struct kvm_vcpu_init)
131542c4e0c7SAnup Patel #define KVM_ARM_PREFERRED_TARGET  _IOR(KVMIO,  0xaf, struct kvm_vcpu_init)
1316749cf76cSChristoffer Dall #define KVM_GET_REG_LIST	  _IOWR(KVMIO, 0xb0, struct kvm_reg_list)
131741408c28SThomas Huth /* Available with KVM_CAP_S390_MEM_OP */
131841408c28SThomas Huth #define KVM_S390_MEM_OP		  _IOW(KVMIO,  0xb1, struct kvm_s390_mem_op)
131930ee2a98SJason J. Herne /* Available with KVM_CAP_S390_SKEYS */
132030ee2a98SJason J. Herne #define KVM_S390_GET_SKEYS      _IOW(KVMIO, 0xb2, struct kvm_s390_skeys)
132130ee2a98SJason J. Herne #define KVM_S390_SET_SKEYS      _IOW(KVMIO, 0xb3, struct kvm_s390_skeys)
132247b43c52SJens Freimann /* Available with KVM_CAP_S390_INJECT_IRQ */
132347b43c52SJens Freimann #define KVM_S390_IRQ              _IOW(KVMIO,  0xb4, struct kvm_s390_irq)
1324816c7667SJens Freimann /* Available with KVM_CAP_S390_IRQ_STATE */
1325816c7667SJens Freimann #define KVM_S390_SET_IRQ_STATE	  _IOW(KVMIO, 0xb5, struct kvm_s390_irq_state)
1326816c7667SJens Freimann #define KVM_S390_GET_IRQ_STATE	  _IOW(KVMIO, 0xb6, struct kvm_s390_irq_state)
1327f077825aSPaolo Bonzini /* Available with KVM_CAP_X86_SMM */
1328f077825aSPaolo Bonzini #define KVM_SMI                   _IO(KVMIO,   0xb7)
13294036e387SClaudio Imbrenda /* Available with KVM_CAP_S390_CMMA_MIGRATION */
1330949c0336SGleb Fotengauer-Malinovskiy #define KVM_S390_GET_CMMA_BITS      _IOWR(KVMIO, 0xb8, struct kvm_s390_cmma_log)
13314036e387SClaudio Imbrenda #define KVM_S390_SET_CMMA_BITS      _IOW(KVMIO, 0xb9, struct kvm_s390_cmma_log)
13325acc5c06SBrijesh Singh /* Memory Encryption Commands */
13335acc5c06SBrijesh Singh #define KVM_MEMORY_ENCRYPT_OP      _IOWR(KVMIO, 0xba, unsigned long)
1334607ca46eSDavid Howells 
133569eaedeeSBrijesh Singh struct kvm_enc_region {
133669eaedeeSBrijesh Singh 	__u64 addr;
133769eaedeeSBrijesh Singh 	__u64 size;
133869eaedeeSBrijesh Singh };
133969eaedeeSBrijesh Singh 
134069eaedeeSBrijesh Singh #define KVM_MEMORY_ENCRYPT_REG_REGION    _IOR(KVMIO, 0xbb, struct kvm_enc_region)
134169eaedeeSBrijesh Singh #define KVM_MEMORY_ENCRYPT_UNREG_REGION  _IOR(KVMIO, 0xbc, struct kvm_enc_region)
134269eaedeeSBrijesh Singh 
1343faeb7833SRoman Kagan /* Available with KVM_CAP_HYPERV_EVENTFD */
1344faeb7833SRoman Kagan #define KVM_HYPERV_EVENTFD        _IOW(KVMIO,  0xbd, struct kvm_hyperv_eventfd)
1345faeb7833SRoman Kagan 
13468fcc4b59SJim Mattson /* Available with KVM_CAP_NESTED_STATE */
13478fcc4b59SJim Mattson #define KVM_GET_NESTED_STATE         _IOWR(KVMIO, 0xbe, struct kvm_nested_state)
13488fcc4b59SJim Mattson #define KVM_SET_NESTED_STATE         _IOW(KVMIO,  0xbf, struct kvm_nested_state)
1349faeb7833SRoman Kagan 
1350d7547c55SPeter Xu /* Available with KVM_CAP_MANUAL_DIRTY_LOG_PROTECT_2 */
13512a31b9dbSPaolo Bonzini #define KVM_CLEAR_DIRTY_LOG          _IOWR(KVMIO, 0xc0, struct kvm_clear_dirty_log)
13522a31b9dbSPaolo Bonzini 
1353c21d54f0SVitaly Kuznetsov /* Available with KVM_CAP_HYPERV_CPUID (vcpu) / KVM_CAP_SYS_HYPERV_CPUID (system) */
13542bc39970SVitaly Kuznetsov #define KVM_GET_SUPPORTED_HV_CPUID _IOWR(KVMIO, 0xc1, struct kvm_cpuid2)
13552bc39970SVitaly Kuznetsov 
13567dd32a0dSDave Martin /* Available with KVM_CAP_ARM_SVE */
13577dd32a0dSDave Martin #define KVM_ARM_VCPU_FINALIZE	  _IOW(KVMIO,  0xc2, int)
13587dd32a0dSDave Martin 
13597de3f142SJanosch Frank /* Available with  KVM_CAP_S390_VCPU_RESETS */
13607de3f142SJanosch Frank #define KVM_S390_NORMAL_RESET	_IO(KVMIO,   0xc3)
13617de3f142SJanosch Frank #define KVM_S390_CLEAR_RESET	_IO(KVMIO,   0xc4)
13627de3f142SJanosch Frank 
136329b40f10SJanosch Frank /* Available with KVM_CAP_S390_PROTECTED */
136429b40f10SJanosch Frank #define KVM_S390_PV_COMMAND		_IOWR(KVMIO, 0xc5, struct kvm_pv_cmd)
136529b40f10SJanosch Frank 
13661a155254SAlexander Graf /* Available with KVM_CAP_X86_MSR_FILTER */
13671a155254SAlexander Graf #define KVM_X86_SET_MSR_FILTER	_IOW(KVMIO,  0xc6, struct kvm_msr_filter)
13681a155254SAlexander Graf 
1369fb04a1edSPeter Xu /* Available with KVM_CAP_DIRTY_LOG_RING */
1370fb04a1edSPeter Xu #define KVM_RESET_DIRTY_RINGS		_IO(KVMIO, 0xc7)
1371fb04a1edSPeter Xu 
13723e324615SDavid Woodhouse /* Per-VM Xen attributes */
1373a76b9641SJoao Martins #define KVM_XEN_HVM_GET_ATTR	_IOWR(KVMIO, 0xc8, struct kvm_xen_hvm_attr)
1374a76b9641SJoao Martins #define KVM_XEN_HVM_SET_ATTR	_IOW(KVMIO,  0xc9, struct kvm_xen_hvm_attr)
1375a76b9641SJoao Martins 
13763e324615SDavid Woodhouse /* Per-vCPU Xen attributes */
13773e324615SDavid Woodhouse #define KVM_XEN_VCPU_GET_ATTR	_IOWR(KVMIO, 0xca, struct kvm_xen_vcpu_attr)
13783e324615SDavid Woodhouse #define KVM_XEN_VCPU_SET_ATTR	_IOW(KVMIO,  0xcb, struct kvm_xen_vcpu_attr)
13793e324615SDavid Woodhouse 
138035025735SDavid Woodhouse /* Available with KVM_CAP_XEN_HVM / KVM_XEN_HVM_CONFIG_EVTCHN_SEND */
138135025735SDavid Woodhouse #define KVM_XEN_HVM_EVTCHN_SEND	_IOW(KVMIO,  0xd0, struct kvm_irq_routing_xen_evtchn)
138235025735SDavid Woodhouse 
13836dba9403SMaxim Levitsky #define KVM_GET_SREGS2             _IOR(KVMIO,  0xcc, struct kvm_sregs2)
13846dba9403SMaxim Levitsky #define KVM_SET_SREGS2             _IOW(KVMIO,  0xcd, struct kvm_sregs2)
13856dba9403SMaxim Levitsky 
13863c9bd400SJay Zhou #define KVM_DIRTY_LOG_MANUAL_PROTECT_ENABLE    (1 << 0)
13873c9bd400SJay Zhou #define KVM_DIRTY_LOG_INITIALLY_SET            (1 << 1)
13883c9bd400SJay Zhou 
1389fb04a1edSPeter Xu /*
1390fb04a1edSPeter Xu  * Arch needs to define the macro after implementing the dirty ring
1391fb04a1edSPeter Xu  * feature.  KVM_DIRTY_LOG_PAGE_OFFSET should be defined as the
1392fb04a1edSPeter Xu  * starting page offset of the dirty ring structures.
1393fb04a1edSPeter Xu  */
1394fb04a1edSPeter Xu #ifndef KVM_DIRTY_LOG_PAGE_OFFSET
1395fb04a1edSPeter Xu #define KVM_DIRTY_LOG_PAGE_OFFSET 0
1396fb04a1edSPeter Xu #endif
1397fb04a1edSPeter Xu 
1398fb04a1edSPeter Xu /*
1399fb04a1edSPeter Xu  * KVM dirty GFN flags, defined as:
1400fb04a1edSPeter Xu  *
1401fb04a1edSPeter Xu  * |---------------+---------------+--------------|
1402fb04a1edSPeter Xu  * | bit 1 (reset) | bit 0 (dirty) | Status       |
1403fb04a1edSPeter Xu  * |---------------+---------------+--------------|
1404fb04a1edSPeter Xu  * |             0 |             0 | Invalid GFN  |
1405fb04a1edSPeter Xu  * |             0 |             1 | Dirty GFN    |
1406fb04a1edSPeter Xu  * |             1 |             X | GFN to reset |
1407fb04a1edSPeter Xu  * |---------------+---------------+--------------|
1408fb04a1edSPeter Xu  *
1409fb04a1edSPeter Xu  * Lifecycle of a dirty GFN goes like:
1410fb04a1edSPeter Xu  *
1411fb04a1edSPeter Xu  *      dirtied         harvested        reset
1412fb04a1edSPeter Xu  * 00 -----------> 01 -------------> 1X -------+
1413fb04a1edSPeter Xu  *  ^                                          |
1414fb04a1edSPeter Xu  *  |                                          |
1415fb04a1edSPeter Xu  *  +------------------------------------------+
1416fb04a1edSPeter Xu  *
1417fb04a1edSPeter Xu  * The userspace program is only responsible for the 01->1X state
1418fb04a1edSPeter Xu  * conversion after harvesting an entry.  Also, it must not skip any
1419fb04a1edSPeter Xu  * dirty bits, so that dirty bits are always harvested in sequence.
1420fb04a1edSPeter Xu  */
1421fb1070d1SJoe Richey #define KVM_DIRTY_GFN_F_DIRTY           _BITUL(0)
1422fb1070d1SJoe Richey #define KVM_DIRTY_GFN_F_RESET           _BITUL(1)
1423fb04a1edSPeter Xu #define KVM_DIRTY_GFN_F_MASK            0x3
1424fb04a1edSPeter Xu 
1425fb04a1edSPeter Xu /*
1426fb04a1edSPeter Xu  * KVM dirty rings should be mapped at KVM_DIRTY_LOG_PAGE_OFFSET of
1427fb04a1edSPeter Xu  * per-vcpu mmaped regions as an array of struct kvm_dirty_gfn.  The
1428fb04a1edSPeter Xu  * size of the gfn buffer is decided by the first argument when
1429fb04a1edSPeter Xu  * enabling KVM_CAP_DIRTY_LOG_RING.
1430fb04a1edSPeter Xu  */
1431fb04a1edSPeter Xu struct kvm_dirty_gfn {
1432fb04a1edSPeter Xu 	__u32 flags;
1433fb04a1edSPeter Xu 	__u32 slot;
1434fb04a1edSPeter Xu 	__u64 offset;
1435fb04a1edSPeter Xu };
1436fb04a1edSPeter Xu 
1437fe6b6bc8SChenyi Qiang #define KVM_BUS_LOCK_DETECTION_OFF             (1 << 0)
1438fe6b6bc8SChenyi Qiang #define KVM_BUS_LOCK_DETECTION_EXIT            (1 << 1)
1439fe6b6bc8SChenyi Qiang 
1440ba7bb663SDavid Dunn #define KVM_PMU_CAP_DISABLE                    (1 << 0)
1441ba7bb663SDavid Dunn 
1442cb082bfaSJing Zhang /**
1443cb082bfaSJing Zhang  * struct kvm_stats_header - Header of per vm/vcpu binary statistics data.
1444cb082bfaSJing Zhang  * @flags: Some extra information for header, always 0 for now.
1445cb082bfaSJing Zhang  * @name_size: The size in bytes of the memory which contains statistics
1446cb082bfaSJing Zhang  *             name string including trailing '\0'. The memory is allocated
1447cb082bfaSJing Zhang  *             at the send of statistics descriptor.
1448cb082bfaSJing Zhang  * @num_desc: The number of statistics the vm or vcpu has.
1449cb082bfaSJing Zhang  * @id_offset: The offset of the vm/vcpu stats' id string in the file pointed
1450cb082bfaSJing Zhang  *             by vm/vcpu stats fd.
1451cb082bfaSJing Zhang  * @desc_offset: The offset of the vm/vcpu stats' descriptor block in the file
1452cb082bfaSJing Zhang  *               pointd by vm/vcpu stats fd.
1453cb082bfaSJing Zhang  * @data_offset: The offset of the vm/vcpu stats' data block in the file
1454cb082bfaSJing Zhang  *               pointed by vm/vcpu stats fd.
1455cb082bfaSJing Zhang  *
1456cb082bfaSJing Zhang  * This is the header userspace needs to read from stats fd before any other
1457cb082bfaSJing Zhang  * readings. It is used by userspace to discover all the information about the
1458cb082bfaSJing Zhang  * vm/vcpu's binary statistics.
1459cb082bfaSJing Zhang  * Userspace reads this header from the start of the vm/vcpu's stats fd.
1460cb082bfaSJing Zhang  */
1461cb082bfaSJing Zhang struct kvm_stats_header {
1462cb082bfaSJing Zhang 	__u32 flags;
1463cb082bfaSJing Zhang 	__u32 name_size;
1464cb082bfaSJing Zhang 	__u32 num_desc;
1465cb082bfaSJing Zhang 	__u32 id_offset;
1466cb082bfaSJing Zhang 	__u32 desc_offset;
1467cb082bfaSJing Zhang 	__u32 data_offset;
1468cb082bfaSJing Zhang };
1469cb082bfaSJing Zhang 
1470cb082bfaSJing Zhang #define KVM_STATS_TYPE_SHIFT		0
1471cb082bfaSJing Zhang #define KVM_STATS_TYPE_MASK		(0xF << KVM_STATS_TYPE_SHIFT)
1472cb082bfaSJing Zhang #define KVM_STATS_TYPE_CUMULATIVE	(0x0 << KVM_STATS_TYPE_SHIFT)
1473cb082bfaSJing Zhang #define KVM_STATS_TYPE_INSTANT		(0x1 << KVM_STATS_TYPE_SHIFT)
1474cb082bfaSJing Zhang #define KVM_STATS_TYPE_PEAK		(0x2 << KVM_STATS_TYPE_SHIFT)
1475f95937ccSJing Zhang #define KVM_STATS_TYPE_LINEAR_HIST	(0x3 << KVM_STATS_TYPE_SHIFT)
1476f95937ccSJing Zhang #define KVM_STATS_TYPE_LOG_HIST		(0x4 << KVM_STATS_TYPE_SHIFT)
1477f95937ccSJing Zhang #define KVM_STATS_TYPE_MAX		KVM_STATS_TYPE_LOG_HIST
1478cb082bfaSJing Zhang 
1479cb082bfaSJing Zhang #define KVM_STATS_UNIT_SHIFT		4
1480cb082bfaSJing Zhang #define KVM_STATS_UNIT_MASK		(0xF << KVM_STATS_UNIT_SHIFT)
1481cb082bfaSJing Zhang #define KVM_STATS_UNIT_NONE		(0x0 << KVM_STATS_UNIT_SHIFT)
1482cb082bfaSJing Zhang #define KVM_STATS_UNIT_BYTES		(0x1 << KVM_STATS_UNIT_SHIFT)
1483cb082bfaSJing Zhang #define KVM_STATS_UNIT_SECONDS		(0x2 << KVM_STATS_UNIT_SHIFT)
1484cb082bfaSJing Zhang #define KVM_STATS_UNIT_CYCLES		(0x3 << KVM_STATS_UNIT_SHIFT)
14851b870fa5SPaolo Bonzini #define KVM_STATS_UNIT_BOOLEAN		(0x4 << KVM_STATS_UNIT_SHIFT)
1486450a5639SOliver Upton #define KVM_STATS_UNIT_MAX		KVM_STATS_UNIT_BOOLEAN
1487cb082bfaSJing Zhang 
1488cb082bfaSJing Zhang #define KVM_STATS_BASE_SHIFT		8
1489cb082bfaSJing Zhang #define KVM_STATS_BASE_MASK		(0xF << KVM_STATS_BASE_SHIFT)
1490cb082bfaSJing Zhang #define KVM_STATS_BASE_POW10		(0x0 << KVM_STATS_BASE_SHIFT)
1491cb082bfaSJing Zhang #define KVM_STATS_BASE_POW2		(0x1 << KVM_STATS_BASE_SHIFT)
1492cb082bfaSJing Zhang #define KVM_STATS_BASE_MAX		KVM_STATS_BASE_POW2
1493cb082bfaSJing Zhang 
1494cb082bfaSJing Zhang /**
1495cb082bfaSJing Zhang  * struct kvm_stats_desc - Descriptor of a KVM statistics.
1496cb082bfaSJing Zhang  * @flags: Annotations of the stats, like type, unit, etc.
1497cb082bfaSJing Zhang  * @exponent: Used together with @flags to determine the unit.
1498cb082bfaSJing Zhang  * @size: The number of data items for this stats.
1499cb082bfaSJing Zhang  *        Every data item is of type __u64.
1500cb082bfaSJing Zhang  * @offset: The offset of the stats to the start of stat structure in
1501f95937ccSJing Zhang  *          structure kvm or kvm_vcpu.
1502f95937ccSJing Zhang  * @bucket_size: A parameter value used for histogram stats. It is only used
1503f95937ccSJing Zhang  *		for linear histogram stats, specifying the size of the bucket;
1504cb082bfaSJing Zhang  * @name: The name string for the stats. Its size is indicated by the
1505cb082bfaSJing Zhang  *        &kvm_stats_header->name_size.
1506cb082bfaSJing Zhang  */
1507cb082bfaSJing Zhang struct kvm_stats_desc {
1508cb082bfaSJing Zhang 	__u32 flags;
1509cb082bfaSJing Zhang 	__s16 exponent;
1510cb082bfaSJing Zhang 	__u16 size;
1511cb082bfaSJing Zhang 	__u32 offset;
1512f95937ccSJing Zhang 	__u32 bucket_size;
1513cb082bfaSJing Zhang 	char name[];
1514cb082bfaSJing Zhang };
1515cb082bfaSJing Zhang 
1516cb082bfaSJing Zhang #define KVM_GET_STATS_FD  _IO(KVMIO,  0xce)
1517cb082bfaSJing Zhang 
1518f6c6804cSJanosch Frank /* Available with KVM_CAP_XSAVE2 */
1519f6c6804cSJanosch Frank #define KVM_GET_XSAVE2		  _IOR(KVMIO,  0xcf, struct kvm_xsave)
1520f6c6804cSJanosch Frank 
15218aba0958SJanosch Frank /* Available with KVM_CAP_S390_PROTECTED_DUMP */
15228aba0958SJanosch Frank #define KVM_S390_PV_CPU_COMMAND	_IOWR(KVMIO, 0xd0, struct kvm_pv_cmd)
15238aba0958SJanosch Frank 
15242f4073e0STao Xu /* Available with KVM_CAP_X86_NOTIFY_VMEXIT */
15252f4073e0STao Xu #define KVM_X86_NOTIFY_VMEXIT_ENABLED		(1ULL << 0)
15262f4073e0STao Xu #define KVM_X86_NOTIFY_VMEXIT_USER		(1ULL << 1)
15272f4073e0STao Xu 
1528db1c875eSMatthew Rosato /* Available with KVM_CAP_S390_ZPCI_OP */
1529db1c875eSMatthew Rosato #define KVM_S390_ZPCI_OP         _IOW(KVMIO,  0xd1, struct kvm_s390_zpci_op)
1530db1c875eSMatthew Rosato 
15315a475554SChao Peng /* Available with KVM_CAP_MEMORY_ATTRIBUTES */
15325a475554SChao Peng #define KVM_SET_MEMORY_ATTRIBUTES              _IOW(KVMIO,  0xd2, struct kvm_memory_attributes)
15335a475554SChao Peng 
15345a475554SChao Peng struct kvm_memory_attributes {
15355a475554SChao Peng 	__u64 address;
15365a475554SChao Peng 	__u64 size;
15375a475554SChao Peng 	__u64 attributes;
15385a475554SChao Peng 	__u64 flags;
15395a475554SChao Peng };
15405a475554SChao Peng 
15415a475554SChao Peng #define KVM_MEMORY_ATTRIBUTE_PRIVATE           (1ULL << 3)
15425a475554SChao Peng 
1543a7800aa8SSean Christopherson #define KVM_CREATE_GUEST_MEMFD	_IOWR(KVMIO,  0xd4, struct kvm_create_guest_memfd)
1544a7800aa8SSean Christopherson 
1545a7800aa8SSean Christopherson struct kvm_create_guest_memfd {
1546a7800aa8SSean Christopherson 	__u64 size;
1547a7800aa8SSean Christopherson 	__u64 flags;
1548a7800aa8SSean Christopherson 	__u64 reserved[6];
1549a7800aa8SSean Christopherson };
1550a7800aa8SSean Christopherson 
1551607ca46eSDavid Howells #endif /* __LINUX_KVM_H */
1552