3 #include "kvm-abi-10.h"
12 #include <sys/types.h>
17 int kvm_alloc_kernel_memory(kvm_context_t kvm
, unsigned long memory
,
20 unsigned long dosmem
= 0xa0000;
21 unsigned long exmem
= 0xc0000;
22 unsigned long pcimem
= 0xe0000000;
25 struct kvm_memory_region low_memory
= {
26 .memory_size
= memory
< dosmem
? memory
: dosmem
,
29 struct kvm_memory_region extended_memory
= {
30 .memory_size
= memory
< exmem
? 0 : memory
- exmem
,
31 .guest_phys_addr
= exmem
,
33 struct kvm_memory_region above_4g_memory
= {
34 .memory_size
= memory
< pcimem
? 0 : memory
- pcimem
,
35 .guest_phys_addr
= 0x100000000ULL
,
38 #ifdef KVM_CAP_SET_TSS_ADDR
39 tss_ext
= ioctl(kvm
->fd
, KVM_CHECK_EXTENSION
, KVM_CAP_SET_TSS_ADDR
);
45 extended_memory
.memory_size
= pcimem
- exmem
;
47 /* 640K should be enough. */
48 low_memory
.slot
= get_free_slot(kvm
);
49 r
= ioctl(kvm
->vm_fd
, KVM_SET_MEMORY_REGION
, &low_memory
);
51 fprintf(stderr
, "kvm_create_memory_region: %m\n");
54 register_slot(low_memory
.slot
, low_memory
.guest_phys_addr
);
56 if (extended_memory
.memory_size
) {
58 extended_memory
.slot
= get_free_slot(kvm
);
60 extended_memory
.slot
= 0;
61 r
= ioctl(kvm
->vm_fd
, KVM_SET_MEMORY_REGION
, &extended_memory
);
63 fprintf(stderr
, "kvm_create_memory_region: %m\n");
66 register_slot(extended_memory
.slot
,
67 extended_memory
.guest_phys_addr
);
70 if (above_4g_memory
.memory_size
) {
71 above_4g_memory
.slot
= get_free_slot(kvm
);
72 r
= ioctl(kvm
->vm_fd
, KVM_SET_MEMORY_REGION
, &above_4g_memory
);
74 fprintf(stderr
, "kvm_create_memory_region: %m\n");
77 register_slot(above_4g_memory
.slot
,
78 above_4g_memory
.guest_phys_addr
);
81 kvm_memory_region_save_params(kvm
, &low_memory
);
82 kvm_memory_region_save_params(kvm
, &extended_memory
);
83 kvm_memory_region_save_params(kvm
, &above_4g_memory
);
84 if (above_4g_memory
.memory_size
)
85 kvm_memory_region_save_params(kvm
, &above_4g_memory
);
87 *vm_mem
= mmap(NULL
, memory
, PROT_READ
|PROT_WRITE
, MAP_SHARED
, kvm
->vm_fd
, 0);
93 #ifdef KVM_CAP_USER_MEMORY
95 int kvm_alloc_userspace_memory(kvm_context_t kvm
, unsigned long memory
,
98 unsigned long dosmem
= 0xa0000;
99 unsigned long exmem
= 0xc0000;
100 unsigned long pcimem
= 0xe0000000;
103 struct kvm_userspace_memory_region low_memory
= {
104 .memory_size
= memory
< dosmem
? memory
: dosmem
,
105 .guest_phys_addr
= 0,
107 struct kvm_userspace_memory_region extended_memory
= {
108 .memory_size
= memory
< exmem
? 0 : memory
- exmem
,
109 .guest_phys_addr
= exmem
,
111 struct kvm_userspace_memory_region above_4g_memory
= {
112 .memory_size
= memory
< pcimem
? 0 : memory
- pcimem
,
113 .guest_phys_addr
= 0x100000000ULL
,
116 #ifdef KVM_CAP_SET_TSS_ADDR
117 tss_ext
= ioctl(kvm
->fd
, KVM_CHECK_EXTENSION
, KVM_CAP_SET_TSS_ADDR
);
122 if (memory
>= pcimem
) {
123 extended_memory
.memory_size
= pcimem
- exmem
;
124 *vm_mem
= mmap(NULL
, memory
+ 0x100000000ULL
- pcimem
,
125 PROT_READ
|PROT_WRITE
, MAP_ANONYMOUS
|
129 *vm_mem
= mmap(NULL
, memory
, PROT_READ
|PROT_WRITE
, MAP_ANONYMOUS
130 | MAP_SHARED
, -1, 0);
131 if (*vm_mem
== MAP_FAILED
) {
132 fprintf(stderr
, "kvm_alloc_userspace_memory: %s", strerror(errno
));
136 low_memory
.userspace_addr
= (unsigned long)*vm_mem
;
137 low_memory
.slot
= get_free_slot(kvm
);
138 /* 640K should be enough. */
139 r
= ioctl(kvm
->vm_fd
, KVM_SET_USER_MEMORY_REGION
, &low_memory
);
141 fprintf(stderr
, "kvm_create_memory_region: %m\n");
144 register_slot(low_memory
.slot
, low_memory
.guest_phys_addr
);
146 if (extended_memory
.memory_size
) {
147 r
= munmap(*vm_mem
+ dosmem
, exmem
- dosmem
);
149 fprintf(stderr
, "kvm_alloc_userspace_memory: %s",
153 extended_memory
.userspace_addr
= (unsigned long)(*vm_mem
+ exmem
);
155 extended_memory
.slot
= get_free_slot(kvm
);
157 extended_memory
.slot
= 0;
158 r
= ioctl(kvm
->vm_fd
, KVM_SET_USER_MEMORY_REGION
, &extended_memory
);
160 fprintf(stderr
, "kvm_create_memory_region: %m\n");
163 register_slot(extended_memory
.slot
,
164 extended_memory
.guest_phys_addr
);
167 if (above_4g_memory
.memory_size
) {
168 r
= munmap(*vm_mem
+ pcimem
, 0x100000000ULL
- pcimem
);
170 fprintf(stderr
, "kvm_alloc_userspace_memory: %s",
174 above_4g_memory
.userspace_addr
= (unsigned long)(*vm_mem
+ 0x100000000ULL
);
175 above_4g_memory
.slot
= get_free_slot(kvm
);
176 r
= ioctl(kvm
->vm_fd
, KVM_SET_USER_MEMORY_REGION
, &above_4g_memory
);
178 fprintf(stderr
, "kvm_create_memory_region: %m\n");
181 register_slot(above_4g_memory
.slot
,
182 above_4g_memory
.guest_phys_addr
);
185 kvm_userspace_memory_region_save_params(kvm
, &low_memory
);
186 kvm_userspace_memory_region_save_params(kvm
, &extended_memory
);
187 if (above_4g_memory
.memory_size
)
188 kvm_userspace_memory_region_save_params(kvm
, &above_4g_memory
);
195 int kvm_set_tss_addr(kvm_context_t kvm
, unsigned long addr
)
197 #ifdef KVM_CAP_SET_TSS_ADDR
200 r
= ioctl(kvm
->fd
, KVM_CHECK_EXTENSION
, KVM_CAP_SET_TSS_ADDR
);
202 r
= ioctl(kvm
->vm_fd
, KVM_SET_TSS_ADDR
, addr
);
204 fprintf(stderr
, "kvm_set_tss_addr: %m\n");
213 static int kvm_init_tss(kvm_context_t kvm
)
215 #ifdef KVM_CAP_SET_TSS_ADDR
218 r
= ioctl(kvm
->fd
, KVM_CHECK_EXTENSION
, KVM_CAP_SET_TSS_ADDR
);
221 * this address is 3 pages before the bios, and the bios should present
222 * as unavaible memory
224 r
= kvm_set_tss_addr(kvm
, 0xfffbd000);
226 printf("kvm_init_tss: unable to set tss addr\n");
235 int kvm_arch_create_default_phys_mem(kvm_context_t kvm
,
236 unsigned long phys_mem_bytes
,
241 zfd
= open("/dev/zero", O_RDONLY
);
243 perror("open /dev/zero");
246 mmap(*vm_mem
+ 0xa8000, 0x8000, PROT_READ
|PROT_WRITE
,
247 MAP_PRIVATE
|MAP_FIXED
, zfd
, 0);
254 int kvm_arch_create(kvm_context_t kvm
, unsigned long phys_mem_bytes
,
259 r
= kvm_init_tss(kvm
);
266 void *kvm_create_kernel_phys_mem(kvm_context_t kvm
, unsigned long phys_start
,
267 unsigned long len
, int log
, int writable
)
270 int prot
= PROT_READ
;
272 struct kvm_memory_region memory
= {
274 .guest_phys_addr
= phys_start
,
275 .flags
= log
? KVM_MEM_LOG_DIRTY_PAGES
: 0,
278 memory
.slot
= get_free_slot(kvm
);
279 r
= ioctl(kvm
->vm_fd
, KVM_SET_MEMORY_REGION
, &memory
);
281 fprintf(stderr
, "create_kernel_phys_mem: %s", strerror(errno
));
284 register_slot(memory
.slot
, memory
.guest_phys_addr
);
285 kvm_memory_region_save_params(kvm
, &memory
);
290 ptr
= mmap(NULL
, len
, prot
, MAP_SHARED
, kvm
->vm_fd
, phys_start
);
291 if (ptr
== MAP_FAILED
) {
292 fprintf(stderr
, "create_kernel_phys_mem: %s", strerror(errno
));
299 int kvm_create_memory_alias(kvm_context_t kvm
,
303 uint64_t target_phys
)
305 struct kvm_memory_alias alias
= {
307 .guest_phys_addr
= phys_start
,
309 .target_phys_addr
= target_phys
,
314 alias
.slot
= get_slot(phys_addr
);
316 r
= ioctl(fd
, KVM_SET_MEMORY_ALIAS
, &alias
);
323 int kvm_destroy_memory_alias(kvm_context_t kvm
, uint64_t phys_addr
)
325 return kvm_create_memory_alias(kvm
, phys_addr
, 0, 0, 0);
328 #ifdef KVM_CAP_IRQCHIP
330 int kvm_get_lapic(kvm_context_t kvm
, int vcpu
, struct kvm_lapic_state
*s
)
333 if (!kvm
->irqchip_in_kernel
)
335 r
= ioctl(kvm
->vcpu_fd
[vcpu
], KVM_GET_LAPIC
, s
);
338 perror("kvm_get_lapic");
343 int kvm_set_lapic(kvm_context_t kvm
, int vcpu
, struct kvm_lapic_state
*s
)
346 if (!kvm
->irqchip_in_kernel
)
348 r
= ioctl(kvm
->vcpu_fd
[vcpu
], KVM_SET_LAPIC
, s
);
351 perror("kvm_set_lapic");
358 static int handle_io_abi10(kvm_context_t kvm
, struct kvm_run_abi10
*run
,
361 uint16_t addr
= run
->io
.port
;
364 void *p
= (void *)run
+ run
->io
.data_offset
;
366 for (i
= 0; i
< run
->io
.count
; ++i
) {
367 switch (run
->io
.direction
) {
369 switch (run
->io
.size
) {
371 r
= kvm
->callbacks
->inb(kvm
->opaque
, addr
, p
);
374 r
= kvm
->callbacks
->inw(kvm
->opaque
, addr
, p
);
377 r
= kvm
->callbacks
->inl(kvm
->opaque
, addr
, p
);
380 fprintf(stderr
, "bad I/O size %d\n", run
->io
.size
);
384 case KVM_EXIT_IO_OUT
:
385 switch (run
->io
.size
) {
387 r
= kvm
->callbacks
->outb(kvm
->opaque
, addr
,
391 r
= kvm
->callbacks
->outw(kvm
->opaque
, addr
,
395 r
= kvm
->callbacks
->outl(kvm
->opaque
, addr
,
399 fprintf(stderr
, "bad I/O size %d\n", run
->io
.size
);
404 fprintf(stderr
, "bad I/O direction %d\n", run
->io
.direction
);
410 run
->io_completed
= 1;
415 static int handle_mmio_abi10(kvm_context_t kvm
, struct kvm_run_abi10
*kvm_run
)
417 unsigned long addr
= kvm_run
->mmio
.phys_addr
;
418 void *data
= kvm_run
->mmio
.data
;
421 if (kvm_run
->mmio
.is_write
) {
422 switch (kvm_run
->mmio
.len
) {
424 r
= kvm
->callbacks
->writeb(kvm
->opaque
, addr
,
428 r
= kvm
->callbacks
->writew(kvm
->opaque
, addr
,
432 r
= kvm
->callbacks
->writel(kvm
->opaque
, addr
,
436 r
= kvm
->callbacks
->writeq(kvm
->opaque
, addr
,
441 switch (kvm_run
->mmio
.len
) {
443 r
= kvm
->callbacks
->readb(kvm
->opaque
, addr
,
447 r
= kvm
->callbacks
->readw(kvm
->opaque
, addr
,
451 r
= kvm
->callbacks
->readl(kvm
->opaque
, addr
,
455 r
= kvm
->callbacks
->readq(kvm
->opaque
, addr
,
459 kvm_run
->io_completed
= 1;
464 int kvm_run_abi10(kvm_context_t kvm
, int vcpu
)
467 int fd
= kvm
->vcpu_fd
[vcpu
];
468 struct kvm_run_abi10
*run
= (struct kvm_run_abi10
*)kvm
->run
[vcpu
];
471 run
->request_interrupt_window
= try_push_interrupts(kvm
);
472 r
= pre_kvm_run(kvm
, vcpu
);
475 r
= ioctl(fd
, KVM_RUN
, 0);
476 post_kvm_run(kvm
, vcpu
);
478 run
->io_completed
= 0;
479 if (r
== -1 && errno
!= EINTR
) {
481 printf("kvm_run: %m\n");
485 r
= handle_io_window(kvm
);
489 switch (run
->exit_reason
) {
490 case KVM_EXIT_UNKNOWN
:
491 fprintf(stderr
, "unhandled vm exit: 0x%x vcpu_id %d\n",
492 (unsigned)run
->hw
.hardware_exit_reason
, vcpu
);
493 kvm_show_regs(kvm
, vcpu
);
496 case KVM_EXIT_FAIL_ENTRY
:
497 fprintf(stderr
, "kvm_run: failed entry, reason %u\n",
498 (unsigned)run
->fail_entry
.hardware_entry_failure_reason
& 0xffff);
501 case KVM_EXIT_EXCEPTION
:
502 fprintf(stderr
, "exception %d (%x)\n",
505 kvm_show_regs(kvm
, vcpu
);
506 kvm_show_code(kvm
, vcpu
);
510 r
= handle_io_abi10(kvm
, run
, vcpu
);
513 r
= handle_debug(kvm
, vcpu
);
516 r
= handle_mmio_abi10(kvm
, run
);
519 r
= handle_halt(kvm
, vcpu
);
521 case KVM_EXIT_IRQ_WINDOW_OPEN
:
523 case KVM_EXIT_SHUTDOWN
:
524 r
= handle_shutdown(kvm
, vcpu
);
527 fprintf(stderr
, "unhandled vm exit: 0x%x\n", run
->exit_reason
);
528 kvm_show_regs(kvm
, vcpu
);
540 void kvm_show_code(kvm_context_t kvm
, int vcpu
)
542 #define CR0_PE_MASK (1ULL<<0)
543 int fd
= kvm
->vcpu_fd
[vcpu
];
544 struct kvm_regs regs
;
545 struct kvm_sregs sregs
;
547 unsigned char code
[50];
549 char code_str
[sizeof(code
) * 3 + 1];
552 r
= ioctl(fd
, KVM_GET_SREGS
, &sregs
);
554 perror("KVM_GET_SREGS");
557 if (sregs
.cr0
& CR0_PE_MASK
)
560 r
= ioctl(fd
, KVM_GET_REGS
, ®s
);
562 perror("KVM_GET_REGS");
565 rip
= sregs
.cs
.base
+ regs
.rip
;
566 back_offset
= regs
.rip
;
567 if (back_offset
> 20)
569 memcpy(code
, kvm
->physical_memory
+ rip
- back_offset
, sizeof code
);
571 for (r
= 0; r
< sizeof code
; ++r
) {
572 if (r
== back_offset
)
573 strcat(code_str
, " -->");
574 sprintf(code_str
+ strlen(code_str
), " %02x", code
[r
]);
576 fprintf(stderr
, "code:%s\n", code_str
);
581 * Returns available msr list. User must free.
583 struct kvm_msr_list
*kvm_get_msr_list(kvm_context_t kvm
)
585 struct kvm_msr_list sizer
, *msrs
;
589 r
= ioctl(kvm
->fd
, KVM_GET_MSR_INDEX_LIST
, &sizer
);
590 if (r
== -1 && errno
!= E2BIG
)
592 msrs
= malloc(sizeof *msrs
+ sizer
.nmsrs
* sizeof *msrs
->indices
);
597 msrs
->nmsrs
= sizer
.nmsrs
;
598 r
= ioctl(kvm
->fd
, KVM_GET_MSR_INDEX_LIST
, msrs
);
608 int kvm_get_msrs(kvm_context_t kvm
, int vcpu
, struct kvm_msr_entry
*msrs
,
611 struct kvm_msrs
*kmsrs
= malloc(sizeof *kmsrs
+ n
* sizeof *msrs
);
619 memcpy(kmsrs
->entries
, msrs
, n
* sizeof *msrs
);
620 r
= ioctl(kvm
->vcpu_fd
[vcpu
], KVM_GET_MSRS
, kmsrs
);
622 memcpy(msrs
, kmsrs
->entries
, n
* sizeof *msrs
);
628 int kvm_set_msrs(kvm_context_t kvm
, int vcpu
, struct kvm_msr_entry
*msrs
,
631 struct kvm_msrs
*kmsrs
= malloc(sizeof *kmsrs
+ n
* sizeof *msrs
);
639 memcpy(kmsrs
->entries
, msrs
, n
* sizeof *msrs
);
640 r
= ioctl(kvm
->vcpu_fd
[vcpu
], KVM_SET_MSRS
, kmsrs
);