mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-27 03:10:12 +00:00
![Avi Kivity](/assets/img/avatar_default.png)
One of the use cases for the supported cpuid list is to create a "greatest common denominator" of cpu capabilities in a server farm. As such, it is useful to be able to get the list without creating a virtual machine first. Since the code does not depend on the vm in any way, all that is needed is to move it to the device ioctl handler. The capability identifier is also changed so that binaries made against -rc1 will fail gracefully. Signed-off-by: Avi Kivity <avi@qumranet.com>
285 lines
7.1 KiB
C
285 lines
7.1 KiB
C
#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 <asm/types.h>
|
|
#include <linux/ioctl.h>
|
|
#include <asm/kvm.h>
|
|
|
|
#define KVM_API_VERSION 12
|
|
|
|
/* for KVM_CREATE_MEMORY_REGION */
|
|
struct kvm_memory_region {
|
|
__u32 slot;
|
|
__u32 flags;
|
|
__u64 guest_phys_addr;
|
|
__u64 memory_size; /* bytes */
|
|
};
|
|
|
|
/* 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_memory_region::flags */
|
|
#define KVM_MEM_LOG_DIRTY_PAGES 1UL
|
|
|
|
|
|
/* 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..
|
|
*/
|
|
__u32 irq;
|
|
__u32 level;
|
|
};
|
|
|
|
|
|
struct kvm_irqchip {
|
|
__u32 chip_id;
|
|
__u32 pad;
|
|
union {
|
|
char dummy[512]; /* reserving space */
|
|
#ifdef CONFIG_X86
|
|
struct kvm_pic_state pic;
|
|
#endif
|
|
#if defined(CONFIG_X86) || defined(CONFIG_IA64)
|
|
struct kvm_ioapic_state ioapic;
|
|
#endif
|
|
} chip;
|
|
};
|
|
|
|
#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
|
|
|
|
/* for KVM_RUN, returned by mmap(vcpu_fd, offset=0) */
|
|
struct kvm_run {
|
|
/* in */
|
|
__u8 request_interrupt_window;
|
|
__u8 padding1[7];
|
|
|
|
/* out */
|
|
__u32 exit_reason;
|
|
__u8 ready_for_interrupt_injection;
|
|
__u8 if_flag;
|
|
__u8 padding2[2];
|
|
|
|
/* in (pre_kvm_run), out (post_kvm_run) */
|
|
__u64 cr8;
|
|
__u64 apic_base;
|
|
|
|
union {
|
|
/* KVM_EXIT_UNKNOWN */
|
|
struct {
|
|
__u64 hardware_exit_reason;
|
|
} hw;
|
|
/* KVM_EXIT_FAIL_ENTRY */
|
|
struct {
|
|
__u64 hardware_entry_failure_reason;
|
|
} fail_entry;
|
|
/* KVM_EXIT_EXCEPTION */
|
|
struct {
|
|
__u32 exception;
|
|
__u32 error_code;
|
|
} ex;
|
|
/* KVM_EXIT_IO */
|
|
struct kvm_io {
|
|
#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;
|
|
struct {
|
|
} debug;
|
|
/* KVM_EXIT_MMIO */
|
|
struct {
|
|
__u64 phys_addr;
|
|
__u8 data[8];
|
|
__u32 len;
|
|
__u8 is_write;
|
|
} mmio;
|
|
/* KVM_EXIT_HYPERCALL */
|
|
struct {
|
|
__u64 nr;
|
|
__u64 args[6];
|
|
__u64 ret;
|
|
__u32 longmode;
|
|
__u32 pad;
|
|
} hypercall;
|
|
/* KVM_EXIT_TPR_ACCESS */
|
|
struct {
|
|
__u64 rip;
|
|
__u32 is_write;
|
|
__u32 pad;
|
|
} tpr_access;
|
|
/* Fix the size of the union. */
|
|
char padding[256];
|
|
};
|
|
};
|
|
|
|
/* 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;
|
|
};
|
|
|
|
struct kvm_breakpoint {
|
|
__u32 enabled;
|
|
__u32 padding;
|
|
__u64 address;
|
|
};
|
|
|
|
/* for KVM_DEBUG_GUEST */
|
|
struct kvm_debug_guest {
|
|
/* int */
|
|
__u32 enabled;
|
|
__u32 pad;
|
|
struct kvm_breakpoint breakpoints[4];
|
|
__u32 singlestep;
|
|
};
|
|
|
|
/* for KVM_GET_DIRTY_LOG */
|
|
struct kvm_dirty_log {
|
|
__u32 slot;
|
|
__u32 padding;
|
|
union {
|
|
void __user *dirty_bitmap; /* one bit per page */
|
|
__u64 padding;
|
|
};
|
|
};
|
|
|
|
/* for KVM_SET_SIGNAL_MASK */
|
|
struct kvm_signal_mask {
|
|
__u32 len;
|
|
__u8 sigset[0];
|
|
};
|
|
|
|
/* 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;
|
|
};
|
|
|
|
#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)
|
|
/*
|
|
* 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
|
|
|
|
/*
|
|
* ioctls for VM fds
|
|
*/
|
|
#define KVM_SET_MEMORY_REGION _IOW(KVMIO, 0x40, struct kvm_memory_region)
|
|
#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)
|
|
/*
|
|
* 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_MEMORY_ALIAS _IOW(KVMIO, 0x43, struct kvm_memory_alias)
|
|
/* 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)
|
|
|
|
/*
|
|
* 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_DEBUG_GUEST _IOW(KVMIO, 0x87, struct kvm_debug_guest)
|
|
#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)
|
|
|
|
#endif
|