at v2.6.20 5.1 kB view raw
1#ifndef __LINUX_KVM_H 2#define __LINUX_KVM_H 3 4/* 5 * Userspace interface for /dev/kvm - kernel based virtual machine 6 * 7 * Note: this interface is considered experimental and may change without 8 * notice. 9 */ 10 11#include <asm/types.h> 12#include <linux/ioctl.h> 13 14#define KVM_API_VERSION 2 15 16/* 17 * Architectural interrupt line count, and the size of the bitmap needed 18 * to hold them. 19 */ 20#define KVM_NR_INTERRUPTS 256 21#define KVM_IRQ_BITMAP_SIZE_BYTES ((KVM_NR_INTERRUPTS + 7) / 8) 22#define KVM_IRQ_BITMAP_SIZE(type) (KVM_IRQ_BITMAP_SIZE_BYTES / sizeof(type)) 23 24 25/* for KVM_CREATE_MEMORY_REGION */ 26struct kvm_memory_region { 27 __u32 slot; 28 __u32 flags; 29 __u64 guest_phys_addr; 30 __u64 memory_size; /* bytes */ 31}; 32 33/* for kvm_memory_region::flags */ 34#define KVM_MEM_LOG_DIRTY_PAGES 1UL 35 36 37#define KVM_EXIT_TYPE_FAIL_ENTRY 1 38#define KVM_EXIT_TYPE_VM_EXIT 2 39 40enum kvm_exit_reason { 41 KVM_EXIT_UNKNOWN = 0, 42 KVM_EXIT_EXCEPTION = 1, 43 KVM_EXIT_IO = 2, 44 KVM_EXIT_CPUID = 3, 45 KVM_EXIT_DEBUG = 4, 46 KVM_EXIT_HLT = 5, 47 KVM_EXIT_MMIO = 6, 48 KVM_EXIT_IRQ_WINDOW_OPEN = 7, 49 KVM_EXIT_SHUTDOWN = 8, 50}; 51 52/* for KVM_RUN */ 53struct kvm_run { 54 /* in */ 55 __u32 vcpu; 56 __u32 emulated; /* skip current instruction */ 57 __u32 mmio_completed; /* mmio request completed */ 58 __u8 request_interrupt_window; 59 __u8 padding1[3]; 60 61 /* out */ 62 __u32 exit_type; 63 __u32 exit_reason; 64 __u32 instruction_length; 65 __u8 ready_for_interrupt_injection; 66 __u8 if_flag; 67 __u16 padding2; 68 __u64 cr8; 69 __u64 apic_base; 70 71 union { 72 /* KVM_EXIT_UNKNOWN */ 73 struct { 74 __u32 hardware_exit_reason; 75 } hw; 76 /* KVM_EXIT_EXCEPTION */ 77 struct { 78 __u32 exception; 79 __u32 error_code; 80 } ex; 81 /* KVM_EXIT_IO */ 82 struct { 83#define KVM_EXIT_IO_IN 0 84#define KVM_EXIT_IO_OUT 1 85 __u8 direction; 86 __u8 size; /* bytes */ 87 __u8 string; 88 __u8 string_down; 89 __u8 rep; 90 __u8 pad; 91 __u16 port; 92 __u64 count; 93 union { 94 __u64 address; 95 __u32 value; 96 }; 97 } io; 98 struct { 99 } debug; 100 /* KVM_EXIT_MMIO */ 101 struct { 102 __u64 phys_addr; 103 __u8 data[8]; 104 __u32 len; 105 __u8 is_write; 106 } mmio; 107 }; 108}; 109 110/* for KVM_GET_REGS and KVM_SET_REGS */ 111struct kvm_regs { 112 /* in */ 113 __u32 vcpu; 114 __u32 padding; 115 116 /* out (KVM_GET_REGS) / in (KVM_SET_REGS) */ 117 __u64 rax, rbx, rcx, rdx; 118 __u64 rsi, rdi, rsp, rbp; 119 __u64 r8, r9, r10, r11; 120 __u64 r12, r13, r14, r15; 121 __u64 rip, rflags; 122}; 123 124struct kvm_segment { 125 __u64 base; 126 __u32 limit; 127 __u16 selector; 128 __u8 type; 129 __u8 present, dpl, db, s, l, g, avl; 130 __u8 unusable; 131 __u8 padding; 132}; 133 134struct kvm_dtable { 135 __u64 base; 136 __u16 limit; 137 __u16 padding[3]; 138}; 139 140/* for KVM_GET_SREGS and KVM_SET_SREGS */ 141struct kvm_sregs { 142 /* in */ 143 __u32 vcpu; 144 __u32 padding; 145 146 /* out (KVM_GET_SREGS) / in (KVM_SET_SREGS) */ 147 struct kvm_segment cs, ds, es, fs, gs, ss; 148 struct kvm_segment tr, ldt; 149 struct kvm_dtable gdt, idt; 150 __u64 cr0, cr2, cr3, cr4, cr8; 151 __u64 efer; 152 __u64 apic_base; 153 __u64 interrupt_bitmap[KVM_IRQ_BITMAP_SIZE(__u64)]; 154}; 155 156struct kvm_msr_entry { 157 __u32 index; 158 __u32 reserved; 159 __u64 data; 160}; 161 162/* for KVM_GET_MSRS and KVM_SET_MSRS */ 163struct kvm_msrs { 164 __u32 vcpu; 165 __u32 nmsrs; /* number of msrs in entries */ 166 167 struct kvm_msr_entry entries[0]; 168}; 169 170/* for KVM_GET_MSR_INDEX_LIST */ 171struct kvm_msr_list { 172 __u32 nmsrs; /* number of msrs in entries */ 173 __u32 indices[0]; 174}; 175 176/* for KVM_TRANSLATE */ 177struct kvm_translation { 178 /* in */ 179 __u64 linear_address; 180 __u32 vcpu; 181 __u32 padding; 182 183 /* out */ 184 __u64 physical_address; 185 __u8 valid; 186 __u8 writeable; 187 __u8 usermode; 188}; 189 190/* for KVM_INTERRUPT */ 191struct kvm_interrupt { 192 /* in */ 193 __u32 vcpu; 194 __u32 irq; 195}; 196 197struct kvm_breakpoint { 198 __u32 enabled; 199 __u32 padding; 200 __u64 address; 201}; 202 203/* for KVM_DEBUG_GUEST */ 204struct kvm_debug_guest { 205 /* int */ 206 __u32 vcpu; 207 __u32 enabled; 208 struct kvm_breakpoint breakpoints[4]; 209 __u32 singlestep; 210}; 211 212/* for KVM_GET_DIRTY_LOG */ 213struct kvm_dirty_log { 214 __u32 slot; 215 __u32 padding; 216 union { 217 void __user *dirty_bitmap; /* one bit per page */ 218 __u64 padding; 219 }; 220}; 221 222#define KVMIO 0xAE 223 224#define KVM_GET_API_VERSION _IO(KVMIO, 1) 225#define KVM_RUN _IOWR(KVMIO, 2, struct kvm_run) 226#define KVM_GET_REGS _IOWR(KVMIO, 3, struct kvm_regs) 227#define KVM_SET_REGS _IOW(KVMIO, 4, struct kvm_regs) 228#define KVM_GET_SREGS _IOWR(KVMIO, 5, struct kvm_sregs) 229#define KVM_SET_SREGS _IOW(KVMIO, 6, struct kvm_sregs) 230#define KVM_TRANSLATE _IOWR(KVMIO, 7, struct kvm_translation) 231#define KVM_INTERRUPT _IOW(KVMIO, 8, struct kvm_interrupt) 232#define KVM_DEBUG_GUEST _IOW(KVMIO, 9, struct kvm_debug_guest) 233#define KVM_SET_MEMORY_REGION _IOW(KVMIO, 10, struct kvm_memory_region) 234#define KVM_CREATE_VCPU _IOW(KVMIO, 11, int /* vcpu_slot */) 235#define KVM_GET_DIRTY_LOG _IOW(KVMIO, 12, struct kvm_dirty_log) 236#define KVM_GET_MSRS _IOWR(KVMIO, 13, struct kvm_msrs) 237#define KVM_SET_MSRS _IOWR(KVMIO, 14, struct kvm_msrs) 238#define KVM_GET_MSR_INDEX_LIST _IOWR(KVMIO, 15, struct kvm_msr_list) 239 240#endif