11 #include <sys/types.h>
16 int kvm_alloc_kernel_memory(kvm_context_t kvm
, unsigned long memory
,
19 unsigned long dosmem
= 0xa0000;
20 unsigned long exmem
= 0xc0000;
21 unsigned long pcimem
= 0xe0000000;
24 struct kvm_memory_region low_memory
= {
25 .memory_size
= memory
< dosmem
? memory
: dosmem
,
28 struct kvm_memory_region extended_memory
= {
29 .memory_size
= memory
< exmem
? 0 : memory
- exmem
,
30 .guest_phys_addr
= exmem
,
32 struct kvm_memory_region above_4g_memory
= {
33 .memory_size
= memory
< pcimem
? 0 : memory
- pcimem
,
34 .guest_phys_addr
= 0x100000000ULL
,
37 #ifdef KVM_CAP_SET_TSS_ADDR
38 tss_ext
= ioctl(kvm
->fd
, KVM_CHECK_EXTENSION
, KVM_CAP_SET_TSS_ADDR
);
44 extended_memory
.memory_size
= pcimem
- exmem
;
46 /* 640K should be enough. */
47 low_memory
.slot
= get_free_slot(kvm
);
48 r
= ioctl(kvm
->vm_fd
, KVM_SET_MEMORY_REGION
, &low_memory
);
50 fprintf(stderr
, "kvm_create_memory_region: %m\n");
53 register_slot(low_memory
.slot
, low_memory
.guest_phys_addr
,
54 low_memory
.memory_size
, 0, 0, 0);
57 if (extended_memory
.memory_size
) {
59 extended_memory
.slot
= get_free_slot(kvm
);
61 extended_memory
.slot
= 0;
62 r
= ioctl(kvm
->vm_fd
, KVM_SET_MEMORY_REGION
, &extended_memory
);
64 fprintf(stderr
, "kvm_create_memory_region: %m\n");
67 register_slot(extended_memory
.slot
,
68 extended_memory
.guest_phys_addr
,
69 extended_memory
.memory_size
, 0, 0, 0);
72 if (above_4g_memory
.memory_size
) {
73 above_4g_memory
.slot
= get_free_slot(kvm
);
74 r
= ioctl(kvm
->vm_fd
, KVM_SET_MEMORY_REGION
, &above_4g_memory
);
76 fprintf(stderr
, "kvm_create_memory_region: %m\n");
79 register_slot(above_4g_memory
.slot
,
80 above_4g_memory
.guest_phys_addr
,
81 above_4g_memory
.memory_size
, 0, 0, 0);
84 *vm_mem
= mmap(NULL
, memory
, PROT_READ
|PROT_WRITE
, MAP_SHARED
, kvm
->vm_fd
, 0);
89 int kvm_set_tss_addr(kvm_context_t kvm
, unsigned long addr
)
91 #ifdef KVM_CAP_SET_TSS_ADDR
94 r
= ioctl(kvm
->fd
, KVM_CHECK_EXTENSION
, KVM_CAP_SET_TSS_ADDR
);
96 r
= ioctl(kvm
->vm_fd
, KVM_SET_TSS_ADDR
, addr
);
98 fprintf(stderr
, "kvm_set_tss_addr: %m\n");
107 static int kvm_init_tss(kvm_context_t kvm
)
109 #ifdef KVM_CAP_SET_TSS_ADDR
112 r
= ioctl(kvm
->fd
, KVM_CHECK_EXTENSION
, KVM_CAP_SET_TSS_ADDR
);
115 * this address is 3 pages before the bios, and the bios should present
116 * as unavaible memory
118 r
= kvm_set_tss_addr(kvm
, 0xfffbd000);
120 fprintf(stderr
, "kvm_init_tss: unable to set tss addr\n");
129 int kvm_arch_create_default_phys_mem(kvm_context_t kvm
,
130 unsigned long phys_mem_bytes
,
135 zfd
= open("/dev/zero", O_RDONLY
);
137 perror("open /dev/zero");
140 mmap(*vm_mem
+ 0xa8000, 0x8000, PROT_READ
|PROT_WRITE
,
141 MAP_PRIVATE
|MAP_FIXED
, zfd
, 0);
147 int kvm_create_pit(kvm_context_t kvm
)
152 kvm
->pit_in_kernel
= 0;
153 if (!kvm
->no_pit_creation
) {
154 r
= ioctl(kvm
->fd
, KVM_CHECK_EXTENSION
, KVM_CAP_PIT
);
156 r
= ioctl(kvm
->vm_fd
, KVM_CREATE_PIT
);
158 kvm
->pit_in_kernel
= 1;
160 fprintf(stderr
, "Create kernel PIC irqchip failed\n");
169 int kvm_arch_create(kvm_context_t kvm
, unsigned long phys_mem_bytes
,
174 r
= kvm_init_tss(kvm
);
178 r
= kvm_create_pit(kvm
);
182 r
= kvm_init_coalesced_mmio(kvm
);
189 #ifdef KVM_EXIT_TPR_ACCESS
191 static int handle_tpr_access(kvm_context_t kvm
, struct kvm_run
*run
, int vcpu
)
193 return kvm
->callbacks
->tpr_access(kvm
->opaque
, vcpu
,
195 run
->tpr_access
.is_write
);
199 int kvm_enable_vapic(kvm_context_t kvm
, int vcpu
, uint64_t vapic
)
202 struct kvm_vapic_addr va
= {
206 r
= ioctl(kvm
->vcpu_fd
[vcpu
], KVM_SET_VAPIC_ADDR
, &va
);
209 perror("kvm_enable_vapic");
217 int kvm_arch_run(struct kvm_run
*run
,kvm_context_t kvm
, int vcpu
)
221 switch (run
->exit_reason
) {
222 #ifdef KVM_EXIT_SET_TPR
223 case KVM_EXIT_SET_TPR
:
226 #ifdef KVM_EXIT_TPR_ACCESS
227 case KVM_EXIT_TPR_ACCESS
:
228 r
= handle_tpr_access(kvm
, run
, vcpu
);
239 void *kvm_create_kernel_phys_mem(kvm_context_t kvm
, unsigned long phys_start
,
240 unsigned long len
, int log
, int writable
)
243 int prot
= PROT_READ
;
245 struct kvm_memory_region memory
= {
247 .guest_phys_addr
= phys_start
,
248 .flags
= log
? KVM_MEM_LOG_DIRTY_PAGES
: 0,
251 memory
.slot
= get_free_slot(kvm
);
252 r
= ioctl(kvm
->vm_fd
, KVM_SET_MEMORY_REGION
, &memory
);
254 fprintf(stderr
, "create_kernel_phys_mem: %s", strerror(errno
));
257 register_slot(memory
.slot
, memory
.guest_phys_addr
, memory
.memory_size
,
263 ptr
= mmap(NULL
, len
, prot
, MAP_SHARED
, kvm
->vm_fd
, phys_start
);
264 if (ptr
== MAP_FAILED
) {
265 fprintf(stderr
, "create_kernel_phys_mem: %s", strerror(errno
));
272 #define MAX_ALIAS_SLOTS 4
276 } kvm_aliases
[MAX_ALIAS_SLOTS
];
278 static int get_alias_slot(uint64_t start
)
282 for (i
=0; i
<MAX_ALIAS_SLOTS
; i
++)
283 if (kvm_aliases
[i
].start
== start
)
287 static int get_free_alias_slot(void)
291 for (i
=0; i
<MAX_ALIAS_SLOTS
; i
++)
292 if (kvm_aliases
[i
].len
== 0)
297 static void register_alias(int slot
, uint64_t start
, uint64_t len
)
299 kvm_aliases
[slot
].start
= start
;
300 kvm_aliases
[slot
].len
= len
;
303 int kvm_create_memory_alias(kvm_context_t kvm
,
306 uint64_t target_phys
)
308 struct kvm_memory_alias alias
= {
310 .guest_phys_addr
= phys_start
,
312 .target_phys_addr
= target_phys
,
318 slot
= get_alias_slot(phys_start
);
320 slot
= get_free_alias_slot();
325 r
= ioctl(fd
, KVM_SET_MEMORY_ALIAS
, &alias
);
329 register_alias(slot
, phys_start
, len
);
333 int kvm_destroy_memory_alias(kvm_context_t kvm
, uint64_t phys_start
)
335 return kvm_create_memory_alias(kvm
, phys_start
, 0, 0);
338 #ifdef KVM_CAP_IRQCHIP
340 int kvm_get_lapic(kvm_context_t kvm
, int vcpu
, struct kvm_lapic_state
*s
)
343 if (!kvm
->irqchip_in_kernel
)
345 r
= ioctl(kvm
->vcpu_fd
[vcpu
], KVM_GET_LAPIC
, s
);
348 perror("kvm_get_lapic");
353 int kvm_set_lapic(kvm_context_t kvm
, int vcpu
, struct kvm_lapic_state
*s
)
356 if (!kvm
->irqchip_in_kernel
)
358 r
= ioctl(kvm
->vcpu_fd
[vcpu
], KVM_SET_LAPIC
, s
);
361 perror("kvm_set_lapic");
370 int kvm_get_pit(kvm_context_t kvm
, struct kvm_pit_state
*s
)
373 if (!kvm
->pit_in_kernel
)
375 r
= ioctl(kvm
->vm_fd
, KVM_GET_PIT
, s
);
378 perror("kvm_get_pit");
383 int kvm_set_pit(kvm_context_t kvm
, struct kvm_pit_state
*s
)
386 if (!kvm
->pit_in_kernel
)
388 r
= ioctl(kvm
->vm_fd
, KVM_SET_PIT
, s
);
391 perror("kvm_set_pit");
398 void kvm_show_code(kvm_context_t kvm
, int vcpu
)
400 #define SHOW_CODE_LEN 50
401 int fd
= kvm
->vcpu_fd
[vcpu
];
402 struct kvm_regs regs
;
403 struct kvm_sregs sregs
;
407 char code_str
[SHOW_CODE_LEN
* 3 + 1];
410 r
= ioctl(fd
, KVM_GET_SREGS
, &sregs
);
412 perror("KVM_GET_SREGS");
415 r
= ioctl(fd
, KVM_GET_REGS
, ®s
);
417 perror("KVM_GET_REGS");
420 rip
= sregs
.cs
.base
+ regs
.rip
;
421 back_offset
= regs
.rip
;
422 if (back_offset
> 20)
425 for (n
= -back_offset
; n
< SHOW_CODE_LEN
-back_offset
; ++n
) {
427 strcat(code_str
, " -->");
428 r
= kvm
->callbacks
->mmio_read(kvm
->opaque
, rip
+ n
, &code
, 1);
430 strcat(code_str
, " xx");
433 sprintf(code_str
+ strlen(code_str
), " %02x", code
);
435 fprintf(stderr
, "code:%s\n", code_str
);
440 * Returns available msr list. User must free.
442 struct kvm_msr_list
*kvm_get_msr_list(kvm_context_t kvm
)
444 struct kvm_msr_list sizer
, *msrs
;
448 r
= ioctl(kvm
->fd
, KVM_GET_MSR_INDEX_LIST
, &sizer
);
449 if (r
== -1 && errno
!= E2BIG
)
451 msrs
= malloc(sizeof *msrs
+ sizer
.nmsrs
* sizeof *msrs
->indices
);
456 msrs
->nmsrs
= sizer
.nmsrs
;
457 r
= ioctl(kvm
->fd
, KVM_GET_MSR_INDEX_LIST
, msrs
);
467 int kvm_get_msrs(kvm_context_t kvm
, int vcpu
, struct kvm_msr_entry
*msrs
,
470 struct kvm_msrs
*kmsrs
= malloc(sizeof *kmsrs
+ n
* sizeof *msrs
);
478 memcpy(kmsrs
->entries
, msrs
, n
* sizeof *msrs
);
479 r
= ioctl(kvm
->vcpu_fd
[vcpu
], KVM_GET_MSRS
, kmsrs
);
481 memcpy(msrs
, kmsrs
->entries
, n
* sizeof *msrs
);
487 int kvm_set_msrs(kvm_context_t kvm
, int vcpu
, struct kvm_msr_entry
*msrs
,
490 struct kvm_msrs
*kmsrs
= malloc(sizeof *kmsrs
+ n
* sizeof *msrs
);
498 memcpy(kmsrs
->entries
, msrs
, n
* sizeof *msrs
);
499 r
= ioctl(kvm
->vcpu_fd
[vcpu
], KVM_SET_MSRS
, kmsrs
);
506 static void print_seg(FILE *file
, const char *name
, struct kvm_segment
*seg
)
509 "%s %04x (%08llx/%08x p %d dpl %d db %d s %d type %x l %d"
511 name
, seg
->selector
, seg
->base
, seg
->limit
, seg
->present
,
512 seg
->dpl
, seg
->db
, seg
->s
, seg
->type
, seg
->l
, seg
->g
,
516 static void print_dt(FILE *file
, const char *name
, struct kvm_dtable
*dt
)
518 fprintf(stderr
, "%s %llx/%x\n", name
, dt
->base
, dt
->limit
);
521 void kvm_show_regs(kvm_context_t kvm
, int vcpu
)
523 int fd
= kvm
->vcpu_fd
[vcpu
];
524 struct kvm_regs regs
;
525 struct kvm_sregs sregs
;
528 r
= ioctl(fd
, KVM_GET_REGS
, ®s
);
530 perror("KVM_GET_REGS");
534 "rax %016llx rbx %016llx rcx %016llx rdx %016llx\n"
535 "rsi %016llx rdi %016llx rsp %016llx rbp %016llx\n"
536 "r8 %016llx r9 %016llx r10 %016llx r11 %016llx\n"
537 "r12 %016llx r13 %016llx r14 %016llx r15 %016llx\n"
538 "rip %016llx rflags %08llx\n",
539 regs
.rax
, regs
.rbx
, regs
.rcx
, regs
.rdx
,
540 regs
.rsi
, regs
.rdi
, regs
.rsp
, regs
.rbp
,
541 regs
.r8
, regs
.r9
, regs
.r10
, regs
.r11
,
542 regs
.r12
, regs
.r13
, regs
.r14
, regs
.r15
,
543 regs
.rip
, regs
.rflags
);
544 r
= ioctl(fd
, KVM_GET_SREGS
, &sregs
);
546 perror("KVM_GET_SREGS");
549 print_seg(stderr
, "cs", &sregs
.cs
);
550 print_seg(stderr
, "ds", &sregs
.ds
);
551 print_seg(stderr
, "es", &sregs
.es
);
552 print_seg(stderr
, "ss", &sregs
.ss
);
553 print_seg(stderr
, "fs", &sregs
.fs
);
554 print_seg(stderr
, "gs", &sregs
.gs
);
555 print_seg(stderr
, "tr", &sregs
.tr
);
556 print_seg(stderr
, "ldt", &sregs
.ldt
);
557 print_dt(stderr
, "gdt", &sregs
.gdt
);
558 print_dt(stderr
, "idt", &sregs
.idt
);
559 fprintf(stderr
, "cr0 %llx cr2 %llx cr3 %llx cr4 %llx cr8 %llx"
561 sregs
.cr0
, sregs
.cr2
, sregs
.cr3
, sregs
.cr4
, sregs
.cr8
,
565 uint64_t kvm_get_apic_base(kvm_context_t kvm
, int vcpu
)
567 struct kvm_run
*run
= kvm
->run
[vcpu
];
569 return run
->apic_base
;
572 void kvm_set_cr8(kvm_context_t kvm
, int vcpu
, uint64_t cr8
)
574 struct kvm_run
*run
= kvm
->run
[vcpu
];
579 __u64
kvm_get_cr8(kvm_context_t kvm
, int vcpu
)
581 return kvm
->run
[vcpu
]->cr8
;
584 int kvm_setup_cpuid(kvm_context_t kvm
, int vcpu
, int nent
,
585 struct kvm_cpuid_entry
*entries
)
587 struct kvm_cpuid
*cpuid
;
590 cpuid
= malloc(sizeof(*cpuid
) + nent
* sizeof(*entries
));
595 memcpy(cpuid
->entries
, entries
, nent
* sizeof(*entries
));
596 r
= ioctl(kvm
->vcpu_fd
[vcpu
], KVM_SET_CPUID
, cpuid
);
602 int kvm_set_shadow_pages(kvm_context_t kvm
, unsigned int nrshadow_pages
)
604 #ifdef KVM_CAP_MMU_SHADOW_CACHE_CONTROL
607 r
= ioctl(kvm
->fd
, KVM_CHECK_EXTENSION
,
608 KVM_CAP_MMU_SHADOW_CACHE_CONTROL
);
610 r
= ioctl(kvm
->vm_fd
, KVM_SET_NR_MMU_PAGES
, nrshadow_pages
);
612 fprintf(stderr
, "kvm_set_shadow_pages: %m\n");
621 int kvm_get_shadow_pages(kvm_context_t kvm
, unsigned int *nrshadow_pages
)
623 #ifdef KVM_CAP_MMU_SHADOW_CACHE_CONTROL
626 r
= ioctl(kvm
->fd
, KVM_CHECK_EXTENSION
,
627 KVM_CAP_MMU_SHADOW_CACHE_CONTROL
);
629 *nrshadow_pages
= ioctl(kvm
->vm_fd
, KVM_GET_NR_MMU_PAGES
);
638 static int tpr_access_reporting(kvm_context_t kvm
, int vcpu
, int enabled
)
641 struct kvm_tpr_access_ctl tac
= {
645 r
= ioctl(kvm
->fd
, KVM_CHECK_EXTENSION
, KVM_CAP_VAPIC
);
646 if (r
== -1 || r
== 0)
648 r
= ioctl(kvm
->vcpu_fd
[vcpu
], KVM_TPR_ACCESS_REPORTING
, &tac
);
651 perror("KVM_TPR_ACCESS_REPORTING");
657 int kvm_enable_tpr_access_reporting(kvm_context_t kvm
, int vcpu
)
659 return tpr_access_reporting(kvm
, vcpu
, 1);
662 int kvm_disable_tpr_access_reporting(kvm_context_t kvm
, int vcpu
)
664 return tpr_access_reporting(kvm
, vcpu
, 0);