2 * Kernel-based Virtual Machine control library
4 * This library provides an API to control the kvm hardware virtualization
7 * Copyright (C) 2006 Qumranet
11 * Avi Kivity <avi@qumranet.com>
12 * Yaniv Kamay <yaniv@qumranet.com>
14 * This work is licensed under the GNU LGPL license, version 2.
18 #define __user /* temporary, until installed via make headers_install */
21 #include <linux/kvm.h>
23 #define EXPECTED_KVM_API_VERSION 12
25 #if EXPECTED_KVM_API_VERSION != KVM_API_VERSION
26 #error libkvm: userspace and kernel version mismatch
36 #include <sys/ioctl.h>
38 #include "kvm-abi-10.h"
40 static int kvm_abi
= EXPECTED_KVM_API_VERSION
;
42 #define PAGE_SIZE 4096ul
44 /* FIXME: share this number with kvm */
45 /* FIXME: or dynamically alloc/realloc regions */
46 #define KVM_MAX_NUM_MEM_REGIONS 4u
50 * \brief The KVM context
52 * The verbose KVM context
55 /// Filedescriptor to /dev/kvm
58 int vcpu_fd
[MAX_VCPUS
];
59 struct kvm_run
*run
[MAX_VCPUS
];
60 /// Callbacks that KVM uses to emulate various unvirtualizable functionality
61 struct kvm_callbacks
*callbacks
;
63 /// A pointer to the memory used as the physical memory for the guest
64 void *physical_memory
;
65 /// is dirty pages logging enabled for all regions or not
66 int dirty_pages_log_all
;
67 /// memory regions parameters
68 struct kvm_memory_region mem_regions
[KVM_MAX_NUM_MEM_REGIONS
];
72 * memory regions parameters
74 static void kvm_memory_region_save_params(kvm_context_t kvm
,
75 struct kvm_memory_region
*mem
)
77 if (!mem
|| (mem
->slot
>= KVM_MAX_NUM_MEM_REGIONS
)) {
78 fprintf(stderr
, "BUG: %s: invalid parameters\n", __FUNCTION__
);
81 kvm
->mem_regions
[mem
->slot
] = *mem
;
84 static void kvm_memory_region_clear_params(kvm_context_t kvm
, int regnum
)
86 if (regnum
>= KVM_MAX_NUM_MEM_REGIONS
) {
87 fprintf(stderr
, "BUG: %s: invalid parameters\n", __FUNCTION__
);
90 kvm
->mem_regions
[regnum
].memory_size
= 0;
94 * dirty pages logging control
96 static int kvm_dirty_pages_log_change(kvm_context_t kvm
, int regnum
, __u32 flag
)
99 struct kvm_memory_region
*mem
;
101 if (regnum
>= KVM_MAX_NUM_MEM_REGIONS
) {
102 fprintf(stderr
, "BUG: %s: invalid parameters\n", __FUNCTION__
);
105 mem
= &kvm
->mem_regions
[regnum
];
106 if (mem
->memory_size
== 0) /* not used */
108 if (mem
->flags
& KVM_MEM_LOG_DIRTY_PAGES
) /* log already enabled */
110 mem
->flags
|= flag
; /* temporary turn on flag */
111 r
= ioctl(kvm
->vm_fd
, KVM_SET_MEMORY_REGION
, mem
);
112 mem
->flags
&= ~flag
; /* back to previous value */
114 fprintf(stderr
, "%s: %m\n", __FUNCTION__
);
119 static int kvm_dirty_pages_log_change_all(kvm_context_t kvm
, __u32 flag
)
123 for (i
=r
=0; i
<KVM_MAX_NUM_MEM_REGIONS
&& r
==0; i
++) {
124 r
= kvm_dirty_pages_log_change(kvm
, i
, flag
);
130 * Enable dirty page logging for all memory regions
132 int kvm_dirty_pages_log_enable_all(kvm_context_t kvm
)
134 if (kvm
->dirty_pages_log_all
)
136 kvm
->dirty_pages_log_all
= 1;
137 return kvm_dirty_pages_log_change_all(kvm
, KVM_MEM_LOG_DIRTY_PAGES
);
141 * Enable dirty page logging only for memory regions that were created with
142 * dirty logging enabled (disable for all other memory regions).
144 int kvm_dirty_pages_log_reset(kvm_context_t kvm
)
146 if (!kvm
->dirty_pages_log_all
)
148 kvm
->dirty_pages_log_all
= 0;
149 return kvm_dirty_pages_log_change_all(kvm
, 0);
153 kvm_context_t
kvm_init(struct kvm_callbacks
*callbacks
,
160 fd
= open("/dev/kvm", O_RDWR
);
162 perror("open /dev/kvm");
165 r
= ioctl(fd
, KVM_GET_API_VERSION
, 0);
167 fprintf(stderr
, "kvm kernel version too old: "
168 "KVM_GET_API_VERSION ioctl not supported\n");
171 if (r
< EXPECTED_KVM_API_VERSION
&& r
!= 10) {
172 fprintf(stderr
, "kvm kernel version too old: "
173 "We expect API version %d or newer, but got "
175 EXPECTED_KVM_API_VERSION
, r
);
178 if (r
> EXPECTED_KVM_API_VERSION
) {
179 fprintf(stderr
, "kvm userspace version too old\n");
183 kvm
= malloc(sizeof(*kvm
));
186 kvm
->callbacks
= callbacks
;
187 kvm
->opaque
= opaque
;
188 kvm
->dirty_pages_log_all
= 0;
189 memset(&kvm
->mem_regions
, 0, sizeof(kvm
->mem_regions
));
197 void kvm_finalize(kvm_context_t kvm
)
199 if (kvm
->vcpu_fd
[0] != -1)
200 close(kvm
->vcpu_fd
[0]);
201 if (kvm
->vm_fd
!= -1)
207 int kvm_create_vcpu(kvm_context_t kvm
, int slot
)
212 r
= ioctl(kvm
->vm_fd
, KVM_CREATE_VCPU
, slot
);
215 fprintf(stderr
, "kvm_create_vcpu: %m\n");
218 kvm
->vcpu_fd
[slot
] = r
;
219 mmap_size
= ioctl(kvm
->fd
, KVM_GET_VCPU_MMAP_SIZE
, 0);
220 if (mmap_size
== -1) {
222 fprintf(stderr
, "get vcpu mmap size: %m\n");
225 kvm
->run
[slot
] = mmap(0, mmap_size
, PROT_READ
|PROT_WRITE
, MAP_SHARED
,
226 kvm
->vcpu_fd
[slot
], 0);
227 if (kvm
->run
[slot
] == MAP_FAILED
) {
229 fprintf(stderr
, "mmap vcpu area: %m\n");
235 int kvm_create(kvm_context_t kvm
, unsigned long memory
, void **vm_mem
)
237 unsigned long dosmem
= 0xa0000;
238 unsigned long exmem
= 0xc0000;
242 struct kvm_memory_region low_memory
= {
244 .memory_size
= memory
< dosmem
? memory
: dosmem
,
245 .guest_phys_addr
= 0,
247 struct kvm_memory_region extended_memory
= {
249 .memory_size
= memory
< exmem
? 0 : memory
- exmem
,
250 .guest_phys_addr
= exmem
,
253 kvm
->vcpu_fd
[0] = -1;
255 fd
= ioctl(fd
, KVM_CREATE_VM
, 0);
257 fprintf(stderr
, "kvm_create_vm: %m\n");
262 /* 640K should be enough. */
263 r
= ioctl(fd
, KVM_SET_MEMORY_REGION
, &low_memory
);
265 fprintf(stderr
, "kvm_create_memory_region: %m\n");
268 if (extended_memory
.memory_size
) {
269 r
= ioctl(fd
, KVM_SET_MEMORY_REGION
, &extended_memory
);
271 fprintf(stderr
, "kvm_create_memory_region: %m\n");
276 kvm_memory_region_save_params(kvm
, &low_memory
);
277 kvm_memory_region_save_params(kvm
, &extended_memory
);
279 *vm_mem
= mmap(0, memory
, PROT_READ
|PROT_WRITE
, MAP_SHARED
, fd
, 0);
280 if (*vm_mem
== MAP_FAILED
) {
281 fprintf(stderr
, "mmap: %m\n");
284 kvm
->physical_memory
= *vm_mem
;
286 zfd
= open("/dev/zero", O_RDONLY
);
287 mmap(*vm_mem
+ 0xa8000, 0x8000, PROT_READ
|PROT_WRITE
,
288 MAP_PRIVATE
|MAP_FIXED
, zfd
, 0);
291 r
= kvm_create_vcpu(kvm
, 0);
298 void *kvm_create_phys_mem(kvm_context_t kvm
, unsigned long phys_start
,
299 unsigned long len
, int slot
, int log
, int writable
)
304 int prot
= PROT_READ
;
305 struct kvm_memory_region memory
= {
308 .guest_phys_addr
= phys_start
,
309 .flags
= log
? KVM_MEM_LOG_DIRTY_PAGES
: 0,
312 r
= ioctl(fd
, KVM_SET_MEMORY_REGION
, &memory
);
316 kvm_memory_region_save_params(kvm
, &memory
);
321 ptr
= mmap(0, len
, prot
, MAP_SHARED
, fd
, phys_start
);
322 if (ptr
== MAP_FAILED
)
327 void kvm_destroy_phys_mem(kvm_context_t kvm
, unsigned long phys_start
,
330 //for each memory region in (phys_start, phys_start+len) do
331 // kvm_memory_region_clear_params(kvm, region);
332 kvm_memory_region_clear_params(kvm
, 0); /* avoid compiler warning */
333 printf("kvm_destroy_phys_mem: implement me\n");
337 int kvm_create_memory_alias(kvm_context_t kvm
,
341 uint64_t target_phys
)
343 struct kvm_memory_alias alias
= {
346 .guest_phys_addr
= phys_start
,
348 .target_phys_addr
= target_phys
,
353 r
= ioctl(fd
, KVM_SET_MEMORY_ALIAS
, &alias
);
360 int kvm_destroy_memory_alias(kvm_context_t kvm
, int slot
)
362 return kvm_create_memory_alias(kvm
, slot
, 0, 0, 0);
365 static int kvm_get_map(kvm_context_t kvm
, int ioctl_num
, int slot
, void *buf
)
368 struct kvm_dirty_log log
= {
372 log
.dirty_bitmap
= buf
;
374 r
= ioctl(kvm
->vm_fd
, ioctl_num
, &log
);
380 int kvm_get_dirty_pages(kvm_context_t kvm
, int slot
, void *buf
)
382 return kvm_get_map(kvm
, KVM_GET_DIRTY_LOG
, slot
, buf
);
385 int kvm_get_mem_map(kvm_context_t kvm
, int slot
, void *buf
)
387 #ifdef KVM_GET_MEM_MAP
388 return kvm_get_map(kvm
, KVM_GET_MEM_MAP
, slot
, buf
);
389 #else /* not KVM_GET_MEM_MAP ==> fake it: all pages exist */
390 unsigned long i
, n
, m
, npages
;
393 if (slot
>= KVM_MAX_NUM_MEM_REGIONS
) {
397 npages
= kvm
->mem_regions
[slot
].memory_size
/ PAGE_SIZE
;
400 memset(buf
, 0xff, n
); /* all pages exist */
402 for (i
=0; i
<=m
; i
++) /* last byte may not be "aligned" */
405 *(unsigned char*)(buf
+n
) = v
;
407 #endif /* KVM_GET_MEM_MAP */
410 static int handle_io_abi10(kvm_context_t kvm
, struct kvm_run_abi10
*run
,
413 uint16_t addr
= run
->io
.port
;
416 void *p
= (void *)run
+ run
->io
.data_offset
;
418 for (i
= 0; i
< run
->io
.count
; ++i
) {
419 switch (run
->io
.direction
) {
421 switch (run
->io
.size
) {
423 r
= kvm
->callbacks
->inb(kvm
->opaque
, addr
, p
);
426 r
= kvm
->callbacks
->inw(kvm
->opaque
, addr
, p
);
429 r
= kvm
->callbacks
->inl(kvm
->opaque
, addr
, p
);
432 fprintf(stderr
, "bad I/O size %d\n", run
->io
.size
);
436 case KVM_EXIT_IO_OUT
:
437 switch (run
->io
.size
) {
439 r
= kvm
->callbacks
->outb(kvm
->opaque
, addr
,
443 r
= kvm
->callbacks
->outw(kvm
->opaque
, addr
,
447 r
= kvm
->callbacks
->outl(kvm
->opaque
, addr
,
451 fprintf(stderr
, "bad I/O size %d\n", run
->io
.size
);
456 fprintf(stderr
, "bad I/O direction %d\n", run
->io
.direction
);
462 run
->io_completed
= 1;
467 static int handle_io(kvm_context_t kvm
, struct kvm_run
*run
, int vcpu
)
469 uint16_t addr
= run
->io
.port
;
472 void *p
= (void *)run
+ run
->io
.data_offset
;
474 for (i
= 0; i
< run
->io
.count
; ++i
) {
475 switch (run
->io
.direction
) {
477 switch (run
->io
.size
) {
479 r
= kvm
->callbacks
->inb(kvm
->opaque
, addr
, p
);
482 r
= kvm
->callbacks
->inw(kvm
->opaque
, addr
, p
);
485 r
= kvm
->callbacks
->inl(kvm
->opaque
, addr
, p
);
488 fprintf(stderr
, "bad I/O size %d\n", run
->io
.size
);
492 case KVM_EXIT_IO_OUT
:
493 switch (run
->io
.size
) {
495 r
= kvm
->callbacks
->outb(kvm
->opaque
, addr
,
499 r
= kvm
->callbacks
->outw(kvm
->opaque
, addr
,
503 r
= kvm
->callbacks
->outl(kvm
->opaque
, addr
,
507 fprintf(stderr
, "bad I/O size %d\n", run
->io
.size
);
512 fprintf(stderr
, "bad I/O direction %d\n", run
->io
.direction
);
522 static int handle_debug(kvm_context_t kvm
, int vcpu
)
524 return kvm
->callbacks
->debug(kvm
->opaque
, vcpu
);
527 int kvm_get_regs(kvm_context_t kvm
, int vcpu
, struct kvm_regs
*regs
)
529 return ioctl(kvm
->vcpu_fd
[vcpu
], KVM_GET_REGS
, regs
);
532 int kvm_set_regs(kvm_context_t kvm
, int vcpu
, struct kvm_regs
*regs
)
534 return ioctl(kvm
->vcpu_fd
[vcpu
], KVM_SET_REGS
, regs
);
537 int kvm_get_fpu(kvm_context_t kvm
, int vcpu
, struct kvm_fpu
*fpu
)
539 return ioctl(kvm
->vcpu_fd
[vcpu
], KVM_GET_FPU
, fpu
);
542 int kvm_set_fpu(kvm_context_t kvm
, int vcpu
, struct kvm_fpu
*fpu
)
544 return ioctl(kvm
->vcpu_fd
[vcpu
], KVM_SET_FPU
, fpu
);
547 int kvm_get_sregs(kvm_context_t kvm
, int vcpu
, struct kvm_sregs
*sregs
)
549 return ioctl(kvm
->vcpu_fd
[vcpu
], KVM_GET_SREGS
, sregs
);
552 int kvm_set_sregs(kvm_context_t kvm
, int vcpu
, struct kvm_sregs
*sregs
)
554 return ioctl(kvm
->vcpu_fd
[vcpu
], KVM_SET_SREGS
, sregs
);
558 * Returns available msr list. User must free.
560 struct kvm_msr_list
*kvm_get_msr_list(kvm_context_t kvm
)
562 struct kvm_msr_list sizer
, *msrs
;
566 r
= ioctl(kvm
->fd
, KVM_GET_MSR_INDEX_LIST
, &sizer
);
567 if (r
== -1 && errno
!= E2BIG
)
569 msrs
= malloc(sizeof *msrs
+ sizer
.nmsrs
* sizeof *msrs
->indices
);
574 msrs
->nmsrs
= sizer
.nmsrs
;
575 r
= ioctl(kvm
->fd
, KVM_GET_MSR_INDEX_LIST
, msrs
);
585 int kvm_get_msrs(kvm_context_t kvm
, int vcpu
, struct kvm_msr_entry
*msrs
,
588 struct kvm_msrs
*kmsrs
= malloc(sizeof *kmsrs
+ n
* sizeof *msrs
);
596 memcpy(kmsrs
->entries
, msrs
, n
* sizeof *msrs
);
597 r
= ioctl(kvm
->vcpu_fd
[vcpu
], KVM_GET_MSRS
, kmsrs
);
599 memcpy(msrs
, kmsrs
->entries
, n
* sizeof *msrs
);
605 int kvm_set_msrs(kvm_context_t kvm
, int vcpu
, struct kvm_msr_entry
*msrs
,
608 struct kvm_msrs
*kmsrs
= malloc(sizeof *kmsrs
+ n
* sizeof *msrs
);
616 memcpy(kmsrs
->entries
, msrs
, n
* sizeof *msrs
);
617 r
= ioctl(kvm
->vcpu_fd
[vcpu
], KVM_SET_MSRS
, kmsrs
);
624 static void print_seg(FILE *file
, const char *name
, struct kvm_segment
*seg
)
627 "%s %04x (%08llx/%08x p %d dpl %d db %d s %d type %x l %d"
629 name
, seg
->selector
, seg
->base
, seg
->limit
, seg
->present
,
630 seg
->dpl
, seg
->db
, seg
->s
, seg
->type
, seg
->l
, seg
->g
,
634 static void print_dt(FILE *file
, const char *name
, struct kvm_dtable
*dt
)
636 fprintf(stderr
, "%s %llx/%x\n", name
, dt
->base
, dt
->limit
);
639 void kvm_show_regs(kvm_context_t kvm
, int vcpu
)
641 int fd
= kvm
->vcpu_fd
[vcpu
];
642 struct kvm_regs regs
;
643 struct kvm_sregs sregs
;
646 r
= ioctl(fd
, KVM_GET_REGS
, ®s
);
648 perror("KVM_GET_REGS");
652 "rax %016llx rbx %016llx rcx %016llx rdx %016llx\n"
653 "rsi %016llx rdi %016llx rsp %016llx rbp %016llx\n"
654 "r8 %016llx r9 %016llx r10 %016llx r11 %016llx\n"
655 "r12 %016llx r13 %016llx r14 %016llx r15 %016llx\n"
656 "rip %016llx rflags %08llx\n",
657 regs
.rax
, regs
.rbx
, regs
.rcx
, regs
.rdx
,
658 regs
.rsi
, regs
.rdi
, regs
.rsp
, regs
.rbp
,
659 regs
.r8
, regs
.r9
, regs
.r10
, regs
.r11
,
660 regs
.r12
, regs
.r13
, regs
.r14
, regs
.r15
,
661 regs
.rip
, regs
.rflags
);
662 r
= ioctl(fd
, KVM_GET_SREGS
, &sregs
);
664 perror("KVM_GET_SREGS");
667 print_seg(stderr
, "cs", &sregs
.cs
);
668 print_seg(stderr
, "ds", &sregs
.ds
);
669 print_seg(stderr
, "es", &sregs
.es
);
670 print_seg(stderr
, "ss", &sregs
.ss
);
671 print_seg(stderr
, "fs", &sregs
.fs
);
672 print_seg(stderr
, "gs", &sregs
.gs
);
673 print_seg(stderr
, "tr", &sregs
.tr
);
674 print_seg(stderr
, "ldt", &sregs
.ldt
);
675 print_dt(stderr
, "gdt", &sregs
.gdt
);
676 print_dt(stderr
, "idt", &sregs
.idt
);
677 fprintf(stderr
, "cr0 %llx cr2 %llx cr3 %llx cr4 %llx cr8 %llx"
679 sregs
.cr0
, sregs
.cr2
, sregs
.cr3
, sregs
.cr4
, sregs
.cr8
,
683 static void kvm_show_code(kvm_context_t kvm
, int vcpu
)
685 #define CR0_PE_MASK (1ULL<<0)
686 int fd
= kvm
->vcpu_fd
[vcpu
];
687 struct kvm_regs regs
;
688 struct kvm_sregs sregs
;
690 unsigned char code
[30];
691 char code_str
[sizeof(code
) * 3 + 1];
694 r
= ioctl(fd
, KVM_GET_SREGS
, &sregs
);
696 perror("KVM_GET_SREGS");
699 if (sregs
.cr0
& CR0_PE_MASK
)
702 r
= ioctl(fd
, KVM_GET_REGS
, ®s
);
704 perror("KVM_GET_REGS");
707 rip
= sregs
.cs
.base
* 16 + regs
.rip
;
708 memcpy(code
, kvm
->physical_memory
+ rip
, sizeof code
);
710 for (r
= 0; r
< sizeof code
; ++r
)
711 sprintf(code_str
+ strlen(code_str
), " %02x", code
[r
]);
712 fprintf(stderr
, "code:%s\n", code_str
);
715 static int handle_mmio_abi10(kvm_context_t kvm
, struct kvm_run_abi10
*kvm_run
)
717 unsigned long addr
= kvm_run
->mmio
.phys_addr
;
718 void *data
= kvm_run
->mmio
.data
;
721 if (kvm_run
->mmio
.is_write
) {
722 switch (kvm_run
->mmio
.len
) {
724 r
= kvm
->callbacks
->writeb(kvm
->opaque
, addr
, *(uint8_t *)data
);
727 r
= kvm
->callbacks
->writew(kvm
->opaque
, addr
, *(uint16_t *)data
);
730 r
= kvm
->callbacks
->writel(kvm
->opaque
, addr
, *(uint32_t *)data
);
733 r
= kvm
->callbacks
->writeq(kvm
->opaque
, addr
, *(uint64_t *)data
);
737 switch (kvm_run
->mmio
.len
) {
739 r
= kvm
->callbacks
->readb(kvm
->opaque
, addr
, (uint8_t *)data
);
742 r
= kvm
->callbacks
->readw(kvm
->opaque
, addr
, (uint16_t *)data
);
745 r
= kvm
->callbacks
->readl(kvm
->opaque
, addr
, (uint32_t *)data
);
748 r
= kvm
->callbacks
->readq(kvm
->opaque
, addr
, (uint64_t *)data
);
751 kvm_run
->io_completed
= 1;
756 static int handle_mmio(kvm_context_t kvm
, struct kvm_run
*kvm_run
)
758 unsigned long addr
= kvm_run
->mmio
.phys_addr
;
759 void *data
= kvm_run
->mmio
.data
;
762 if (kvm_run
->mmio
.is_write
) {
763 switch (kvm_run
->mmio
.len
) {
765 r
= kvm
->callbacks
->writeb(kvm
->opaque
, addr
, *(uint8_t *)data
);
768 r
= kvm
->callbacks
->writew(kvm
->opaque
, addr
, *(uint16_t *)data
);
771 r
= kvm
->callbacks
->writel(kvm
->opaque
, addr
, *(uint32_t *)data
);
774 r
= kvm
->callbacks
->writeq(kvm
->opaque
, addr
, *(uint64_t *)data
);
778 switch (kvm_run
->mmio
.len
) {
780 r
= kvm
->callbacks
->readb(kvm
->opaque
, addr
, (uint8_t *)data
);
783 r
= kvm
->callbacks
->readw(kvm
->opaque
, addr
, (uint16_t *)data
);
786 r
= kvm
->callbacks
->readl(kvm
->opaque
, addr
, (uint32_t *)data
);
789 r
= kvm
->callbacks
->readq(kvm
->opaque
, addr
, (uint64_t *)data
);
796 static int handle_io_window(kvm_context_t kvm
)
798 return kvm
->callbacks
->io_window(kvm
->opaque
);
801 static int handle_halt(kvm_context_t kvm
, int vcpu
)
803 return kvm
->callbacks
->halt(kvm
->opaque
, vcpu
);
806 static int handle_shutdown(kvm_context_t kvm
, int vcpu
)
808 return kvm
->callbacks
->shutdown(kvm
->opaque
, vcpu
);
811 int try_push_interrupts(kvm_context_t kvm
)
813 return kvm
->callbacks
->try_push_interrupts(kvm
->opaque
);
816 static void post_kvm_run(kvm_context_t kvm
, int vcpu
)
818 kvm
->callbacks
->post_kvm_run(kvm
->opaque
, vcpu
);
821 static void pre_kvm_run(kvm_context_t kvm
, int vcpu
)
823 kvm
->callbacks
->pre_kvm_run(kvm
->opaque
, vcpu
);
826 int kvm_get_interrupt_flag(kvm_context_t kvm
, int vcpu
)
828 struct kvm_run
*run
= kvm
->run
[vcpu
];
831 return ((struct kvm_run_abi10
*)run
)->if_flag
;
835 uint64_t kvm_get_apic_base(kvm_context_t kvm
, int vcpu
)
837 struct kvm_run
*run
= kvm
->run
[vcpu
];
840 return ((struct kvm_run_abi10
*)run
)->apic_base
;
841 return run
->apic_base
;
844 int kvm_is_ready_for_interrupt_injection(kvm_context_t kvm
, int vcpu
)
846 struct kvm_run
*run
= kvm
->run
[vcpu
];
849 return ((struct kvm_run_abi10
*)run
)->ready_for_interrupt_injection
;
850 return run
->ready_for_interrupt_injection
;
853 void kvm_set_cr8(kvm_context_t kvm
, int vcpu
, uint64_t cr8
)
855 struct kvm_run
*run
= kvm
->run
[vcpu
];
858 ((struct kvm_run_abi10
*)run
)->cr8
= cr8
;
864 static int kvm_run_abi10(kvm_context_t kvm
, int vcpu
)
867 int fd
= kvm
->vcpu_fd
[vcpu
];
868 struct kvm_run_abi10
*run
= (struct kvm_run_abi10
*)kvm
->run
[vcpu
];
871 run
->request_interrupt_window
= try_push_interrupts(kvm
);
872 pre_kvm_run(kvm
, vcpu
);
873 r
= ioctl(fd
, KVM_RUN
, 0);
874 post_kvm_run(kvm
, vcpu
);
876 run
->io_completed
= 0;
877 if (r
== -1 && errno
!= EINTR
) {
879 printf("kvm_run: %m\n");
883 r
= handle_io_window(kvm
);
887 switch (run
->exit_reason
) {
888 case KVM_EXIT_UNKNOWN
:
889 fprintf(stderr
, "unhandled vm exit: 0x%x\n",
890 (unsigned)run
->hw
.hardware_exit_reason
);
891 kvm_show_regs(kvm
, vcpu
);
894 case KVM_EXIT_FAIL_ENTRY
:
895 fprintf(stderr
, "kvm_run: failed entry, reason %u\n",
896 (unsigned)run
->fail_entry
.hardware_entry_failure_reason
& 0xffff);
899 case KVM_EXIT_EXCEPTION
:
900 fprintf(stderr
, "exception %d (%x)\n",
903 kvm_show_regs(kvm
, vcpu
);
904 kvm_show_code(kvm
, vcpu
);
908 r
= handle_io_abi10(kvm
, run
, vcpu
);
911 r
= handle_debug(kvm
, vcpu
);
914 r
= handle_mmio_abi10(kvm
, run
);
917 r
= handle_halt(kvm
, vcpu
);
919 case KVM_EXIT_IRQ_WINDOW_OPEN
:
921 case KVM_EXIT_SHUTDOWN
:
922 r
= handle_shutdown(kvm
, vcpu
);
925 fprintf(stderr
, "unhandled vm exit: 0x%x\n", run
->exit_reason
);
926 kvm_show_regs(kvm
, vcpu
);
937 int kvm_run(kvm_context_t kvm
, int vcpu
)
940 int fd
= kvm
->vcpu_fd
[vcpu
];
941 struct kvm_run
*run
= kvm
->run
[vcpu
];
944 return kvm_run_abi10(kvm
, vcpu
);
947 run
->request_interrupt_window
= try_push_interrupts(kvm
);
948 pre_kvm_run(kvm
, vcpu
);
949 r
= ioctl(fd
, KVM_RUN
, 0);
950 post_kvm_run(kvm
, vcpu
);
952 if (r
== -1 && errno
!= EINTR
) {
954 printf("kvm_run: %m\n");
958 r
= handle_io_window(kvm
);
962 switch (run
->exit_reason
) {
963 case KVM_EXIT_UNKNOWN
:
964 fprintf(stderr
, "unhandled vm exit: 0x%x\n",
965 (unsigned)run
->hw
.hardware_exit_reason
);
966 kvm_show_regs(kvm
, vcpu
);
969 case KVM_EXIT_FAIL_ENTRY
:
970 fprintf(stderr
, "kvm_run: failed entry, reason %u\n",
971 (unsigned)run
->fail_entry
.hardware_entry_failure_reason
& 0xffff);
974 case KVM_EXIT_EXCEPTION
:
975 fprintf(stderr
, "exception %d (%x)\n",
978 kvm_show_regs(kvm
, vcpu
);
979 kvm_show_code(kvm
, vcpu
);
983 r
= handle_io(kvm
, run
, vcpu
);
986 r
= handle_debug(kvm
, vcpu
);
989 r
= handle_mmio(kvm
, run
);
992 r
= handle_halt(kvm
, vcpu
);
994 case KVM_EXIT_IRQ_WINDOW_OPEN
:
996 case KVM_EXIT_SHUTDOWN
:
997 r
= handle_shutdown(kvm
, vcpu
);
1000 fprintf(stderr
, "unhandled vm exit: 0x%x\n", run
->exit_reason
);
1001 kvm_show_regs(kvm
, vcpu
);
1012 int kvm_inject_irq(kvm_context_t kvm
, int vcpu
, unsigned irq
)
1014 struct kvm_interrupt intr
;
1017 return ioctl(kvm
->vcpu_fd
[vcpu
], KVM_INTERRUPT
, &intr
);
1020 int kvm_guest_debug(kvm_context_t kvm
, int vcpu
, struct kvm_debug_guest
*dbg
)
1022 return ioctl(kvm
->vcpu_fd
[vcpu
], KVM_DEBUG_GUEST
, dbg
);
1025 int kvm_setup_cpuid(kvm_context_t kvm
, int vcpu
, int nent
,
1026 struct kvm_cpuid_entry
*entries
)
1028 struct kvm_cpuid
*cpuid
;
1031 cpuid
= malloc(sizeof(*cpuid
) + nent
* sizeof(*entries
));
1036 memcpy(cpuid
->entries
, entries
, nent
* sizeof(*entries
));
1037 r
= ioctl(kvm
->vcpu_fd
[vcpu
], KVM_SET_CPUID
, cpuid
);
1043 int kvm_set_signal_mask(kvm_context_t kvm
, int vcpu
, const sigset_t
*sigset
)
1045 struct kvm_signal_mask
*sigmask
;
1049 r
= ioctl(kvm
->vcpu_fd
[vcpu
], KVM_SET_SIGNAL_MASK
, NULL
);
1054 sigmask
= malloc(sizeof(*sigmask
) + sizeof(*sigset
));
1059 memcpy(sigmask
->sigset
, sigset
, sizeof(*sigset
));
1060 r
= ioctl(kvm
->vcpu_fd
[vcpu
], KVM_SET_SIGNAL_MASK
, sigmask
);