xref: /kvmtool/x86/include/asm/kvm.h (revision 764dfba19d3b5a3a565b303464b6e336198eb6f9)
160021220SAndre Przywara #ifndef _ASM_X86_KVM_H
260021220SAndre Przywara #define _ASM_X86_KVM_H
360021220SAndre Przywara 
460021220SAndre Przywara /*
560021220SAndre Przywara  * KVM x86 specific structures and definitions
660021220SAndre Przywara  *
760021220SAndre Przywara  */
860021220SAndre Przywara 
960021220SAndre Przywara #include <linux/types.h>
1060021220SAndre Przywara #include <linux/ioctl.h>
1160021220SAndre Przywara 
1260021220SAndre Przywara #define DE_VECTOR 0
1360021220SAndre Przywara #define DB_VECTOR 1
1460021220SAndre Przywara #define BP_VECTOR 3
1560021220SAndre Przywara #define OF_VECTOR 4
1660021220SAndre Przywara #define BR_VECTOR 5
1760021220SAndre Przywara #define UD_VECTOR 6
1860021220SAndre Przywara #define NM_VECTOR 7
1960021220SAndre Przywara #define DF_VECTOR 8
2060021220SAndre Przywara #define TS_VECTOR 10
2160021220SAndre Przywara #define NP_VECTOR 11
2260021220SAndre Przywara #define SS_VECTOR 12
2360021220SAndre Przywara #define GP_VECTOR 13
2460021220SAndre Przywara #define PF_VECTOR 14
2560021220SAndre Przywara #define MF_VECTOR 16
2660021220SAndre Przywara #define AC_VECTOR 17
2760021220SAndre Przywara #define MC_VECTOR 18
2860021220SAndre Przywara #define XM_VECTOR 19
2960021220SAndre Przywara #define VE_VECTOR 20
3060021220SAndre Przywara 
3160021220SAndre Przywara /* Select x86 specific features in <linux/kvm.h> */
3260021220SAndre Przywara #define __KVM_HAVE_PIT
3360021220SAndre Przywara #define __KVM_HAVE_IOAPIC
3460021220SAndre Przywara #define __KVM_HAVE_IRQ_LINE
3560021220SAndre Przywara #define __KVM_HAVE_MSI
3660021220SAndre Przywara #define __KVM_HAVE_USER_NMI
3760021220SAndre Przywara #define __KVM_HAVE_GUEST_DEBUG
3860021220SAndre Przywara #define __KVM_HAVE_MSIX
3960021220SAndre Przywara #define __KVM_HAVE_MCE
4060021220SAndre Przywara #define __KVM_HAVE_PIT_STATE2
4160021220SAndre Przywara #define __KVM_HAVE_XEN_HVM
4260021220SAndre Przywara #define __KVM_HAVE_VCPU_EVENTS
4360021220SAndre Przywara #define __KVM_HAVE_DEBUGREGS
4460021220SAndre Przywara #define __KVM_HAVE_XSAVE
4560021220SAndre Przywara #define __KVM_HAVE_XCRS
4660021220SAndre Przywara #define __KVM_HAVE_READONLY_MEM
4760021220SAndre Przywara 
4860021220SAndre Przywara /* Architectural interrupt line count. */
4960021220SAndre Przywara #define KVM_NR_INTERRUPTS 256
5060021220SAndre Przywara 
5160021220SAndre Przywara struct kvm_memory_alias {
5260021220SAndre Przywara 	__u32 slot;  /* this has a different namespace than memory slots */
5360021220SAndre Przywara 	__u32 flags;
5460021220SAndre Przywara 	__u64 guest_phys_addr;
5560021220SAndre Przywara 	__u64 memory_size;
5660021220SAndre Przywara 	__u64 target_phys_addr;
5760021220SAndre Przywara };
5860021220SAndre Przywara 
5960021220SAndre Przywara /* for KVM_GET_IRQCHIP and KVM_SET_IRQCHIP */
6060021220SAndre Przywara struct kvm_pic_state {
6160021220SAndre Przywara 	__u8 last_irr;	/* edge detection */
6260021220SAndre Przywara 	__u8 irr;		/* interrupt request register */
6360021220SAndre Przywara 	__u8 imr;		/* interrupt mask register */
6460021220SAndre Przywara 	__u8 isr;		/* interrupt service register */
6560021220SAndre Przywara 	__u8 priority_add;	/* highest irq priority */
6660021220SAndre Przywara 	__u8 irq_base;
6760021220SAndre Przywara 	__u8 read_reg_select;
6860021220SAndre Przywara 	__u8 poll;
6960021220SAndre Przywara 	__u8 special_mask;
7060021220SAndre Przywara 	__u8 init_state;
7160021220SAndre Przywara 	__u8 auto_eoi;
7260021220SAndre Przywara 	__u8 rotate_on_auto_eoi;
7360021220SAndre Przywara 	__u8 special_fully_nested_mode;
7460021220SAndre Przywara 	__u8 init4;		/* true if 4 byte init */
7560021220SAndre Przywara 	__u8 elcr;		/* PIIX edge/trigger selection */
7660021220SAndre Przywara 	__u8 elcr_mask;
7760021220SAndre Przywara };
7860021220SAndre Przywara 
7960021220SAndre Przywara #define KVM_IOAPIC_NUM_PINS  24
8060021220SAndre Przywara struct kvm_ioapic_state {
8160021220SAndre Przywara 	__u64 base_address;
8260021220SAndre Przywara 	__u32 ioregsel;
8360021220SAndre Przywara 	__u32 id;
8460021220SAndre Przywara 	__u32 irr;
8560021220SAndre Przywara 	__u32 pad;
8660021220SAndre Przywara 	union {
8760021220SAndre Przywara 		__u64 bits;
8860021220SAndre Przywara 		struct {
8960021220SAndre Przywara 			__u8 vector;
9060021220SAndre Przywara 			__u8 delivery_mode:3;
9160021220SAndre Przywara 			__u8 dest_mode:1;
9260021220SAndre Przywara 			__u8 delivery_status:1;
9360021220SAndre Przywara 			__u8 polarity:1;
9460021220SAndre Przywara 			__u8 remote_irr:1;
9560021220SAndre Przywara 			__u8 trig_mode:1;
9660021220SAndre Przywara 			__u8 mask:1;
9760021220SAndre Przywara 			__u8 reserve:7;
9860021220SAndre Przywara 			__u8 reserved[4];
9960021220SAndre Przywara 			__u8 dest_id;
10060021220SAndre Przywara 		} fields;
10160021220SAndre Przywara 	} redirtbl[KVM_IOAPIC_NUM_PINS];
10260021220SAndre Przywara };
10360021220SAndre Przywara 
10460021220SAndre Przywara #define KVM_IRQCHIP_PIC_MASTER   0
10560021220SAndre Przywara #define KVM_IRQCHIP_PIC_SLAVE    1
10660021220SAndre Przywara #define KVM_IRQCHIP_IOAPIC       2
10760021220SAndre Przywara #define KVM_NR_IRQCHIPS          3
10860021220SAndre Przywara 
109b37ed70eSAndre Przywara #define KVM_RUN_X86_SMM		 (1 << 0)
110b37ed70eSAndre Przywara 
11160021220SAndre Przywara /* for KVM_GET_REGS and KVM_SET_REGS */
11260021220SAndre Przywara struct kvm_regs {
11360021220SAndre Przywara 	/* out (KVM_GET_REGS) / in (KVM_SET_REGS) */
11460021220SAndre Przywara 	__u64 rax, rbx, rcx, rdx;
11560021220SAndre Przywara 	__u64 rsi, rdi, rsp, rbp;
11660021220SAndre Przywara 	__u64 r8,  r9,  r10, r11;
11760021220SAndre Przywara 	__u64 r12, r13, r14, r15;
11860021220SAndre Przywara 	__u64 rip, rflags;
11960021220SAndre Przywara };
12060021220SAndre Przywara 
12160021220SAndre Przywara /* for KVM_GET_LAPIC and KVM_SET_LAPIC */
12260021220SAndre Przywara #define KVM_APIC_REG_SIZE 0x400
12360021220SAndre Przywara struct kvm_lapic_state {
12460021220SAndre Przywara 	char regs[KVM_APIC_REG_SIZE];
12560021220SAndre Przywara };
12660021220SAndre Przywara 
12760021220SAndre Przywara struct kvm_segment {
12860021220SAndre Przywara 	__u64 base;
12960021220SAndre Przywara 	__u32 limit;
13060021220SAndre Przywara 	__u16 selector;
13160021220SAndre Przywara 	__u8  type;
13260021220SAndre Przywara 	__u8  present, dpl, db, s, l, g, avl;
13360021220SAndre Przywara 	__u8  unusable;
13460021220SAndre Przywara 	__u8  padding;
13560021220SAndre Przywara };
13660021220SAndre Przywara 
13760021220SAndre Przywara struct kvm_dtable {
13860021220SAndre Przywara 	__u64 base;
13960021220SAndre Przywara 	__u16 limit;
14060021220SAndre Przywara 	__u16 padding[3];
14160021220SAndre Przywara };
14260021220SAndre Przywara 
14360021220SAndre Przywara 
14460021220SAndre Przywara /* for KVM_GET_SREGS and KVM_SET_SREGS */
14560021220SAndre Przywara struct kvm_sregs {
14660021220SAndre Przywara 	/* out (KVM_GET_SREGS) / in (KVM_SET_SREGS) */
14760021220SAndre Przywara 	struct kvm_segment cs, ds, es, fs, gs, ss;
14860021220SAndre Przywara 	struct kvm_segment tr, ldt;
14960021220SAndre Przywara 	struct kvm_dtable gdt, idt;
15060021220SAndre Przywara 	__u64 cr0, cr2, cr3, cr4, cr8;
15160021220SAndre Przywara 	__u64 efer;
15260021220SAndre Przywara 	__u64 apic_base;
15360021220SAndre Przywara 	__u64 interrupt_bitmap[(KVM_NR_INTERRUPTS + 63) / 64];
15460021220SAndre Przywara };
15560021220SAndre Przywara 
15660021220SAndre Przywara /* for KVM_GET_FPU and KVM_SET_FPU */
15760021220SAndre Przywara struct kvm_fpu {
15860021220SAndre Przywara 	__u8  fpr[8][16];
15960021220SAndre Przywara 	__u16 fcw;
16060021220SAndre Przywara 	__u16 fsw;
16160021220SAndre Przywara 	__u8  ftwx;  /* in fxsave format */
16260021220SAndre Przywara 	__u8  pad1;
16360021220SAndre Przywara 	__u16 last_opcode;
16460021220SAndre Przywara 	__u64 last_ip;
16560021220SAndre Przywara 	__u64 last_dp;
16660021220SAndre Przywara 	__u8  xmm[16][16];
16760021220SAndre Przywara 	__u32 mxcsr;
16860021220SAndre Przywara 	__u32 pad2;
16960021220SAndre Przywara };
17060021220SAndre Przywara 
17160021220SAndre Przywara struct kvm_msr_entry {
17260021220SAndre Przywara 	__u32 index;
17360021220SAndre Przywara 	__u32 reserved;
17460021220SAndre Przywara 	__u64 data;
17560021220SAndre Przywara };
17660021220SAndre Przywara 
17760021220SAndre Przywara /* for KVM_GET_MSRS and KVM_SET_MSRS */
17860021220SAndre Przywara struct kvm_msrs {
17960021220SAndre Przywara 	__u32 nmsrs; /* number of msrs in entries */
18060021220SAndre Przywara 	__u32 pad;
18160021220SAndre Przywara 
18260021220SAndre Przywara 	struct kvm_msr_entry entries[0];
18360021220SAndre Przywara };
18460021220SAndre Przywara 
18560021220SAndre Przywara /* for KVM_GET_MSR_INDEX_LIST */
18660021220SAndre Przywara struct kvm_msr_list {
18760021220SAndre Przywara 	__u32 nmsrs; /* number of msrs in entries */
18860021220SAndre Przywara 	__u32 indices[0];
18960021220SAndre Przywara };
19060021220SAndre Przywara 
19160021220SAndre Przywara 
19260021220SAndre Przywara struct kvm_cpuid_entry {
19360021220SAndre Przywara 	__u32 function;
19460021220SAndre Przywara 	__u32 eax;
19560021220SAndre Przywara 	__u32 ebx;
19660021220SAndre Przywara 	__u32 ecx;
19760021220SAndre Przywara 	__u32 edx;
19860021220SAndre Przywara 	__u32 padding;
19960021220SAndre Przywara };
20060021220SAndre Przywara 
20160021220SAndre Przywara /* for KVM_SET_CPUID */
20260021220SAndre Przywara struct kvm_cpuid {
20360021220SAndre Przywara 	__u32 nent;
20460021220SAndre Przywara 	__u32 padding;
20560021220SAndre Przywara 	struct kvm_cpuid_entry entries[0];
20660021220SAndre Przywara };
20760021220SAndre Przywara 
20860021220SAndre Przywara struct kvm_cpuid_entry2 {
20960021220SAndre Przywara 	__u32 function;
21060021220SAndre Przywara 	__u32 index;
21160021220SAndre Przywara 	__u32 flags;
21260021220SAndre Przywara 	__u32 eax;
21360021220SAndre Przywara 	__u32 ebx;
21460021220SAndre Przywara 	__u32 ecx;
21560021220SAndre Przywara 	__u32 edx;
21660021220SAndre Przywara 	__u32 padding[3];
21760021220SAndre Przywara };
21860021220SAndre Przywara 
219*764dfba1SAndre Przywara #define KVM_CPUID_FLAG_SIGNIFCANT_INDEX		(1 << 0)
220*764dfba1SAndre Przywara #define KVM_CPUID_FLAG_STATEFUL_FUNC		(1 << 1)
221*764dfba1SAndre Przywara #define KVM_CPUID_FLAG_STATE_READ_NEXT		(1 << 2)
22260021220SAndre Przywara 
22360021220SAndre Przywara /* for KVM_SET_CPUID2 */
22460021220SAndre Przywara struct kvm_cpuid2 {
22560021220SAndre Przywara 	__u32 nent;
22660021220SAndre Przywara 	__u32 padding;
22760021220SAndre Przywara 	struct kvm_cpuid_entry2 entries[0];
22860021220SAndre Przywara };
22960021220SAndre Przywara 
23060021220SAndre Przywara /* for KVM_GET_PIT and KVM_SET_PIT */
23160021220SAndre Przywara struct kvm_pit_channel_state {
23260021220SAndre Przywara 	__u32 count; /* can be 65536 */
23360021220SAndre Przywara 	__u16 latched_count;
23460021220SAndre Przywara 	__u8 count_latched;
23560021220SAndre Przywara 	__u8 status_latched;
23660021220SAndre Przywara 	__u8 status;
23760021220SAndre Przywara 	__u8 read_state;
23860021220SAndre Przywara 	__u8 write_state;
23960021220SAndre Przywara 	__u8 write_latch;
24060021220SAndre Przywara 	__u8 rw_mode;
24160021220SAndre Przywara 	__u8 mode;
24260021220SAndre Przywara 	__u8 bcd;
24360021220SAndre Przywara 	__u8 gate;
24460021220SAndre Przywara 	__s64 count_load_time;
24560021220SAndre Przywara };
24660021220SAndre Przywara 
24760021220SAndre Przywara struct kvm_debug_exit_arch {
24860021220SAndre Przywara 	__u32 exception;
24960021220SAndre Przywara 	__u32 pad;
25060021220SAndre Przywara 	__u64 pc;
25160021220SAndre Przywara 	__u64 dr6;
25260021220SAndre Przywara 	__u64 dr7;
25360021220SAndre Przywara };
25460021220SAndre Przywara 
25560021220SAndre Przywara #define KVM_GUESTDBG_USE_SW_BP		0x00010000
25660021220SAndre Przywara #define KVM_GUESTDBG_USE_HW_BP		0x00020000
25760021220SAndre Przywara #define KVM_GUESTDBG_INJECT_DB		0x00040000
25860021220SAndre Przywara #define KVM_GUESTDBG_INJECT_BP		0x00080000
25960021220SAndre Przywara 
26060021220SAndre Przywara /* for KVM_SET_GUEST_DEBUG */
26160021220SAndre Przywara struct kvm_guest_debug_arch {
26260021220SAndre Przywara 	__u64 debugreg[8];
26360021220SAndre Przywara };
26460021220SAndre Przywara 
26560021220SAndre Przywara struct kvm_pit_state {
26660021220SAndre Przywara 	struct kvm_pit_channel_state channels[3];
26760021220SAndre Przywara };
26860021220SAndre Przywara 
26960021220SAndre Przywara #define KVM_PIT_FLAGS_HPET_LEGACY  0x00000001
27060021220SAndre Przywara 
27160021220SAndre Przywara struct kvm_pit_state2 {
27260021220SAndre Przywara 	struct kvm_pit_channel_state channels[3];
27360021220SAndre Przywara 	__u32 flags;
27460021220SAndre Przywara 	__u32 reserved[9];
27560021220SAndre Przywara };
27660021220SAndre Przywara 
27760021220SAndre Przywara struct kvm_reinject_control {
27860021220SAndre Przywara 	__u8 pit_reinject;
27960021220SAndre Przywara 	__u8 reserved[31];
28060021220SAndre Przywara };
28160021220SAndre Przywara 
28260021220SAndre Przywara /* When set in flags, include corresponding fields on KVM_SET_VCPU_EVENTS */
28360021220SAndre Przywara #define KVM_VCPUEVENT_VALID_NMI_PENDING	0x00000001
28460021220SAndre Przywara #define KVM_VCPUEVENT_VALID_SIPI_VECTOR	0x00000002
28560021220SAndre Przywara #define KVM_VCPUEVENT_VALID_SHADOW	0x00000004
286b37ed70eSAndre Przywara #define KVM_VCPUEVENT_VALID_SMM		0x00000008
28760021220SAndre Przywara 
28860021220SAndre Przywara /* Interrupt shadow states */
28960021220SAndre Przywara #define KVM_X86_SHADOW_INT_MOV_SS	0x01
29060021220SAndre Przywara #define KVM_X86_SHADOW_INT_STI		0x02
29160021220SAndre Przywara 
29260021220SAndre Przywara /* for KVM_GET/SET_VCPU_EVENTS */
29360021220SAndre Przywara struct kvm_vcpu_events {
29460021220SAndre Przywara 	struct {
29560021220SAndre Przywara 		__u8 injected;
29660021220SAndre Przywara 		__u8 nr;
29760021220SAndre Przywara 		__u8 has_error_code;
29860021220SAndre Przywara 		__u8 pad;
29960021220SAndre Przywara 		__u32 error_code;
30060021220SAndre Przywara 	} exception;
30160021220SAndre Przywara 	struct {
30260021220SAndre Przywara 		__u8 injected;
30360021220SAndre Przywara 		__u8 nr;
30460021220SAndre Przywara 		__u8 soft;
30560021220SAndre Przywara 		__u8 shadow;
30660021220SAndre Przywara 	} interrupt;
30760021220SAndre Przywara 	struct {
30860021220SAndre Przywara 		__u8 injected;
30960021220SAndre Przywara 		__u8 pending;
31060021220SAndre Przywara 		__u8 masked;
31160021220SAndre Przywara 		__u8 pad;
31260021220SAndre Przywara 	} nmi;
31360021220SAndre Przywara 	__u32 sipi_vector;
31460021220SAndre Przywara 	__u32 flags;
315b37ed70eSAndre Przywara 	struct {
316b37ed70eSAndre Przywara 		__u8 smm;
317b37ed70eSAndre Przywara 		__u8 pending;
318b37ed70eSAndre Przywara 		__u8 smm_inside_nmi;
319b37ed70eSAndre Przywara 		__u8 latched_init;
320b37ed70eSAndre Przywara 	} smi;
321b37ed70eSAndre Przywara 	__u32 reserved[9];
32260021220SAndre Przywara };
32360021220SAndre Przywara 
32460021220SAndre Przywara /* for KVM_GET/SET_DEBUGREGS */
32560021220SAndre Przywara struct kvm_debugregs {
32660021220SAndre Przywara 	__u64 db[4];
32760021220SAndre Przywara 	__u64 dr6;
32860021220SAndre Przywara 	__u64 dr7;
32960021220SAndre Przywara 	__u64 flags;
33060021220SAndre Przywara 	__u64 reserved[9];
33160021220SAndre Przywara };
33260021220SAndre Przywara 
33360021220SAndre Przywara /* for KVM_CAP_XSAVE */
33460021220SAndre Przywara struct kvm_xsave {
33560021220SAndre Przywara 	__u32 region[1024];
33660021220SAndre Przywara };
33760021220SAndre Przywara 
33860021220SAndre Przywara #define KVM_MAX_XCRS	16
33960021220SAndre Przywara 
34060021220SAndre Przywara struct kvm_xcr {
34160021220SAndre Przywara 	__u32 xcr;
34260021220SAndre Przywara 	__u32 reserved;
34360021220SAndre Przywara 	__u64 value;
34460021220SAndre Przywara };
34560021220SAndre Przywara 
34660021220SAndre Przywara struct kvm_xcrs {
34760021220SAndre Przywara 	__u32 nr_xcrs;
34860021220SAndre Przywara 	__u32 flags;
34960021220SAndre Przywara 	struct kvm_xcr xcrs[KVM_MAX_XCRS];
35060021220SAndre Przywara 	__u64 padding[16];
35160021220SAndre Przywara };
35260021220SAndre Przywara 
35360021220SAndre Przywara /* definition of registers in kvm_run */
35460021220SAndre Przywara struct kvm_sync_regs {
35560021220SAndre Przywara };
35660021220SAndre Przywara 
357b37ed70eSAndre Przywara #define KVM_X86_QUIRK_LINT0_REENABLED	(1 << 0)
358b37ed70eSAndre Przywara #define KVM_X86_QUIRK_CD_NW_CLEARED	(1 << 1)
359b37ed70eSAndre Przywara 
36060021220SAndre Przywara #endif /* _ASM_X86_KVM_H */
361