at v2.6.24 8.8 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: you must update KVM_API_VERSION if you change this interface. 8 */ 9 10#include <asm/types.h> 11#include <linux/ioctl.h> 12 13#define KVM_API_VERSION 12 14 15/* Architectural interrupt line count. */ 16#define KVM_NR_INTERRUPTS 256 17 18/* for KVM_CREATE_MEMORY_REGION */ 19struct kvm_memory_region { 20 __u32 slot; 21 __u32 flags; 22 __u64 guest_phys_addr; 23 __u64 memory_size; /* bytes */ 24}; 25 26/* for kvm_memory_region::flags */ 27#define KVM_MEM_LOG_DIRTY_PAGES 1UL 28 29struct kvm_memory_alias { 30 __u32 slot; /* this has a different namespace than memory slots */ 31 __u32 flags; 32 __u64 guest_phys_addr; 33 __u64 memory_size; 34 __u64 target_phys_addr; 35}; 36 37/* for KVM_IRQ_LINE */ 38struct kvm_irq_level { 39 /* 40 * ACPI gsi notion of irq. 41 * For IA-64 (APIC model) IOAPIC0: irq 0-23; IOAPIC1: irq 24-47.. 42 * For X86 (standard AT mode) PIC0/1: irq 0-15. IOAPIC0: 0-23.. 43 */ 44 __u32 irq; 45 __u32 level; 46}; 47 48/* for KVM_GET_IRQCHIP and KVM_SET_IRQCHIP */ 49struct kvm_pic_state { 50 __u8 last_irr; /* edge detection */ 51 __u8 irr; /* interrupt request register */ 52 __u8 imr; /* interrupt mask register */ 53 __u8 isr; /* interrupt service register */ 54 __u8 priority_add; /* highest irq priority */ 55 __u8 irq_base; 56 __u8 read_reg_select; 57 __u8 poll; 58 __u8 special_mask; 59 __u8 init_state; 60 __u8 auto_eoi; 61 __u8 rotate_on_auto_eoi; 62 __u8 special_fully_nested_mode; 63 __u8 init4; /* true if 4 byte init */ 64 __u8 elcr; /* PIIX edge/trigger selection */ 65 __u8 elcr_mask; 66}; 67 68#define KVM_IOAPIC_NUM_PINS 24 69struct kvm_ioapic_state { 70 __u64 base_address; 71 __u32 ioregsel; 72 __u32 id; 73 __u32 irr; 74 __u32 pad; 75 union { 76 __u64 bits; 77 struct { 78 __u8 vector; 79 __u8 delivery_mode:3; 80 __u8 dest_mode:1; 81 __u8 delivery_status:1; 82 __u8 polarity:1; 83 __u8 remote_irr:1; 84 __u8 trig_mode:1; 85 __u8 mask:1; 86 __u8 reserve:7; 87 __u8 reserved[4]; 88 __u8 dest_id; 89 } fields; 90 } redirtbl[KVM_IOAPIC_NUM_PINS]; 91}; 92 93#define KVM_IRQCHIP_PIC_MASTER 0 94#define KVM_IRQCHIP_PIC_SLAVE 1 95#define KVM_IRQCHIP_IOAPIC 2 96 97struct kvm_irqchip { 98 __u32 chip_id; 99 __u32 pad; 100 union { 101 char dummy[512]; /* reserving space */ 102 struct kvm_pic_state pic; 103 struct kvm_ioapic_state ioapic; 104 } chip; 105}; 106 107#define KVM_EXIT_UNKNOWN 0 108#define KVM_EXIT_EXCEPTION 1 109#define KVM_EXIT_IO 2 110#define KVM_EXIT_HYPERCALL 3 111#define KVM_EXIT_DEBUG 4 112#define KVM_EXIT_HLT 5 113#define KVM_EXIT_MMIO 6 114#define KVM_EXIT_IRQ_WINDOW_OPEN 7 115#define KVM_EXIT_SHUTDOWN 8 116#define KVM_EXIT_FAIL_ENTRY 9 117#define KVM_EXIT_INTR 10 118#define KVM_EXIT_SET_TPR 11 119 120/* for KVM_RUN, returned by mmap(vcpu_fd, offset=0) */ 121struct kvm_run { 122 /* in */ 123 __u8 request_interrupt_window; 124 __u8 padding1[7]; 125 126 /* out */ 127 __u32 exit_reason; 128 __u8 ready_for_interrupt_injection; 129 __u8 if_flag; 130 __u8 padding2[2]; 131 132 /* in (pre_kvm_run), out (post_kvm_run) */ 133 __u64 cr8; 134 __u64 apic_base; 135 136 union { 137 /* KVM_EXIT_UNKNOWN */ 138 struct { 139 __u64 hardware_exit_reason; 140 } hw; 141 /* KVM_EXIT_FAIL_ENTRY */ 142 struct { 143 __u64 hardware_entry_failure_reason; 144 } fail_entry; 145 /* KVM_EXIT_EXCEPTION */ 146 struct { 147 __u32 exception; 148 __u32 error_code; 149 } ex; 150 /* KVM_EXIT_IO */ 151 struct kvm_io { 152#define KVM_EXIT_IO_IN 0 153#define KVM_EXIT_IO_OUT 1 154 __u8 direction; 155 __u8 size; /* bytes */ 156 __u16 port; 157 __u32 count; 158 __u64 data_offset; /* relative to kvm_run start */ 159 } io; 160 struct { 161 } debug; 162 /* KVM_EXIT_MMIO */ 163 struct { 164 __u64 phys_addr; 165 __u8 data[8]; 166 __u32 len; 167 __u8 is_write; 168 } mmio; 169 /* KVM_EXIT_HYPERCALL */ 170 struct { 171 __u64 nr; 172 __u64 args[6]; 173 __u64 ret; 174 __u32 longmode; 175 __u32 pad; 176 } hypercall; 177 /* Fix the size of the union. */ 178 char padding[256]; 179 }; 180}; 181 182/* for KVM_GET_REGS and KVM_SET_REGS */ 183struct kvm_regs { 184 /* out (KVM_GET_REGS) / in (KVM_SET_REGS) */ 185 __u64 rax, rbx, rcx, rdx; 186 __u64 rsi, rdi, rsp, rbp; 187 __u64 r8, r9, r10, r11; 188 __u64 r12, r13, r14, r15; 189 __u64 rip, rflags; 190}; 191 192/* for KVM_GET_FPU and KVM_SET_FPU */ 193struct kvm_fpu { 194 __u8 fpr[8][16]; 195 __u16 fcw; 196 __u16 fsw; 197 __u8 ftwx; /* in fxsave format */ 198 __u8 pad1; 199 __u16 last_opcode; 200 __u64 last_ip; 201 __u64 last_dp; 202 __u8 xmm[16][16]; 203 __u32 mxcsr; 204 __u32 pad2; 205}; 206 207/* for KVM_GET_LAPIC and KVM_SET_LAPIC */ 208#define KVM_APIC_REG_SIZE 0x400 209struct kvm_lapic_state { 210 char regs[KVM_APIC_REG_SIZE]; 211}; 212 213struct kvm_segment { 214 __u64 base; 215 __u32 limit; 216 __u16 selector; 217 __u8 type; 218 __u8 present, dpl, db, s, l, g, avl; 219 __u8 unusable; 220 __u8 padding; 221}; 222 223struct kvm_dtable { 224 __u64 base; 225 __u16 limit; 226 __u16 padding[3]; 227}; 228 229/* for KVM_GET_SREGS and KVM_SET_SREGS */ 230struct kvm_sregs { 231 /* out (KVM_GET_SREGS) / in (KVM_SET_SREGS) */ 232 struct kvm_segment cs, ds, es, fs, gs, ss; 233 struct kvm_segment tr, ldt; 234 struct kvm_dtable gdt, idt; 235 __u64 cr0, cr2, cr3, cr4, cr8; 236 __u64 efer; 237 __u64 apic_base; 238 __u64 interrupt_bitmap[(KVM_NR_INTERRUPTS + 63) / 64]; 239}; 240 241struct kvm_msr_entry { 242 __u32 index; 243 __u32 reserved; 244 __u64 data; 245}; 246 247/* for KVM_GET_MSRS and KVM_SET_MSRS */ 248struct kvm_msrs { 249 __u32 nmsrs; /* number of msrs in entries */ 250 __u32 pad; 251 252 struct kvm_msr_entry entries[0]; 253}; 254 255/* for KVM_GET_MSR_INDEX_LIST */ 256struct kvm_msr_list { 257 __u32 nmsrs; /* number of msrs in entries */ 258 __u32 indices[0]; 259}; 260 261/* for KVM_TRANSLATE */ 262struct kvm_translation { 263 /* in */ 264 __u64 linear_address; 265 266 /* out */ 267 __u64 physical_address; 268 __u8 valid; 269 __u8 writeable; 270 __u8 usermode; 271 __u8 pad[5]; 272}; 273 274/* for KVM_INTERRUPT */ 275struct kvm_interrupt { 276 /* in */ 277 __u32 irq; 278}; 279 280struct kvm_breakpoint { 281 __u32 enabled; 282 __u32 padding; 283 __u64 address; 284}; 285 286/* for KVM_DEBUG_GUEST */ 287struct kvm_debug_guest { 288 /* int */ 289 __u32 enabled; 290 __u32 pad; 291 struct kvm_breakpoint breakpoints[4]; 292 __u32 singlestep; 293}; 294 295/* for KVM_GET_DIRTY_LOG */ 296struct kvm_dirty_log { 297 __u32 slot; 298 __u32 padding; 299 union { 300 void __user *dirty_bitmap; /* one bit per page */ 301 __u64 padding; 302 }; 303}; 304 305struct kvm_cpuid_entry { 306 __u32 function; 307 __u32 eax; 308 __u32 ebx; 309 __u32 ecx; 310 __u32 edx; 311 __u32 padding; 312}; 313 314/* for KVM_SET_CPUID */ 315struct kvm_cpuid { 316 __u32 nent; 317 __u32 padding; 318 struct kvm_cpuid_entry entries[0]; 319}; 320 321/* for KVM_SET_SIGNAL_MASK */ 322struct kvm_signal_mask { 323 __u32 len; 324 __u8 sigset[0]; 325}; 326 327#define KVMIO 0xAE 328 329/* 330 * ioctls for /dev/kvm fds: 331 */ 332#define KVM_GET_API_VERSION _IO(KVMIO, 0x00) 333#define KVM_CREATE_VM _IO(KVMIO, 0x01) /* returns a VM fd */ 334#define KVM_GET_MSR_INDEX_LIST _IOWR(KVMIO, 0x02, struct kvm_msr_list) 335/* 336 * Check if a kvm extension is available. Argument is extension number, 337 * return is 1 (yes) or 0 (no, sorry). 338 */ 339#define KVM_CHECK_EXTENSION _IO(KVMIO, 0x03) 340/* 341 * Get size for mmap(vcpu_fd) 342 */ 343#define KVM_GET_VCPU_MMAP_SIZE _IO(KVMIO, 0x04) /* in bytes */ 344 345/* 346 * Extension capability list. 347 */ 348#define KVM_CAP_IRQCHIP 0 349#define KVM_CAP_HLT 1 350 351/* 352 * ioctls for VM fds 353 */ 354#define KVM_SET_MEMORY_REGION _IOW(KVMIO, 0x40, struct kvm_memory_region) 355/* 356 * KVM_CREATE_VCPU receives as a parameter the vcpu slot, and returns 357 * a vcpu fd. 358 */ 359#define KVM_CREATE_VCPU _IO(KVMIO, 0x41) 360#define KVM_GET_DIRTY_LOG _IOW(KVMIO, 0x42, struct kvm_dirty_log) 361#define KVM_SET_MEMORY_ALIAS _IOW(KVMIO, 0x43, struct kvm_memory_alias) 362/* Device model IOC */ 363#define KVM_CREATE_IRQCHIP _IO(KVMIO, 0x60) 364#define KVM_IRQ_LINE _IOW(KVMIO, 0x61, struct kvm_irq_level) 365#define KVM_GET_IRQCHIP _IOWR(KVMIO, 0x62, struct kvm_irqchip) 366#define KVM_SET_IRQCHIP _IOR(KVMIO, 0x63, struct kvm_irqchip) 367 368/* 369 * ioctls for vcpu fds 370 */ 371#define KVM_RUN _IO(KVMIO, 0x80) 372#define KVM_GET_REGS _IOR(KVMIO, 0x81, struct kvm_regs) 373#define KVM_SET_REGS _IOW(KVMIO, 0x82, struct kvm_regs) 374#define KVM_GET_SREGS _IOR(KVMIO, 0x83, struct kvm_sregs) 375#define KVM_SET_SREGS _IOW(KVMIO, 0x84, struct kvm_sregs) 376#define KVM_TRANSLATE _IOWR(KVMIO, 0x85, struct kvm_translation) 377#define KVM_INTERRUPT _IOW(KVMIO, 0x86, struct kvm_interrupt) 378#define KVM_DEBUG_GUEST _IOW(KVMIO, 0x87, struct kvm_debug_guest) 379#define KVM_GET_MSRS _IOWR(KVMIO, 0x88, struct kvm_msrs) 380#define KVM_SET_MSRS _IOW(KVMIO, 0x89, struct kvm_msrs) 381#define KVM_SET_CPUID _IOW(KVMIO, 0x8a, struct kvm_cpuid) 382#define KVM_SET_SIGNAL_MASK _IOW(KVMIO, 0x8b, struct kvm_signal_mask) 383#define KVM_GET_FPU _IOR(KVMIO, 0x8c, struct kvm_fpu) 384#define KVM_SET_FPU _IOW(KVMIO, 0x8d, struct kvm_fpu) 385#define KVM_GET_LAPIC _IOR(KVMIO, 0x8e, struct kvm_lapic_state) 386#define KVM_SET_LAPIC _IOW(KVMIO, 0x8f, struct kvm_lapic_state) 387 388#endif