#ifndef __KVM_H #define __KVM_H /* * The userland / kernel interface was initially defined by the Linux KVM * project. As a part of our efforts to port it, it's important to maintain * compatibility with the portions of that interface that we implement. A side * effect of this is that we require GNU extensions to C. Rather than let a * consumer go crazy trying to understand and track down odd compiler errors, we * explicitly note that this file is not ISO C. */ #ifndef __GNUC__ #error "The KVM Header files require GNU C extensions for compatibility." #endif #include #include #include #include "kvm_x86.h" #define KVM_API_VERSION 12 /* same as linux (for qemu compatability...) */ /* for KVM_CREATE_MEMORY_REGION */ typedef struct kvm_memory_region { uint32_t slot; uint32_t flags; uint64_t guest_phys_addr; uint64_t memory_size; /* bytes */ } kvm_memory_region_t; /* for KVM_SET_USER_MEMORY_REGION */ typedef struct kvm_userspace_memory_region { uint32_t slot; uint32_t flags; uint64_t guest_phys_addr; uint64_t memory_size; /* bytes */ uint64_t userspace_addr; /* start of the userspace allocated memory */ } kvm_userspace_memory_region_t; /* for kvm_memory_region::flags */ #define KVM_MEM_LOG_DIRTY_PAGES 1UL #define KVM_MEMSLOT_INVALID (1UL << 1) /* for KVM_IRQ_LINE */ typedef 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.. */ union { uint32_t irq; int32_t status; }; uint32_t level; } kvm_irq_level_t; typedef struct kvm_irqchip { uint32_t chip_id; uint32_t pad; union { char dummy[512]; /* reserving space */ struct kvm_pic_state pic; struct kvm_ioapic_state ioapic; } chip; } kvm_irqchip_t; /* for KVM_CREATE_PIT2 */ typedef struct kvm_pit_config { uint32_t flags; uint32_t pad[15]; } kvm_pit_config_t; #define KVM_PIT_SPEAKER_DUMMY 1 #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 #define KVM_EXIT_NMI 16 #define KVM_EXIT_INTERNAL_ERROR 17 /* For KVM_EXIT_INTERNAL_ERROR */ #define KVM_INTERNAL_ERROR_EMULATION 1 #define KVM_INTERNAL_ERROR_SIMUL_EX 2 /* for KVM_RUN, returned by mmap(vcpu_fd, offset=0) */ typedef struct kvm_run { /* in */ unsigned char request_interrupt_window; unsigned char padding1[7]; /* out */ uint32_t exit_reason; unsigned char ready_for_interrupt_injection; unsigned char if_flag; unsigned char padding2[2]; /* in (pre_kvm_run), out (post_kvm_run) */ uint64_t cr8; uint64_t apic_base; union { /* KVM_EXIT_UNKNOWN */ struct { uint64_t hardware_exit_reason; } hw; /* KVM_EXIT_FAIL_ENTRY */ struct { uint64_t hardware_entry_failure_reason; } fail_entry; /* KVM_EXIT_EXCEPTION */ struct { uint32_t exception; uint32_t error_code; } ex; /* KVM_EXIT_IO */ struct { #define KVM_EXIT_IO_IN 0 #define KVM_EXIT_IO_OUT 1 unsigned char direction; unsigned char size; /* bytes */ unsigned short port; uint32_t count; uint64_t data_offset; /* relative to kvm_run start */ } io; struct { struct kvm_debug_exit_arch arch; } debug; /* KVM_EXIT_MMIO */ struct { uint64_t phys_addr; unsigned char data[8]; uint32_t len; unsigned char is_write; } mmio; /* KVM_EXIT_HYPERCALL */ struct { uint64_t nr; uint64_t args[6]; uint64_t ret; uint32_t longmode; uint32_t pad; } hypercall; /* KVM_EXIT_TPR_ACCESS */ struct { uint64_t rip; uint32_t is_write; uint32_t pad; } tpr_access; /* KVM_EXIT_DCR */ struct { uint32_t dcrn; uint32_t data; unsigned char is_write; } dcr; struct { uint32_t suberror; /* Available with KVM_CAP_INTERNAL_ERROR_DATA: */ uint32_t ndata; uint64_t data[16]; } internal; /* Fix the size of the union. */ char padding[256]; }; } kvm_run_t; typedef struct kvm_coalesced_mmio_zone { uint64_t addr; uint32_t size; uint32_t pad; } kvm_coalesced_mmio_zone_t; typedef struct kvm_coalesced_mmio { uint64_t phys_addr; uint32_t len; uint32_t pad; unsigned char data[8]; } kvm_coalesced_mmio_t; typedef struct kvm_coalesced_mmio_ring { uint32_t first, last; struct kvm_coalesced_mmio coalesced_mmio[1]; } kvm_coalesced_mmio_ring_t; #define KVM_COALESCED_MMIO_MAX \ ((PAGESIZE - sizeof (struct kvm_coalesced_mmio_ring)) / \ sizeof (struct kvm_coalesced_mmio)) /* for KVM_INTERRUPT */ typedef struct kvm_interrupt { /* in */ uint32_t irq; } kvm_interrupt_t; /* for KVM_GET_DIRTY_LOG */ typedef struct kvm_dirty_log { uint32_t slot; uint32_t padding1; union { void *dirty_bitmap; /* one bit per page */ uint64_t padding2; }; } kvm_dirty_log_t; /* for KVM_SET_SIGNAL_MASK */ typedef struct kvm_signal_mask { uint32_t len; uint8_t sigset[1]; } kvm_signal_mask_t; /* for KVM_TPR_ACCESS_REPORTING */ typedef struct kvm_tpr_access_ctl { uint32_t enabled; uint32_t flags; uint32_t reserved[8]; } kvm_tpr_access_ctl_t; /* for KVM_SET_VAPIC_ADDR */ typedef struct kvm_vapic_addr { uint64_t vapic_addr; } kvm_vapic_addr_t; /* for KVM_SET_MP_STATE */ #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 typedef struct kvm_mp_state { uint32_t mp_state; } kvm_mp_state_t; /* for KVM_SET_GUEST_DEBUG */ #define KVM_GUESTDBG_ENABLE 0x00000001 #define KVM_GUESTDBG_SINGLESTEP 0x00000002 typedef struct kvm_guest_debug { uint32_t control; uint32_t pad; struct kvm_guest_debug_arch arch; } kvm_guest_debug_t; /* ioctl commands */ #define KVMIO 0xAE /* * 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_CLONE _IO(KVMIO, 0x20) #define KVM_NET_QUEUE _IO(KVMIO, 0x21) /* * 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) /* * 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 #define KVM_CAP_NR_MEMSLOTS 10 #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 #ifdef __KVM_HAVE_DEVICE_ASSIGNMENT #define KVM_CAP_DEVICE_ASSIGNMENT 17 #endif #define KVM_CAP_IOMMU 18 #ifdef __KVM_HAVE_MSI #define KVM_CAP_DEVICE_MSI 20 #endif /* Bug in KVM_SET_USER_MEMORY_REGION fixed: */ #define KVM_CAP_DESTROY_MEMORY_REGION_WORKS 21 #define KVM_CAP_USER_NMI 22 #ifdef __KVM_HAVE_GUEST_DEBUG #define KVM_CAP_SET_GUEST_DEBUG 23 #endif #define KVM_CAP_REINJECT_CONTROL 24 #define KVM_CAP_IRQ_ROUTING 25 #define KVM_CAP_IRQ_INJECT_STATUS 26 #ifdef __KVM_HAVE_DEVICE_ASSIGNMENT #define KVM_CAP_DEVICE_DEASSIGNMENT 27 #endif #ifdef __KVM_HAVE_MSIX #define KVM_CAP_DEVICE_MSIX 28 #endif #define KVM_CAP_ASSIGN_DEV_IRQ 29 /* Another bug in KVM_SET_USER_MEMORY_REGION fixed: */ #define KVM_CAP_JOIN_MEMORY_REGIONS_WORKS 30 #define KVM_CAP_MCE 31 #define KVM_CAP_IRQFD 32 #define KVM_CAP_PIT2 33 #define KVM_CAP_SET_BOOT_CPU_ID 34 #define KVM_CAP_PIT_STATE2 35 #define KVM_CAP_IOEVENTFD 36 #define KVM_CAP_SET_IDENTITY_MAP_ADDR 37 #define KVM_CAP_XEN_HVM 38 #define KVM_CAP_ADJUST_CLOCK 39 #define KVM_CAP_INTERNAL_ERROR_DATA 40 #define KVM_CAP_VCPU_EVENTS 41 #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_X86_ROBUST_SINGLESTEP 51 #ifdef KVM_CAP_IRQ_ROUTING typedef struct kvm_irq_routing_irqchip { uint32_t irqchip; uint32_t pin; } kvm_irq_routing_irqchip_t; typedef struct kvm_irq_routing_msi { uint32_t address_lo; uint32_t address_hi; uint32_t data; uint32_t pad; } kvm_irq_routing_msi_t; /* gsi routing entry types */ #define KVM_IRQ_ROUTING_IRQCHIP 1 #define KVM_IRQ_ROUTING_MSI 2 typedef struct kvm_irq_routing_entry { uint32_t gsi; uint32_t type; uint32_t flags; uint32_t pad; union { struct kvm_irq_routing_irqchip irqchip; struct kvm_irq_routing_msi msi; uint32_t pad[8]; } u; } kvm_irq_routing_entry_t; typedef struct kvm_irq_routing { uint32_t nr; uint32_t flags; struct kvm_irq_routing_entry entries[1]; } kvm_irq_routing_t; #endif /* KVM_CAP_IRQ_ROUTING */ #ifdef KVM_CAP_MCE /* x86 MCE */ typedef struct kvm_x86_mce { uint64_t status; uint64_t addr; uint64_t misc; uint64_t mcg_status; uint8_t bank; uint8_t pad1[7]; uint64_t pad2[3]; } kvm_x86_mce_t; #endif /* KVM_CAP_MCE */ typedef struct kvm_clock_data { uint64_t clock; uint32_t flags; uint32_t pad[9]; } kvm_clock_data_t; /* * ioctls for VM fds */ /* * 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) #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, uint64_t) /* 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_CREATE_PIT2 _IOW(KVMIO, 0x77, struct kvm_pit_config) #define KVM_SET_BOOT_CPU_ID _IO(KVMIO, 0x78) #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) /* * 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_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) #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_NMI */ #define KVM_NMI _IO(KVMIO, 0x9a) /* MCE for x86 */ #define KVM_X86_SETUP_MCE _IOW(KVMIO, 0x9c, uint64_t) #define KVM_X86_GET_MCE_CAP_SUPPORTED _IOR(KVMIO, 0x9d, uint64_t) #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) #endif /* __KVM_H */