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 printf("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 printf("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
);
185 #ifdef KVM_EXIT_TPR_ACCESS
187 static int handle_tpr_access(kvm_context_t kvm
, struct kvm_run
*run
, int vcpu
)
189 return kvm
->callbacks
->tpr_access(kvm
->opaque
, vcpu
,
191 run
->tpr_access
.is_write
);
195 int kvm_enable_vapic(kvm_context_t kvm
, int vcpu
, uint64_t vapic
)
198 struct kvm_vapic_addr va
= {
202 r
= ioctl(kvm
->vcpu_fd
[vcpu
], KVM_SET_VAPIC_ADDR
, &va
);
205 perror("kvm_enable_vapic");
213 int kvm_arch_run(struct kvm_run
*run
,kvm_context_t kvm
, int vcpu
)
217 switch (run
->exit_reason
) {
218 #ifdef KVM_EXIT_SET_TPR
219 case KVM_EXIT_SET_TPR
:
222 #ifdef KVM_EXIT_TPR_ACCESS
223 case KVM_EXIT_TPR_ACCESS
:
224 r
= handle_tpr_access(kvm
, run
, vcpu
);
235 void *kvm_create_kernel_phys_mem(kvm_context_t kvm
, unsigned long phys_start
,
236 unsigned long len
, int log
, int writable
)
239 int prot
= PROT_READ
;
241 struct kvm_memory_region memory
= {
243 .guest_phys_addr
= phys_start
,
244 .flags
= log
? KVM_MEM_LOG_DIRTY_PAGES
: 0,
247 memory
.slot
= get_free_slot(kvm
);
248 r
= ioctl(kvm
->vm_fd
, KVM_SET_MEMORY_REGION
, &memory
);
250 fprintf(stderr
, "create_kernel_phys_mem: %s", strerror(errno
));
253 register_slot(memory
.slot
, memory
.guest_phys_addr
, memory
.memory_size
,
259 ptr
= mmap(NULL
, len
, prot
, MAP_SHARED
, kvm
->vm_fd
, phys_start
);
260 if (ptr
== MAP_FAILED
) {
261 fprintf(stderr
, "create_kernel_phys_mem: %s", strerror(errno
));
268 #define MAX_ALIAS_SLOTS 4
272 } kvm_aliases
[MAX_ALIAS_SLOTS
];
274 static int get_alias_slot(uint64_t start
)
278 for (i
=0; i
<MAX_ALIAS_SLOTS
; i
++)
279 if (kvm_aliases
[i
].start
== start
)
283 static int get_free_alias_slot(void)
287 for (i
=0; i
<MAX_ALIAS_SLOTS
; i
++)
288 if (kvm_aliases
[i
].len
== 0)
293 static void register_alias(int slot
, uint64_t start
, uint64_t len
)
295 kvm_aliases
[slot
].start
= start
;
296 kvm_aliases
[slot
].len
= len
;
299 int kvm_create_memory_alias(kvm_context_t kvm
,
302 uint64_t target_phys
)
304 struct kvm_memory_alias alias
= {
306 .guest_phys_addr
= phys_start
,
308 .target_phys_addr
= target_phys
,
314 slot
= get_alias_slot(phys_start
);
316 slot
= get_free_alias_slot();
321 r
= ioctl(fd
, KVM_SET_MEMORY_ALIAS
, &alias
);
325 register_alias(slot
, phys_start
, len
);
329 int kvm_destroy_memory_alias(kvm_context_t kvm
, uint64_t phys_start
)
331 return kvm_create_memory_alias(kvm
, phys_start
, 0, 0);
334 #ifdef KVM_CAP_IRQCHIP
336 int kvm_get_lapic(kvm_context_t kvm
, int vcpu
, struct kvm_lapic_state
*s
)
339 if (!kvm
->irqchip_in_kernel
)
341 r
= ioctl(kvm
->vcpu_fd
[vcpu
], KVM_GET_LAPIC
, s
);
344 perror("kvm_get_lapic");
349 int kvm_set_lapic(kvm_context_t kvm
, int vcpu
, struct kvm_lapic_state
*s
)
352 if (!kvm
->irqchip_in_kernel
)
354 r
= ioctl(kvm
->vcpu_fd
[vcpu
], KVM_SET_LAPIC
, s
);
357 perror("kvm_set_lapic");
366 int kvm_get_pit(kvm_context_t kvm
, struct kvm_pit_state
*s
)
369 if (!kvm
->pit_in_kernel
)
371 r
= ioctl(kvm
->vm_fd
, KVM_GET_PIT
, s
);
374 perror("kvm_get_pit");
379 int kvm_set_pit(kvm_context_t kvm
, struct kvm_pit_state
*s
)
382 if (!kvm
->pit_in_kernel
)
384 r
= ioctl(kvm
->vm_fd
, KVM_SET_PIT
, s
);
387 perror("kvm_set_pit");
394 void kvm_show_code(kvm_context_t kvm
, int vcpu
)
396 #define CR0_PE_MASK (1ULL<<0)
397 int fd
= kvm
->vcpu_fd
[vcpu
];
398 struct kvm_regs regs
;
399 struct kvm_sregs sregs
;
401 unsigned char code
[50];
403 char code_str
[sizeof(code
) * 3 + 1];
406 r
= ioctl(fd
, KVM_GET_SREGS
, &sregs
);
408 perror("KVM_GET_SREGS");
411 if (sregs
.cr0
& CR0_PE_MASK
)
414 r
= ioctl(fd
, KVM_GET_REGS
, ®s
);
416 perror("KVM_GET_REGS");
419 rip
= sregs
.cs
.base
+ regs
.rip
;
420 back_offset
= regs
.rip
;
421 if (back_offset
> 20)
423 memcpy(code
, kvm
->physical_memory
+ rip
- back_offset
, sizeof code
);
425 for (r
= 0; r
< sizeof code
; ++r
) {
426 if (r
== back_offset
)
427 strcat(code_str
, " -->");
428 sprintf(code_str
+ strlen(code_str
), " %02x", code
[r
]);
430 fprintf(stderr
, "code:%s\n", code_str
);
435 * Returns available msr list. User must free.
437 struct kvm_msr_list
*kvm_get_msr_list(kvm_context_t kvm
)
439 struct kvm_msr_list sizer
, *msrs
;
443 r
= ioctl(kvm
->fd
, KVM_GET_MSR_INDEX_LIST
, &sizer
);
444 if (r
== -1 && errno
!= E2BIG
)
446 msrs
= malloc(sizeof *msrs
+ sizer
.nmsrs
* sizeof *msrs
->indices
);
451 msrs
->nmsrs
= sizer
.nmsrs
;
452 r
= ioctl(kvm
->fd
, KVM_GET_MSR_INDEX_LIST
, msrs
);
462 int kvm_get_msrs(kvm_context_t kvm
, int vcpu
, struct kvm_msr_entry
*msrs
,
465 struct kvm_msrs
*kmsrs
= malloc(sizeof *kmsrs
+ n
* sizeof *msrs
);
473 memcpy(kmsrs
->entries
, msrs
, n
* sizeof *msrs
);
474 r
= ioctl(kvm
->vcpu_fd
[vcpu
], KVM_GET_MSRS
, kmsrs
);
476 memcpy(msrs
, kmsrs
->entries
, n
* sizeof *msrs
);
482 int kvm_set_msrs(kvm_context_t kvm
, int vcpu
, struct kvm_msr_entry
*msrs
,
485 struct kvm_msrs
*kmsrs
= malloc(sizeof *kmsrs
+ n
* sizeof *msrs
);
493 memcpy(kmsrs
->entries
, msrs
, n
* sizeof *msrs
);
494 r
= ioctl(kvm
->vcpu_fd
[vcpu
], KVM_SET_MSRS
, kmsrs
);
501 static void print_seg(FILE *file
, const char *name
, struct kvm_segment
*seg
)
504 "%s %04x (%08llx/%08x p %d dpl %d db %d s %d type %x l %d"
506 name
, seg
->selector
, seg
->base
, seg
->limit
, seg
->present
,
507 seg
->dpl
, seg
->db
, seg
->s
, seg
->type
, seg
->l
, seg
->g
,
511 static void print_dt(FILE *file
, const char *name
, struct kvm_dtable
*dt
)
513 fprintf(stderr
, "%s %llx/%x\n", name
, dt
->base
, dt
->limit
);
516 void kvm_show_regs(kvm_context_t kvm
, int vcpu
)
518 int fd
= kvm
->vcpu_fd
[vcpu
];
519 struct kvm_regs regs
;
520 struct kvm_sregs sregs
;
523 r
= ioctl(fd
, KVM_GET_REGS
, ®s
);
525 perror("KVM_GET_REGS");
529 "rax %016llx rbx %016llx rcx %016llx rdx %016llx\n"
530 "rsi %016llx rdi %016llx rsp %016llx rbp %016llx\n"
531 "r8 %016llx r9 %016llx r10 %016llx r11 %016llx\n"
532 "r12 %016llx r13 %016llx r14 %016llx r15 %016llx\n"
533 "rip %016llx rflags %08llx\n",
534 regs
.rax
, regs
.rbx
, regs
.rcx
, regs
.rdx
,
535 regs
.rsi
, regs
.rdi
, regs
.rsp
, regs
.rbp
,
536 regs
.r8
, regs
.r9
, regs
.r10
, regs
.r11
,
537 regs
.r12
, regs
.r13
, regs
.r14
, regs
.r15
,
538 regs
.rip
, regs
.rflags
);
539 r
= ioctl(fd
, KVM_GET_SREGS
, &sregs
);
541 perror("KVM_GET_SREGS");
544 print_seg(stderr
, "cs", &sregs
.cs
);
545 print_seg(stderr
, "ds", &sregs
.ds
);
546 print_seg(stderr
, "es", &sregs
.es
);
547 print_seg(stderr
, "ss", &sregs
.ss
);
548 print_seg(stderr
, "fs", &sregs
.fs
);
549 print_seg(stderr
, "gs", &sregs
.gs
);
550 print_seg(stderr
, "tr", &sregs
.tr
);
551 print_seg(stderr
, "ldt", &sregs
.ldt
);
552 print_dt(stderr
, "gdt", &sregs
.gdt
);
553 print_dt(stderr
, "idt", &sregs
.idt
);
554 fprintf(stderr
, "cr0 %llx cr2 %llx cr3 %llx cr4 %llx cr8 %llx"
556 sregs
.cr0
, sregs
.cr2
, sregs
.cr3
, sregs
.cr4
, sregs
.cr8
,
560 uint64_t kvm_get_apic_base(kvm_context_t kvm
, int vcpu
)
562 struct kvm_run
*run
= kvm
->run
[vcpu
];
564 return run
->apic_base
;
567 void kvm_set_cr8(kvm_context_t kvm
, int vcpu
, uint64_t cr8
)
569 struct kvm_run
*run
= kvm
->run
[vcpu
];
574 __u64
kvm_get_cr8(kvm_context_t kvm
, int vcpu
)
576 return kvm
->run
[vcpu
]->cr8
;
579 int kvm_setup_cpuid(kvm_context_t kvm
, int vcpu
, int nent
,
580 struct kvm_cpuid_entry
*entries
)
582 struct kvm_cpuid
*cpuid
;
585 cpuid
= malloc(sizeof(*cpuid
) + nent
* sizeof(*entries
));
590 memcpy(cpuid
->entries
, entries
, nent
* sizeof(*entries
));
591 r
= ioctl(kvm
->vcpu_fd
[vcpu
], KVM_SET_CPUID
, cpuid
);
597 int kvm_set_shadow_pages(kvm_context_t kvm
, unsigned int nrshadow_pages
)
599 #ifdef KVM_CAP_MMU_SHADOW_CACHE_CONTROL
602 r
= ioctl(kvm
->fd
, KVM_CHECK_EXTENSION
,
603 KVM_CAP_MMU_SHADOW_CACHE_CONTROL
);
605 r
= ioctl(kvm
->vm_fd
, KVM_SET_NR_MMU_PAGES
, nrshadow_pages
);
607 fprintf(stderr
, "kvm_set_shadow_pages: %m\n");
616 int kvm_get_shadow_pages(kvm_context_t kvm
, unsigned int *nrshadow_pages
)
618 #ifdef KVM_CAP_MMU_SHADOW_CACHE_CONTROL
621 r
= ioctl(kvm
->fd
, KVM_CHECK_EXTENSION
,
622 KVM_CAP_MMU_SHADOW_CACHE_CONTROL
);
624 *nrshadow_pages
= ioctl(kvm
->vm_fd
, KVM_GET_NR_MMU_PAGES
);
633 static int tpr_access_reporting(kvm_context_t kvm
, int vcpu
, int enabled
)
636 struct kvm_tpr_access_ctl tac
= {
640 r
= ioctl(kvm
->fd
, KVM_CHECK_EXTENSION
, KVM_CAP_VAPIC
);
641 if (r
== -1 || r
== 0)
643 r
= ioctl(kvm
->vcpu_fd
[vcpu
], KVM_TPR_ACCESS_REPORTING
, &tac
);
646 perror("KVM_TPR_ACCESS_REPORTING");
652 int kvm_enable_tpr_access_reporting(kvm_context_t kvm
, int vcpu
)
654 return tpr_access_reporting(kvm
, vcpu
, 1);
657 int kvm_disable_tpr_access_reporting(kvm_context_t kvm
, int vcpu
)
659 return tpr_access_reporting(kvm
, vcpu
, 0);