10 #include <sys/types.h>
15 int kvm_set_tss_addr(kvm_context_t kvm
, unsigned long addr
)
17 #ifdef KVM_CAP_SET_TSS_ADDR
20 r
= ioctl(kvm
->fd
, KVM_CHECK_EXTENSION
, KVM_CAP_SET_TSS_ADDR
);
22 r
= ioctl(kvm
->vm_fd
, KVM_SET_TSS_ADDR
, addr
);
24 fprintf(stderr
, "kvm_set_tss_addr: %m\n");
33 static int kvm_init_tss(kvm_context_t kvm
)
35 #ifdef KVM_CAP_SET_TSS_ADDR
38 r
= ioctl(kvm
->fd
, KVM_CHECK_EXTENSION
, KVM_CAP_SET_TSS_ADDR
);
41 * this address is 3 pages before the bios, and the bios should present
44 r
= kvm_set_tss_addr(kvm
, 0xfffbd000);
46 fprintf(stderr
, "kvm_init_tss: unable to set tss addr\n");
55 static int kvm_create_pit(kvm_context_t kvm
)
60 kvm
->pit_in_kernel
= 0;
61 if (!kvm
->no_pit_creation
) {
63 struct kvm_pit_config config
= { .flags
= 0 };
65 r
= ioctl(kvm
->fd
, KVM_CHECK_EXTENSION
, KVM_CAP_PIT2
);
67 r
= ioctl(kvm
->vm_fd
, KVM_CREATE_PIT2
, &config
);
71 r
= ioctl(kvm
->fd
, KVM_CHECK_EXTENSION
, KVM_CAP_PIT
);
75 r
= ioctl(kvm
->vm_fd
, KVM_CREATE_PIT
);
78 fprintf(stderr
, "Create kernel PIC irqchip failed\n");
81 kvm
->pit_in_kernel
= 1;
87 int kvm_arch_create(kvm_context_t kvm
, unsigned long phys_mem_bytes
,
92 r
= kvm_init_tss(kvm
);
96 r
= kvm_create_pit(kvm
);
100 r
= kvm_init_coalesced_mmio(kvm
);
107 #ifdef KVM_EXIT_TPR_ACCESS
109 static int handle_tpr_access(kvm_context_t kvm
, struct kvm_run
*run
, int vcpu
)
111 return kvm
->callbacks
->tpr_access(kvm
->opaque
, vcpu
,
113 run
->tpr_access
.is_write
);
117 int kvm_enable_vapic(kvm_context_t kvm
, int vcpu
, uint64_t vapic
)
120 struct kvm_vapic_addr va
= {
124 r
= ioctl(kvm
->vcpu_fd
[vcpu
], KVM_SET_VAPIC_ADDR
, &va
);
127 perror("kvm_enable_vapic");
135 int kvm_arch_run(struct kvm_run
*run
,kvm_context_t kvm
, int vcpu
)
139 switch (run
->exit_reason
) {
140 #ifdef KVM_EXIT_SET_TPR
141 case KVM_EXIT_SET_TPR
:
144 #ifdef KVM_EXIT_TPR_ACCESS
145 case KVM_EXIT_TPR_ACCESS
:
146 r
= handle_tpr_access(kvm
, run
, vcpu
);
157 #define MAX_ALIAS_SLOTS 4
161 } kvm_aliases
[MAX_ALIAS_SLOTS
];
163 static int get_alias_slot(uint64_t start
)
167 for (i
=0; i
<MAX_ALIAS_SLOTS
; i
++)
168 if (kvm_aliases
[i
].start
== start
)
172 static int get_free_alias_slot(void)
176 for (i
=0; i
<MAX_ALIAS_SLOTS
; i
++)
177 if (kvm_aliases
[i
].len
== 0)
182 static void register_alias(int slot
, uint64_t start
, uint64_t len
)
184 kvm_aliases
[slot
].start
= start
;
185 kvm_aliases
[slot
].len
= len
;
188 int kvm_create_memory_alias(kvm_context_t kvm
,
191 uint64_t target_phys
)
193 struct kvm_memory_alias alias
= {
195 .guest_phys_addr
= phys_start
,
197 .target_phys_addr
= target_phys
,
203 slot
= get_alias_slot(phys_start
);
205 slot
= get_free_alias_slot();
210 r
= ioctl(fd
, KVM_SET_MEMORY_ALIAS
, &alias
);
214 register_alias(slot
, phys_start
, len
);
218 int kvm_destroy_memory_alias(kvm_context_t kvm
, uint64_t phys_start
)
220 return kvm_create_memory_alias(kvm
, phys_start
, 0, 0);
223 #ifdef KVM_CAP_IRQCHIP
225 int kvm_get_lapic(kvm_context_t kvm
, int vcpu
, struct kvm_lapic_state
*s
)
228 if (!kvm
->irqchip_in_kernel
)
230 r
= ioctl(kvm
->vcpu_fd
[vcpu
], KVM_GET_LAPIC
, s
);
233 perror("kvm_get_lapic");
238 int kvm_set_lapic(kvm_context_t kvm
, int vcpu
, struct kvm_lapic_state
*s
)
241 if (!kvm
->irqchip_in_kernel
)
243 r
= ioctl(kvm
->vcpu_fd
[vcpu
], KVM_SET_LAPIC
, s
);
246 perror("kvm_set_lapic");
255 int kvm_get_pit(kvm_context_t kvm
, struct kvm_pit_state
*s
)
258 if (!kvm
->pit_in_kernel
)
260 r
= ioctl(kvm
->vm_fd
, KVM_GET_PIT
, s
);
263 perror("kvm_get_pit");
268 int kvm_set_pit(kvm_context_t kvm
, struct kvm_pit_state
*s
)
271 if (!kvm
->pit_in_kernel
)
273 r
= ioctl(kvm
->vm_fd
, KVM_SET_PIT
, s
);
276 perror("kvm_set_pit");
283 void kvm_show_code(kvm_context_t kvm
, int vcpu
)
285 #define SHOW_CODE_LEN 50
286 int fd
= kvm
->vcpu_fd
[vcpu
];
287 struct kvm_regs regs
;
288 struct kvm_sregs sregs
;
292 char code_str
[SHOW_CODE_LEN
* 3 + 1];
295 r
= ioctl(fd
, KVM_GET_SREGS
, &sregs
);
297 perror("KVM_GET_SREGS");
300 r
= ioctl(fd
, KVM_GET_REGS
, ®s
);
302 perror("KVM_GET_REGS");
305 rip
= sregs
.cs
.base
+ regs
.rip
;
306 back_offset
= regs
.rip
;
307 if (back_offset
> 20)
310 for (n
= -back_offset
; n
< SHOW_CODE_LEN
-back_offset
; ++n
) {
312 strcat(code_str
, " -->");
313 r
= kvm
->callbacks
->mmio_read(kvm
->opaque
, rip
+ n
, &code
, 1);
315 strcat(code_str
, " xx");
318 sprintf(code_str
+ strlen(code_str
), " %02x", code
);
320 fprintf(stderr
, "code:%s\n", code_str
);
325 * Returns available msr list. User must free.
327 struct kvm_msr_list
*kvm_get_msr_list(kvm_context_t kvm
)
329 struct kvm_msr_list sizer
, *msrs
;
333 r
= ioctl(kvm
->fd
, KVM_GET_MSR_INDEX_LIST
, &sizer
);
334 if (r
== -1 && errno
!= E2BIG
)
336 msrs
= malloc(sizeof *msrs
+ sizer
.nmsrs
* sizeof *msrs
->indices
);
341 msrs
->nmsrs
= sizer
.nmsrs
;
342 r
= ioctl(kvm
->fd
, KVM_GET_MSR_INDEX_LIST
, msrs
);
352 int kvm_get_msrs(kvm_context_t kvm
, int vcpu
, struct kvm_msr_entry
*msrs
,
355 struct kvm_msrs
*kmsrs
= malloc(sizeof *kmsrs
+ n
* sizeof *msrs
);
363 memcpy(kmsrs
->entries
, msrs
, n
* sizeof *msrs
);
364 r
= ioctl(kvm
->vcpu_fd
[vcpu
], KVM_GET_MSRS
, kmsrs
);
366 memcpy(msrs
, kmsrs
->entries
, n
* sizeof *msrs
);
372 int kvm_set_msrs(kvm_context_t kvm
, int vcpu
, struct kvm_msr_entry
*msrs
,
375 struct kvm_msrs
*kmsrs
= malloc(sizeof *kmsrs
+ n
* sizeof *msrs
);
383 memcpy(kmsrs
->entries
, msrs
, n
* sizeof *msrs
);
384 r
= ioctl(kvm
->vcpu_fd
[vcpu
], KVM_SET_MSRS
, kmsrs
);
391 static void print_seg(FILE *file
, const char *name
, struct kvm_segment
*seg
)
394 "%s %04x (%08llx/%08x p %d dpl %d db %d s %d type %x l %d"
396 name
, seg
->selector
, seg
->base
, seg
->limit
, seg
->present
,
397 seg
->dpl
, seg
->db
, seg
->s
, seg
->type
, seg
->l
, seg
->g
,
401 static void print_dt(FILE *file
, const char *name
, struct kvm_dtable
*dt
)
403 fprintf(stderr
, "%s %llx/%x\n", name
, dt
->base
, dt
->limit
);
406 void kvm_show_regs(kvm_context_t kvm
, int vcpu
)
408 int fd
= kvm
->vcpu_fd
[vcpu
];
409 struct kvm_regs regs
;
410 struct kvm_sregs sregs
;
413 r
= ioctl(fd
, KVM_GET_REGS
, ®s
);
415 perror("KVM_GET_REGS");
419 "rax %016llx rbx %016llx rcx %016llx rdx %016llx\n"
420 "rsi %016llx rdi %016llx rsp %016llx rbp %016llx\n"
421 "r8 %016llx r9 %016llx r10 %016llx r11 %016llx\n"
422 "r12 %016llx r13 %016llx r14 %016llx r15 %016llx\n"
423 "rip %016llx rflags %08llx\n",
424 regs
.rax
, regs
.rbx
, regs
.rcx
, regs
.rdx
,
425 regs
.rsi
, regs
.rdi
, regs
.rsp
, regs
.rbp
,
426 regs
.r8
, regs
.r9
, regs
.r10
, regs
.r11
,
427 regs
.r12
, regs
.r13
, regs
.r14
, regs
.r15
,
428 regs
.rip
, regs
.rflags
);
429 r
= ioctl(fd
, KVM_GET_SREGS
, &sregs
);
431 perror("KVM_GET_SREGS");
434 print_seg(stderr
, "cs", &sregs
.cs
);
435 print_seg(stderr
, "ds", &sregs
.ds
);
436 print_seg(stderr
, "es", &sregs
.es
);
437 print_seg(stderr
, "ss", &sregs
.ss
);
438 print_seg(stderr
, "fs", &sregs
.fs
);
439 print_seg(stderr
, "gs", &sregs
.gs
);
440 print_seg(stderr
, "tr", &sregs
.tr
);
441 print_seg(stderr
, "ldt", &sregs
.ldt
);
442 print_dt(stderr
, "gdt", &sregs
.gdt
);
443 print_dt(stderr
, "idt", &sregs
.idt
);
444 fprintf(stderr
, "cr0 %llx cr2 %llx cr3 %llx cr4 %llx cr8 %llx"
446 sregs
.cr0
, sregs
.cr2
, sregs
.cr3
, sregs
.cr4
, sregs
.cr8
,
450 uint64_t kvm_get_apic_base(kvm_context_t kvm
, int vcpu
)
452 struct kvm_run
*run
= kvm
->run
[vcpu
];
454 return run
->apic_base
;
457 void kvm_set_cr8(kvm_context_t kvm
, int vcpu
, uint64_t cr8
)
459 struct kvm_run
*run
= kvm
->run
[vcpu
];
464 __u64
kvm_get_cr8(kvm_context_t kvm
, int vcpu
)
466 return kvm
->run
[vcpu
]->cr8
;
469 int kvm_setup_cpuid(kvm_context_t kvm
, int vcpu
, int nent
,
470 struct kvm_cpuid_entry
*entries
)
472 struct kvm_cpuid
*cpuid
;
475 cpuid
= malloc(sizeof(*cpuid
) + nent
* sizeof(*entries
));
480 memcpy(cpuid
->entries
, entries
, nent
* sizeof(*entries
));
481 r
= ioctl(kvm
->vcpu_fd
[vcpu
], KVM_SET_CPUID
, cpuid
);
487 int kvm_setup_cpuid2(kvm_context_t kvm
, int vcpu
, int nent
,
488 struct kvm_cpuid_entry2
*entries
)
490 struct kvm_cpuid2
*cpuid
;
493 cpuid
= malloc(sizeof(*cpuid
) + nent
* sizeof(*entries
));
498 memcpy(cpuid
->entries
, entries
, nent
* sizeof(*entries
));
499 r
= ioctl(kvm
->vcpu_fd
[vcpu
], KVM_SET_CPUID2
, cpuid
);
501 fprintf(stderr
, "kvm_setup_cpuid2: %m\n");
508 int kvm_set_shadow_pages(kvm_context_t kvm
, unsigned int nrshadow_pages
)
510 #ifdef KVM_CAP_MMU_SHADOW_CACHE_CONTROL
513 r
= ioctl(kvm
->fd
, KVM_CHECK_EXTENSION
,
514 KVM_CAP_MMU_SHADOW_CACHE_CONTROL
);
516 r
= ioctl(kvm
->vm_fd
, KVM_SET_NR_MMU_PAGES
, nrshadow_pages
);
518 fprintf(stderr
, "kvm_set_shadow_pages: %m\n");
527 int kvm_get_shadow_pages(kvm_context_t kvm
, unsigned int *nrshadow_pages
)
529 #ifdef KVM_CAP_MMU_SHADOW_CACHE_CONTROL
532 r
= ioctl(kvm
->fd
, KVM_CHECK_EXTENSION
,
533 KVM_CAP_MMU_SHADOW_CACHE_CONTROL
);
535 *nrshadow_pages
= ioctl(kvm
->vm_fd
, KVM_GET_NR_MMU_PAGES
);
544 static int tpr_access_reporting(kvm_context_t kvm
, int vcpu
, int enabled
)
547 struct kvm_tpr_access_ctl tac
= {
551 r
= ioctl(kvm
->fd
, KVM_CHECK_EXTENSION
, KVM_CAP_VAPIC
);
552 if (r
== -1 || r
== 0)
554 r
= ioctl(kvm
->vcpu_fd
[vcpu
], KVM_TPR_ACCESS_REPORTING
, &tac
);
557 perror("KVM_TPR_ACCESS_REPORTING");
563 int kvm_enable_tpr_access_reporting(kvm_context_t kvm
, int vcpu
)
565 return tpr_access_reporting(kvm
, vcpu
, 1);
568 int kvm_disable_tpr_access_reporting(kvm_context_t kvm
, int vcpu
)
570 return tpr_access_reporting(kvm
, vcpu
, 0);
575 #ifdef KVM_CAP_EXT_CPUID
577 static struct kvm_cpuid2
*try_get_cpuid(kvm_context_t kvm
, int max
)
579 struct kvm_cpuid2
*cpuid
;
582 size
= sizeof(*cpuid
) + max
* sizeof(*cpuid
->entries
);
583 cpuid
= (struct kvm_cpuid2
*)malloc(size
);
585 r
= ioctl(kvm
->fd
, KVM_GET_SUPPORTED_CPUID
, cpuid
);
588 else if (r
== 0 && cpuid
->nent
>= max
)
595 fprintf(stderr
, "KVM_GET_SUPPORTED_CPUID failed: %s\n",
612 uint32_t kvm_get_supported_cpuid(kvm_context_t kvm
, uint32_t function
, int reg
)
614 struct kvm_cpuid2
*cpuid
;
617 uint32_t cpuid_1_edx
;
619 if (!kvm_check_extension(kvm
, KVM_CAP_EXT_CPUID
)) {
624 while ((cpuid
= try_get_cpuid(kvm
, max
)) == NULL
) {
628 for (i
= 0; i
< cpuid
->nent
; ++i
) {
629 if (cpuid
->entries
[i
].function
== function
) {
632 ret
= cpuid
->entries
[i
].eax
;
635 ret
= cpuid
->entries
[i
].ebx
;
638 ret
= cpuid
->entries
[i
].ecx
;
641 ret
= cpuid
->entries
[i
].edx
;
643 /* kvm misreports the following features
645 ret
|= 1 << 12; /* MTRR */
646 ret
|= 1 << 16; /* PAT */
647 ret
|= 1 << 7; /* MCE */
648 ret
|= 1 << 14; /* MCA */
651 /* On Intel, kvm returns cpuid according to
652 * the Intel spec, so add missing bits
653 * according to the AMD spec:
655 if (function
== 0x80000001) {
656 cpuid_1_edx
= kvm_get_supported_cpuid(kvm
, 1, R_EDX
);
657 ret
|= cpuid_1_edx
& 0xdfeff7ff;
671 uint32_t kvm_get_supported_cpuid(kvm_context_t kvm
, uint32_t function
, int reg
)