diff options
author | Robert Mustacchi <rm@joyent.com> | 2011-06-04 16:06:06 -0700 |
---|---|---|
committer | Robert Mustacchi <rm@joyent.com> | 2011-06-04 16:06:06 -0700 |
commit | 518253a6f4b959ff830df42cb30e44e0da4836db (patch) | |
tree | 856bff42851ea6735e775b109894e5505c70e634 /kvm.h | |
parent | 0e20210cdbb940ca91007d08ff1984c4286776a1 (diff) | |
download | illumos-kvm-518253a6f4b959ff830df42cb30e44e0da4836db.tar.gz |
HVM-288 kvm.h and kvm_host.h should be similar to upstream in content
Diffstat (limited to 'kvm.h')
-rw-r--r-- | kvm.h | 2094 |
1 files changed, 286 insertions, 1808 deletions
@@ -1,536 +1,46 @@ -#ifndef SOLARIS_KVM_H -#define SOLARIS_KVM_H +#ifndef __KVM_H +#define __KVM_H -#include <sys/list.h> #include <sys/types.h> -#include <sys/kstat.h> -#include <sys/ddi.h> -#include <sys/sunddi.h> -#include <sys/sdt.h> -#include <sys/avl.h> -#undef _ASM /* cyclic.h expects this not defined */ -#include <sys/cyclic.h> -#define _ASM -#include <sys/atomic.h> -#include "kvm_types.h" - -#define XXX_KVM_PROBE DTRACE_PROBE2(kvm__xxx, \ - char *, __FILE__, int, __LINE__) -#define XXX_KVM_SYNC_PROBE DTRACE_PROBE2(kvm__xxx__sync, \ - char *, __FILE__, int, __LINE__) - -#define KVM_CPUALL -1 -typedef void (*kvm_xcall_t)(void *); - -#ifdef _KERNEL -#include "bitops.h" -#ifdef CONFIG_MMU_NOTIFIER -#include "mmu_notifier.h" -#endif /*CONFIG_MMU_NOTIFIER*/ -#endif /*_KERNEL*/ +#include <sys/param.h> +#include "kvm_x86.h" #define KVM_API_VERSION 12 /* same as linux (for qemu compatability...) */ -#ifndef offsetof -#define offsetof(s, m) ((size_t)(&((s *)0)->m)) -#endif - -#define offset_in_page(p) ((unsigned long)(p) & ~PAGEMASK) - -/* borrowed liberally from linux... */ - -#define MAX_IO_MSRS 256 -#define CR0_RESERVED_BITS \ - (~(unsigned long)(X86_CR0_PE | X86_CR0_MP | X86_CR0_EM | X86_CR0_TS \ - | X86_CR0_ET | X86_CR0_NE | X86_CR0_WP | X86_CR0_AM \ - | X86_CR0_NW | X86_CR0_CD | X86_CR0_PG)) -#define CR4_RESERVED_BITS \ - (~(unsigned long)(X86_CR4_VME | X86_CR4_PVI | X86_CR4_TSD | X86_CR4_DE\ - | X86_CR4_PSE | X86_CR4_PAE | X86_CR4_MCE \ - | X86_CR4_PGE | X86_CR4_PCE | X86_CR4_OSFXSR \ - | X86_CR4_OSXMMEXCPT | X86_CR4_VMXE)) - -#define CR8_RESERVED_BITS (~(unsigned long)X86_CR8_TPR) - -#define KVM_MAX_VCPUS 64 - -#ifdef _KERNEL -#define MCG_CTL_P (1ULL<<8) /* MCG_CTL register available */ -#endif /*_KERNEL*/ - -#define KVM_MAX_MCE_BANKS 32 -#define KVM_MCE_CAP_SUPPORTED MCG_CTL_P - -#ifdef __ASSEMBLY__ -# define __IA64_UL(x) (x) -# define __IA64_UL_CONST(x) x - -#else -# define __IA64_UL(x) ((unsigned long)(x)) -# define __IA64_UL_CONST(x) x##UL -#endif - -/* - * This must match KVM_IA64_VCPU_STACK_{SHIFT,SIZE} arch/ia64/include/asm/kvm.h - */ -#define KVM_STK_SHIFT 16 -#define KVM_STK_OFFSET (__IA64_UL_CONST(1)<< KVM_STK_SHIFT) - -#define KVM_VM_STRUCT_SHIFT 19 -#define KVM_VM_STRUCT_SIZE (__IA64_UL_CONST(1) << KVM_VM_STRUCT_SHIFT) - -#define KVM_MEM_DIRY_LOG_SHIFT 19 -#define KVM_MEM_DIRTY_LOG_SIZE (__IA64_UL_CONST(1) << KVM_MEM_DIRY_LOG_SHIFT) - - -#define KVM_VM_BUFFER_BASE (KVM_VMM_BASE + VMM_SIZE) -#define KVM_VM_BUFFER_SIZE (__IA64_UL_CONST(8)<<20) - -/* - * kvm guest's data area looks as follow: - * - * +----------------------+ ------- KVM_VM_DATA_SIZE - * | vcpu[n]'s data | | ___________________KVM_STK_OFFSET - * | | | / | - * | .......... | | /vcpu's struct&stack | - * | .......... | | /---------------------|---- 0 - * | vcpu[5]'s data | | / vpd | - * | vcpu[4]'s data | |/-----------------------| - * | vcpu[3]'s data | / vtlb | - * | vcpu[2]'s data | /|------------------------| - * | vcpu[1]'s data |/ | vhpt | - * | vcpu[0]'s data |____________________________| - * +----------------------+ | - * | memory dirty log | | - * +----------------------+ | - * | vm's data struct | | - * +----------------------+ | - * | | | - * | | | - * | | | - * | | | - * | | | - * | | | - * | | | - * | vm's p2m table | | - * | | | - * | | | - * | | | | - * vm's data->| | | | - * +----------------------+ ------- 0 - * To support large memory, needs to increase the size of p2m. - * To support more vcpus, needs to ensure it has enough space to - * hold vcpus' data. - */ - -#define KVM_VM_DATA_SHIFT 26 -#define KVM_VM_DATA_SIZE (__IA64_UL_CONST(1) << KVM_VM_DATA_SHIFT) -#define KVM_VM_DATA_BASE (KVM_VMM_BASE + KVM_VM_DATA_SIZE) - -#define KVM_P2M_BASE KVM_VM_DATA_BASE -#define KVM_P2M_SIZE (__IA64_UL_CONST(24) << 20) - -/*Define the max vcpus and memory for Guests.*/ -#define KVM_MAX_MEM_SIZE (KVM_P2M_SIZE >> 3 << PAGESHIFT) - -#define VMM_LOG_LEN 256 - -#define VHPT_SHIFT 16 -#define VHPT_SIZE (__IA64_UL_CONST(1) << VHPT_SHIFT) -#define VHPT_NUM_ENTRIES (__IA64_UL_CONST(1) << (VHPT_SHIFT-5)) - -#define VTLB_SHIFT 16 -#define VTLB_SIZE (__IA64_UL_CONST(1) << VTLB_SHIFT) -#define VTLB_NUM_ENTRIES (1UL << (VHPT_SHIFT-5)) - -#define VPD_SHIFT 16 -#define VPD_SIZE (__IA64_UL_CONST(1) << VPD_SHIFT) - -#define VCPU_STRUCT_SHIFT 16 -#define VCPU_STRUCT_SIZE (__IA64_UL_CONST(1) << VCPU_STRUCT_SHIFT) - -#define KVM_NR_PAGE_SIZES 3 /* XXX assumes x86 */ - -#ifdef _KERNEL -typedef struct kvm_vcpu_data { - char vcpu_vhpt[VHPT_SIZE]; - char vcpu_vtlb[VTLB_SIZE]; - char vcpu_vpd[VPD_SIZE]; - char vcpu_struct[VCPU_STRUCT_SIZE]; -} kvm_vcpu_data_t; - -typedef struct kvm_vm_data { - char kvm_p2m[KVM_P2M_SIZE]; - char kvm_vm_struct[KVM_VM_STRUCT_SIZE]; - char kvm_mem_dirty_log[KVM_MEM_DIRTY_LOG_SIZE]; - struct kvm_vcpu_data vcpu_data[KVM_MAX_VCPUS]; -} kvm_vm_data_t; - -/* - * We don't want allocation failures within the mmu code, so we preallocate - * enough memory for a single page fault in a cache. - */ - - -#define KVM_NR_DB_REGS 4 - -/* - * fxsave fpu state. Taken from x86_64/processor.h. To be killed when - * we have asm/x86/processor.h - */ -typedef struct fxsave { - uint16_t cwd; - uint16_t swd; - uint16_t twd; - uint16_t fop; - uint64_t rip; - uint64_t rdp; - uint32_t mxcsr; - uint32_t mxcsr_mask; - uint32_t st_space[32]; /* 8*16 bytes for each FP-reg = 128 bytes */ -#ifdef CONFIG_X86_64 - uint32_t xmm_space[64]; /* 16*16 bytes for each XMM-reg = 256 bytes */ -#else - uint32_t xmm_space[32]; /* 8*16 bytes for each XMM-reg = 128 bytes */ -#endif -} fxsave_t; - -#endif /*_KERNEL*/ - -#define KVM_MAX_CPUID_ENTRIES 40 - -#define KVM_POSSIBLE_CR0_GUEST_BITS X86_CR0_TS -#define KVM_POSSIBLE_CR4_GUEST_BITS \ - (X86_CR4_PVI | X86_CR4_DE | X86_CR4_PCE | X86_CR4_OSFXSR \ - | X86_CR4_OSXMMEXCPT | X86_CR4_PGE) - - -#ifndef CONFIG_X86_64 -#define mod_64(x, y) ((x) - (y) * div64_u64(x, y)) -#else -#define mod_64(x, y) ((x) % (y)) -#endif - -#ifdef _KERNEL -#include "kvm_emulate.h" - - -#endif /*_KERNEL*/ - -#define APIC_LDR 0xD0 - -#define APIC_LVT_NUM 6 -/* 14 is the version for Xeon and Pentium 8.4.8*/ -#define APIC_VERSION (0x14UL | ((APIC_LVT_NUM - 1) << 16)) -#define LAPIC_MMIO_LENGTH (1 << 12) -/* followed define is not in apicdef.h */ -#define APIC_SHORT_MASK 0xc0000 -#define APIC_DEST_NOSHORT 0x0 -#define APIC_DEST_MASK 0x800 -#define MAX_APIC_VECTOR 256 - -#define KVM_IOAPIC_NUM_PINS 24 - -#ifndef ARRAY_SIZE -#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0])) -#endif /*ARRAY_SIZE*/ - -#define LVT_MASK \ - (APIC_LVT_MASKED | APIC_SEND_PENDING | APIC_VECTOR_MASK) - -#define LINT_MASK \ - (LVT_MASK | APIC_MODE_MASK | APIC_INPUT_POLARITY | \ - APIC_LVT_REMOTE_IRR | APIC_LVT_LEVEL_TRIGGER) - -#ifdef _KERNEL - -/* XXX This shouldn't be necessary */ -#include "kvm_timer.h" - -struct vcpu_vmx; -struct kvm_user_return_notifier; - -typedef struct kvm_vcpu_stats { - kstat_named_t kvmvs_id; /* instance of associated kvm */ - kstat_named_t kvmvs_nmi_injections; /* number of NMI injections */ - kstat_named_t kvmvs_irq_injections; /* number of IRQ injections */ - kstat_named_t kvmvs_fpu_reload; /* number of FPU reloads */ - kstat_named_t kvmvs_host_state_reload; /* host state (re)loads */ - kstat_named_t kvmvs_insn_emulation; /* instruction emulation */ - kstat_named_t kvmvs_insn_emulation_fail; /* emulation failures */ - kstat_named_t kvmvs_exits; /* total VM exits */ - kstat_named_t kvmvs_halt_exits; /* exits due to HLT */ - kstat_named_t kvmvs_irq_exits; /* exits due to IRQ */ - kstat_named_t kvmvs_io_exits; /* exits due to I/O instrn */ - kstat_named_t kvmvs_mmio_exits; /* exits due to mem mppd I/O */ - kstat_named_t kvmvs_nmi_window_exits; /* exits due to NMI window */ - kstat_named_t kvmvs_irq_window_exits; /* exits due to IRQ window */ - kstat_named_t kvmvs_request_irq_exits; /* exits due to requested IRQ */ - kstat_named_t kvmvs_signal_exits; /* exits due to pending sig */ - kstat_named_t kvmvs_halt_wakeup; /* wakeups from HLT */ - kstat_named_t kvmvs_invlpg; /* INVLPG instructions */ - kstat_named_t kvmvs_pf_guest; /* injected guest pagefaults */ - kstat_named_t kvmvs_pf_fixed; /* fixed pagefaults */ - kstat_named_t kvmvs_hypercalls; /* hypercalls (VMCALL instrn) */ -} kvm_vcpu_stats_t; - -#define KVM_VCPU_KSTAT_INIT(vcpu, field, name) \ - kstat_named_init(&((vcpu)->kvcpu_stats.field), name, KSTAT_DATA_UINT64); - -#define KVM_VCPU_KSTAT_INC(vcpu, field) \ - (vcpu)->kvcpu_stats.field.value.ui64++; - -typedef struct kvm_vcpu { - struct kvm *kvm; -#ifdef CONFIG_PREEMPT_NOTIFIERS - struct preempt_notifier preempt_notifier; -#endif - int vcpu_id; - kmutex_t mutex; - int cpu; - struct kvm_run *run; - unsigned long requests; - unsigned long guest_debug; - int srcu_idx; - - int fpu_active; - int guest_fpu_loaded; - - kmutex_t kvcpu_kick_lock; - kcondvar_t kvcpu_kick_cv; - kvm_vcpu_stats_t kvcpu_stats; - kstat_t *kvcpu_kstat; - - int sigset_active; - sigset_t sigset; - - /*#ifdef CONFIG_HAS_IOMEM*/ - int mmio_needed; - int mmio_read_completed; - int mmio_is_write; - int mmio_size; - unsigned char mmio_data[8]; - gpa_t mmio_phys_addr; - /*#endif*/ - - struct kvm_vcpu_arch arch; - ddi_umem_cookie_t cookie; - struct kvm_user_return_notifier *urn; -} kvm_vcpu_t; - -#define KVM_NR_SHARED_MSRS 16 - -typedef struct kvm_shared_msrs_global { - int nr; - uint32_t msrs[KVM_NR_SHARED_MSRS]; -} kvm_shared_msrs_global_t; - -typedef struct kvm_user_return_notifier { - void (*on_user_return)(struct kvm_vcpu *, - struct kvm_user_return_notifier *); -} kvm_user_return_notifier_t; - -typedef struct kvm_shared_msrs { - struct kvm_user_return_notifier urn; - int registered; - struct kvm_shared_msr_values { - uint64_t host; - uint64_t curr; - } values[KVM_NR_SHARED_MSRS]; -} kvm_shared_msrs_t; - -typedef struct kvm_memory_slot { - gfn_t base_gfn; - unsigned long npages; - unsigned long flags; - unsigned long *rmap; - unsigned long *dirty_bitmap; - struct { - unsigned long rmap_pde; - int write_count; - } *lpage_info[KVM_NR_PAGE_SIZES]; - unsigned long userspace_addr; - int user_alloc; -} kvm_memory_slot_t; - - -typedef struct kvm_memslots { - int nmemslots; - struct kvm_memory_slot memslots[KVM_MEMORY_SLOTS + - KVM_PRIVATE_MEM_SLOTS]; -} kvm_memslots_t; - -#endif /*_KERNEL*/ - -#ifdef x86 - - -#define KVM_ALIAS_SLOTS 4 - -#define KVM_HPAGE_SHIFT(x) (PAGESHIFT + (((x) - 1) * 9)) -#define KVM_HPAGE_MASK(x) (~(KVM_HPAGE_SIZE(x) - 1)) -#define KVM_PAGES_PER_HPAGE(x) (KVM_HPAGE_SIZE(x) / PAGESIZE) - -#define DE_VECTOR 0 -#define DB_VECTOR 1 -#define BP_VECTOR 3 -#define OF_VECTOR 4 -#define BR_VECTOR 5 -#define UD_VECTOR 6 -#define NM_VECTOR 7 -#define DF_VECTOR 8 -#define TS_VECTOR 10 -#define NP_VECTOR 11 -#define SS_VECTOR 12 -#define GP_VECTOR 13 -#define PF_VECTOR 14 -#define MF_VECTOR 16 -#define MC_VECTOR 18 - -#define SELECTOR_TI_MASK (1 << 2) -#define SELECTOR_RPL_MASK 0x03 - -#define IOPL_SHIFT 12 - -#define KVM_ALIAS_SLOTS 4 - -#define KVM_PERMILLE_MMU_PAGES 20 -#define KVM_MIN_ALLOC_MMU_PAGES 64 -#define KVM_MMU_HASH_SHIFT 10 -#define KVM_NUM_MMU_PAGES (1 << KVM_MMU_HASH_SHIFT) -#define KVM_MIN_FREE_MMU_PAGES 5 -#define KVM_REFILL_PAGES 25 - -#define KVM_NR_FIXED_MTRR_REGION 88 -#define KVM_NR_VAR_MTRR 8 - -#ifdef _KERNEL -extern kmutex_t kvm_lock; -extern list_t vm_list; -#endif /*_KERNEL*/ - -#define KVM_USERSPACE_IRQ_SOURCE_ID 0 - -/* - * 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 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 */ -#ifdef __KVM_HAVE_DEVICE_ASSIGNMENT -#define KVM_CAP_DEVICE_ASSIGNMENT 17 -#endif -#define KVM_CAP_IOMMU 18 - -/* For vcpu->arch.iommu_flags */ -#define KVM_IOMMU_CACHE_COHERENCY 0x1 - -#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 -#ifdef __KVM_HAVE_USER_NMI -#define KVM_CAP_USER_NMI 22 -#endif -#ifdef __KVM_HAVE_GUEST_DEBUG -#define KVM_CAP_SET_GUEST_DEBUG 23 -#endif -#define KVM_CAP_REINJECT_CONTROL 24 -#ifdef __KVM_HAVE_IOAPIC -#define KVM_CAP_IRQ_ROUTING 25 -#endif -#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 +/* 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; -#define KVM_IRQCHIP_PIC_MASTER 0 -#define KVM_IRQCHIP_PIC_SLAVE 1 -#define KVM_IRQCHIP_IOAPIC 2 -#define KVM_NR_IRQCHIPS 3 +/* 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_GET_IRQCHIP and KVM_SET_IRQCHIP */ -typedef struct kvm_pic_state { - uint8_t last_irr; /* edge detection */ - uint8_t irr; /* interrupt request register */ - uint8_t imr; /* interrupt mask register */ - uint8_t isr; /* interrupt service register */ - uint8_t priority_add; /* highest irq priority */ - uint8_t irq_base; - uint8_t read_reg_select; - uint8_t poll; - uint8_t special_mask; - uint8_t init_state; - uint8_t auto_eoi; - uint8_t rotate_on_auto_eoi; - uint8_t special_fully_nested_mode; - uint8_t init4; /* true if 4 byte init */ - uint8_t elcr; /* PIIX edge/trigger selection */ - uint8_t elcr_mask; -} kvm_pic_state_t; +/* for kvm_memory_region::flags */ +#define KVM_MEM_LOG_DIRTY_PAGES 1UL +#define KVM_MEMSLOT_INVALID (1UL << 1) -#define KVM_IOAPIC_NUM_PINS 24 -typedef struct kvm_ioapic_state { - uint64_t base_address; - uint32_t ioregsel; - uint32_t id; - uint32_t irr; - uint32_t pad; +/* 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 { - uint64_t bits; - struct { - uint8_t vector; - uint8_t delivery_mode:3; - uint8_t dest_mode:1; - uint8_t delivery_status:1; - uint8_t polarity:1; - uint8_t remote_irr:1; - uint8_t trig_mode:1; - uint8_t mask:1; - uint8_t reserve:7; - uint8_t reserved[4]; - uint8_t dest_id; - } fields; - } redirtbl[KVM_IOAPIC_NUM_PINS]; -} kvm_ioapic_state_t; + uint32_t irq; + int32_t status; + }; + uint32_t level; +} kvm_irq_level_t; typedef struct kvm_irqchip { uint32_t chip_id; @@ -548,526 +58,7 @@ typedef struct kvm_pit_config { uint32_t pad[15]; } kvm_pit_config_t; -/* for KVM_GET_REGS and KVM_SET_REGS */ -typedef struct kvm_regs { - /* out (KVM_GET_REGS) / in (KVM_SET_REGS) */ - uint64_t rax, rbx, rcx, rdx; - uint64_t rsi, rdi, rsp, rbp; - uint64_t r8, r9, r10, r11; - uint64_t r12, r13, r14, r15; - uint64_t rip, rflags; -} kvm_regs_t; - -typedef struct kvm_mp_state { - uint32_t mp_state; -} kvm_mp_state_t; - -/* for KVM_GET_LAPIC and KVM_SET_LAPIC */ -#define KVM_APIC_REG_SIZE 0x400 -typedef struct kvm_lapic_state { - char regs[KVM_APIC_REG_SIZE]; -} kvm_lapic_state_t; - -typedef struct kvm_dtable { - uint64_t base; - unsigned short limit; - unsigned short padding[3]; -} kvm_dtable_t; - -/* Architectural interrupt line count. */ -#define KVM_NR_INTERRUPTS 256 - - -typedef struct kvm_vmx_segment_field { - unsigned selector; - unsigned base; - unsigned limit; - unsigned ar_bytes; -} kvm_vmx_segment_field_t; - -/* for KVM_GET_SREGS and KVM_SET_SREGS */ -typedef struct kvm_sregs { - /* out (KVM_GET_SREGS) / in (KVM_SET_SREGS) */ - struct kvm_segment cs, ds, es, fs, gs, ss; - struct kvm_segment tr, ldt; - struct kvm_dtable gdt, idt; - uint64_t cr0, cr2, cr3, cr4, cr8; - uint64_t efer; - uint64_t apic_base; - unsigned long interrupt_bitmap[(KVM_NR_INTERRUPTS + (64-1)) / 64]; /*XXX 64 = bits in unsigned long*/ -} kvm_sregs_t; - -/* When set in flags, include corresponding fields on KVM_SET_VCPU_EVENTS */ -#define KVM_VCPUEVENT_VALID_NMI_PENDING 0x00000001 -#define KVM_VCPUEVENT_VALID_SIPI_VECTOR 0x00000002 - -/* for KVM_GET/SET_VCPU_EVENTS */ -typedef struct kvm_vcpu_events { - struct { - unsigned char injected; - unsigned char nr; - unsigned char has_error_code; - unsigned char pad; - uint32_t error_code; - } exception; - struct { - unsigned char injected; - unsigned char nr; - unsigned char soft; - unsigned char pad; - } interrupt; - struct { - unsigned char injected; - unsigned char pending; - unsigned char masked; - unsigned char pad; - } nmi; - uint32_t sipi_vector; - uint32_t flags; - uint32_t reserved[10]; -} kvm_vcpu_events_t; - -#define KVM_CAP_IRQ_ROUTING 25 - -#ifdef KVM_CAP_IRQ_ROUTING -typedef struct kvm_irq_routing_irqchip { - uint32_t irqchip; - uint32_t pin; -} kvm_irq_routing_irqchip_t; - -/* - * Shift/mask fields for msi address - */ - -#define MSI_ADDR_BASE_HI 0 -#define MSI_ADDR_BASE_LO 0xfee00000 - -#define MSI_ADDR_DEST_MODE_SHIFT 2 -#define MSI_ADDR_DEST_MODE_PHYSICAL (0 << MSI_ADDR_DEST_MODE_SHIFT) -#define MSI_ADDR_DEST_MODE_LOGICAL (1 << MSI_ADDR_DEST_MODE_SHIFT) - -#define MSI_ADDR_REDIRECTION_SHIFT 3 -#define MSI_ADDR_REDIRECTION_CPU (0 << MSI_ADDR_REDIRECTION_SHIFT) - /* dedicated cpu */ -#define MSI_ADDR_REDIRECTION_LOWPRI (1 << MSI_ADDR_REDIRECTION_SHIFT) - /* lowest priority */ - -#define MSI_ADDR_DEST_ID_SHIFT 12 -#define MSI_ADDR_DEST_ID_MASK 0x00ffff0 -#define MSI_ADDR_DEST_ID(dest) (((dest) << MSI_ADDR_DEST_ID_SHIFT) & \ - MSI_ADDR_DEST_ID_MASK) -#define MSI_ADDR_EXT_DEST_ID(dest) ((dest) & 0xffffff00) - -#define MSI_ADDR_IR_EXT_INT (1 << 4) -#define MSI_ADDR_IR_SHV (1 << 3) -#define MSI_ADDR_IR_INDEX1(index) ((index & 0x8000) >> 13) -#define MSI_ADDR_IR_INDEX2(index) ((index & 0x7fff) << 5) -#define MSI_DATA_VECTOR_SHIFT 0 -#define MSI_DATA_VECTOR_MASK 0x000000ff -#define MSI_DATA_VECTOR(v) (((v) << MSI_DATA_VECTOR_SHIFT) & \ - MSI_DATA_VECTOR_MASK) -#define MSI_DATA_TRIGGER_SHIFT 15 -#define MSI_DATA_TRIGGER_EDGE (0 << MSI_DATA_TRIGGER_SHIFT) -#define MSI_DATA_TRIGGER_LEVEL (1 << MSI_DATA_TRIGGER_SHIFT) - -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 - -#define KVM_MAX_MCE_BANKS 32 -#define KVM_MCE_CAP_SUPPORTED MCG_CTL_P - - -struct kvm_vcpu; -struct kvm; - -typedef struct kvm_irq_ack_notifier { - list_t link; - unsigned gsi; - void (*irq_acked)(struct kvm_irq_ack_notifier *kian); -} kvm_irq_ack_notifier_t; - -#define KVM_ASSIGNED_MSIX_PENDING 0x1 -typedef struct kvm_guest_msix_entry { - uint32_t vector; - unsigned short entry; - unsigned short flags; -} kvm_guest_msix_entry_t; - -typedef struct kvm_assigned_dev_kernel { - struct kvm_irq_ack_notifier ack_notifier; - list_t interrupt_work; - list_t list; - int assigned_dev_id; - int host_segnr; - int host_busnr; - int host_devfn; - unsigned int entries_nr; - int host_irq; - unsigned char host_irq_disabled; - struct msix_entry *host_msix_entries; - int guest_irq; - struct kvm_guest_msix_entry *guest_msix_entries; - unsigned long irq_requested_type; - int irq_source_id; - int flags; - struct pci_dev *dev; - struct kvm *kvm; - kmutex_t assigned_dev_lock; -} kvm_assigned_dev_kernel_t; - -#ifndef container_of -/** - * container_of - cast a member of a structure out to the containing structure - * @ptr: the pointer to the member. - * @type: the type of the container struct this is embedded in. - * @member: the name of the member within the struct. - * - */ -#define container_of(ptr, type, member) ({ \ - const typeof( ((type *)0)->member ) *__mptr = (ptr); \ - (type *)( (char *)__mptr - offsetof(type,member) );}) -#endif /*container_of*/ - -/* Avoid include hell */ -#define NMI_VECTOR 0x02 - -/* - * Save the original ist values for checking stack pointers during debugging - */ -typedef struct orig_ist { - unsigned long ist[7]; -} orig_ist_t; - -#define MXCSR_DEFAULT 0x1f80 - -typedef struct i387_fsave_struct { - uint32_t cwd; /* FPU Control Word */ - uint32_t swd; /* FPU Status Word */ - uint32_t twd; /* FPU Tag Word */ - uint32_t fip; /* FPU IP Offset */ - uint32_t fcs; /* FPU IP Selector */ - uint32_t foo; /* FPU Operand Pointer Offset */ - uint32_t fos; /* FPU Operand Pointer Selector */ - - /* 8*10 bytes for each FP-reg = 80 bytes: */ - uint32_t st_space[20]; - - /* Software status information [not touched by FSAVE ]: */ - uint32_t status; -} i387_fsave_struct_t; - - -typedef struct i387_soft_struct { - uint32_t cwd; - uint32_t swd; - uint32_t twd; - uint32_t fip; - uint32_t fcs; - uint32_t foo; - uint32_t fos; - /* 8*10 bytes for each FP-reg = 80 bytes: */ - uint32_t st_space[20]; - unsigned char ftop; - unsigned char changed; - unsigned char lookahead; - unsigned char no_update; - unsigned char rm; - unsigned char alimit; - struct math_emu_info *info; - uint32_t entry_eip; -} i387_soft_struct_t; - -#define KVM_CPUID_FLAG_SIGNIFCANT_INDEX 1 -#define KVM_CPUID_FLAG_STATEFUL_FUNC 2 -#define KVM_CPUID_FLAG_STATE_READ_NEXT 4 - - -/* for KVM_GET_FPU and KVM_SET_FPU */ -typedef struct kvm_fpu { - unsigned char fpr[8][16]; - unsigned short fcw; - unsigned short fsw; - unsigned char ftwx; /* in fxsave format */ - unsigned char pad1; - unsigned short last_opcode; - uint64_t last_ip; - uint64_t last_dp; - unsigned char xmm[16][16]; - uint32_t mxcsr; - uint32_t pad2; -} kvm_fpu_t; - -typedef struct kvm_msr_entry { - uint32_t index; - uint32_t reserved; - uint64_t data; -} kvm_msr_entry_t; - -/* for KVM_GET_MSRS and KVM_SET_MSRS */ -typedef struct kvm_msrs { - uint32_t nmsrs; /* number of msrs in entries */ - uint32_t pad; - - struct kvm_msr_entry entries[100]; -} kvm_msrs_t; - -/* for KVM_GET_MSR_INDEX_LIST */ -typedef struct kvm_msr_list { - uint32_t nmsrs; /* number of msrs in entries */ - uint32_t indices[1]; -} kvm_msr_list_t; - -typedef struct kvm_cpuid_entry { - uint32_t function; - uint32_t eax; - uint32_t ebx; - uint32_t ecx; - uint32_t edx; - uint32_t padding; -} kvm_cpuid_entry_t; - -/* for KVM_SET_CPUID */ -typedef struct kvm_cpuid { - uint32_t nent; - uint32_t padding; - struct kvm_cpuid_entry entries[100]; -} kvm_cpuid_t; - -/* for KVM_GET_PIT and KVM_SET_PIT */ -typedef struct kvm_pit_channel_state { - uint32_t count; /* can be 65536 */ - uint16_t latched_count; - uint8_t count_latched; - uint8_t status_latched; - uint8_t status; - uint8_t read_state; - uint8_t write_state; - uint8_t write_latch; - uint8_t rw_mode; - uint8_t mode; - uint8_t bcd; - uint8_t gate; - int64_t count_load_time; -} kvm_pit_channel_state_t; - -typedef struct kvm_debug_exit_arch { - uint32_t exception; - uint32_t pad; - uint64_t pc; - uint64_t dr6; - uint64_t dr7; -} kvm_debug_exit_arch_t; - -#define KVM_GUESTDBG_USE_SW_BP 0x00010000 -#define KVM_GUESTDBG_USE_HW_BP 0x00020000 -#define KVM_GUESTDBG_INJECT_DB 0x00040000 -#define KVM_GUESTDBG_INJECT_BP 0x00080000 - -#ifdef XXX -/* for KVM_SET_GUEST_DEBUG */ -typedef struct kvm_guest_debug_arch { - uint64_t debugreg[8]; -} kvm_guest_debug_arch_t; -#endif /*XXX*/ - -typedef struct kvm_pit_state { - struct kvm_pit_channel_state channels[3]; -} kvm_pit_state_t; - -#define KVM_PIT_FLAGS_HPET_LEGACY 0x00000001 - -typedef struct kvm_pit_state2 { - struct kvm_pit_channel_state channels[3]; - uint32_t flags; - uint32_t reserved[9]; -} kvm_pit_state2_t; - -typedef struct kvm_reinject_control { - uint8_t pit_reinject; - uint8_t reserved[31]; -} kvm_reinject_control_t; - - -/* for KVM_SET_CPUID2 */ -typedef struct kvm_cpuid2 { - uint32_t nent; - uint32_t padding; - struct kvm_cpuid_entry2 entries[100]; -} kvm_cpuid2_t; - -#define X86_SHADOW_INT_MOV_SS 1 -#define X86_SHADOW_INT_STI 2 - - -struct pvclock_wall_clock { - uint32_t version; - uint32_t sec; - uint32_t nsec; -} __attribute__((__packed__)); - -typedef struct pvclock_wall_clock pvclock_wall_clock_t; - -typedef struct msi_msg { - uint32_t address_lo; /* low 32 bits of msi message address */ - uint32_t address_hi; /* high 32 bits of msi message address */ - uint32_t data; /* 16 bits of msi message data */ -} msi_msg_t; - - -typedef struct kvm_kernel_irq_routing_entry { - uint32_t gsi; - uint32_t type; - int (*set)(struct kvm_kernel_irq_routing_entry *e, - struct kvm *kvm, int irq_source_id, int level); - union { - struct { - unsigned irqchip; - unsigned pin; - } irqchip; - struct msi_msg msi; - }; - struct list_node link; -} kvm_kernel_irq_routing_entry_t; - -/*#ifdef __KVM_HAVE_IOAPIC*/ - -#define KVM_MAX_IRQ_ROUTES 1024 - -typedef struct kvm_irq_routing_table { - int chip[KVM_NR_IRQCHIPS][KVM_IOAPIC_NUM_PINS]; - struct kvm_kernel_irq_routing_entry *rt_entries; - uint32_t nr_rt_entries; - /* - * Array indexed by gsi. Each entry contains list of irq chips - * the gsi is connected to. - */ - list_t map[KVM_MAX_IRQ_ROUTES+1]; -} kvm_irq_routing_table_t; - -typedef struct kvm_kirq_routing { - uint32_t nr; - uint32_t flags; - struct kvm_irq_routing_entry entries[KVM_MAX_IRQ_ROUTES+1]; -} kvm_kirq_routing_t; - -/*#endif __KVM_HAVE_IOAPIC*/ - -#define MTRRphysBase_MSR(reg) (0x200 + 2 * (reg)) -#define MTRRphysMask_MSR(reg) (0x200 + 2 * (reg) + 1) - -#endif /*x86*/ - -#ifdef _KERNEL - -enum kvm_bus { - KVM_MMIO_BUS, - KVM_PIO_BUS, - KVM_NR_BUSES -}; - -typedef struct kvm_stats { - kstat_named_t kvmks_pid; /* PID of opening process */ - kstat_named_t kvmks_mmu_pte_write; /* page table entry writes */ - kstat_named_t kvmks_mmu_pte_zapped; /* zapped page table entries */ - kstat_named_t kvmks_mmu_pte_updated; /* page table entry updates */ - kstat_named_t kvmks_mmu_flooded; /* # of pages flooded */ - kstat_named_t kvmks_mmu_cache_miss; /* misses in page cache */ - kstat_named_t kvmks_mmu_recycled; /* recycles from free list */ - kstat_named_t kvmks_remote_tlb_flush; /* remote TLB flushes */ - kstat_named_t kvmks_lpages; /* large pages in use */ -} kvm_stats_t; - -#define KVM_KSTAT_INIT(kvmp, field, name) \ - kstat_named_init(&((kvmp)->kvm_stats.field), name, KSTAT_DATA_UINT64); - -#define KVM_KSTAT_INC(kvmp, field) \ - (kvmp)->kvm_stats.field.value.ui64++; - -#define KVM_KSTAT_DEC(kvmp, field) \ - (kvmp)->kvm_stats.field.value.ui64--; - -typedef struct kvm { - kmutex_t mmu_lock; - kmutex_t requests_lock; - kmutex_t slots_lock; - struct as *mm; /* userspace tied to this vm */ - struct kvm_memslots *memslots; - /* the following was a read-copy update mechanism */ - /* we'll use a reader-writer lock, for now */ - krwlock_t kvm_rwlock; -#ifdef CONFIG_KVM_APIC_ARCHITECTURE - uint32_t bsp_vcpu_id; - struct kvm_vcpu *bsp_vcpu; -#endif - struct kvm_vcpu *vcpus[KVM_MAX_VCPUS]; - volatile int online_vcpus; - struct list_node vm_list; - kmutex_t lock; - struct kvm_io_bus *buses[KVM_NR_BUSES]; -#ifdef CONFIG_HAVE_KVM_EVENTFD - struct { - kmutex_t lock; - struct list_head items; - } irqfds; - struct list_head ioeventfds; -#endif - struct kstat *kvm_kstat; - kvm_stats_t kvm_stats; - struct kvm_arch arch; - volatile int users_count; -#ifdef KVM_COALESCED_MMIO_PAGE_OFFSET - struct kvm_coalesced_mmio_dev *coalesced_mmio_dev; - struct kvm_coalesced_mmio_ring *coalesced_mmio_ring; - ddi_umem_cookie_t mmio_cookie; -#endif - - kmutex_t irq_lock; -#ifdef CONFIG_HAVE_KVM_IRQCHIP - struct kvm_irq_routing_table *irq_routing; - list_t mask_notifier_list; - list_t irq_ack_notifier_list; -#endif - -#if defined(KVM_ARCH_WANT_MMU_NOTIFIER) && defined(CONFIG_MMU_NOTIFIER) - struct mmu_notifier mmu_notifier; - unsigned long mmu_notifier_seq; - long mmu_notifier_count; -#endif - int kvmid; /* unique identifier for this kvm */ - int kvm_clones; - pid_t kvm_pid; /* pid associated with this kvm */ - kmutex_t kvm_avllock; - avl_tree_t kvm_avlmp; /* avl tree for mmu to page_t mapping */ -} kvm_t; -#endif /*_KERNEL*/ +#define KVM_PIT_SPEAKER_DUMMY 1 #define KVM_EXIT_UNKNOWN 0 #define KVM_EXIT_EXCEPTION 1 @@ -1201,126 +192,221 @@ typedef struct kvm_run { }; } kvm_run_t; -/* the following is directly copied from ioctl.h on linux */ -#ifndef _ASM_GENERIC_IOCTL_H -#define _ASM_GENERIC_IOCTL_H +typedef struct kvm_coalesced_mmio_zone { + uint64_t addr; + uint32_t size; + uint32_t pad; +} kvm_coalesced_mmio_zone_t; -/* ioctl command encoding: 32 bits total, command in lower 16 bits, - * size of the parameter structure in the lower 14 bits of the - * upper 16 bits. - * Encoding the size of the parameter structure in the ioctl request - * is useful for catching programs compiled with old versions - * and to avoid overwriting user space outside the user buffer area. - * The highest 2 bits are reserved for indicating the ``access mode''. - * NOTE: This limits the max parameter size to 16kB -1 ! - */ +typedef struct kvm_coalesced_mmio { + uint64_t phys_addr; + uint32_t len; + uint32_t pad; + unsigned char data[8]; +} kvm_coalesced_mmio_t; -/* - * The following is for compatibility across the various Linux - * platforms. The generic ioctl numbering scheme doesn't really enforce - * a type field. De facto, however, the top 8 bits of the lower 16 - * bits are indeed used as a type field, so we might just as well make - * this explicit here. Please be sure to use the decoding macros - * below from now on. - */ -#define _IOC_NRBITS 8 -#define _IOC_TYPEBITS 8 +typedef struct kvm_coalesced_mmio_ring { + uint32_t first, last; + struct kvm_coalesced_mmio coalesced_mmio[1]; +} kvm_coalesced_mmio_ring_t; -/* - * Let any architecture override either of the following before - * including this file. - */ +/* XXX NEEDS TO DIE! */ +typedef struct kvm_coalesced_mmio_zone_ioc { + struct kvm_coalesced_mmio_zone zone; + int kvmid; +} kvm_coalesced_mmio_zone_ioc_t; -#ifndef _IOC_SIZEBITS -# define _IOC_SIZEBITS 14 -#endif +#define KVM_COALESCED_MMIO_MAX \ + ((PAGESIZE - sizeof(struct kvm_coalesced_mmio_ring)) / \ + sizeof(struct kvm_coalesced_mmio)) -#ifndef _IOC_DIRBITS -# define _IOC_DIRBITS 2 -#endif +/* for KVM_INTERRUPT */ +typedef struct kvm_interrupt { + /* in */ + uint32_t irq; +} kvm_interrupt_t; -#define _IOC_NRMASK ((1 << _IOC_NRBITS)-1) -#define _IOC_TYPEMASK ((1 << _IOC_TYPEBITS)-1) -#define _IOC_SIZEMASK ((1 << _IOC_SIZEBITS)-1) -#define _IOC_DIRMASK ((1 << _IOC_DIRBITS)-1) +/* 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; + }v; +} kvm_dirty_log_t; -#define _IOC_NRSHIFT 0 -#define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS) -#define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS) -#define _IOC_DIRSHIFT (_IOC_SIZESHIFT+_IOC_SIZEBITS) +/* for KVM_SET_SIGNAL_MASK */ +typedef struct kvm_signal_mask { + uint32_t len; + uint8_t sigset[1]; +} kvm_signal_mask_t; -/* - * Direction bits, which any architecture can choose to override - * before including this file. - */ +/* 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; -#ifndef _IOC_NONE -# define _IOC_NONE 0U -#endif +/* for KVM_SET_VAPIC_ADDR */ +typedef struct kvm_vapic_addr { + uint64_t vapic_addr; +} kvm_vapic_addr_t; -#ifndef _IOC_WRITE -# define _IOC_WRITE 1U -#endif +/* 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 -#ifndef _IOC_READ -# define _IOC_READ 2U -#endif +typedef struct kvm_mp_state { + uint32_t mp_state; +} kvm_mp_state_t; -#define _IOC(dir,type,nr,size) \ - (((dir) << _IOC_DIRSHIFT) | \ - ((type) << _IOC_TYPESHIFT) | \ - ((nr) << _IOC_NRSHIFT) | \ - ((size) << _IOC_SIZESHIFT)) +/* for KVM_SET_GUEST_DEBUG */ -#ifdef XXX -#ifdef _KERNEL +#define KVM_GUESTDBG_ENABLE 0x00000001 +#define KVM_GUESTDBG_SINGLESTEP 0x00000002 -/* provoke compile error for invalid uses of size argument */ -extern unsigned int __invalid_size_argument_for_IOC; -#define _IOC_TYPECHECK(t) \ - ((sizeof(t) == sizeof(t[1]) && \ - sizeof(t) < (1 << _IOC_SIZEBITS)) ? \ - sizeof(t) : __invalid_size_argument_for_IOC) -#else -#define _IOC_TYPECHECK(t) (sizeof(t)) -#endif /*_KERNEL*/ -#else /*XXX*/ +typedef struct kvm_guest_debug { + uint32_t control; + uint32_t pad; + struct kvm_guest_debug_arch arch; +} kvm_guest_debug_t; -#define _IOC_TYPECHECK(t) (sizeof(t)) -static void native_load_tr_desc(void) -{ - __asm__ volatile("ltr %w0"::"q" (KTSS_SEL)); -} +/* 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) -#define load_TR_desc() native_load_tr_desc() +/* + * 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) -#endif /*XXX*/ +/* + * 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 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 */ +#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 +#ifdef __KVM_HAVE_USER_NMI +#define KVM_CAP_USER_NMI 22 +#endif +#ifdef __KVM_HAVE_GUEST_DEBUG +#define KVM_CAP_SET_GUEST_DEBUG 23 +#endif +#define KVM_CAP_REINJECT_CONTROL 24 +#ifdef __KVM_HAVE_IOAPIC +#define KVM_CAP_IRQ_ROUTING 25 +#endif +#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; -#ifdef XXX -#define _IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),(_IOC_TYPECHECK(size))) -#define _IOW(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size))) -#define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size))) -#define _IOR_BAD(type,nr,size) _IOC(_IOC_READ,(type),(nr),sizeof(size)) -#define _IOW_BAD(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),sizeof(size)) -#define _IOWR_BAD(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size)) -#endif /*XXX*/ -/* used to decode ioctl numbers.. */ -#define _IOC_DIR(nr) (((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK) -#define _IOC_TYPE(nr) (((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK) -#define _IOC_NR(nr) (((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK) -#define _IOC_SIZE(nr) (((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK) +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; -#define IOCSIZE_MASK (_IOC_SIZEMASK << _IOC_SIZESHIFT) -#define IOCSIZE_SHIFT (_IOC_SIZESHIFT) +/* gsi routing entry types */ +#define KVM_IRQ_ROUTING_IRQCHIP 1 +#define KVM_IRQ_ROUTING_MSI 2 -#endif /* _ASM_GENERIC_IOCTL_H */ +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; -/* ioctl commands */ +typedef struct kvm_irq_routing { + uint32_t nr; + uint32_t flags; + struct kvm_irq_routing_entry entries[1]; +} kvm_irq_routing_t; -#define KVMIO 0xAE +#endif /* KVM_CAP_IRQ_ROUTING */ +#ifdef KVM_CAP_MCE /* x86 MCE */ typedef struct kvm_x86_mce { uint64_t status; @@ -1331,6 +417,7 @@ typedef struct kvm_x86_mce { uint8_t pad1[7]; uint64_t pad2[3]; } kvm_x86_mce_t; +#endif /* KVM_CAP_MCE */ typedef struct kvm_clock_data { uint64_t clock; @@ -1338,101 +425,6 @@ typedef struct kvm_clock_data { uint32_t pad[9]; } kvm_clock_data_t; -/* for KVM_SET_SIGNAL_MASK */ -typedef struct kvm_signal_mask { - uint32_t len; - uint8_t sigset[1]; -} kvm_signal_mask_t; - -typedef struct kvm_set_boot_cpu_id_ioc { - int id; -} kvm_set_boot_cpu_id_ioc_t; - -/* - * 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_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_MSRS _IOWR(KVMIO, 0x88, struct kvm_msrs) -#define KVM_SET_MSRS _IOW(KVMIO, 0x89, struct kvm_msrs) -#define KVM_GET_LAPIC _IOR(KVMIO, 0x8e, struct kvm_lapic_state) -#define KVM_SET_LAPIC _IOW(KVMIO, 0x8f, struct kvm_lapic_state) -#define KVM_GET_MP_STATE _IOR(KVMIO, 0x98, struct kvm_mp_state) -#define KVM_SET_MP_STATE _IOW(KVMIO, 0x99, struct kvm_mp_state) -/* 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) - -#define KVM_REINJECT_CONTROL _IO(KVMIO, 0x71) -#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_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_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 /dev/kvm fds: - */ -#define KVM_GET_API_VERSION _IO(KVMIO, 0x00) -#define KVM_CREATE_VM _IO(KVMIO, 0x01) /* returns a VM fd */ -#define KVM_DESTROY_VM _IO(KVMIO, 0x0a) -#define KVM_CLONE _IO(KVMIO, 0x20) -#define KVM_NET_QUEUE _IO(KVMIO, 0x21) - -#define KVM_GET_MSR_INDEX_LIST _IOWR(KVMIO, 0x02, struct kvm_msr_list) - -#define KVM_S390_ENABLE_SIE _IO(KVMIO, 0x06) - -#define KVM_GET_VCPU_MMAP_SIZE _IO(KVMIO, 0x04) /* in bytes */ - -#define KVM_GET_SUPPORTED_CPUID _IOWR(KVMIO, 0x05, struct kvm_cpuid2) - -/* 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; - -/* - * for KVM_SET_IDENTITY_MAP_ADDR - */ - -typedef struct kvm_id_map_addr { - int pad; - uint64_t addr; -} kvm_id_map_addr_t; - -/* for KVM_SET_IDENTITY_MAP_ADDR */ -typedef struct kvm_id_map_addr_ioc { - uint64_t ident_addr; -} kvm_id_map_addr_ioc_t; - - /* * ioctls for VM fds */ @@ -1445,612 +437,98 @@ typedef struct kvm_id_map_addr_ioc { #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, struct kvm_id_map_addr_ioc) + /* Device model IOC */ #define KVM_CREATE_IRQCHIP _IO(KVMIO, 0x60) #define KVM_IRQ_LINE _IOW(KVMIO, 0x61, struct kvm_irq_level) -#define KVM_IRQ_LINE_STATUS _IOWR(KVMIO, 0x67, 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_PIT_SPEAKER_DUMMY 1 - #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_CREATE_PIT2 _IOW(KVMIO, 0x77, struct kvm_pit_config) - +#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_ioc) #define KVM_UNREGISTER_COALESCED_MMIO \ _IOW(KVMIO, 0x68, struct kvm_coalesced_mmio_zone_ioc) - -#define KVM_SET_GSI_ROUTING _IOW(KVMIO, 0x6a, struct kvm_kirq_routing) +#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) /* - * Check if a kvm extension is available. Argument is extension number, - * return is 1 (yes) or 0 (no, sorry). + * ioctls for vcpu fds */ -#define KVM_CHECK_EXTENSION _IO(KVMIO, 0x03) - -/* 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; - }v; -} kvm_dirty_log_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_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 - -/* 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; - -typedef struct kvm_tpr_acl_ioc { - struct kvm_tpr_access_ctl tac; - int kvm_id; - int cpu_index; -} kvm_tpr_acl_ioc_t; - +#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_acl_ioc) /* 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) +/* 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) -#define APIC_BUS_CYCLE_NS 1 -#define NSEC_PER_MSEC 1000000L -#define NSEC_PER_SEC 1000000000L - -/* for kvm_memory_region::flags */ -#define KVM_MEM_LOG_DIRTY_PAGES 1UL -#define KVM_MEMSLOT_INVALID (1UL << 1) - - -/* 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; - -#ifndef XXX -#define KVM_SET_USER_MEMORY_REGION _IOW(KVMIO, 0x46, \ - struct kvm_userspace_memory_region) -#else -#define KVM_SET_USER_MEMORY_REGION _IOW(KVMIO, 0x46, \ - struct kvm_set_user_memory_ioc) -#endif /*XXX*/ - +/* + * XXX Additions which probably are changes from qemu/kvm upstream + */ /* for KVM_SET_TSS_ADDR ioctl */ typedef struct kvm_tss { - uint64_t addr; /* in */ + uint64_t addr; /* in */ } kvm_tss_t; -/* for KVM_CREATE_VCPU */ -typedef struct kvm_vcpu_ioc { - uint32_t id; /*IN*/ - uint64_t kvm_run_addr; /*OUT*/ - uint64_t kvm_vcpu_addr; /* OUT, id is not unique across VMs */ -} kvm_vcpu_ioc_t; - - - -/* LDT or TSS descriptor in the GDT. 16 bytes. */ -struct ldttss_desc64 { - unsigned short limit0; - unsigned short base0; - unsigned base1 : 8, type : 5, dpl : 2, p : 1; - unsigned limit1 : 4, zero0 : 3, g : 1, base2 : 8; - uint32_t base3; - uint32_t zero1; -} __attribute__((packed)); - -typedef struct ldttss_desc64 ldttss_desc64_t; - -#ifdef _KERNEL - -#define kvm_for_each_vcpu(idx, vcpup, kvm) \ - for (idx = 0, vcpup = kvm_get_vcpu(kvm, idx); \ - idx < kvm->online_vcpus && vcpup; /* XXX - need protection */ \ - vcpup = kvm_get_vcpu(kvm, ++idx)) - -extern struct kvm_vcpu *kvm_get_vcpu(struct kvm *kvm, int i); - -typedef struct kvm_irq_mask_notifier { - void (*func)(struct kvm_irq_mask_notifier *kimn, int masked); - int irq; - struct list_node link; -} kvm_irq_mask_notifier_t; - -/* Intel-defined CPU features, CPUID level 0x00000001 (edx), word 0 */ -#define X86_FEATURE_FPU (0 * 32 + 0) /* Onboard FPU */ -#define X86_FEATURE_VME (0 * 32 + 1) /* Virtual Mode Extensions */ -#define X86_FEATURE_DE (0 * 32 + 2) /* Debugging Extensions */ -#define X86_FEATURE_PSE (0 * 32 + 3) /* Page Size Extensions */ -#define X86_FEATURE_TSC (0 * 32 + 4) /* Time Stamp Counter */ -#define X86_FEATURE_MSR (0 * 32 + 5) /* Model-Specific Registers */ -#define X86_FEATURE_PAE (0 * 32 + 6) /* Phys. Address Extensions */ -#define X86_FEATURE_MCE (0 * 32 + 7) /* Machine Check Exception */ -#define X86_FEATURE_CX8 (0 * 32 + 8) /* CMPXCHG8 instruction */ -#define X86_FEATURE_APIC (0 * 32 + 9) /* Onboard APIC */ -#define X86_FEATURE_SEP (0 * 32 + 11) /* SYSENTER/SYSEXIT */ -#define X86_FEATURE_MTRR (0 * 32 + 12) /* Memory Type Range Regs. */ -#define X86_FEATURE_PGE (0 * 32 + 13) /* Page Global Enable */ -#define X86_FEATURE_MCA (0 * 32 + 14) /* Machine Check Architecture */ -#define X86_FEATURE_CMOV (0 * 32 + 15) /* CMOV instructions */ - /* (+ FCMOVcc, FCOMI w/ FPU) */ -#define X86_FEATURE_PAT (0 * 32 + 16) /* Page Attribute Table */ -#define X86_FEATURE_PSE36 (0 * 32 + 17) /* 36-bit PSEs */ -#define X86_FEATURE_PN (0 * 32 + 18) /* Processor serial number */ -#define X86_FEATURE_CLFLSH (0 * 32 + 19) /* "clflush" instruction */ -#define X86_FEATURE_DS (0 * 32 + 21) /* "dts" Debug Store */ -#define X86_FEATURE_ACPI (0 * 32 + 22) /* ACPI via MSR */ -#define X86_FEATURE_MMX (0 * 32 + 23) /* Multimedia Extensions */ -#define X86_FEATURE_FXSR (0 * 32 + 24) /* FXSAVE/FXRSTOR, CR4.OSFXSR */ -#define X86_FEATURE_XMM (0 * 32 + 25) /* "sse" */ -#define X86_FEATURE_XMM2 (0 * 32 + 26) /* "sse2" */ -#define X86_FEATURE_SELFSNOOP (0 * 32 + 27) /* "ss" CPU self snoop */ -#define X86_FEATURE_HT (0 * 32 + 28) /* Hyper-Threading */ -#define X86_FEATURE_ACC (0 * 32 + 29) /* "tm" Auto. clock control */ -#define X86_FEATURE_IA64 (0 * 32 + 30) /* IA-64 processor */ -#define X86_FEATURE_PBE (0 * 32 + 31) /* Pending Break Enable */ - -/* AMD-defined CPU features, CPUID level 0x80000001, word 1 */ -/* Don't duplicate feature flags which are redundant with Intel! */ -#define X86_FEATURE_SYSCALL (1 * 32 + 11) /* SYSCALL/SYSRET */ -#define X86_FEATURE_MP (1 * 32 + 19) /* MP Capable. */ -#define X86_FEATURE_NX (1 * 32 + 20) /* Execute Disable */ -#define X86_FEATURE_MMXEXT (1 * 32 + 22) /* AMD MMX extensions */ -#define X86_FEATURE_FXSR_OPT (1 * 32 + 25) /* FXSAVE/FXRSTOR optimiztns */ -#define X86_FEATURE_GBPAGES (1 * 32 + 26) /* "pdpe1gb" GB pages */ -#define X86_FEATURE_RDTSCP (1 * 32 + 27) /* RDTSCP */ -#define X86_FEATURE_LM (1 * 32 + 29) /* Long Mode (x86-64) */ -#define X86_FEATURE_3DNOWEXT (1 * 32 + 30) /* AMD 3DNow! extensions */ -#define X86_FEATURE_3DNOW (1 * 32 + 31) /* 3DNow! */ - -/* cpu types for specific tunings: */ -#define X86_FEATURE_K8 (3 * 32 + 4) /* "" Opteron, Athlon64 */ -#define X86_FEATURE_K7 (3 * 32 + 5) /* "" Athlon */ -#define X86_FEATURE_P3 (3 * 32 + 6) /* "" P3 */ -#define X86_FEATURE_P4 (3 * 32 + 7) /* "" P4 */ -#define X86_FEATURE_CONSTANT_TSC (3 * 32 + 8) /* TSC ticks at constant rate */ -#define X86_FEATURE_UP (3 * 32 + 9) /* smp kernel running on up */ -#define X86_FEATURE_FXSAVE_LEAK (3 * 32 + 10) /* FXSAVE leaks FOP/FIP/FOP */ -#define X86_FEATURE_ARCH_PERFMON (3 * 32 + 11) /* Intel Arch. PerfMon */ -#define X86_FEATURE_PEBS (3 * 32 + 12) /* Precise-Event Based Smplng */ -#define X86_FEATURE_BTS (3 * 32 + 13) /* Branch Trace Store */ -#define X86_FEATURE_SYSCALL32 (3 * 32 + 14) /* syscall in ia32 userspace */ -#define X86_FEATURE_SYSENTER32 (3 * 32 + 15) /* sysenter in ia32 userspace */ -#define X86_FEATURE_REP_GOOD (3 * 32 + 16) /* rep microcode works well */ -#define X86_FEATURE_MFENCE_RDTSC (3 * 32 + 17) /* Mfence synchronizes RDTSC */ -#define X86_FEATURE_LFENCE_RDTSC (3 * 32 + 18) /* Lfence synchronizes RDTSC */ -#define X86_FEATURE_11AP (3 * 32 + 19) /* Bad local APIC aka 11AP */ -#define X86_FEATURE_NOPL (3 * 32 + 20) /* NOPL (0F 1F) instructions */ -#define X86_FEATURE_AMDC1E (3 * 32 + 21) /* AMD C1E detected */ -#define X86_FEATURE_XTOPOLOGY (3 * 32 + 22) /* topology enum extensions */ -#define X86_FEATURE_TSC_RELIABLE (3 * 32 + 23) /* TSC is reliable */ -#define X86_FEATURE_NONSTOP_TSC (3 * 32 + 24) /* TSC continues in C states */ -#define X86_FEATURE_CLFLUSH_MONITOR (3 * 32 + 25) /* clflush reqd w/ monitor */ -#define X86_FEATURE_EXTD_APICID (3 * 32 + 26) /* extended APICID (8 bits) */ -#define X86_FEATURE_AMD_DCM (3 * 32 + 27) /* multi-node processor */ -#define X86_FEATURE_APERFMPERF (3 * 32 + 28) /* APERFMPERF */ - -/* Intel-defined CPU features, CPUID level 0x00000001 (ecx), word 4 */ -#define X86_FEATURE_XMM3 (4 * 32 + 0) /* "pni" SSE-3 */ -#define X86_FEATURE_PCLMULQDQ (4 * 32 + 1) /* PCLMULQDQ instruction */ -#define X86_FEATURE_DTES64 (4 * 32 + 2) /* 64-bit Debug Store */ -#define X86_FEATURE_MWAIT (4 * 32 + 3) /* "monitor" Monitor/Mwait */ -#define X86_FEATURE_DSCPL (4 * 32 + 4) /* ds_cpl CPL Qual Debug Str */ -#define X86_FEATURE_VMX (4 * 32 + 5) /* Hardware virtualization */ -#define X86_FEATURE_SMX (4 * 32 + 6) /* Safer mode */ -#define X86_FEATURE_EST (4 * 32 + 7) /* Enhanced SpeedStep */ -#define X86_FEATURE_TM2 (4 * 32 + 8) /* Thermal Monitor 2 */ -#define X86_FEATURE_SSSE3 (4 * 32 + 9) /* Supplemental SSE-3 */ -#define X86_FEATURE_CID (4 * 32 + 10) /* Context ID */ -#define X86_FEATURE_FMA (4 * 32 + 12) /* Fused multiply-add */ -#define X86_FEATURE_CX16 (4 * 32 + 13) /* CMPXCHG16B */ -#define X86_FEATURE_XTPR (4 * 32 + 14) /* Send Task Priority Msgs */ -#define X86_FEATURE_PDCM (4 * 32 + 15) /* Performance Capabilities */ -#define X86_FEATURE_DCA (4 * 32 + 18) /* Direct Cache Access */ -#define X86_FEATURE_XMM4_1 (4 * 32 + 19) /* "sse4_1" SSE-4.1 */ -#define X86_FEATURE_XMM4_2 (4 * 32 + 20) /* "sse4_2" SSE-4.2 */ -#define X86_FEATURE_X2APIC (4 * 32 + 21) /* x2APIC */ -#define X86_FEATURE_MOVBE (4 * 32 + 22) /* MOVBE instruction */ -#define X86_FEATURE_POPCNT (4 * 32 + 23) /* POPCNT instruction */ -#define X86_FEATURE_AES (4 * 32 + 25) /* AES instructions */ -#define X86_FEATURE_XSAVE (4 * 32 + 26) /* XSAVE/XRSTOR/XSETBV/XGETBV */ -#define X86_FEATURE_OSXSAVE (4 * 32 + 27) /* "" XSAVE enabled in the OS */ -#define X86_FEATURE_AVX (4 * 32 + 28) /* Advanced Vector Extensions */ -#define X86_FEATURE_HYPERVISOR (4 * 32 + 31) /* Running on a hypervisor */ - -/* More extended AMD flags: CPUID level 0x80000001, ecx, word 6 */ -#define X86_FEATURE_LAHF_LM (6 * 32 + 0) /* LAHF/SAHF in long mode */ -#define X86_FEATURE_CMP_LEGACY (6 * 32 + 1) /* HyperThreading invalid */ -#define X86_FEATURE_SVM (6 * 32 + 2) /* Secure virtual machine */ -#define X86_FEATURE_EXTAPIC (6 * 32 + 3) /* Extended APIC space */ -#define X86_FEATURE_CR8_LEGACY (6 * 32 + 4) /* CR8 in 32-bit mode */ -#define X86_FEATURE_ABM (6 * 32 + 5) /* Advanced bit manipulation */ -#define X86_FEATURE_SSE4A (6 * 32 + 6) /* SSE-4A */ -#define X86_FEATURE_MISALIGNSSE (6 * 32 + 7) /* Misaligned SSE mode */ -#define X86_FEATURE_3DNOWPREFETCH (6 * 32 + 8) /* 3DNow prefetch */ -#define X86_FEATURE_OSVW (6 * 32 + 9) /* OS Visible Workaround */ -#define X86_FEATURE_IBS (6 * 32 + 10) /* Instruction Based Sampling */ -#define X86_FEATURE_SSE5 (6 * 32 + 11) /* SSE-5 */ -#define X86_FEATURE_SKINIT (6 * 32 + 12) /* SKINIT/STGI instructions */ -#define X86_FEATURE_WDT (6 * 32 + 13) /* Watchdog timer */ -#define X86_FEATURE_NODEID_MSR (6 * 32 + 19) /* NodeId MSR */ - -/* Transmeta-defined CPU features, CPUID level 0x80860001, word 2 */ -#define X86_FEATURE_RECOVERY (2 * 32 + 0) /* CPU in recovery mode */ -#define X86_FEATURE_LONGRUN (2 * 32 + 1) /* Longrun power control */ -#define X86_FEATURE_LRTI (2 * 32 + 3) /* LongRun table interface */ - - -#ifdef __KVM_HAVE_IOAPIC -void kvm_get_intr_delivery_bitmask(struct kvm_ioapic *ioapic, - union kvm_ioapic_redirect_entry *entry, - unsigned long *deliver_bitmask); -#endif -int kvm_set_irq(struct kvm *kvm, int irq_source_id, uint32_t irq, int level); -void kvm_notify_acked_irq(struct kvm *kvm, unsigned irqchip, unsigned pin); -void kvm_register_irq_ack_notifier(struct kvm *kvm, - struct kvm_irq_ack_notifier *kian); -void kvm_unregister_irq_ack_notifier(struct kvm *kvm, - struct kvm_irq_ack_notifier *kian); -int kvm_request_irq_source_id(struct kvm *kvm); -void kvm_free_irq_source_id(struct kvm *kvm, int irq_source_id); - -#ifdef CONFIG_HAVE_KVM_IRQCHIP - -int kvm_setup_default_irq_routing(struct kvm *kvm); -int kvm_set_irq_routing(struct kvm *kvm, - const struct kvm_irq_routing_entry *entries, - unsigned nr, - unsigned flags); -void kvm_free_irq_routing(struct kvm *kvm); - -#else - -static void kvm_free_irq_routing(struct kvm *kvm) {} - -#endif /*CONFIG_HAVE_KVM_IRQCHIP*/ - /* - * vcpu->requests bit members - */ -#define KVM_REQ_TLB_FLUSH 0 -#define KVM_REQ_MIGRATE_TIMER 1 -#define KVM_REQ_REPORT_TPR_ACCESS 2 -#define KVM_REQ_MMU_RELOAD 3 -#define KVM_REQ_TRIPLE_FAULT 4 -#define KVM_REQ_PENDING_TIMER 5 -#define KVM_REQ_UNHALT 6 -#define KVM_REQ_MMU_SYNC 7 -#define KVM_REQ_KVMCLOCK_UPDATE 8 -#define KVM_REQ_KICK 9 -#define KVM_REQ_DEACTIVATE_FPU 10 - -#define KVM_USERSPACE_IRQ_SOURCE_ID 0 - -#define RW_STATE_LSB 1 -#define RW_STATE_MSB 2 -#define RW_STATE_WORD0 3 -#define RW_STATE_WORD1 4 - -#define page_to_pfn(page) (page->p_pagenum) - -#ifdef XXX -#define __ex(x) __kvm_handle_fault_on_reboot(x) -#endif /*XXX*/ - -#ifdef CONFIG_PREEMPT_NOTIFIERS -#ifdef XXX - -struct preempt_notifier; - -/** - * preempt_ops - notifiers called when a task is preempted and rescheduled - * @sched_in: we're about to be rescheduled: - * notifier: struct preempt_notifier for the task being scheduled - * cpu: cpu we're scheduled on - * @sched_out: we've just been preempted - * notifier: struct preempt_notifier for the task being preempted - * next: the task that's kicking us out - * - * Please note that sched_in and out are called under different - * contexts. sched_out is called with rq lock held and irq disabled - * while sched_in is called without rq lock and irq enabled. This - * difference is intentional and depended upon by its users. - */ -typedef struct preempt_ops { - void (*sched_in)(struct preempt_notifier *notifier, int cpu); - void (*sched_out)(struct preempt_notifier *notifier, - struct task_struct *next); -} preempt_ops_t; - -/** - * preempt_notifier - key for installing preemption notifiers - * @link: internal use - * @ops: defines the notifier functions to be called - * - * Usually used in conjunction with container_of(). - */ -typedef struct preempt_notifier { - struct hlist_node link; - struct preempt_ops *ops; -} preempt_notifier_t; - -void preempt_notifier_register(struct preempt_notifier *notifier); -void preempt_notifier_unregister(struct preempt_notifier *notifier); -void preempt_notifier_init(struct preempt_notifier *notifier, - struct preempt_ops *ops); - -#endif /*XXX*/ -#endif /*CONFIG_PREEMPT_NOTIFIERS*/ -typedef struct cpuid_data { - struct kvm_cpuid2 cpuid; - struct kvm_cpuid_entry2 entries[100]; -} __attribute__((packed)) cpuid_data; - -/* - * It would be nice to use something smarter than a linear search, TBD... - * Thankfully we dont expect many devices to register (famous last words :), - * so until then it will suffice. At least its abstracted so we can change - * in one place. + * for KVM_SET_IDENTITY_MAP_ADDR */ -typedef struct kvm_io_bus { - int dev_count; -#define NR_IOBUS_DEVS 200 - struct kvm_io_device *devs[NR_IOBUS_DEVS]; -} kvm_io_bus_t; - -int kvm_io_bus_write(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr, - int len, const void *val); -int kvm_io_bus_read(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr, int len, - void *val); -int kvm_io_bus_register_dev(struct kvm *kvm, enum kvm_bus bus_idx, - struct kvm_io_device *dev); -int kvm_io_bus_unregister_dev(struct kvm *kvm, enum kvm_bus bus_idx, - struct kvm_io_device *dev); - -unsigned long kvm_dirty_bitmap_bytes(struct kvm_memory_slot *memslot); - -int kvm_set_memory_region(struct kvm *kvm, - struct kvm_userspace_memory_region *mem, - int user_alloc); -int __kvm_set_memory_region(struct kvm *kvm, - struct kvm_userspace_memory_region *mem, - int user_alloc); -int kvm_arch_prepare_memory_region(struct kvm *kvm, - struct kvm_memory_slot *memslot, - struct kvm_memory_slot old, - struct kvm_userspace_memory_region *mem, - int user_alloc); -void kvm_arch_commit_memory_region(struct kvm *kvm, - struct kvm_userspace_memory_region *mem, - struct kvm_memory_slot old, - int user_alloc); - -int is_error_page(struct page *page); -int is_error_pfn(pfn_t pfn); -int kvm_is_error_hva(unsigned long addr); -void kvm_disable_largepages(void); -void kvm_arch_flush_shadow(struct kvm *kvm); -gfn_t unalias_gfn(struct kvm *kvm, gfn_t gfn); -gfn_t unalias_gfn_instantiation(struct kvm *kvm, gfn_t gfn); - -page_t *gfn_to_page(struct kvm *kvm, gfn_t gfn); -unsigned long gfn_to_hva(struct kvm *kvm, gfn_t gfn); -void kvm_release_page_clean(struct page *page); -void kvm_release_page_dirty(struct page *page); -void kvm_set_page_dirty(struct page *page); -void kvm_set_page_accessed(struct page *page); - -pfn_t gfn_to_pfn(struct kvm *kvm, gfn_t gfn); -pfn_t gfn_to_pfn_memslot(struct kvm *kvm, - struct kvm_memory_slot *slot, gfn_t gfn); -int memslot_id(struct kvm *kvm, gfn_t gfn); -void kvm_get_pfn(struct kvm_vcpu *vcpu, pfn_t pfn); - -int kvm_read_guest_page(struct kvm *kvm, gfn_t gfn, void *data, int offset, - int len); -int kvm_read_guest_atomic(struct kvm *kvm, gpa_t gpa, void *data, - unsigned long len); -int kvm_read_guest(struct kvm *kvm, gpa_t gpa, void *data, unsigned long len); -int kvm_write_guest_page(struct kvm *kvm, gfn_t gfn, const void *data, - int offset, int len); -int kvm_write_guest(struct kvm *kvm, gpa_t gpa, const void *data, - unsigned long len); -int kvm_clear_guest_page(struct kvm *kvm, gfn_t gfn, int offset, int len); -int kvm_clear_guest(struct kvm *kvm, gpa_t gpa, unsigned long len); -struct kvm_memory_slot *gfn_to_memslot(struct kvm *kvm, gfn_t gfn); -int kvm_is_visible_gfn(struct kvm *kvm, gfn_t gfn); -unsigned long kvm_host_page_size(struct kvm *kvm, gfn_t gfn); -void mark_page_dirty(struct kvm *kvm, gfn_t gfn); - -void kvm_vcpu_block(struct kvm_vcpu *vcpu); -void kvm_vcpu_on_spin(struct kvm_vcpu *vcpu); -void kvm_resched(struct kvm_vcpu *vcpu); -void kvm_load_guest_fpu(struct kvm_vcpu *vcpu); -void kvm_put_guest_fpu(struct kvm_vcpu *vcpu); -void kvm_flush_remote_tlbs(struct kvm *kvm); -void kvm_reload_remote_mmus(struct kvm *kvm); - -long kvm_arch_dev_ioctl(struct file *filp, - unsigned int ioctl, unsigned long arg); -long kvm_arch_vcpu_ioctl(struct file *filp, - unsigned int ioctl, unsigned long arg); - -int kvm_get_dirty_log(struct kvm *kvm, - struct kvm_dirty_log *log, int *is_dirty); -int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, - struct kvm_dirty_log *log); - -int kvm_vm_ioctl_set_memory_region(struct kvm *kvm, - struct - kvm_userspace_memory_region *mem, - int user_alloc); -long kvm_arch_vm_ioctl(struct file *filp, - unsigned int ioctl, unsigned long arg); - -int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu); -int kvm_arch_vcpu_ioctl_set_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu); - -#ifdef XXX -int kvm_arch_vcpu_ioctl_translate(struct kvm_vcpu *vcpu, - struct kvm_translation *tr); -#endif /*XXX*/ - -int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs); -int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs); -int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu, - struct kvm_sregs *sregs); -int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, - struct kvm_sregs *sregs); -int kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu, - struct kvm_mp_state *mp_state); -int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu, - struct kvm_mp_state *mp_state); -int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu, - struct kvm_guest_debug *dbg); -int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu); - -int kvm_arch_init(void *opaque); -void kvm_arch_exit(void); - -int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu); -void kvm_arch_vcpu_uninit(struct kvm_vcpu *vcpu); - -void kvm_arch_vcpu_free(struct kvm_vcpu *vcpu); -void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu); -void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu); -int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu); -void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu); -int kvm_arch_vcpu_reset(struct kvm_vcpu *vcpu); -int kvm_arch_hardware_enable(void *garbage); -void kvm_arch_hardware_disable(void *garbage); -int kvm_arch_hardware_setup(void); -void kvm_arch_hardware_unsetup(void); -void kvm_arch_check_processor_compat(void *rtn); -int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu); - -void kvm_free_physmem(struct kvm *kvm); - -void kvm_vcpu_uninit(struct kvm_vcpu *); - -struct kvm *kvm_arch_create_vm(void); -void kvm_arch_destroy_vm(struct kvm *kvm); -void kvm_arch_destroy_vm_comps(struct kvm *kvm); -void kvm_free_all_assigned_devices(struct kvm *kvm); -void kvm_arch_sync_events(struct kvm *kvm); - -int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu); -void kvm_vcpu_kick(struct kvm_vcpu *vcpu); - -void kvm_sigprocmask(int how, sigset_t *, sigset_t *); - -void kvm_register_irq_mask_notifier(struct kvm *kvm, int irq, - struct kvm_irq_mask_notifier *kimn); -void kvm_unregister_irq_mask_notifier(struct kvm *kvm, int irq, - struct kvm_irq_mask_notifier *kimn); -void kvm_fire_mask_notifiers(struct kvm *kvm, int irq, int mask); - -extern int irqchip_in_kernel(struct kvm *kvm); -extern void kvm_inject_nmi(struct kvm_vcpu *); - -int kvm_iommu_map_pages(struct kvm *kvm, struct kvm_memory_slot *slot); -int kvm_iommu_map_guest(struct kvm *kvm); -int kvm_iommu_unmap_guest(struct kvm *kvm); -int kvm_assign_device(struct kvm *kvm, - struct kvm_assigned_dev_kernel *assigned_dev); -int kvm_deassign_device(struct kvm *kvm, - struct kvm_assigned_dev_kernel *assigned_dev); - -extern unsigned long kvm_rip_read(struct kvm_vcpu *); -extern int kvm_vcpu_is_bsp(struct kvm_vcpu *); - -extern struct kvm_cpuid_entry2 *kvm_find_cpuid_entry(struct kvm_vcpu *vcpu, - uint32_t function, uint32_t index); - -#define BITS_PER_LONG (sizeof (unsigned long) * 8) - -#define MSR_EFER 0xc0000080 /* extended feature register */ - -#define KVM_TRACE1(name, type1, arg1) \ - DTRACE_PROBE1(kvm__##name, type1, arg1); - -#define KVM_TRACE2(name, type1, arg1, type2, arg2) \ - DTRACE_PROBE2(kvm__##name, type1, arg1, type2, arg2); - -#define KVM_TRACE3(name, type1, arg1, type2, arg2, type3, arg3) \ - DTRACE_PROBE3(kvm__##name, type1, arg1, type2, arg2, type3, arg3); +typedef struct kvm_id_map_addr { + int pad; + uint64_t addr; +} kvm_id_map_addr_t; -#define KVM_TRACE4(name, type1, arg1, type2, arg2, type3, arg3, \ - type4, arg4) \ - DTRACE_PROBE4(kvm__##name, type1, arg1, type2, arg2, \ - type3, arg3, type4, arg4); +/* for KVM_SET_IDENTITY_MAP_ADDR */ +typedef struct kvm_id_map_addr_ioc { + uint64_t ident_addr; +} kvm_id_map_addr_ioc_t; -#define KVM_TRACE5(name, type1, arg1, type2, arg2, type3, arg3, \ - type4, arg4, type5, arg5) \ - DTRACE_PROBE5(kvm__##name, type1, arg1, type2, arg2, \ - type3, arg3, type4, arg4, type5, arg5); +typedef struct kvm_tpr_acl_ioc { + struct kvm_tpr_access_ctl tac; + int kvm_id; + int cpu_index; +} kvm_tpr_acl_ioc_t; -#define KVM_TRACE6(name, type1, arg1, type2, arg2, type3, arg3, \ - type4, arg4, type5, arg5, type6, arg6) \ - DTRACE_PROBE6(kvm__##name, type1, arg1, type2, arg2, \ - type3, arg3, type4, arg4, type5, arg5, type6, arg6); +typedef struct kvm_set_boot_cpu_id_ioc { + int id; +} kvm_set_boot_cpu_id_ioc_t; -#endif -#endif /*SOLARIS_KVM_H*/ +#endif /* __KVM_H */ |