summaryrefslogtreecommitdiff
path: root/include/arch/x86_64/linux/kvm.h
blob: 09d169acd57aaaa308dd8351d803325d42865f39 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
#ifndef __LINUX_KVM_H
#define __LINUX_KVM_H

/*
 * Userspace interface for /dev/kvm - kernel based virtual machine
 *
 * Note: you must update KVM_API_VERSION if you change this interface.
 */

#include <linux/const.h>
#include <linux/types.h>

#include <linux/ioctl.h>
#include <asm/kvm.h>

#define KVM_API_VERSION 12

/*
 * Backwards-compatible definitions.
 */
#define __KVM_HAVE_GUEST_DEBUG

/* for KVM_SET_USER_MEMORY_REGION */
struct kvm_userspace_memory_region {
	__u32 slot;
	__u32 flags;
	__u64 guest_phys_addr;
	__u64 memory_size;    /* bytes */
	__u64 userspace_addr; /* start of the userspace allocated memory */
};

/* for KVM_SET_USER_MEMORY_REGION2 */
struct kvm_userspace_memory_region2 {
	__u32 slot;
	__u32 flags;
	__u64 guest_phys_addr;
	__u64 memory_size;
	__u64 userspace_addr;
	__u64 guest_memfd_offset;
	__u32 guest_memfd;
	__u32 pad1;
	__u64 pad2[14];
};

/*
 * The bit 0 ~ bit 15 of kvm_userspace_memory_region::flags are visible for
 * userspace, other bits are reserved for kvm internal use which are defined
 * in include/linux/kvm_host.h.
 */
#define KVM_MEM_LOG_DIRTY_PAGES (1UL << 0)
#define KVM_MEM_READONLY	(1UL << 1)
#define KVM_MEM_GUEST_MEMFD	(1UL << 2)

/* for KVM_IRQ_LINE */
struct kvm_irq_level {
	/*
	 * ACPI gsi notion of irq.
	 * For IA-64 (APIC model) IOAPIC0: irq 0-23; IOAPIC1: irq 24-47..
	 * For X86 (standard AT mode) PIC0/1: irq 0-15. IOAPIC0: 0-23..
	 * For ARM: See Documentation/virt/kvm/api.rst
	 */
	union {
		__u32 irq;
		__s32 status;
	};
	__u32 level;
};

struct kvm_irqchip {
	__u32 chip_id;
	__u32 pad;
	union {
		char dummy[512]; /* reserving space */
#ifdef __KVM_HAVE_PIT
		struct kvm_pic_state pic;
#endif
#ifdef __KVM_HAVE_IOAPIC
		struct kvm_ioapic_state ioapic;
#endif
	} chip;
};

/* for KVM_CREATE_PIT2 */
struct kvm_pit_config {
	__u32 flags;
	__u32 pad[15];
};

#define KVM_PIT_SPEAKER_DUMMY 1

struct kvm_hyperv_exit {
#define KVM_EXIT_HYPERV_SYNIC  1
#define KVM_EXIT_HYPERV_HCALL  2
#define KVM_EXIT_HYPERV_SYNDBG 3
	__u32 type;
	__u32 pad1;
	union {
		struct {
			__u32 msr;
			__u32 pad2;
			__u64 control;
			__u64 evt_page;
			__u64 msg_page;
		} synic;
		struct {
			__u64 input;
			__u64 result;
			__u64 params[2];
		} hcall;
		struct {
			__u32 msr;
			__u32 pad2;
			__u64 control;
			__u64 status;
			__u64 send_page;
			__u64 recv_page;
			__u64 pending_page;
		} syndbg;
	} u;
};

struct kvm_xen_exit {
#define KVM_EXIT_XEN_HCALL 1
	__u32 type;
	union {
		struct {
			__u32 longmode;
			__u32 cpl;
			__u64 input;
			__u64 result;
			__u64 params[6];
		} hcall;
	} u;
};

#define KVM_S390_GET_SKEYS_NONE 1
#define KVM_S390_SKEYS_MAX	1048576

#define KVM_EXIT_UNKNOWN	 0
#define KVM_EXIT_EXCEPTION	 1
#define KVM_EXIT_IO		 2
#define KVM_EXIT_HYPERCALL	 3
#define KVM_EXIT_DEBUG		 4
#define KVM_EXIT_HLT		 5
#define KVM_EXIT_MMIO		 6
#define KVM_EXIT_IRQ_WINDOW_OPEN 7
#define KVM_EXIT_SHUTDOWN	 8
#define KVM_EXIT_FAIL_ENTRY	 9
#define KVM_EXIT_INTR		 10
#define KVM_EXIT_SET_TPR	 11
#define KVM_EXIT_TPR_ACCESS	 12
#define KVM_EXIT_S390_SIEIC	 13
#define KVM_EXIT_S390_RESET	 14
#define KVM_EXIT_DCR		 15 /* deprecated */
#define KVM_EXIT_NMI		 16
#define KVM_EXIT_INTERNAL_ERROR	 17
#define KVM_EXIT_OSI		 18
#define KVM_EXIT_PAPR_HCALL	 19
#define KVM_EXIT_S390_UCONTROL	 20
#define KVM_EXIT_WATCHDOG	 21
#define KVM_EXIT_S390_TSCH	 22
#define KVM_EXIT_EPR		 23
#define KVM_EXIT_SYSTEM_EVENT	 24
#define KVM_EXIT_S390_STSI	 25
#define KVM_EXIT_IOAPIC_EOI	 26
#define KVM_EXIT_HYPERV		 27
#define KVM_EXIT_ARM_NISV	 28
#define KVM_EXIT_X86_RDMSR	 29
#define KVM_EXIT_X86_WRMSR	 30
#define KVM_EXIT_DIRTY_RING_FULL 31
#define KVM_EXIT_AP_RESET_HOLD	 32
#define KVM_EXIT_X86_BUS_LOCK	 33
#define KVM_EXIT_XEN		 34
#define KVM_EXIT_RISCV_SBI	 35
#define KVM_EXIT_RISCV_CSR	 36
#define KVM_EXIT_NOTIFY		 37
#define KVM_EXIT_LOONGARCH_IOCSR 38
#define KVM_EXIT_MEMORY_FAULT	 39
#define KVM_EXIT_TDX		 40

/* For KVM_EXIT_INTERNAL_ERROR */
/* Emulate instruction failed. */
#define KVM_INTERNAL_ERROR_EMULATION 1
/* Encounter unexpected simultaneous exceptions. */
#define KVM_INTERNAL_ERROR_SIMUL_EX 2
/* Encounter unexpected vm-exit due to delivery event. */
#define KVM_INTERNAL_ERROR_DELIVERY_EV 3
/* Encounter unexpected vm-exit reason */
#define KVM_INTERNAL_ERROR_UNEXPECTED_EXIT_REASON 4

/* Flags that describe what fields in emulation_failure hold valid data. */
#define KVM_INTERNAL_ERROR_EMULATION_FLAG_INSTRUCTION_BYTES (1ULL << 0)

/*
 * struct kvm_run can be modified by userspace at any time, so KVM must be
 * careful to avoid TOCTOU bugs. In order to protect KVM, HINT_UNSAFE_IN_KVM()
 * renames fields in struct kvm_run from <symbol> to <symbol>__unsafe when
 * compiled into the kernel, ensuring that any use within KVM is obvious and
 * gets extra scrutiny.
 */
#define HINT_UNSAFE_IN_KVM(_symbol) _symbol

/* for KVM_RUN, returned by mmap(vcpu_fd, offset=0) */
struct kvm_run {
	/* in */
	__u8 request_interrupt_window;
	__u8 HINT_UNSAFE_IN_KVM(immediate_exit);
	__u8 padding1[6];

	/* out */
	__u32 exit_reason;
	__u8 ready_for_interrupt_injection;
	__u8 if_flag;
	__u16 flags;

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

#ifdef __KVM_S390
	/* the processor status word for s390 */
	__u64 psw_mask; /* psw upper half */
	__u64 psw_addr; /* psw lower half */
#endif
	union {
		/* KVM_EXIT_UNKNOWN */
		struct {
			__u64 hardware_exit_reason;
		} hw;
		/* KVM_EXIT_FAIL_ENTRY */
		struct {
			__u64 hardware_entry_failure_reason;
			__u32 cpu;
		} fail_entry;
		/* KVM_EXIT_EXCEPTION */
		struct {
			__u32 exception;
			__u32 error_code;
		} ex;
		/* KVM_EXIT_IO */
		struct {
#define KVM_EXIT_IO_IN	0
#define KVM_EXIT_IO_OUT 1
			__u8 direction;
			__u8 size; /* bytes */
			__u16 port;
			__u32 count;
			__u64 data_offset; /* relative to kvm_run start */
		} io;
		/* KVM_EXIT_DEBUG */
		struct {
			struct kvm_debug_exit_arch arch;
		} debug;
		/* KVM_EXIT_MMIO */
		struct {
			__u64 phys_addr;
			__u8 data[8];
			__u32 len;
			__u8 is_write;
		} mmio;
		/* KVM_EXIT_LOONGARCH_IOCSR */
		struct {
			__u64 phys_addr;
			__u8 data[8];
			__u32 len;
			__u8 is_write;
		} iocsr_io;
		/* KVM_EXIT_HYPERCALL */
		struct {
			__u64 nr;
			__u64 args[6];
			__u64 ret;

			union {
				__u32 longmode;
				__u64 flags;
			};
		} hypercall;
		/* KVM_EXIT_TPR_ACCESS */
		struct {
			__u64 rip;
			__u32 is_write;
			__u32 pad;
		} tpr_access;
		/* KVM_EXIT_S390_SIEIC */
		struct {
			__u8 icptcode;
			__u16 ipa;
			__u32 ipb;
		} s390_sieic;
		/* KVM_EXIT_S390_RESET */
		__u64 s390_reset_flags;
		/* KVM_EXIT_S390_UCONTROL */
		struct {
			__u64 trans_exc_code;
			__u32 pgm_code;
		} s390_ucontrol;
		/* KVM_EXIT_DCR (deprecated) */
		struct {
			__u32 dcrn;
			__u32 data;
			__u8 is_write;
		} dcr;
		/* KVM_EXIT_INTERNAL_ERROR */
		struct {
			__u32 suberror;
			/* Available with KVM_CAP_INTERNAL_ERROR_DATA: */
			__u32 ndata;
			__u64 data[16];
		} internal;
		/*
		 * KVM_INTERNAL_ERROR_EMULATION
		 *
		 * "struct emulation_failure" is an overlay of "struct internal"
		 * that is used for the KVM_INTERNAL_ERROR_EMULATION sub-type of
		 * KVM_EXIT_INTERNAL_ERROR.  Note, unlike other internal error
		 * sub-types, this struct is ABI!  It also needs to be backwards
		 * compatible with "struct internal".  Take special care that
		 * "ndata" is correct, that new fields are enumerated in
		 * "flags", and that each flag enumerates fields that are 64-bit
		 * aligned and sized (so that ndata+internal.data[] is
		 * valid/accurate).
		 *
		 * Space beyond the defined fields may be used to store
		 * arbitrary debug information relating to the emulation
		 * failure. It is accounted for in "ndata" but the format is
		 * unspecified and is not represented in "flags". Any such
		 * information is *not* ABI!
		 */
		struct {
			__u32 suberror;
			__u32 ndata;
			__u64 flags;
			union {
				struct {
					__u8 insn_size;
					__u8 insn_bytes[15];
				};
			};
			/* Arbitrary debug data may follow. */
		} emulation_failure;
		/* KVM_EXIT_OSI */
		struct {
			__u64 gprs[32];
		} osi;
		/* KVM_EXIT_PAPR_HCALL */
		struct {
			__u64 nr;
			__u64 ret;
			__u64 args[9];
		} papr_hcall;
		/* KVM_EXIT_S390_TSCH */
		struct {
			__u16 subchannel_id;
			__u16 subchannel_nr;
			__u32 io_int_parm;
			__u32 io_int_word;
			__u32 ipb;
			__u8 dequeued;
		} s390_tsch;
		/* KVM_EXIT_EPR */
		struct {
			__u32 epr;
		} epr;
		/* KVM_EXIT_SYSTEM_EVENT */
		struct {
#define KVM_SYSTEM_EVENT_SHUTDOWN  1
#define KVM_SYSTEM_EVENT_RESET	   2
#define KVM_SYSTEM_EVENT_CRASH	   3
#define KVM_SYSTEM_EVENT_WAKEUP	   4
#define KVM_SYSTEM_EVENT_SUSPEND   5
#define KVM_SYSTEM_EVENT_SEV_TERM  6
#define KVM_SYSTEM_EVENT_TDX_FATAL 7
			__u32 type;
			__u32 ndata;
			union {
				__u64 flags;
				__u64 data[16];
			};
		} system_event;
		/* KVM_EXIT_S390_STSI */
		struct {
			__u64 addr;
			__u8 ar;
			__u8 reserved;
			__u8 fc;
			__u8 sel1;
			__u16 sel2;
		} s390_stsi;
		/* KVM_EXIT_IOAPIC_EOI */
		struct {
			__u8 vector;
		} eoi;
		/* KVM_EXIT_HYPERV */
		struct kvm_hyperv_exit hyperv;
		/* KVM_EXIT_ARM_NISV */
		struct {
			__u64 esr_iss;
			__u64 fault_ipa;
		} arm_nisv;
		/* KVM_EXIT_X86_RDMSR / KVM_EXIT_X86_WRMSR */
		struct {
			__u8 error; /* user -> kernel */
			__u8 pad[7];
#define KVM_MSR_EXIT_REASON_INVAL   (1 << 0)
#define KVM_MSR_EXIT_REASON_UNKNOWN (1 << 1)
#define KVM_MSR_EXIT_REASON_FILTER  (1 << 2)
#define KVM_MSR_EXIT_REASON_VALID_MASK \
	(KVM_MSR_EXIT_REASON_INVAL | KVM_MSR_EXIT_REASON_UNKNOWN | KVM_MSR_EXIT_REASON_FILTER)
			__u32 reason; /* kernel -> user */
			__u32 index;  /* kernel -> user */
			__u64 data;   /* kernel <-> user */
		} msr;
		/* KVM_EXIT_XEN */
		struct kvm_xen_exit xen;
		/* KVM_EXIT_RISCV_SBI */
		struct {
			unsigned long extension_id;
			unsigned long function_id;
			unsigned long args[6];
			unsigned long ret[2];
		} riscv_sbi;
		/* KVM_EXIT_RISCV_CSR */
		struct {
			unsigned long csr_num;
			unsigned long new_value;
			unsigned long write_mask;
			unsigned long ret_value;
		} riscv_csr;
		/* KVM_EXIT_NOTIFY */
		struct {
#define KVM_NOTIFY_CONTEXT_INVALID (1 << 0)
			__u32 flags;
		} notify;
		/* KVM_EXIT_MEMORY_FAULT */
		struct {
#define KVM_MEMORY_EXIT_FLAG_PRIVATE (1ULL << 3)
			__u64 flags;
			__u64 gpa;
			__u64 size;
		} memory_fault;
		/* KVM_EXIT_TDX */
		struct {
			__u64 flags;
			__u64 nr;
			union {
				struct {
					__u64 ret;
					__u64 data[5];
				} unknown;
				struct {
					__u64 ret;
					__u64 gpa;
					__u64 size;
				} get_quote;
				struct {
					__u64 ret;
					__u64 leaf;
					__u64 r11, r12, r13, r14;
				} get_tdvmcall_info;
				struct {
					__u64 ret;
					__u64 vector;
				} setup_event_notify;
			};
		} tdx;
		/* Fix the size of the union. */
		char padding[256];
	};

/* 2048 is the size of the char array used to bound/pad the size
 * of the union that holds sync regs.
 */
#define SYNC_REGS_SIZE_BYTES 2048
	/*
	 * shared registers between kvm and userspace.
	 * kvm_valid_regs specifies the register classes set by the host
	 * kvm_dirty_regs specified the register classes dirtied by userspace
	 * struct kvm_sync_regs is architecture specific, as well as the
	 * bits for kvm_valid_regs and kvm_dirty_regs
	 */
	__u64 kvm_valid_regs;
	__u64 kvm_dirty_regs;
	union {
		struct kvm_sync_regs regs;
		char padding[SYNC_REGS_SIZE_BYTES];
	} s;
};

/* for KVM_REGISTER_COALESCED_MMIO / KVM_UNREGISTER_COALESCED_MMIO */

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

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

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

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

/* for KVM_TRANSLATE */
struct kvm_translation {
	/* in */
	__u64 linear_address;

	/* out */
	__u64 physical_address;
	__u8 valid;
	__u8 writeable;
	__u8 usermode;
	__u8 pad[5];
};

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

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

/* for KVM_CLEAR_DIRTY_LOG */
struct kvm_clear_dirty_log {
	__u32 slot;
	__u32 num_pages;
	__u64 first_page;
	union {
		void *dirty_bitmap; /* one bit per page */
		__u64 padding2;
	};
};

/* for KVM_SET_SIGNAL_MASK */
struct kvm_signal_mask {
	__u32 len;
	__u8 sigset[];
};

/* for KVM_TPR_ACCESS_REPORTING */
struct kvm_tpr_access_ctl {
	__u32 enabled;
	__u32 flags;
	__u32 reserved[8];
};

/* for KVM_SET_VAPIC_ADDR */
struct kvm_vapic_addr {
	__u64 vapic_addr;
};

/* for KVM_SET_MP_STATE */

/* not all states are valid on all architectures */
#define KVM_MP_STATE_RUNNABLE	   0
#define KVM_MP_STATE_UNINITIALIZED 1
#define KVM_MP_STATE_INIT_RECEIVED 2
#define KVM_MP_STATE_HALTED	   3
#define KVM_MP_STATE_SIPI_RECEIVED 4
#define KVM_MP_STATE_STOPPED	   5
#define KVM_MP_STATE_CHECK_STOP	   6
#define KVM_MP_STATE_OPERATING	   7
#define KVM_MP_STATE_LOAD	   8
#define KVM_MP_STATE_AP_RESET_HOLD 9
#define KVM_MP_STATE_SUSPENDED	   10

struct kvm_mp_state {
	__u32 mp_state;
};

/* for KVM_SET_GUEST_DEBUG */

#define KVM_GUESTDBG_ENABLE	0x00000001
#define KVM_GUESTDBG_SINGLESTEP 0x00000002

struct kvm_guest_debug {
	__u32 control;
	__u32 pad;
	struct kvm_guest_debug_arch arch;
};

enum {
	kvm_ioeventfd_flag_nr_datamatch,
	kvm_ioeventfd_flag_nr_pio,
	kvm_ioeventfd_flag_nr_deassign,
	kvm_ioeventfd_flag_nr_virtio_ccw_notify,
	kvm_ioeventfd_flag_nr_fast_mmio,
	kvm_ioeventfd_flag_nr_max,
};

#define KVM_IOEVENTFD_FLAG_DATAMATCH	     (1 << kvm_ioeventfd_flag_nr_datamatch)
#define KVM_IOEVENTFD_FLAG_PIO		     (1 << kvm_ioeventfd_flag_nr_pio)
#define KVM_IOEVENTFD_FLAG_DEASSIGN	     (1 << kvm_ioeventfd_flag_nr_deassign)
#define KVM_IOEVENTFD_FLAG_VIRTIO_CCW_NOTIFY (1 << kvm_ioeventfd_flag_nr_virtio_ccw_notify)

#define KVM_IOEVENTFD_VALID_FLAG_MASK ((1 << kvm_ioeventfd_flag_nr_max) - 1)

struct kvm_ioeventfd {
	__u64 datamatch;
	__u64 addr; /* legal pio/mmio address */
	__u32 len;  /* 1, 2, 4, or 8 bytes; or 0 to ignore length */
	__s32 fd;
	__u32 flags;
	__u8 pad[36];
};

#define KVM_X86_DISABLE_EXITS_MWAIT	 (1 << 0)
#define KVM_X86_DISABLE_EXITS_HLT	 (1 << 1)
#define KVM_X86_DISABLE_EXITS_PAUSE	 (1 << 2)
#define KVM_X86_DISABLE_EXITS_CSTATE	 (1 << 3)
#define KVM_X86_DISABLE_EXITS_APERFMPERF (1 << 4)

/* for KVM_ENABLE_CAP */
struct kvm_enable_cap {
	/* in */
	__u32 cap;
	__u32 flags;
	__u64 args[4];
	__u8 pad[64];
};

#define KVMIO 0xAE

/* machine type bits, to be used as argument to KVM_CREATE_VM */
#define KVM_VM_S390_UCONTROL 1

/* on ppc, 0 indicate default, 1 should force HV and 2 PR */
#define KVM_VM_PPC_HV 1
#define KVM_VM_PPC_PR 2

/* on MIPS, 0 indicates auto, 1 forces VZ ASE, 2 forces trap & emulate */
#define KVM_VM_MIPS_AUTO 0
#define KVM_VM_MIPS_VZ	 1
#define KVM_VM_MIPS_TE	 2

#define KVM_S390_SIE_PAGE_OFFSET 1

/*
 * On arm64, machine type can be used to request the physical
 * address size for the VM. Bits[7-0] are reserved for the guest
 * PA size shift (i.e, log2(PA_Size)). For backward compatibility,
 * value 0 implies the default IPA size, 40bits.
 */
#define KVM_VM_TYPE_ARM_IPA_SIZE_MASK 0xffULL
#define KVM_VM_TYPE_ARM_IPA_SIZE(x)   ((x) & KVM_VM_TYPE_ARM_IPA_SIZE_MASK)
/*
 * ioctls for /dev/kvm fds:
 */
#define KVM_GET_API_VERSION    _IO(KVMIO, 0x00)
#define KVM_CREATE_VM	       _IO(KVMIO, 0x01) /* returns a VM fd */
#define KVM_GET_MSR_INDEX_LIST _IOWR(KVMIO, 0x02, struct kvm_msr_list)

#define KVM_S390_ENABLE_SIE _IO(KVMIO, 0x06)
/*
 * Check if a kvm extension is available.  Argument is extension number,
 * return is 1 (yes) or 0 (no, sorry).
 */
#define KVM_CHECK_EXTENSION _IO(KVMIO, 0x03)
/*
 * Get size for mmap(vcpu_fd)
 */
#define KVM_GET_VCPU_MMAP_SIZE	       _IO(KVMIO, 0x04) /* in bytes */
#define KVM_GET_SUPPORTED_CPUID	       _IOWR(KVMIO, 0x05, struct kvm_cpuid2)
#define KVM_GET_EMULATED_CPUID	       _IOWR(KVMIO, 0x09, struct kvm_cpuid2)
#define KVM_GET_MSR_FEATURE_INDEX_LIST _IOWR(KVMIO, 0x0a, struct kvm_msr_list)

/*
 * Extension capability list.
 */
#define KVM_CAP_IRQCHIP			 0
#define KVM_CAP_HLT			 1
#define KVM_CAP_MMU_SHADOW_CACHE_CONTROL 2
#define KVM_CAP_USER_MEMORY		 3
#define KVM_CAP_SET_TSS_ADDR		 4
#define KVM_CAP_VAPIC			 6
#define KVM_CAP_EXT_CPUID		 7
#define KVM_CAP_CLOCKSOURCE		 8
#define KVM_CAP_NR_VCPUS		 9  /* returns recommended max vcpus per vm */
#define KVM_CAP_NR_MEMSLOTS		 10 /* returns max memory slots per vm */
#define KVM_CAP_PIT			 11
#define KVM_CAP_NOP_IO_DELAY		 12
#define KVM_CAP_PV_MMU			 13
#define KVM_CAP_MP_STATE		 14
#define KVM_CAP_COALESCED_MMIO		 15
#define KVM_CAP_SYNC_MMU		 16 /* Changes to host mmap are reflected in guest */
#define KVM_CAP_IOMMU			 18
/* Bug in KVM_SET_USER_MEMORY_REGION fixed: */
#define KVM_CAP_DESTROY_MEMORY_REGION_WORKS 21
#define KVM_CAP_USER_NMI		    22
#define KVM_CAP_SET_GUEST_DEBUG		    23
#ifdef __KVM_HAVE_PIT
#define KVM_CAP_REINJECT_CONTROL 24
#endif
#define KVM_CAP_IRQ_ROUTING	  25
#define KVM_CAP_IRQ_INJECT_STATUS 26
#define KVM_CAP_ASSIGN_DEV_IRQ	  29
/* Another bug in KVM_SET_USER_MEMORY_REGION fixed: */
#define KVM_CAP_JOIN_MEMORY_REGIONS_WORKS 30
#ifdef __KVM_HAVE_MCE
#define KVM_CAP_MCE 31
#endif
#define KVM_CAP_IRQFD 32
#ifdef __KVM_HAVE_PIT
#define KVM_CAP_PIT2 33
#endif
#define KVM_CAP_SET_BOOT_CPU_ID 34
#ifdef __KVM_HAVE_PIT_STATE2
#define KVM_CAP_PIT_STATE2 35
#endif
#define KVM_CAP_IOEVENTFD	      36
#define KVM_CAP_SET_IDENTITY_MAP_ADDR 37
#ifdef __KVM_HAVE_XEN_HVM
#define KVM_CAP_XEN_HVM 38
#endif
#define KVM_CAP_ADJUST_CLOCK	    39
#define KVM_CAP_INTERNAL_ERROR_DATA 40
#ifdef __KVM_HAVE_VCPU_EVENTS
#define KVM_CAP_VCPU_EVENTS 41
#endif
#define KVM_CAP_S390_PSW	   42
#define KVM_CAP_PPC_SEGSTATE	   43
#define KVM_CAP_HYPERV		   44
#define KVM_CAP_HYPERV_VAPIC	   45
#define KVM_CAP_HYPERV_SPIN	   46
#define KVM_CAP_PCI_SEGMENT	   47
#define KVM_CAP_PPC_PAIRED_SINGLES 48
#define KVM_CAP_INTR_SHADOW	   49
#ifdef __KVM_HAVE_DEBUGREGS
#define KVM_CAP_DEBUGREGS 50
#endif
#define KVM_CAP_X86_ROBUST_SINGLESTEP 51
#define KVM_CAP_PPC_OSI		      52
#define KVM_CAP_PPC_UNSET_IRQ	      53
#define KVM_CAP_ENABLE_CAP	      54
#ifdef __KVM_HAVE_XSAVE
#define KVM_CAP_XSAVE 55
#endif
#ifdef __KVM_HAVE_XCRS
#define KVM_CAP_XCRS 56
#endif
#define KVM_CAP_PPC_GET_PVINFO		       57
#define KVM_CAP_PPC_IRQ_LEVEL		       58
#define KVM_CAP_ASYNC_PF		       59
#define KVM_CAP_TSC_CONTROL		       60
#define KVM_CAP_GET_TSC_KHZ		       61
#define KVM_CAP_PPC_BOOKE_SREGS		       62
#define KVM_CAP_SPAPR_TCE		       63
#define KVM_CAP_PPC_SMT			       64
#define KVM_CAP_PPC_RMA			       65
#define KVM_CAP_MAX_VCPUS		       66 /* returns max vcpus per vm */
#define KVM_CAP_PPC_HIOR		       67
#define KVM_CAP_PPC_PAPR		       68
#define KVM_CAP_SW_TLB			       69
#define KVM_CAP_ONE_REG			       70
#define KVM_CAP_S390_GMAP		       71
#define KVM_CAP_TSC_DEADLINE_TIMER	       72
#define KVM_CAP_S390_UCONTROL		       73
#define KVM_CAP_SYNC_REGS		       74
#define KVM_CAP_PCI_2_3			       75
#define KVM_CAP_KVMCLOCK_CTRL		       76
#define KVM_CAP_SIGNAL_MSI		       77
#define KVM_CAP_PPC_GET_SMMU_INFO	       78
#define KVM_CAP_S390_COW		       79
#define KVM_CAP_PPC_ALLOC_HTAB		       80
#define KVM_CAP_READONLY_MEM		       81
#define KVM_CAP_IRQFD_RESAMPLE		       82
#define KVM_CAP_PPC_BOOKE_WATCHDOG	       83
#define KVM_CAP_PPC_HTAB_FD		       84
#define KVM_CAP_S390_CSS_SUPPORT	       85
#define KVM_CAP_PPC_EPR			       86
#define KVM_CAP_ARM_PSCI		       87
#define KVM_CAP_ARM_SET_DEVICE_ADDR	       88
#define KVM_CAP_DEVICE_CTRL		       89
#define KVM_CAP_IRQ_MPIC		       90
#define KVM_CAP_PPC_RTAS		       91
#define KVM_CAP_IRQ_XICS		       92
#define KVM_CAP_ARM_EL1_32BIT		       93
#define KVM_CAP_SPAPR_MULTITCE		       94
#define KVM_CAP_EXT_EMUL_CPUID		       95
#define KVM_CAP_HYPERV_TIME		       96
#define KVM_CAP_IOAPIC_POLARITY_IGNORED	       97
#define KVM_CAP_ENABLE_CAP_VM		       98
#define KVM_CAP_S390_IRQCHIP		       99
#define KVM_CAP_IOEVENTFD_NO_LENGTH	       100
#define KVM_CAP_VM_ATTRIBUTES		       101
#define KVM_CAP_ARM_PSCI_0_2		       102
#define KVM_CAP_PPC_FIXUP_HCALL		       103
#define KVM_CAP_PPC_ENABLE_HCALL	       104
#define KVM_CAP_CHECK_EXTENSION_VM	       105
#define KVM_CAP_S390_USER_SIGP		       106
#define KVM_CAP_S390_VECTOR_REGISTERS	       107
#define KVM_CAP_S390_MEM_OP		       108
#define KVM_CAP_S390_USER_STSI		       109
#define KVM_CAP_S390_SKEYS		       110
#define KVM_CAP_MIPS_FPU		       111
#define KVM_CAP_MIPS_MSA		       112
#define KVM_CAP_S390_INJECT_IRQ		       113
#define KVM_CAP_S390_IRQ_STATE		       114
#define KVM_CAP_PPC_HWRNG		       115
#define KVM_CAP_DISABLE_QUIRKS		       116
#define KVM_CAP_X86_SMM			       117
#define KVM_CAP_MULTI_ADDRESS_SPACE	       118
#define KVM_CAP_GUEST_DEBUG_HW_BPS	       119
#define KVM_CAP_GUEST_DEBUG_HW_WPS	       120
#define KVM_CAP_SPLIT_IRQCHIP		       121
#define KVM_CAP_IOEVENTFD_ANY_LENGTH	       122
#define KVM_CAP_HYPERV_SYNIC		       123
#define KVM_CAP_S390_RI			       124
#define KVM_CAP_SPAPR_TCE_64		       125
#define KVM_CAP_ARM_PMU_V3		       126
#define KVM_CAP_VCPU_ATTRIBUTES		       127
#define KVM_CAP_MAX_VCPU_ID		       128
#define KVM_CAP_X2APIC_API		       129
#define KVM_CAP_S390_USER_INSTR0	       130
#define KVM_CAP_MSI_DEVID		       131
#define KVM_CAP_PPC_HTM			       132
#define KVM_CAP_SPAPR_RESIZE_HPT	       133
#define KVM_CAP_PPC_MMU_RADIX		       134
#define KVM_CAP_PPC_MMU_HASH_V3		       135
#define KVM_CAP_IMMEDIATE_EXIT		       136
#define KVM_CAP_MIPS_VZ			       137
#define KVM_CAP_MIPS_TE			       138
#define KVM_CAP_MIPS_64BIT		       139
#define KVM_CAP_S390_GS			       140
#define KVM_CAP_S390_AIS		       141
#define KVM_CAP_SPAPR_TCE_VFIO		       142
#define KVM_CAP_X86_DISABLE_EXITS	       143
#define KVM_CAP_ARM_USER_IRQ		       144
#define KVM_CAP_S390_CMMA_MIGRATION	       145
#define KVM_CAP_PPC_FWNMI		       146
#define KVM_CAP_PPC_SMT_POSSIBLE	       147
#define KVM_CAP_HYPERV_SYNIC2		       148
#define KVM_CAP_HYPERV_VP_INDEX		       149
#define KVM_CAP_S390_AIS_MIGRATION	       150
#define KVM_CAP_PPC_GET_CPU_CHAR	       151
#define KVM_CAP_S390_BPB		       152
#define KVM_CAP_GET_MSR_FEATURES	       153
#define KVM_CAP_HYPERV_EVENTFD		       154
#define KVM_CAP_HYPERV_TLBFLUSH		       155
#define KVM_CAP_S390_HPAGE_1M		       156
#define KVM_CAP_NESTED_STATE		       157
#define KVM_CAP_ARM_INJECT_SERROR_ESR	       158
#define KVM_CAP_MSR_PLATFORM_INFO	       159
#define KVM_CAP_PPC_NESTED_HV		       160
#define KVM_CAP_HYPERV_SEND_IPI		       161
#define KVM_CAP_COALESCED_PIO		       162
#define KVM_CAP_HYPERV_ENLIGHTENED_VMCS	       163
#define KVM_CAP_EXCEPTION_PAYLOAD	       164
#define KVM_CAP_ARM_VM_IPA_SIZE		       165
#define KVM_CAP_MANUAL_DIRTY_LOG_PROTECT       166 /* Obsolete */
#define KVM_CAP_HYPERV_CPUID		       167
#define KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2      168
#define KVM_CAP_PPC_IRQ_XIVE		       169
#define KVM_CAP_ARM_SVE			       170
#define KVM_CAP_ARM_PTRAUTH_ADDRESS	       171
#define KVM_CAP_ARM_PTRAUTH_GENERIC	       172
#define KVM_CAP_PMU_EVENT_FILTER	       173
#define KVM_CAP_ARM_IRQ_LINE_LAYOUT_2	       174
#define KVM_CAP_HYPERV_DIRECT_TLBFLUSH	       175
#define KVM_CAP_PPC_GUEST_DEBUG_SSTEP	       176
#define KVM_CAP_ARM_NISV_TO_USER	       177
#define KVM_CAP_ARM_INJECT_EXT_DABT	       178
#define KVM_CAP_S390_VCPU_RESETS	       179
#define KVM_CAP_S390_PROTECTED		       180
#define KVM_CAP_PPC_SECURE_GUEST	       181
#define KVM_CAP_HALT_POLL		       182
#define KVM_CAP_ASYNC_PF_INT		       183
#define KVM_CAP_LAST_CPU		       184
#define KVM_CAP_SMALLER_MAXPHYADDR	       185
#define KVM_CAP_S390_DIAG318		       186
#define KVM_CAP_STEAL_TIME		       187
#define KVM_CAP_X86_USER_SPACE_MSR	       188
#define KVM_CAP_X86_MSR_FILTER		       189
#define KVM_CAP_ENFORCE_PV_FEATURE_CPUID       190
#define KVM_CAP_SYS_HYPERV_CPUID	       191
#define KVM_CAP_DIRTY_LOG_RING		       192
#define KVM_CAP_X86_BUS_LOCK_EXIT	       193
#define KVM_CAP_PPC_DAWR1		       194
#define KVM_CAP_SET_GUEST_DEBUG2	       195
#define KVM_CAP_SGX_ATTRIBUTE		       196
#define KVM_CAP_VM_COPY_ENC_CONTEXT_FROM       197
#define KVM_CAP_PTP_KVM			       198
#define KVM_CAP_HYPERV_ENFORCE_CPUID	       199
#define KVM_CAP_SREGS2			       200
#define KVM_CAP_EXIT_HYPERCALL		       201
#define KVM_CAP_PPC_RPT_INVALIDATE	       202
#define KVM_CAP_BINARY_STATS_FD		       203
#define KVM_CAP_EXIT_ON_EMULATION_FAILURE      204
#define KVM_CAP_ARM_MTE			       205
#define KVM_CAP_VM_MOVE_ENC_CONTEXT_FROM       206
#define KVM_CAP_VM_GPA_BITS		       207
#define KVM_CAP_XSAVE2			       208
#define KVM_CAP_SYS_ATTRIBUTES		       209
#define KVM_CAP_PPC_AIL_MODE_3		       210
#define KVM_CAP_S390_MEM_OP_EXTENSION	       211
#define KVM_CAP_PMU_CAPABILITY		       212
#define KVM_CAP_DISABLE_QUIRKS2		       213
#define KVM_CAP_VM_TSC_CONTROL		       214
#define KVM_CAP_SYSTEM_EVENT_DATA	       215
#define KVM_CAP_ARM_SYSTEM_SUSPEND	       216
#define KVM_CAP_S390_PROTECTED_DUMP	       217
#define KVM_CAP_X86_TRIPLE_FAULT_EVENT	       218
#define KVM_CAP_X86_NOTIFY_VMEXIT	       219
#define KVM_CAP_VM_DISABLE_NX_HUGE_PAGES       220
#define KVM_CAP_S390_ZPCI_OP		       221
#define KVM_CAP_S390_CPU_TOPOLOGY	       222
#define KVM_CAP_DIRTY_LOG_RING_ACQ_REL	       223
#define KVM_CAP_S390_PROTECTED_ASYNC_DISABLE   224
#define KVM_CAP_DIRTY_LOG_RING_WITH_BITMAP     225
#define KVM_CAP_PMU_EVENT_MASKED_EVENTS	       226
#define KVM_CAP_COUNTER_OFFSET		       227
#define KVM_CAP_ARM_EAGER_SPLIT_CHUNK_SIZE     228
#define KVM_CAP_ARM_SUPPORTED_BLOCK_SIZES      229
#define KVM_CAP_ARM_SUPPORTED_REG_MASK_RANGES  230
#define KVM_CAP_USER_MEMORY2		       231
#define KVM_CAP_MEMORY_FAULT_INFO	       232
#define KVM_CAP_MEMORY_ATTRIBUTES	       233
#define KVM_CAP_GUEST_MEMFD		       234
#define KVM_CAP_VM_TYPES		       235
#define KVM_CAP_PRE_FAULT_MEMORY	       236
#define KVM_CAP_X86_APIC_BUS_CYCLES_NS	       237
#define KVM_CAP_X86_GUEST_MODE		       238
#define KVM_CAP_ARM_WRITABLE_IMP_ID_REGS       239
#define KVM_CAP_ARM_EL2			       240
#define KVM_CAP_ARM_EL2_E2H0		       241
#define KVM_CAP_RISCV_MP_STATE_RESET	       242
#define KVM_CAP_ARM_CACHEABLE_PFNMAP_SUPPORTED 243

struct kvm_irq_routing_irqchip {
	__u32 irqchip;
	__u32 pin;
};

struct kvm_irq_routing_msi {
	__u32 address_lo;
	__u32 address_hi;
	__u32 data;
	union {
		__u32 pad;
		__u32 devid;
	};
};

struct kvm_irq_routing_s390_adapter {
	__u64 ind_addr;
	__u64 summary_addr;
	__u64 ind_offset;
	__u32 summary_offset;
	__u32 adapter_id;
};

struct kvm_irq_routing_hv_sint {
	__u32 vcpu;
	__u32 sint;
};

struct kvm_irq_routing_xen_evtchn {
	__u32 port;
	__u32 vcpu;
	__u32 priority;
};

#define KVM_IRQ_ROUTING_XEN_EVTCHN_PRIO_2LEVEL ((__u32)(-1))

/* gsi routing entry types */
#define KVM_IRQ_ROUTING_IRQCHIP	     1
#define KVM_IRQ_ROUTING_MSI	     2
#define KVM_IRQ_ROUTING_S390_ADAPTER 3
#define KVM_IRQ_ROUTING_HV_SINT	     4
#define KVM_IRQ_ROUTING_XEN_EVTCHN   5

struct kvm_irq_routing_entry {
	__u32 gsi;
	__u32 type;
	__u32 flags;
	__u32 pad;
	union {
		struct kvm_irq_routing_irqchip irqchip;
		struct kvm_irq_routing_msi msi;
		struct kvm_irq_routing_s390_adapter adapter;
		struct kvm_irq_routing_hv_sint hv_sint;
		struct kvm_irq_routing_xen_evtchn xen_evtchn;
		__u32 pad[8];
	} u;
};

struct kvm_irq_routing {
	__u32 nr;
	__u32 flags;
	struct kvm_irq_routing_entry entries[];
};

#define KVM_IRQFD_FLAG_DEASSIGN (1 << 0)
/*
 * Available with KVM_CAP_IRQFD_RESAMPLE
 *
 * KVM_IRQFD_FLAG_RESAMPLE indicates resamplefd is valid and specifies
 * the irqfd to operate in resampling mode for level triggered interrupt
 * emulation.  See Documentation/virt/kvm/api.rst.
 */
#define KVM_IRQFD_FLAG_RESAMPLE (1 << 1)

struct kvm_irqfd {
	__u32 fd;
	__u32 gsi;
	__u32 flags;
	__u32 resamplefd;
	__u8 pad[16];
};

/* For KVM_CAP_ADJUST_CLOCK */

/* Do not use 1, KVM_CHECK_EXTENSION returned it before we had flags.  */
#define KVM_CLOCK_TSC_STABLE 2
#define KVM_CLOCK_REALTIME   (1 << 2)
#define KVM_CLOCK_HOST_TSC   (1 << 3)

struct kvm_clock_data {
	__u64 clock;
	__u32 flags;
	__u32 pad0;
	__u64 realtime;
	__u64 host_tsc;
	__u32 pad[4];
};

/* For KVM_CAP_SW_TLB */

#define KVM_MMU_FSL_BOOKE_NOHV 0
#define KVM_MMU_FSL_BOOKE_HV   1

struct kvm_config_tlb {
	__u64 params;
	__u64 array;
	__u32 mmu_type;
	__u32 array_len;
};

struct kvm_dirty_tlb {
	__u64 bitmap;
	__u32 num_dirty;
};

/* Available with KVM_CAP_ONE_REG */

#define KVM_REG_ARCH_MASK 0xff00000000000000ULL
#define KVM_REG_GENERIC	  0x0000000000000000ULL

/*
 * Architecture specific registers are to be defined in arch headers and
 * ORed with the arch identifier.
 */
#define KVM_REG_PPC	  0x1000000000000000ULL
#define KVM_REG_X86	  0x2000000000000000ULL
#define KVM_REG_IA64	  0x3000000000000000ULL
#define KVM_REG_ARM	  0x4000000000000000ULL
#define KVM_REG_S390	  0x5000000000000000ULL
#define KVM_REG_ARM64	  0x6000000000000000ULL
#define KVM_REG_MIPS	  0x7000000000000000ULL
#define KVM_REG_RISCV	  0x8000000000000000ULL
#define KVM_REG_LOONGARCH 0x9000000000000000ULL

#define KVM_REG_SIZE_SHIFT 52
#define KVM_REG_SIZE_MASK  0x00f0000000000000ULL

#define KVM_REG_SIZE(id) (1U << (((id) & KVM_REG_SIZE_MASK) >> KVM_REG_SIZE_SHIFT))

#define KVM_REG_SIZE_U8	   0x0000000000000000ULL
#define KVM_REG_SIZE_U16   0x0010000000000000ULL
#define KVM_REG_SIZE_U32   0x0020000000000000ULL
#define KVM_REG_SIZE_U64   0x0030000000000000ULL
#define KVM_REG_SIZE_U128  0x0040000000000000ULL
#define KVM_REG_SIZE_U256  0x0050000000000000ULL
#define KVM_REG_SIZE_U512  0x0060000000000000ULL
#define KVM_REG_SIZE_U1024 0x0070000000000000ULL
#define KVM_REG_SIZE_U2048 0x0080000000000000ULL

struct kvm_reg_list {
	__u64 n; /* number of regs */
	__u64 reg[];
};

struct kvm_one_reg {
	__u64 id;
	__u64 addr;
};

#define KVM_MSI_VALID_DEVID (1U << 0)
struct kvm_msi {
	__u32 address_lo;
	__u32 address_hi;
	__u32 data;
	__u32 flags;
	__u32 devid;
	__u8 pad[12];
};

struct kvm_arm_device_addr {
	__u64 id;
	__u64 addr;
};

/*
 * Device control API, available with KVM_CAP_DEVICE_CTRL
 */
#define KVM_CREATE_DEVICE_TEST 1

struct kvm_create_device {
	__u32 type;  /* in: KVM_DEV_TYPE_xxx */
	__u32 fd;    /* out: device handle */
	__u32 flags; /* in: KVM_CREATE_DEVICE_xxx */
};

struct kvm_device_attr {
	__u32 flags; /* no flags currently defined */
	__u32 group; /* device-defined */
	__u64 attr;  /* group-defined */
	__u64 addr;  /* userspace address of attr data */
};

#define KVM_DEV_VFIO_FILE 1

#define KVM_DEV_VFIO_FILE_ADD 1
#define KVM_DEV_VFIO_FILE_DEL 2

/* KVM_DEV_VFIO_GROUP aliases are for compile time uapi compatibility */
#define KVM_DEV_VFIO_GROUP KVM_DEV_VFIO_FILE

#define KVM_DEV_VFIO_GROUP_ADD		 KVM_DEV_VFIO_FILE_ADD
#define KVM_DEV_VFIO_GROUP_DEL		 KVM_DEV_VFIO_FILE_DEL
#define KVM_DEV_VFIO_GROUP_SET_SPAPR_TCE 3

enum kvm_device_type {
	KVM_DEV_TYPE_FSL_MPIC_20 = 1,
#define KVM_DEV_TYPE_FSL_MPIC_20 KVM_DEV_TYPE_FSL_MPIC_20
	KVM_DEV_TYPE_FSL_MPIC_42,
#define KVM_DEV_TYPE_FSL_MPIC_42 KVM_DEV_TYPE_FSL_MPIC_42
	KVM_DEV_TYPE_XICS,
#define KVM_DEV_TYPE_XICS KVM_DEV_TYPE_XICS
	KVM_DEV_TYPE_VFIO,
#define KVM_DEV_TYPE_VFIO KVM_DEV_TYPE_VFIO
	KVM_DEV_TYPE_ARM_VGIC_V2,
#define KVM_DEV_TYPE_ARM_VGIC_V2 KVM_DEV_TYPE_ARM_VGIC_V2
	KVM_DEV_TYPE_FLIC,
#define KVM_DEV_TYPE_FLIC KVM_DEV_TYPE_FLIC
	KVM_DEV_TYPE_ARM_VGIC_V3,
#define KVM_DEV_TYPE_ARM_VGIC_V3 KVM_DEV_TYPE_ARM_VGIC_V3
	KVM_DEV_TYPE_ARM_VGIC_ITS,
#define KVM_DEV_TYPE_ARM_VGIC_ITS KVM_DEV_TYPE_ARM_VGIC_ITS
	KVM_DEV_TYPE_XIVE,
#define KVM_DEV_TYPE_XIVE KVM_DEV_TYPE_XIVE
	KVM_DEV_TYPE_ARM_PV_TIME,
#define KVM_DEV_TYPE_ARM_PV_TIME KVM_DEV_TYPE_ARM_PV_TIME
	KVM_DEV_TYPE_RISCV_AIA,
#define KVM_DEV_TYPE_RISCV_AIA KVM_DEV_TYPE_RISCV_AIA
	KVM_DEV_TYPE_LOONGARCH_IPI,
#define KVM_DEV_TYPE_LOONGARCH_IPI KVM_DEV_TYPE_LOONGARCH_IPI
	KVM_DEV_TYPE_LOONGARCH_EIOINTC,
#define KVM_DEV_TYPE_LOONGARCH_EIOINTC KVM_DEV_TYPE_LOONGARCH_EIOINTC
	KVM_DEV_TYPE_LOONGARCH_PCHPIC,
#define KVM_DEV_TYPE_LOONGARCH_PCHPIC KVM_DEV_TYPE_LOONGARCH_PCHPIC

	KVM_DEV_TYPE_MAX,

};

struct kvm_vfio_spapr_tce {
	__s32 groupfd;
	__s32 tablefd;
};

/*
 * KVM_CREATE_VCPU receives as a parameter the vcpu slot, and returns
 * a vcpu fd.
 */
#define KVM_CREATE_VCPU		    _IO(KVMIO, 0x41)
#define KVM_GET_DIRTY_LOG	    _IOW(KVMIO, 0x42, struct kvm_dirty_log)
#define KVM_SET_NR_MMU_PAGES	    _IO(KVMIO, 0x44)
#define KVM_GET_NR_MMU_PAGES	    _IO(KVMIO, 0x45) /* deprecated */
#define KVM_SET_USER_MEMORY_REGION  _IOW(KVMIO, 0x46, struct kvm_userspace_memory_region)
#define KVM_SET_TSS_ADDR	    _IO(KVMIO, 0x47)
#define KVM_SET_IDENTITY_MAP_ADDR   _IOW(KVMIO, 0x48, __u64)
#define KVM_SET_USER_MEMORY_REGION2 _IOW(KVMIO, 0x49, struct kvm_userspace_memory_region2)

/* enable ucontrol for s390 */
#define KVM_S390_UCAS_MAP   _IOW(KVMIO, 0x50, struct kvm_s390_ucas_mapping)
#define KVM_S390_UCAS_UNMAP _IOW(KVMIO, 0x51, struct kvm_s390_ucas_mapping)
#define KVM_S390_VCPU_FAULT _IOW(KVMIO, 0x52, unsigned long)

/* Device model IOC */
#define KVM_CREATE_IRQCHIP	      _IO(KVMIO, 0x60)
#define KVM_IRQ_LINE		      _IOW(KVMIO, 0x61, struct kvm_irq_level)
#define KVM_GET_IRQCHIP		      _IOWR(KVMIO, 0x62, struct kvm_irqchip)
#define KVM_SET_IRQCHIP		      _IOR(KVMIO, 0x63, struct kvm_irqchip)
#define KVM_CREATE_PIT		      _IO(KVMIO, 0x64)
#define KVM_GET_PIT		      _IOWR(KVMIO, 0x65, struct kvm_pit_state)
#define KVM_SET_PIT		      _IOR(KVMIO, 0x66, struct kvm_pit_state)
#define KVM_IRQ_LINE_STATUS	      _IOWR(KVMIO, 0x67, struct kvm_irq_level)
#define KVM_REGISTER_COALESCED_MMIO   _IOW(KVMIO, 0x67, struct kvm_coalesced_mmio_zone)
#define KVM_UNREGISTER_COALESCED_MMIO _IOW(KVMIO, 0x68, struct kvm_coalesced_mmio_zone)
#define KVM_SET_GSI_ROUTING	      _IOW(KVMIO, 0x6a, struct kvm_irq_routing)
#define KVM_REINJECT_CONTROL	      _IO(KVMIO, 0x71)
#define KVM_IRQFD		      _IOW(KVMIO, 0x76, struct kvm_irqfd)
#define KVM_CREATE_PIT2		      _IOW(KVMIO, 0x77, struct kvm_pit_config)
#define KVM_SET_BOOT_CPU_ID	      _IO(KVMIO, 0x78)
#define KVM_IOEVENTFD		      _IOW(KVMIO, 0x79, struct kvm_ioeventfd)
#define KVM_XEN_HVM_CONFIG	      _IOW(KVMIO, 0x7a, struct kvm_xen_hvm_config)
#define KVM_SET_CLOCK		      _IOW(KVMIO, 0x7b, struct kvm_clock_data)
#define KVM_GET_CLOCK		      _IOR(KVMIO, 0x7c, struct kvm_clock_data)
/* Available with KVM_CAP_PIT_STATE2 */
#define KVM_GET_PIT2 _IOR(KVMIO, 0x9f, struct kvm_pit_state2)
#define KVM_SET_PIT2 _IOW(KVMIO, 0xa0, struct kvm_pit_state2)
/* Available with KVM_CAP_PPC_GET_PVINFO */
#define KVM_PPC_GET_PVINFO _IOW(KVMIO, 0xa1, struct kvm_ppc_pvinfo)
/* Available with KVM_CAP_TSC_CONTROL for a vCPU, or with
 *  KVM_CAP_VM_TSC_CONTROL to set defaults for a VM */
#define KVM_SET_TSC_KHZ _IO(KVMIO, 0xa2)
#define KVM_GET_TSC_KHZ _IO(KVMIO, 0xa3)
/* Available with KVM_CAP_SIGNAL_MSI */
#define KVM_SIGNAL_MSI _IOW(KVMIO, 0xa5, struct kvm_msi)
/* Available with KVM_CAP_PPC_GET_SMMU_INFO */
#define KVM_PPC_GET_SMMU_INFO _IOR(KVMIO, 0xa6, struct kvm_ppc_smmu_info)
/* Available with KVM_CAP_PPC_ALLOC_HTAB */
#define KVM_PPC_ALLOCATE_HTAB	_IOWR(KVMIO, 0xa7, __u32)
#define KVM_CREATE_SPAPR_TCE	_IOW(KVMIO, 0xa8, struct kvm_create_spapr_tce)
#define KVM_CREATE_SPAPR_TCE_64 _IOW(KVMIO, 0xa8, struct kvm_create_spapr_tce_64)
/* Available with KVM_CAP_RMA */
#define KVM_ALLOCATE_RMA _IOR(KVMIO, 0xa9, struct kvm_allocate_rma)
/* Available with KVM_CAP_PPC_HTAB_FD */
#define KVM_PPC_GET_HTAB_FD _IOW(KVMIO, 0xaa, struct kvm_get_htab_fd)
/* Available with KVM_CAP_ARM_SET_DEVICE_ADDR */
#define KVM_ARM_SET_DEVICE_ADDR _IOW(KVMIO, 0xab, struct kvm_arm_device_addr)
/* Available with KVM_CAP_PPC_RTAS */
#define KVM_PPC_RTAS_DEFINE_TOKEN _IOW(KVMIO, 0xac, struct kvm_rtas_token_args)
/* Available with KVM_CAP_SPAPR_RESIZE_HPT */
#define KVM_PPC_RESIZE_HPT_PREPARE _IOR(KVMIO, 0xad, struct kvm_ppc_resize_hpt)
#define KVM_PPC_RESIZE_HPT_COMMIT  _IOR(KVMIO, 0xae, struct kvm_ppc_resize_hpt)
/* Available with KVM_CAP_PPC_MMU_RADIX or KVM_CAP_PPC_MMU_HASH_V3 */
#define KVM_PPC_CONFIGURE_V3_MMU _IOW(KVMIO, 0xaf, struct kvm_ppc_mmuv3_cfg)
/* Available with KVM_CAP_PPC_MMU_RADIX */
#define KVM_PPC_GET_RMMU_INFO _IOW(KVMIO, 0xb0, struct kvm_ppc_rmmu_info)
/* Available with KVM_CAP_PPC_GET_CPU_CHAR */
#define KVM_PPC_GET_CPU_CHAR _IOR(KVMIO, 0xb1, struct kvm_ppc_cpu_char)
/* Available with KVM_CAP_PMU_EVENT_FILTER */
#define KVM_SET_PMU_EVENT_FILTER _IOW(KVMIO, 0xb2, struct kvm_pmu_event_filter)
#define KVM_PPC_SVM_OFF		 _IO(KVMIO, 0xb3)
#define KVM_ARM_MTE_COPY_TAGS	 _IOR(KVMIO, 0xb4, struct kvm_arm_copy_mte_tags)
/* Available with KVM_CAP_COUNTER_OFFSET */
#define KVM_ARM_SET_COUNTER_OFFSET     _IOW(KVMIO, 0xb5, struct kvm_arm_counter_offset)
#define KVM_ARM_GET_REG_WRITABLE_MASKS _IOR(KVMIO, 0xb6, struct reg_mask_range)

/* ioctl for vm fd */
#define KVM_CREATE_DEVICE _IOWR(KVMIO, 0xe0, struct kvm_create_device)

/* ioctls for fds returned by KVM_CREATE_DEVICE */
#define KVM_SET_DEVICE_ATTR _IOW(KVMIO, 0xe1, struct kvm_device_attr)
#define KVM_GET_DEVICE_ATTR _IOW(KVMIO, 0xe2, struct kvm_device_attr)
#define KVM_HAS_DEVICE_ATTR _IOW(KVMIO, 0xe3, struct kvm_device_attr)

/*
 * ioctls for vcpu fds
 */
#define KVM_RUN		    _IO(KVMIO, 0x80)
#define KVM_GET_REGS	    _IOR(KVMIO, 0x81, struct kvm_regs)
#define KVM_SET_REGS	    _IOW(KVMIO, 0x82, struct kvm_regs)
#define KVM_GET_SREGS	    _IOR(KVMIO, 0x83, struct kvm_sregs)
#define KVM_SET_SREGS	    _IOW(KVMIO, 0x84, struct kvm_sregs)
#define KVM_TRANSLATE	    _IOWR(KVMIO, 0x85, struct kvm_translation)
#define KVM_INTERRUPT	    _IOW(KVMIO, 0x86, struct kvm_interrupt)
#define KVM_GET_MSRS	    _IOWR(KVMIO, 0x88, struct kvm_msrs)
#define KVM_SET_MSRS	    _IOW(KVMIO, 0x89, struct kvm_msrs)
#define KVM_SET_CPUID	    _IOW(KVMIO, 0x8a, struct kvm_cpuid)
#define KVM_SET_SIGNAL_MASK _IOW(KVMIO, 0x8b, struct kvm_signal_mask)
#define KVM_GET_FPU	    _IOR(KVMIO, 0x8c, struct kvm_fpu)
#define KVM_SET_FPU	    _IOW(KVMIO, 0x8d, struct kvm_fpu)
#define KVM_GET_LAPIC	    _IOR(KVMIO, 0x8e, struct kvm_lapic_state)
#define KVM_SET_LAPIC	    _IOW(KVMIO, 0x8f, struct kvm_lapic_state)
#define KVM_SET_CPUID2	    _IOW(KVMIO, 0x90, struct kvm_cpuid2)
#define KVM_GET_CPUID2	    _IOWR(KVMIO, 0x91, struct kvm_cpuid2)
/* Available with KVM_CAP_VAPIC */
#define KVM_TPR_ACCESS_REPORTING _IOWR(KVMIO, 0x92, struct kvm_tpr_access_ctl)
/* Available with KVM_CAP_VAPIC */
#define KVM_SET_VAPIC_ADDR _IOW(KVMIO, 0x93, struct kvm_vapic_addr)
/* valid for virtual machine (for floating interrupt)_and_ vcpu */
#define KVM_S390_INTERRUPT _IOW(KVMIO, 0x94, struct kvm_s390_interrupt)
/* store status for s390 */
#define KVM_S390_STORE_STATUS_NOADDR   (-1ul)
#define KVM_S390_STORE_STATUS_PREFIXED (-2ul)
#define KVM_S390_STORE_STATUS	       _IOW(KVMIO, 0x95, unsigned long)
/* initial ipl psw for s390 */
#define KVM_S390_SET_INITIAL_PSW _IOW(KVMIO, 0x96, struct kvm_s390_psw)
/* initial reset for s390 */
#define KVM_S390_INITIAL_RESET _IO(KVMIO, 0x97)
#define KVM_GET_MP_STATE       _IOR(KVMIO, 0x98, struct kvm_mp_state)
#define KVM_SET_MP_STATE       _IOW(KVMIO, 0x99, struct kvm_mp_state)
/* Available with KVM_CAP_USER_NMI */
#define KVM_NMI _IO(KVMIO, 0x9a)
/* Available with KVM_CAP_SET_GUEST_DEBUG */
#define KVM_SET_GUEST_DEBUG _IOW(KVMIO, 0x9b, struct kvm_guest_debug)
/* MCE for x86 */
#define KVM_X86_SETUP_MCE	      _IOW(KVMIO, 0x9c, __u64)
#define KVM_X86_GET_MCE_CAP_SUPPORTED _IOR(KVMIO, 0x9d, __u64)
#define KVM_X86_SET_MCE		      _IOW(KVMIO, 0x9e, struct kvm_x86_mce)
/* Available with KVM_CAP_VCPU_EVENTS */
#define KVM_GET_VCPU_EVENTS _IOR(KVMIO, 0x9f, struct kvm_vcpu_events)
#define KVM_SET_VCPU_EVENTS _IOW(KVMIO, 0xa0, struct kvm_vcpu_events)
/* Available with KVM_CAP_DEBUGREGS */
#define KVM_GET_DEBUGREGS _IOR(KVMIO, 0xa1, struct kvm_debugregs)
#define KVM_SET_DEBUGREGS _IOW(KVMIO, 0xa2, struct kvm_debugregs)
/*
 * vcpu version available with KVM_CAP_ENABLE_CAP
 * vm version available with KVM_CAP_ENABLE_CAP_VM
 */
#define KVM_ENABLE_CAP _IOW(KVMIO, 0xa3, struct kvm_enable_cap)
/* Available with KVM_CAP_XSAVE */
#define KVM_GET_XSAVE _IOR(KVMIO, 0xa4, struct kvm_xsave)
#define KVM_SET_XSAVE _IOW(KVMIO, 0xa5, struct kvm_xsave)
/* Available with KVM_CAP_XCRS */
#define KVM_GET_XCRS _IOR(KVMIO, 0xa6, struct kvm_xcrs)
#define KVM_SET_XCRS _IOW(KVMIO, 0xa7, struct kvm_xcrs)
/* Available with KVM_CAP_SW_TLB */
#define KVM_DIRTY_TLB _IOW(KVMIO, 0xaa, struct kvm_dirty_tlb)
/* Available with KVM_CAP_ONE_REG */
#define KVM_GET_ONE_REG _IOW(KVMIO, 0xab, struct kvm_one_reg)
#define KVM_SET_ONE_REG _IOW(KVMIO, 0xac, struct kvm_one_reg)
/* VM is being stopped by host */
#define KVM_KVMCLOCK_CTRL	 _IO(KVMIO, 0xad)
#define KVM_ARM_VCPU_INIT	 _IOW(KVMIO, 0xae, struct kvm_vcpu_init)
#define KVM_ARM_PREFERRED_TARGET _IOR(KVMIO, 0xaf, struct kvm_vcpu_init)
#define KVM_GET_REG_LIST	 _IOWR(KVMIO, 0xb0, struct kvm_reg_list)
/* Available with KVM_CAP_S390_MEM_OP */
#define KVM_S390_MEM_OP _IOW(KVMIO, 0xb1, struct kvm_s390_mem_op)
/* Available with KVM_CAP_S390_SKEYS */
#define KVM_S390_GET_SKEYS _IOW(KVMIO, 0xb2, struct kvm_s390_skeys)
#define KVM_S390_SET_SKEYS _IOW(KVMIO, 0xb3, struct kvm_s390_skeys)
/* Available with KVM_CAP_S390_INJECT_IRQ */
#define KVM_S390_IRQ _IOW(KVMIO, 0xb4, struct kvm_s390_irq)
/* Available with KVM_CAP_S390_IRQ_STATE */
#define KVM_S390_SET_IRQ_STATE _IOW(KVMIO, 0xb5, struct kvm_s390_irq_state)
#define KVM_S390_GET_IRQ_STATE _IOW(KVMIO, 0xb6, struct kvm_s390_irq_state)
/* Available with KVM_CAP_X86_SMM */
#define KVM_SMI _IO(KVMIO, 0xb7)
/* Available with KVM_CAP_S390_CMMA_MIGRATION */
#define KVM_S390_GET_CMMA_BITS _IOWR(KVMIO, 0xb8, struct kvm_s390_cmma_log)
#define KVM_S390_SET_CMMA_BITS _IOW(KVMIO, 0xb9, struct kvm_s390_cmma_log)
/* Memory Encryption Commands */
#define KVM_MEMORY_ENCRYPT_OP _IOWR(KVMIO, 0xba, unsigned long)

struct kvm_enc_region {
	__u64 addr;
	__u64 size;
};

#define KVM_MEMORY_ENCRYPT_REG_REGION	_IOR(KVMIO, 0xbb, struct kvm_enc_region)
#define KVM_MEMORY_ENCRYPT_UNREG_REGION _IOR(KVMIO, 0xbc, struct kvm_enc_region)

/* Available with KVM_CAP_HYPERV_EVENTFD */
#define KVM_HYPERV_EVENTFD _IOW(KVMIO, 0xbd, struct kvm_hyperv_eventfd)

/* Available with KVM_CAP_NESTED_STATE */
#define KVM_GET_NESTED_STATE _IOWR(KVMIO, 0xbe, struct kvm_nested_state)
#define KVM_SET_NESTED_STATE _IOW(KVMIO, 0xbf, struct kvm_nested_state)

/* Available with KVM_CAP_MANUAL_DIRTY_LOG_PROTECT_2 */
#define KVM_CLEAR_DIRTY_LOG _IOWR(KVMIO, 0xc0, struct kvm_clear_dirty_log)

/* Available with KVM_CAP_HYPERV_CPUID (vcpu) / KVM_CAP_SYS_HYPERV_CPUID
 * (system) */
#define KVM_GET_SUPPORTED_HV_CPUID _IOWR(KVMIO, 0xc1, struct kvm_cpuid2)

/* Available with KVM_CAP_ARM_SVE */
#define KVM_ARM_VCPU_FINALIZE _IOW(KVMIO, 0xc2, int)

/* Available with  KVM_CAP_S390_VCPU_RESETS */
#define KVM_S390_NORMAL_RESET _IO(KVMIO, 0xc3)
#define KVM_S390_CLEAR_RESET  _IO(KVMIO, 0xc4)

/* Available with KVM_CAP_S390_PROTECTED */
#define KVM_S390_PV_COMMAND _IOWR(KVMIO, 0xc5, struct kvm_pv_cmd)

/* Available with KVM_CAP_X86_MSR_FILTER */
#define KVM_X86_SET_MSR_FILTER _IOW(KVMIO, 0xc6, struct kvm_msr_filter)

/* Available with KVM_CAP_DIRTY_LOG_RING */
#define KVM_RESET_DIRTY_RINGS _IO(KVMIO, 0xc7)

/* Per-VM Xen attributes */
#define KVM_XEN_HVM_GET_ATTR _IOWR(KVMIO, 0xc8, struct kvm_xen_hvm_attr)
#define KVM_XEN_HVM_SET_ATTR _IOW(KVMIO, 0xc9, struct kvm_xen_hvm_attr)

/* Per-vCPU Xen attributes */
#define KVM_XEN_VCPU_GET_ATTR _IOWR(KVMIO, 0xca, struct kvm_xen_vcpu_attr)
#define KVM_XEN_VCPU_SET_ATTR _IOW(KVMIO, 0xcb, struct kvm_xen_vcpu_attr)

/* Available with KVM_CAP_XEN_HVM / KVM_XEN_HVM_CONFIG_EVTCHN_SEND */
#define KVM_XEN_HVM_EVTCHN_SEND _IOW(KVMIO, 0xd0, struct kvm_irq_routing_xen_evtchn)

#define KVM_GET_SREGS2 _IOR(KVMIO, 0xcc, struct kvm_sregs2)
#define KVM_SET_SREGS2 _IOW(KVMIO, 0xcd, struct kvm_sregs2)

#define KVM_DIRTY_LOG_MANUAL_PROTECT_ENABLE (1 << 0)
#define KVM_DIRTY_LOG_INITIALLY_SET	    (1 << 1)

/*
 * Arch needs to define the macro after implementing the dirty ring
 * feature.  KVM_DIRTY_LOG_PAGE_OFFSET should be defined as the
 * starting page offset of the dirty ring structures.
 */
#ifndef KVM_DIRTY_LOG_PAGE_OFFSET
#define KVM_DIRTY_LOG_PAGE_OFFSET 0
#endif

/*
 * KVM dirty GFN flags, defined as:
 *
 * |---------------+---------------+--------------|
 * | bit 1 (reset) | bit 0 (dirty) | Status       |
 * |---------------+---------------+--------------|
 * |             0 |             0 | Invalid GFN  |
 * |             0 |             1 | Dirty GFN    |
 * |             1 |             X | GFN to reset |
 * |---------------+---------------+--------------|
 *
 * Lifecycle of a dirty GFN goes like:
 *
 *      dirtied         harvested        reset
 * 00 -----------> 01 -------------> 1X -------+
 *  ^                                          |
 *  |                                          |
 *  +------------------------------------------+
 *
 * The userspace program is only responsible for the 01->1X state
 * conversion after harvesting an entry.  Also, it must not skip any
 * dirty bits, so that dirty bits are always harvested in sequence.
 */
#define KVM_DIRTY_GFN_F_DIRTY _BITUL(0)
#define KVM_DIRTY_GFN_F_RESET _BITUL(1)
#define KVM_DIRTY_GFN_F_MASK  0x3

/*
 * KVM dirty rings should be mapped at KVM_DIRTY_LOG_PAGE_OFFSET of
 * per-vcpu mmaped regions as an array of struct kvm_dirty_gfn.  The
 * size of the gfn buffer is decided by the first argument when
 * enabling KVM_CAP_DIRTY_LOG_RING.
 */
struct kvm_dirty_gfn {
	__u32 flags;
	__u32 slot;
	__u64 offset;
};

#define KVM_BUS_LOCK_DETECTION_OFF  (1 << 0)
#define KVM_BUS_LOCK_DETECTION_EXIT (1 << 1)

#define KVM_PMU_CAP_DISABLE (1 << 0)

/**
 * struct kvm_stats_header - Header of per vm/vcpu binary statistics data.
 * @flags: Some extra information for header, always 0 for now.
 * @name_size: The size in bytes of the memory which contains statistics
 *             name string including trailing '\0'. The memory is allocated
 *             at the send of statistics descriptor.
 * @num_desc: The number of statistics the vm or vcpu has.
 * @id_offset: The offset of the vm/vcpu stats' id string in the file pointed
 *             by vm/vcpu stats fd.
 * @desc_offset: The offset of the vm/vcpu stats' descriptor block in the file
 *               pointd by vm/vcpu stats fd.
 * @data_offset: The offset of the vm/vcpu stats' data block in the file
 *               pointed by vm/vcpu stats fd.
 *
 * This is the header userspace needs to read from stats fd before any other
 * readings. It is used by userspace to discover all the information about the
 * vm/vcpu's binary statistics.
 * Userspace reads this header from the start of the vm/vcpu's stats fd.
 */
struct kvm_stats_header {
	__u32 flags;
	__u32 name_size;
	__u32 num_desc;
	__u32 id_offset;
	__u32 desc_offset;
	__u32 data_offset;
};

#define KVM_STATS_TYPE_SHIFT	   0
#define KVM_STATS_TYPE_MASK	   (0xF << KVM_STATS_TYPE_SHIFT)
#define KVM_STATS_TYPE_CUMULATIVE  (0x0 << KVM_STATS_TYPE_SHIFT)
#define KVM_STATS_TYPE_INSTANT	   (0x1 << KVM_STATS_TYPE_SHIFT)
#define KVM_STATS_TYPE_PEAK	   (0x2 << KVM_STATS_TYPE_SHIFT)
#define KVM_STATS_TYPE_LINEAR_HIST (0x3 << KVM_STATS_TYPE_SHIFT)
#define KVM_STATS_TYPE_LOG_HIST	   (0x4 << KVM_STATS_TYPE_SHIFT)
#define KVM_STATS_TYPE_MAX	   KVM_STATS_TYPE_LOG_HIST

#define KVM_STATS_UNIT_SHIFT   4
#define KVM_STATS_UNIT_MASK    (0xF << KVM_STATS_UNIT_SHIFT)
#define KVM_STATS_UNIT_NONE    (0x0 << KVM_STATS_UNIT_SHIFT)
#define KVM_STATS_UNIT_BYTES   (0x1 << KVM_STATS_UNIT_SHIFT)
#define KVM_STATS_UNIT_SECONDS (0x2 << KVM_STATS_UNIT_SHIFT)
#define KVM_STATS_UNIT_CYCLES  (0x3 << KVM_STATS_UNIT_SHIFT)
#define KVM_STATS_UNIT_BOOLEAN (0x4 << KVM_STATS_UNIT_SHIFT)
#define KVM_STATS_UNIT_MAX     KVM_STATS_UNIT_BOOLEAN

#define KVM_STATS_BASE_SHIFT 8
#define KVM_STATS_BASE_MASK  (0xF << KVM_STATS_BASE_SHIFT)
#define KVM_STATS_BASE_POW10 (0x0 << KVM_STATS_BASE_SHIFT)
#define KVM_STATS_BASE_POW2  (0x1 << KVM_STATS_BASE_SHIFT)
#define KVM_STATS_BASE_MAX   KVM_STATS_BASE_POW2

/**
 * struct kvm_stats_desc - Descriptor of a KVM statistics.
 * @flags: Annotations of the stats, like type, unit, etc.
 * @exponent: Used together with @flags to determine the unit.
 * @size: The number of data items for this stats.
 *        Every data item is of type __u64.
 * @offset: The offset of the stats to the start of stat structure in
 *          structure kvm or kvm_vcpu.
 * @bucket_size: A parameter value used for histogram stats. It is only used
 *		for linear histogram stats, specifying the size of the bucket;
 * @name: The name string for the stats. Its size is indicated by the
 *        &kvm_stats_header->name_size.
 */
struct kvm_stats_desc {
	__u32 flags;
	__s16 exponent;
	__u16 size;
	__u32 offset;
	__u32 bucket_size;
	char name[];
};

#define KVM_GET_STATS_FD _IO(KVMIO, 0xce)

/* Available with KVM_CAP_XSAVE2 */
#define KVM_GET_XSAVE2 _IOR(KVMIO, 0xcf, struct kvm_xsave)

/* Available with KVM_CAP_S390_PROTECTED_DUMP */
#define KVM_S390_PV_CPU_COMMAND _IOWR(KVMIO, 0xd0, struct kvm_pv_cmd)

/* Available with KVM_CAP_X86_NOTIFY_VMEXIT */
#define KVM_X86_NOTIFY_VMEXIT_ENABLED (1ULL << 0)
#define KVM_X86_NOTIFY_VMEXIT_USER    (1ULL << 1)

/* Available with KVM_CAP_S390_ZPCI_OP */
#define KVM_S390_ZPCI_OP _IOW(KVMIO, 0xd1, struct kvm_s390_zpci_op)

/* Available with KVM_CAP_MEMORY_ATTRIBUTES */
#define KVM_SET_MEMORY_ATTRIBUTES _IOW(KVMIO, 0xd2, struct kvm_memory_attributes)

struct kvm_memory_attributes {
	__u64 address;
	__u64 size;
	__u64 attributes;
	__u64 flags;
};

#define KVM_MEMORY_ATTRIBUTE_PRIVATE (1ULL << 3)

#define KVM_CREATE_GUEST_MEMFD _IOWR(KVMIO, 0xd4, struct kvm_create_guest_memfd)

struct kvm_create_guest_memfd {
	__u64 size;
	__u64 flags;
	__u64 reserved[6];
};

#define KVM_PRE_FAULT_MEMORY _IOWR(KVMIO, 0xd5, struct kvm_pre_fault_memory)

struct kvm_pre_fault_memory {
	__u64 gpa;
	__u64 size;
	__u64 flags;
	__u64 padding[5];
};

#endif /* __LINUX_KVM_H */