blob: 10b129400feeaff13eadf715e2edddbcb259c068 [file] [log] [blame]
Elliott Hughesabd62612013-11-08 11:45:48 -08001/****************************************************************************
2 ****************************************************************************
3 ***
4 *** This header was automatically generated from a Linux kernel header
5 *** of the same name, to make information necessary for userspace to
6 *** call into the kernel available to libc. It contains only constants,
7 *** structures, and macros generated from the original header, and thus,
8 *** contains no copyrightable information.
9 ***
10 *** To edit the content of this header, modify the corresponding
11 *** source file (e.g. under external/kernel-headers/original/) then
12 *** run bionic/libc/kernel/tools/update_all.py
13 ***
14 *** Any manual change here will be lost the next time this script will
15 *** be run. You've been warned!
16 ***
17 ****************************************************************************
18 ****************************************************************************/
19#ifndef _ASM_X86_KVM_H
20#define _ASM_X86_KVM_H
21#include <linux/types.h>
22#include <linux/ioctl.h>
Christopher Ferris525ce912017-07-26 13:12:53 -070023#define KVM_PIO_PAGE_OFFSET 1
24#define KVM_COALESCED_MMIO_PAGE_OFFSET 2
Elliott Hughesabd62612013-11-08 11:45:48 -080025#define DE_VECTOR 0
26#define DB_VECTOR 1
27#define BP_VECTOR 3
28#define OF_VECTOR 4
Elliott Hughesabd62612013-11-08 11:45:48 -080029#define BR_VECTOR 5
30#define UD_VECTOR 6
31#define NM_VECTOR 7
32#define DF_VECTOR 8
Elliott Hughesabd62612013-11-08 11:45:48 -080033#define TS_VECTOR 10
34#define NP_VECTOR 11
35#define SS_VECTOR 12
36#define GP_VECTOR 13
Elliott Hughesabd62612013-11-08 11:45:48 -080037#define PF_VECTOR 14
38#define MF_VECTOR 16
Christopher Ferris82d75042015-01-26 10:57:07 -080039#define AC_VECTOR 17
Elliott Hughesabd62612013-11-08 11:45:48 -080040#define MC_VECTOR 18
Christopher Ferris82d75042015-01-26 10:57:07 -080041#define XM_VECTOR 19
42#define VE_VECTOR 20
43#define __KVM_HAVE_PIT
Elliott Hughesabd62612013-11-08 11:45:48 -080044#define __KVM_HAVE_IOAPIC
45#define __KVM_HAVE_IRQ_LINE
46#define __KVM_HAVE_MSI
47#define __KVM_HAVE_USER_NMI
Elliott Hughesabd62612013-11-08 11:45:48 -080048#define __KVM_HAVE_GUEST_DEBUG
49#define __KVM_HAVE_MSIX
50#define __KVM_HAVE_MCE
51#define __KVM_HAVE_PIT_STATE2
Elliott Hughesabd62612013-11-08 11:45:48 -080052#define __KVM_HAVE_XEN_HVM
53#define __KVM_HAVE_VCPU_EVENTS
54#define __KVM_HAVE_DEBUGREGS
55#define __KVM_HAVE_XSAVE
Elliott Hughesabd62612013-11-08 11:45:48 -080056#define __KVM_HAVE_XCRS
57#define __KVM_HAVE_READONLY_MEM
58#define KVM_NR_INTERRUPTS 256
59struct kvm_memory_alias {
Tao Baod7db5942015-01-28 10:07:51 -080060 __u32 slot;
Tao Baod7db5942015-01-28 10:07:51 -080061 __u32 flags;
62 __u64 guest_phys_addr;
63 __u64 memory_size;
64 __u64 target_phys_addr;
Elliott Hughesabd62612013-11-08 11:45:48 -080065};
66struct kvm_pic_state {
Tao Baod7db5942015-01-28 10:07:51 -080067 __u8 last_irr;
68 __u8 irr;
Tao Baod7db5942015-01-28 10:07:51 -080069 __u8 imr;
70 __u8 isr;
71 __u8 priority_add;
72 __u8 irq_base;
Tao Baod7db5942015-01-28 10:07:51 -080073 __u8 read_reg_select;
74 __u8 poll;
75 __u8 special_mask;
76 __u8 init_state;
Tao Baod7db5942015-01-28 10:07:51 -080077 __u8 auto_eoi;
78 __u8 rotate_on_auto_eoi;
79 __u8 special_fully_nested_mode;
80 __u8 init4;
Tao Baod7db5942015-01-28 10:07:51 -080081 __u8 elcr;
82 __u8 elcr_mask;
Elliott Hughesabd62612013-11-08 11:45:48 -080083};
Elliott Hughesabd62612013-11-08 11:45:48 -080084#define KVM_IOAPIC_NUM_PINS 24
85struct kvm_ioapic_state {
Tao Baod7db5942015-01-28 10:07:51 -080086 __u64 base_address;
87 __u32 ioregsel;
88 __u32 id;
Tao Baod7db5942015-01-28 10:07:51 -080089 __u32 irr;
90 __u32 pad;
91 union {
92 __u64 bits;
Tao Baod7db5942015-01-28 10:07:51 -080093 struct {
94 __u8 vector;
95 __u8 delivery_mode : 3;
96 __u8 dest_mode : 1;
Tao Baod7db5942015-01-28 10:07:51 -080097 __u8 delivery_status : 1;
98 __u8 polarity : 1;
99 __u8 remote_irr : 1;
100 __u8 trig_mode : 1;
Tao Baod7db5942015-01-28 10:07:51 -0800101 __u8 mask : 1;
102 __u8 reserve : 7;
103 __u8 reserved[4];
104 __u8 dest_id;
Tao Baod7db5942015-01-28 10:07:51 -0800105 } fields;
106 } redirtbl[KVM_IOAPIC_NUM_PINS];
Elliott Hughesabd62612013-11-08 11:45:48 -0800107};
Elliott Hughesabd62612013-11-08 11:45:48 -0800108#define KVM_IRQCHIP_PIC_MASTER 0
109#define KVM_IRQCHIP_PIC_SLAVE 1
110#define KVM_IRQCHIP_IOAPIC 2
111#define KVM_NR_IRQCHIPS 3
Christopher Ferris05d08e92016-02-04 13:16:38 -0800112#define KVM_RUN_X86_SMM (1 << 0)
Christopher Ferris05d08e92016-02-04 13:16:38 -0800113struct kvm_regs {
Tao Baod7db5942015-01-28 10:07:51 -0800114 __u64 rax, rbx, rcx, rdx;
115 __u64 rsi, rdi, rsp, rbp;
116 __u64 r8, r9, r10, r11;
Christopher Ferris05d08e92016-02-04 13:16:38 -0800117 __u64 r12, r13, r14, r15;
Tao Baod7db5942015-01-28 10:07:51 -0800118 __u64 rip, rflags;
Elliott Hughesabd62612013-11-08 11:45:48 -0800119};
120#define KVM_APIC_REG_SIZE 0x400
Christopher Ferris05d08e92016-02-04 13:16:38 -0800121struct kvm_lapic_state {
Tao Baod7db5942015-01-28 10:07:51 -0800122 char regs[KVM_APIC_REG_SIZE];
Elliott Hughesabd62612013-11-08 11:45:48 -0800123};
124struct kvm_segment {
Christopher Ferris05d08e92016-02-04 13:16:38 -0800125 __u64 base;
Tao Baod7db5942015-01-28 10:07:51 -0800126 __u32 limit;
127 __u16 selector;
128 __u8 type;
Christopher Ferris05d08e92016-02-04 13:16:38 -0800129 __u8 present, dpl, db, s, l, g, avl;
Tao Baod7db5942015-01-28 10:07:51 -0800130 __u8 unusable;
131 __u8 padding;
Elliott Hughesabd62612013-11-08 11:45:48 -0800132};
Christopher Ferris05d08e92016-02-04 13:16:38 -0800133struct kvm_dtable {
Tao Baod7db5942015-01-28 10:07:51 -0800134 __u64 base;
135 __u16 limit;
136 __u16 padding[3];
Christopher Ferris05d08e92016-02-04 13:16:38 -0800137};
Elliott Hughesabd62612013-11-08 11:45:48 -0800138struct kvm_sregs {
Tao Baod7db5942015-01-28 10:07:51 -0800139 struct kvm_segment cs, ds, es, fs, gs, ss;
140 struct kvm_segment tr, ldt;
Christopher Ferris05d08e92016-02-04 13:16:38 -0800141 struct kvm_dtable gdt, idt;
Tao Baod7db5942015-01-28 10:07:51 -0800142 __u64 cr0, cr2, cr3, cr4, cr8;
143 __u64 efer;
144 __u64 apic_base;
Christopher Ferris05d08e92016-02-04 13:16:38 -0800145 __u64 interrupt_bitmap[(KVM_NR_INTERRUPTS + 63) / 64];
Elliott Hughesabd62612013-11-08 11:45:48 -0800146};
147struct kvm_fpu {
Tao Baod7db5942015-01-28 10:07:51 -0800148 __u8 fpr[8][16];
Christopher Ferris05d08e92016-02-04 13:16:38 -0800149 __u16 fcw;
Tao Baod7db5942015-01-28 10:07:51 -0800150 __u16 fsw;
151 __u8 ftwx;
152 __u8 pad1;
Christopher Ferris05d08e92016-02-04 13:16:38 -0800153 __u16 last_opcode;
Tao Baod7db5942015-01-28 10:07:51 -0800154 __u64 last_ip;
155 __u64 last_dp;
156 __u8 xmm[16][16];
Christopher Ferris05d08e92016-02-04 13:16:38 -0800157 __u32 mxcsr;
Tao Baod7db5942015-01-28 10:07:51 -0800158 __u32 pad2;
Elliott Hughesabd62612013-11-08 11:45:48 -0800159};
160struct kvm_msr_entry {
Christopher Ferris05d08e92016-02-04 13:16:38 -0800161 __u32 index;
Tao Baod7db5942015-01-28 10:07:51 -0800162 __u32 reserved;
163 __u64 data;
Elliott Hughesabd62612013-11-08 11:45:48 -0800164};
Christopher Ferris05d08e92016-02-04 13:16:38 -0800165struct kvm_msrs {
Tao Baod7db5942015-01-28 10:07:51 -0800166 __u32 nmsrs;
167 __u32 pad;
168 struct kvm_msr_entry entries[0];
Christopher Ferris05d08e92016-02-04 13:16:38 -0800169};
Elliott Hughesabd62612013-11-08 11:45:48 -0800170struct kvm_msr_list {
Tao Baod7db5942015-01-28 10:07:51 -0800171 __u32 nmsrs;
172 __u32 indices[0];
Christopher Ferris05d08e92016-02-04 13:16:38 -0800173};
Elliott Hughesabd62612013-11-08 11:45:48 -0800174struct kvm_cpuid_entry {
Tao Baod7db5942015-01-28 10:07:51 -0800175 __u32 function;
176 __u32 eax;
Christopher Ferris05d08e92016-02-04 13:16:38 -0800177 __u32 ebx;
Tao Baod7db5942015-01-28 10:07:51 -0800178 __u32 ecx;
179 __u32 edx;
180 __u32 padding;
Christopher Ferris05d08e92016-02-04 13:16:38 -0800181};
Elliott Hughesabd62612013-11-08 11:45:48 -0800182struct kvm_cpuid {
Tao Baod7db5942015-01-28 10:07:51 -0800183 __u32 nent;
184 __u32 padding;
Christopher Ferris05d08e92016-02-04 13:16:38 -0800185 struct kvm_cpuid_entry entries[0];
Elliott Hughesabd62612013-11-08 11:45:48 -0800186};
187struct kvm_cpuid_entry2 {
Tao Baod7db5942015-01-28 10:07:51 -0800188 __u32 function;
Christopher Ferris05d08e92016-02-04 13:16:38 -0800189 __u32 index;
Tao Baod7db5942015-01-28 10:07:51 -0800190 __u32 flags;
191 __u32 eax;
192 __u32 ebx;
Christopher Ferris05d08e92016-02-04 13:16:38 -0800193 __u32 ecx;
Tao Baod7db5942015-01-28 10:07:51 -0800194 __u32 edx;
195 __u32 padding[3];
Elliott Hughesabd62612013-11-08 11:45:48 -0800196};
Christopher Ferris106b3a82016-08-24 12:15:38 -0700197#define KVM_CPUID_FLAG_SIGNIFCANT_INDEX (1 << 0)
198#define KVM_CPUID_FLAG_STATEFUL_FUNC (1 << 1)
199#define KVM_CPUID_FLAG_STATE_READ_NEXT (1 << 2)
Elliott Hughesabd62612013-11-08 11:45:48 -0800200struct kvm_cpuid2 {
Christopher Ferris05d08e92016-02-04 13:16:38 -0800201 __u32 nent;
Tao Baod7db5942015-01-28 10:07:51 -0800202 __u32 padding;
203 struct kvm_cpuid_entry2 entries[0];
Elliott Hughesabd62612013-11-08 11:45:48 -0800204};
Christopher Ferris05d08e92016-02-04 13:16:38 -0800205struct kvm_pit_channel_state {
Tao Baod7db5942015-01-28 10:07:51 -0800206 __u32 count;
207 __u16 latched_count;
208 __u8 count_latched;
Christopher Ferris05d08e92016-02-04 13:16:38 -0800209 __u8 status_latched;
Tao Baod7db5942015-01-28 10:07:51 -0800210 __u8 status;
211 __u8 read_state;
212 __u8 write_state;
Christopher Ferris05d08e92016-02-04 13:16:38 -0800213 __u8 write_latch;
Tao Baod7db5942015-01-28 10:07:51 -0800214 __u8 rw_mode;
215 __u8 mode;
216 __u8 bcd;
Christopher Ferris05d08e92016-02-04 13:16:38 -0800217 __u8 gate;
Tao Baod7db5942015-01-28 10:07:51 -0800218 __s64 count_load_time;
Elliott Hughesabd62612013-11-08 11:45:48 -0800219};
220struct kvm_debug_exit_arch {
Christopher Ferris05d08e92016-02-04 13:16:38 -0800221 __u32 exception;
Tao Baod7db5942015-01-28 10:07:51 -0800222 __u32 pad;
223 __u64 pc;
224 __u64 dr6;
Christopher Ferris05d08e92016-02-04 13:16:38 -0800225 __u64 dr7;
Elliott Hughesabd62612013-11-08 11:45:48 -0800226};
227#define KVM_GUESTDBG_USE_SW_BP 0x00010000
228#define KVM_GUESTDBG_USE_HW_BP 0x00020000
Christopher Ferris05d08e92016-02-04 13:16:38 -0800229#define KVM_GUESTDBG_INJECT_DB 0x00040000
Elliott Hughesabd62612013-11-08 11:45:48 -0800230#define KVM_GUESTDBG_INJECT_BP 0x00080000
231struct kvm_guest_debug_arch {
Tao Baod7db5942015-01-28 10:07:51 -0800232 __u64 debugreg[8];
Christopher Ferris05d08e92016-02-04 13:16:38 -0800233};
Elliott Hughesabd62612013-11-08 11:45:48 -0800234struct kvm_pit_state {
Tao Baod7db5942015-01-28 10:07:51 -0800235 struct kvm_pit_channel_state channels[3];
Elliott Hughesabd62612013-11-08 11:45:48 -0800236};
Christopher Ferris05d08e92016-02-04 13:16:38 -0800237#define KVM_PIT_FLAGS_HPET_LEGACY 0x00000001
Elliott Hughesabd62612013-11-08 11:45:48 -0800238struct kvm_pit_state2 {
Tao Baod7db5942015-01-28 10:07:51 -0800239 struct kvm_pit_channel_state channels[3];
240 __u32 flags;
Christopher Ferris05d08e92016-02-04 13:16:38 -0800241 __u32 reserved[9];
Elliott Hughesabd62612013-11-08 11:45:48 -0800242};
243struct kvm_reinject_control {
Tao Baod7db5942015-01-28 10:07:51 -0800244 __u8 pit_reinject;
Christopher Ferris05d08e92016-02-04 13:16:38 -0800245 __u8 reserved[31];
Elliott Hughesabd62612013-11-08 11:45:48 -0800246};
247#define KVM_VCPUEVENT_VALID_NMI_PENDING 0x00000001
248#define KVM_VCPUEVENT_VALID_SIPI_VECTOR 0x00000002
Christopher Ferris05d08e92016-02-04 13:16:38 -0800249#define KVM_VCPUEVENT_VALID_SHADOW 0x00000004
250#define KVM_VCPUEVENT_VALID_SMM 0x00000008
Christopher Ferris86a48372019-01-10 14:14:59 -0800251#define KVM_VCPUEVENT_VALID_PAYLOAD 0x00000010
Elliott Hughesabd62612013-11-08 11:45:48 -0800252#define KVM_X86_SHADOW_INT_MOV_SS 0x01
253#define KVM_X86_SHADOW_INT_STI 0x02
254struct kvm_vcpu_events {
Tao Baod7db5942015-01-28 10:07:51 -0800255 struct {
Tao Baod7db5942015-01-28 10:07:51 -0800256 __u8 injected;
257 __u8 nr;
258 __u8 has_error_code;
Christopher Ferris86a48372019-01-10 14:14:59 -0800259 __u8 pending;
Tao Baod7db5942015-01-28 10:07:51 -0800260 __u32 error_code;
261 } exception;
262 struct {
263 __u8 injected;
Tao Baod7db5942015-01-28 10:07:51 -0800264 __u8 nr;
265 __u8 soft;
266 __u8 shadow;
267 } interrupt;
Tao Baod7db5942015-01-28 10:07:51 -0800268 struct {
269 __u8 injected;
270 __u8 pending;
271 __u8 masked;
Tao Baod7db5942015-01-28 10:07:51 -0800272 __u8 pad;
273 } nmi;
274 __u32 sipi_vector;
275 __u32 flags;
Christopher Ferris05d08e92016-02-04 13:16:38 -0800276 struct {
277 __u8 smm;
Christopher Ferris05d08e92016-02-04 13:16:38 -0800278 __u8 pending;
279 __u8 smm_inside_nmi;
280 __u8 latched_init;
281 } smi;
Christopher Ferris86a48372019-01-10 14:14:59 -0800282 __u8 reserved[27];
283 __u8 exception_has_payload;
284 __u64 exception_payload;
Elliott Hughesabd62612013-11-08 11:45:48 -0800285};
286struct kvm_debugregs {
Tao Baod7db5942015-01-28 10:07:51 -0800287 __u64 db[4];
Tao Baod7db5942015-01-28 10:07:51 -0800288 __u64 dr6;
289 __u64 dr7;
290 __u64 flags;
291 __u64 reserved[9];
Elliott Hughesabd62612013-11-08 11:45:48 -0800292};
293struct kvm_xsave {
Tao Baod7db5942015-01-28 10:07:51 -0800294 __u32 region[1024];
Elliott Hughesabd62612013-11-08 11:45:48 -0800295};
296#define KVM_MAX_XCRS 16
297struct kvm_xcr {
Tao Baod7db5942015-01-28 10:07:51 -0800298 __u32 xcr;
299 __u32 reserved;
Tao Baod7db5942015-01-28 10:07:51 -0800300 __u64 value;
Elliott Hughesabd62612013-11-08 11:45:48 -0800301};
302struct kvm_xcrs {
Tao Baod7db5942015-01-28 10:07:51 -0800303 __u32 nr_xcrs;
Tao Baod7db5942015-01-28 10:07:51 -0800304 __u32 flags;
305 struct kvm_xcr xcrs[KVM_MAX_XCRS];
306 __u64 padding[16];
Elliott Hughesabd62612013-11-08 11:45:48 -0800307};
Christopher Ferris76a1d452018-06-27 14:12:29 -0700308#define KVM_SYNC_X86_REGS (1UL << 0)
309#define KVM_SYNC_X86_SREGS (1UL << 1)
310#define KVM_SYNC_X86_EVENTS (1UL << 2)
311#define KVM_SYNC_X86_VALID_FIELDS (KVM_SYNC_X86_REGS | KVM_SYNC_X86_SREGS | KVM_SYNC_X86_EVENTS)
Elliott Hughesabd62612013-11-08 11:45:48 -0800312struct kvm_sync_regs {
Christopher Ferris76a1d452018-06-27 14:12:29 -0700313 struct kvm_regs regs;
314 struct kvm_sregs sregs;
315 struct kvm_vcpu_events events;
Elliott Hughesabd62612013-11-08 11:45:48 -0800316};
Christopher Ferris05d08e92016-02-04 13:16:38 -0800317#define KVM_X86_QUIRK_LINT0_REENABLED (1 << 0)
318#define KVM_X86_QUIRK_CD_NW_CLEARED (1 << 1)
Christopher Ferris9ce28842018-10-25 12:11:39 -0700319#define KVM_X86_QUIRK_LAPIC_MMIO_HOLE (1 << 2)
Christopher Ferris24f97eb2019-05-20 12:58:13 -0700320#define KVM_X86_QUIRK_OUT_7E_INC_RIP (1 << 3)
Christopher Ferris9ce28842018-10-25 12:11:39 -0700321#define KVM_STATE_NESTED_GUEST_MODE 0x00000001
322#define KVM_STATE_NESTED_RUN_PENDING 0x00000002
Christopher Ferris86a48372019-01-10 14:14:59 -0800323#define KVM_STATE_NESTED_EVMCS 0x00000004
Christopher Ferris9ce28842018-10-25 12:11:39 -0700324#define KVM_STATE_NESTED_SMM_GUEST_MODE 0x00000001
325#define KVM_STATE_NESTED_SMM_VMXON 0x00000002
326struct kvm_vmx_nested_state {
327 __u64 vmxon_pa;
328 __u64 vmcs_pa;
329 struct {
330 __u16 flags;
331 } smm;
332};
333struct kvm_nested_state {
334 __u16 flags;
335 __u16 format;
336 __u32 size;
337 union {
338 struct kvm_vmx_nested_state vmx;
339 __u8 pad[120];
340 };
341 __u8 data[0];
342};
Elliott Hughesabd62612013-11-08 11:45:48 -0800343#endif