* [PATCH 0/5 v2] Further cleanups to qemu-kvm.c
@ 2009-06-18 19:37 Glauber Costa
2009-06-18 19:37 ` [PATCH 1/5] get rid of target-i386/libkvm.c Glauber Costa
2009-06-21 10:01 ` [PATCH 0/5 v2] Further cleanups to qemu-kvm.c Avi Kivity
0 siblings, 2 replies; 8+ messages in thread
From: Glauber Costa @ 2009-06-18 19:37 UTC (permalink / raw)
To: kvm; +Cc: avi
Avi,
This is the patch set that should be applied. It is comprised of
4 patches. It however, depends on "[PATCH 1/5] get rid of target-i386/libkvm.c",
so I'm sending it again, since it does not seem to be already applied by you.
Thanks.
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 1/5] get rid of target-i386/libkvm.c
2009-06-18 19:37 [PATCH 0/5 v2] Further cleanups to qemu-kvm.c Glauber Costa
@ 2009-06-18 19:37 ` Glauber Costa
2009-06-18 19:37 ` [PATCH 2/5] qemu-kvm.c memory cleanup Glauber Costa
2009-06-21 10:01 ` [PATCH 0/5 v2] Further cleanups to qemu-kvm.c Avi Kivity
1 sibling, 1 reply; 8+ messages in thread
From: Glauber Costa @ 2009-06-18 19:37 UTC (permalink / raw)
To: kvm; +Cc: avi
Same spirit of what has already been done for the generic code.
Fold libkvm.c into qemu-kvm-x86.c. handle_tpr_access becomes
kvm_handle_tpr_access, to avoid name clash.
Signed-off-by: Glauber Costa <glommer@redhat.com>
---
Makefile.target | 2 +-
qemu-kvm-x86.c | 652 ++++++++++++++++++++++++++++++++++++++++++++++++
target-i386/libkvm.c | 666 --------------------------------------------------
3 files changed, 653 insertions(+), 667 deletions(-)
delete mode 100644 target-i386/libkvm.c
diff --git a/Makefile.target b/Makefile.target
index 6637d9b..08121a9 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -162,7 +162,7 @@ CPPFLAGS+=-I$(SRC_PATH)/tcg/sparc
endif
ifeq ($(USE_KVM), 1)
-LIBOBJS+=qemu-kvm.o libkvm.o
+LIBOBJS+=qemu-kvm.o
endif
ifdef CONFIG_SOFTFLOAT
LIBOBJS+=fpu/softfloat.o
diff --git a/qemu-kvm-x86.c b/qemu-kvm-x86.c
index 5460136..049e9ee 100644
--- a/qemu-kvm-x86.c
+++ b/qemu-kvm-x86.c
@@ -16,9 +16,11 @@
#include "qemu-kvm.h"
#include "libkvm-all.h"
+#include "libkvm.h"
#include <pthread.h>
#include <sys/utsname.h>
#include <linux/kvm_para.h>
+#include <sys/ioctl.h>
#include "kvm.h"
@@ -31,6 +33,656 @@ static int kvm_has_vm_hsave_pa;
static int lm_capable_kernel;
+int kvm_set_tss_addr(kvm_context_t kvm, unsigned long addr)
+{
+#ifdef KVM_CAP_SET_TSS_ADDR
+ int r;
+
+ r = ioctl(kvm->fd, KVM_CHECK_EXTENSION, KVM_CAP_SET_TSS_ADDR);
+ if (r > 0) {
+ r = ioctl(kvm->vm_fd, KVM_SET_TSS_ADDR, addr);
+ if (r == -1) {
+ fprintf(stderr, "kvm_set_tss_addr: %m\n");
+ return -errno;
+ }
+ return 0;
+ }
+#endif
+ return -ENOSYS;
+}
+
+static int kvm_init_tss(kvm_context_t kvm)
+{
+#ifdef KVM_CAP_SET_TSS_ADDR
+ int r;
+
+ r = ioctl(kvm->fd, KVM_CHECK_EXTENSION, KVM_CAP_SET_TSS_ADDR);
+ if (r > 0) {
+ /*
+ * this address is 3 pages before the bios, and the bios should present
+ * as unavaible memory
+ */
+ r = kvm_set_tss_addr(kvm, 0xfffbd000);
+ if (r < 0) {
+ fprintf(stderr, "kvm_init_tss: unable to set tss addr\n");
+ return r;
+ }
+
+ }
+#endif
+ return 0;
+}
+
+static int kvm_create_pit(kvm_context_t kvm)
+{
+#ifdef KVM_CAP_PIT
+ int r;
+
+ kvm->pit_in_kernel = 0;
+ if (!kvm->no_pit_creation) {
+ r = ioctl(kvm->fd, KVM_CHECK_EXTENSION, KVM_CAP_PIT);
+ if (r > 0) {
+ r = ioctl(kvm->vm_fd, KVM_CREATE_PIT);
+ if (r >= 0)
+ kvm->pit_in_kernel = 1;
+ else {
+ fprintf(stderr, "Create kernel PIC irqchip failed\n");
+ return r;
+ }
+ }
+ }
+#endif
+ return 0;
+}
+
+int kvm_arch_create(kvm_context_t kvm, unsigned long phys_mem_bytes,
+ void **vm_mem)
+{
+ int r = 0;
+
+ r = kvm_init_tss(kvm);
+ if (r < 0)
+ return r;
+
+ r = kvm_create_pit(kvm);
+ if (r < 0)
+ return r;
+
+ r = kvm_init_coalesced_mmio(kvm);
+ if (r < 0)
+ return r;
+
+ return 0;
+}
+
+#ifdef KVM_EXIT_TPR_ACCESS
+
+static int kvm_handle_tpr_access(kvm_vcpu_context_t vcpu)
+{
+ struct kvm_run *run = vcpu->run;
+ return vcpu->kvm->callbacks->tpr_access(vcpu->kvm->opaque, vcpu,
+ run->tpr_access.rip,
+ run->tpr_access.is_write);
+}
+
+
+int kvm_enable_vapic(kvm_vcpu_context_t vcpu, uint64_t vapic)
+{
+ int r;
+ struct kvm_vapic_addr va = {
+ .vapic_addr = vapic,
+ };
+
+ r = ioctl(vcpu->fd, KVM_SET_VAPIC_ADDR, &va);
+ if (r == -1) {
+ r = -errno;
+ perror("kvm_enable_vapic");
+ return r;
+ }
+ return 0;
+}
+
+#endif
+
+int kvm_arch_run(kvm_vcpu_context_t vcpu)
+{
+ int r = 0;
+ struct kvm_run *run = vcpu->run;
+
+
+ switch (run->exit_reason) {
+#ifdef KVM_EXIT_SET_TPR
+ case KVM_EXIT_SET_TPR:
+ break;
+#endif
+#ifdef KVM_EXIT_TPR_ACCESS
+ case KVM_EXIT_TPR_ACCESS:
+ r = kvm_handle_tpr_access(vcpu);
+ break;
+#endif
+ default:
+ r = 1;
+ break;
+ }
+
+ return r;
+}
+
+#define MAX_ALIAS_SLOTS 4
+static struct {
+ uint64_t start;
+ uint64_t len;
+} kvm_aliases[MAX_ALIAS_SLOTS];
+
+static int get_alias_slot(uint64_t start)
+{
+ int i;
+
+ for (i=0; i<MAX_ALIAS_SLOTS; i++)
+ if (kvm_aliases[i].start == start)
+ return i;
+ return -1;
+}
+static int get_free_alias_slot(void)
+{
+ int i;
+
+ for (i=0; i<MAX_ALIAS_SLOTS; i++)
+ if (kvm_aliases[i].len == 0)
+ return i;
+ return -1;
+}
+
+static void register_alias(int slot, uint64_t start, uint64_t len)
+{
+ kvm_aliases[slot].start = start;
+ kvm_aliases[slot].len = len;
+}
+
+int kvm_create_memory_alias(kvm_context_t kvm,
+ uint64_t phys_start,
+ uint64_t len,
+ uint64_t target_phys)
+{
+ struct kvm_memory_alias alias = {
+ .flags = 0,
+ .guest_phys_addr = phys_start,
+ .memory_size = len,
+ .target_phys_addr = target_phys,
+ };
+ int fd = kvm->vm_fd;
+ int r;
+ int slot;
+
+ slot = get_alias_slot(phys_start);
+ if (slot < 0)
+ slot = get_free_alias_slot();
+ if (slot < 0)
+ return -EBUSY;
+ alias.slot = slot;
+
+ r = ioctl(fd, KVM_SET_MEMORY_ALIAS, &alias);
+ if (r == -1)
+ return -errno;
+
+ register_alias(slot, phys_start, len);
+ return 0;
+}
+
+int kvm_destroy_memory_alias(kvm_context_t kvm, uint64_t phys_start)
+{
+ return kvm_create_memory_alias(kvm, phys_start, 0, 0);
+}
+
+#ifdef KVM_CAP_IRQCHIP
+
+int kvm_get_lapic(kvm_vcpu_context_t vcpu, struct kvm_lapic_state *s)
+{
+ int r;
+ if (!kvm_irqchip_in_kernel(vcpu->kvm))
+ return 0;
+ r = ioctl(vcpu->fd, KVM_GET_LAPIC, s);
+ if (r == -1) {
+ r = -errno;
+ perror("kvm_get_lapic");
+ }
+ return r;
+}
+
+int kvm_set_lapic(kvm_vcpu_context_t vcpu, struct kvm_lapic_state *s)
+{
+ int r;
+ if (!kvm_irqchip_in_kernel(vcpu->kvm))
+ return 0;
+ r = ioctl(vcpu->fd, KVM_SET_LAPIC, s);
+ if (r == -1) {
+ r = -errno;
+ perror("kvm_set_lapic");
+ }
+ return r;
+}
+
+#endif
+
+#ifdef KVM_CAP_PIT
+
+int kvm_get_pit(kvm_context_t kvm, struct kvm_pit_state *s)
+{
+ int r;
+ if (!kvm->pit_in_kernel)
+ return 0;
+ r = ioctl(kvm->vm_fd, KVM_GET_PIT, s);
+ if (r == -1) {
+ r = -errno;
+ perror("kvm_get_pit");
+ }
+ return r;
+}
+
+int kvm_set_pit(kvm_context_t kvm, struct kvm_pit_state *s)
+{
+ int r;
+ if (!kvm->pit_in_kernel)
+ return 0;
+ r = ioctl(kvm->vm_fd, KVM_SET_PIT, s);
+ if (r == -1) {
+ r = -errno;
+ perror("kvm_set_pit");
+ }
+ return r;
+}
+
+#endif
+
+void kvm_show_code(kvm_vcpu_context_t vcpu)
+{
+#define SHOW_CODE_LEN 50
+ int fd = vcpu->fd;
+ struct kvm_regs regs;
+ struct kvm_sregs sregs;
+ int r, n;
+ int back_offset;
+ unsigned char code;
+ char code_str[SHOW_CODE_LEN * 3 + 1];
+ unsigned long rip;
+ kvm_context_t kvm = vcpu->kvm;
+
+ r = ioctl(fd, KVM_GET_SREGS, &sregs);
+ if (r == -1) {
+ perror("KVM_GET_SREGS");
+ return;
+ }
+ r = ioctl(fd, KVM_GET_REGS, ®s);
+ if (r == -1) {
+ perror("KVM_GET_REGS");
+ return;
+ }
+ rip = sregs.cs.base + regs.rip;
+ back_offset = regs.rip;
+ if (back_offset > 20)
+ back_offset = 20;
+ *code_str = 0;
+ for (n = -back_offset; n < SHOW_CODE_LEN-back_offset; ++n) {
+ if (n == 0)
+ strcat(code_str, " -->");
+ r = kvm->callbacks->mmio_read(kvm->opaque, rip + n, &code, 1);
+ if (r < 0) {
+ strcat(code_str, " xx");
+ continue;
+ }
+ sprintf(code_str + strlen(code_str), " %02x", code);
+ }
+ fprintf(stderr, "code:%s\n", code_str);
+}
+
+
+/*
+ * Returns available msr list. User must free.
+ */
+struct kvm_msr_list *kvm_get_msr_list(kvm_context_t kvm)
+{
+ struct kvm_msr_list sizer, *msrs;
+ int r, e;
+
+ sizer.nmsrs = 0;
+ r = ioctl(kvm->fd, KVM_GET_MSR_INDEX_LIST, &sizer);
+ if (r == -1 && errno != E2BIG)
+ return NULL;
+ msrs = malloc(sizeof *msrs + sizer.nmsrs * sizeof *msrs->indices);
+ if (!msrs) {
+ errno = ENOMEM;
+ return NULL;
+ }
+ msrs->nmsrs = sizer.nmsrs;
+ r = ioctl(kvm->fd, KVM_GET_MSR_INDEX_LIST, msrs);
+ if (r == -1) {
+ e = errno;
+ free(msrs);
+ errno = e;
+ return NULL;
+ }
+ return msrs;
+}
+
+int kvm_get_msrs(kvm_vcpu_context_t vcpu, struct kvm_msr_entry *msrs, int n)
+{
+ struct kvm_msrs *kmsrs = malloc(sizeof *kmsrs + n * sizeof *msrs);
+ int r, e;
+
+ if (!kmsrs) {
+ errno = ENOMEM;
+ return -1;
+ }
+ kmsrs->nmsrs = n;
+ memcpy(kmsrs->entries, msrs, n * sizeof *msrs);
+ r = ioctl(vcpu->fd, KVM_GET_MSRS, kmsrs);
+ e = errno;
+ memcpy(msrs, kmsrs->entries, n * sizeof *msrs);
+ free(kmsrs);
+ errno = e;
+ return r;
+}
+
+int kvm_set_msrs(kvm_vcpu_context_t vcpu, struct kvm_msr_entry *msrs, int n)
+{
+ struct kvm_msrs *kmsrs = malloc(sizeof *kmsrs + n * sizeof *msrs);
+ int r, e;
+
+ if (!kmsrs) {
+ errno = ENOMEM;
+ return -1;
+ }
+ kmsrs->nmsrs = n;
+ memcpy(kmsrs->entries, msrs, n * sizeof *msrs);
+ r = ioctl(vcpu->fd, KVM_SET_MSRS, kmsrs);
+ e = errno;
+ free(kmsrs);
+ errno = e;
+ return r;
+}
+
+static void print_seg(FILE *file, const char *name, struct kvm_segment *seg)
+{
+ fprintf(stderr,
+ "%s %04x (%08llx/%08x p %d dpl %d db %d s %d type %x l %d"
+ " g %d avl %d)\n",
+ name, seg->selector, seg->base, seg->limit, seg->present,
+ seg->dpl, seg->db, seg->s, seg->type, seg->l, seg->g,
+ seg->avl);
+}
+
+static void print_dt(FILE *file, const char *name, struct kvm_dtable *dt)
+{
+ fprintf(stderr, "%s %llx/%x\n", name, dt->base, dt->limit);
+}
+
+void kvm_show_regs(kvm_vcpu_context_t vcpu)
+{
+ int fd = vcpu->fd;
+ struct kvm_regs regs;
+ struct kvm_sregs sregs;
+ int r;
+
+ r = ioctl(fd, KVM_GET_REGS, ®s);
+ if (r == -1) {
+ perror("KVM_GET_REGS");
+ return;
+ }
+ fprintf(stderr,
+ "rax %016llx rbx %016llx rcx %016llx rdx %016llx\n"
+ "rsi %016llx rdi %016llx rsp %016llx rbp %016llx\n"
+ "r8 %016llx r9 %016llx r10 %016llx r11 %016llx\n"
+ "r12 %016llx r13 %016llx r14 %016llx r15 %016llx\n"
+ "rip %016llx rflags %08llx\n",
+ regs.rax, regs.rbx, regs.rcx, regs.rdx,
+ regs.rsi, regs.rdi, regs.rsp, regs.rbp,
+ regs.r8, regs.r9, regs.r10, regs.r11,
+ regs.r12, regs.r13, regs.r14, regs.r15,
+ regs.rip, regs.rflags);
+ r = ioctl(fd, KVM_GET_SREGS, &sregs);
+ if (r == -1) {
+ perror("KVM_GET_SREGS");
+ return;
+ }
+ print_seg(stderr, "cs", &sregs.cs);
+ print_seg(stderr, "ds", &sregs.ds);
+ print_seg(stderr, "es", &sregs.es);
+ print_seg(stderr, "ss", &sregs.ss);
+ print_seg(stderr, "fs", &sregs.fs);
+ print_seg(stderr, "gs", &sregs.gs);
+ print_seg(stderr, "tr", &sregs.tr);
+ print_seg(stderr, "ldt", &sregs.ldt);
+ print_dt(stderr, "gdt", &sregs.gdt);
+ print_dt(stderr, "idt", &sregs.idt);
+ fprintf(stderr, "cr0 %llx cr2 %llx cr3 %llx cr4 %llx cr8 %llx"
+ " efer %llx\n",
+ sregs.cr0, sregs.cr2, sregs.cr3, sregs.cr4, sregs.cr8,
+ sregs.efer);
+}
+
+uint64_t kvm_get_apic_base(kvm_vcpu_context_t vcpu)
+{
+ return vcpu->run->apic_base;
+}
+
+void kvm_set_cr8(kvm_vcpu_context_t vcpu, uint64_t cr8)
+{
+ vcpu->run->cr8 = cr8;
+}
+
+__u64 kvm_get_cr8(kvm_vcpu_context_t vcpu)
+{
+ return vcpu->run->cr8;
+}
+
+int kvm_setup_cpuid(kvm_vcpu_context_t vcpu, int nent,
+ struct kvm_cpuid_entry *entries)
+{
+ struct kvm_cpuid *cpuid;
+ int r;
+
+ cpuid = malloc(sizeof(*cpuid) + nent * sizeof(*entries));
+ if (!cpuid)
+ return -ENOMEM;
+
+ cpuid->nent = nent;
+ memcpy(cpuid->entries, entries, nent * sizeof(*entries));
+ r = ioctl(vcpu->fd, KVM_SET_CPUID, cpuid);
+
+ free(cpuid);
+ return r;
+}
+
+int kvm_setup_cpuid2(kvm_vcpu_context_t vcpu, int nent,
+ struct kvm_cpuid_entry2 *entries)
+{
+ struct kvm_cpuid2 *cpuid;
+ int r;
+
+ cpuid = malloc(sizeof(*cpuid) + nent * sizeof(*entries));
+ if (!cpuid)
+ return -ENOMEM;
+
+ cpuid->nent = nent;
+ memcpy(cpuid->entries, entries, nent * sizeof(*entries));
+ r = ioctl(vcpu->fd, KVM_SET_CPUID2, cpuid);
+ if (r == -1) {
+ fprintf(stderr, "kvm_setup_cpuid2: %m\n");
+ return -errno;
+ }
+ free(cpuid);
+ return r;
+}
+
+int kvm_set_shadow_pages(kvm_context_t kvm, unsigned int nrshadow_pages)
+{
+#ifdef KVM_CAP_MMU_SHADOW_CACHE_CONTROL
+ int r;
+
+ r = ioctl(kvm->fd, KVM_CHECK_EXTENSION,
+ KVM_CAP_MMU_SHADOW_CACHE_CONTROL);
+ if (r > 0) {
+ r = ioctl(kvm->vm_fd, KVM_SET_NR_MMU_PAGES, nrshadow_pages);
+ if (r == -1) {
+ fprintf(stderr, "kvm_set_shadow_pages: %m\n");
+ return -errno;
+ }
+ return 0;
+ }
+#endif
+ return -1;
+}
+
+int kvm_get_shadow_pages(kvm_context_t kvm, unsigned int *nrshadow_pages)
+{
+#ifdef KVM_CAP_MMU_SHADOW_CACHE_CONTROL
+ int r;
+
+ r = ioctl(kvm->fd, KVM_CHECK_EXTENSION,
+ KVM_CAP_MMU_SHADOW_CACHE_CONTROL);
+ if (r > 0) {
+ *nrshadow_pages = ioctl(kvm->vm_fd, KVM_GET_NR_MMU_PAGES);
+ return 0;
+ }
+#endif
+ return -1;
+}
+
+#ifdef KVM_CAP_VAPIC
+
+static int tpr_access_reporting(kvm_vcpu_context_t vcpu, int enabled)
+{
+ int r;
+ struct kvm_tpr_access_ctl tac = {
+ .enabled = enabled,
+ };
+
+ r = ioctl(vcpu->kvm->fd, KVM_CHECK_EXTENSION, KVM_CAP_VAPIC);
+ if (r == -1 || r == 0)
+ return -ENOSYS;
+ r = ioctl(vcpu->fd, KVM_TPR_ACCESS_REPORTING, &tac);
+ if (r == -1) {
+ r = -errno;
+ perror("KVM_TPR_ACCESS_REPORTING");
+ return r;
+ }
+ return 0;
+}
+
+int kvm_enable_tpr_access_reporting(kvm_vcpu_context_t vcpu)
+{
+ return tpr_access_reporting(vcpu, 1);
+}
+
+int kvm_disable_tpr_access_reporting(kvm_vcpu_context_t vcpu)
+{
+ return tpr_access_reporting(vcpu, 0);
+}
+
+#endif
+
+#ifdef KVM_CAP_EXT_CPUID
+
+static struct kvm_cpuid2 *try_get_cpuid(kvm_context_t kvm, int max)
+{
+ struct kvm_cpuid2 *cpuid;
+ int r, size;
+
+ size = sizeof(*cpuid) + max * sizeof(*cpuid->entries);
+ cpuid = (struct kvm_cpuid2 *)malloc(size);
+ cpuid->nent = max;
+ r = ioctl(kvm->fd, KVM_GET_SUPPORTED_CPUID, cpuid);
+ if (r == -1)
+ r = -errno;
+ else if (r == 0 && cpuid->nent >= max)
+ r = -E2BIG;
+ if (r < 0) {
+ if (r == -E2BIG) {
+ free(cpuid);
+ return NULL;
+ } else {
+ fprintf(stderr, "KVM_GET_SUPPORTED_CPUID failed: %s\n",
+ strerror(-r));
+ exit(1);
+ }
+ }
+ return cpuid;
+}
+
+#define R_EAX 0
+#define R_ECX 1
+#define R_EDX 2
+#define R_EBX 3
+#define R_ESP 4
+#define R_EBP 5
+#define R_ESI 6
+#define R_EDI 7
+
+uint32_t kvm_get_supported_cpuid(kvm_context_t kvm, uint32_t function, int reg)
+{
+ struct kvm_cpuid2 *cpuid;
+ int i, max;
+ uint32_t ret = 0;
+ uint32_t cpuid_1_edx;
+
+ if (!kvm_check_extension(kvm, KVM_CAP_EXT_CPUID)) {
+ return -1U;
+ }
+
+ max = 1;
+ while ((cpuid = try_get_cpuid(kvm, max)) == NULL) {
+ max *= 2;
+ }
+
+ for (i = 0; i < cpuid->nent; ++i) {
+ if (cpuid->entries[i].function == function) {
+ switch (reg) {
+ case R_EAX:
+ ret = cpuid->entries[i].eax;
+ break;
+ case R_EBX:
+ ret = cpuid->entries[i].ebx;
+ break;
+ case R_ECX:
+ ret = cpuid->entries[i].ecx;
+ break;
+ case R_EDX:
+ ret = cpuid->entries[i].edx;
+ if (function == 1) {
+ /* kvm misreports the following features
+ */
+ ret |= 1 << 12; /* MTRR */
+ ret |= 1 << 16; /* PAT */
+ ret |= 1 << 7; /* MCE */
+ ret |= 1 << 14; /* MCA */
+ }
+
+ /* On Intel, kvm returns cpuid according to
+ * the Intel spec, so add missing bits
+ * according to the AMD spec:
+ */
+ if (function == 0x80000001) {
+ cpuid_1_edx = kvm_get_supported_cpuid(kvm, 1, R_EDX);
+ ret |= cpuid_1_edx & 0xdfeff7ff;
+ }
+ break;
+ }
+ }
+ }
+
+ free(cpuid);
+
+ return ret;
+}
+
+#else
+
+uint32_t kvm_get_supported_cpuid(kvm_context_t kvm, uint32_t function, int reg)
+{
+ return -1U;
+}
+
+#endif
int kvm_qemu_create_memory_alias(uint64_t phys_start,
uint64_t len,
uint64_t target_phys)
diff --git a/target-i386/libkvm.c b/target-i386/libkvm.c
deleted file mode 100644
index 0f4e009..0000000
--- a/target-i386/libkvm.c
+++ /dev/null
@@ -1,666 +0,0 @@
-#include "sysemu.h"
-
-#include "libkvm-all.h"
-#include "libkvm.h"
-#include <errno.h>
-#include <sys/ioctl.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/mman.h>
-#include <stdio.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <stdlib.h>
-
-int kvm_set_tss_addr(kvm_context_t kvm, unsigned long addr)
-{
-#ifdef KVM_CAP_SET_TSS_ADDR
- int r;
-
- r = ioctl(kvm->fd, KVM_CHECK_EXTENSION, KVM_CAP_SET_TSS_ADDR);
- if (r > 0) {
- r = ioctl(kvm->vm_fd, KVM_SET_TSS_ADDR, addr);
- if (r == -1) {
- fprintf(stderr, "kvm_set_tss_addr: %m\n");
- return -errno;
- }
- return 0;
- }
-#endif
- return -ENOSYS;
-}
-
-static int kvm_init_tss(kvm_context_t kvm)
-{
-#ifdef KVM_CAP_SET_TSS_ADDR
- int r;
-
- r = ioctl(kvm->fd, KVM_CHECK_EXTENSION, KVM_CAP_SET_TSS_ADDR);
- if (r > 0) {
- /*
- * this address is 3 pages before the bios, and the bios should present
- * as unavaible memory
- */
- r = kvm_set_tss_addr(kvm, 0xfffbd000);
- if (r < 0) {
- fprintf(stderr, "kvm_init_tss: unable to set tss addr\n");
- return r;
- }
-
- }
-#endif
- return 0;
-}
-
-static int kvm_create_pit(kvm_context_t kvm)
-{
-#ifdef KVM_CAP_PIT
- int r;
-
- kvm->pit_in_kernel = 0;
- if (!kvm->no_pit_creation) {
- r = ioctl(kvm->fd, KVM_CHECK_EXTENSION, KVM_CAP_PIT);
- if (r > 0) {
- r = ioctl(kvm->vm_fd, KVM_CREATE_PIT);
- if (r >= 0)
- kvm->pit_in_kernel = 1;
- else {
- fprintf(stderr, "Create kernel PIC irqchip failed\n");
- return r;
- }
- }
- }
-#endif
- return 0;
-}
-
-int kvm_arch_create(kvm_context_t kvm, unsigned long phys_mem_bytes,
- void **vm_mem)
-{
- int r = 0;
-
- r = kvm_init_tss(kvm);
- if (r < 0)
- return r;
-
- r = kvm_create_pit(kvm);
- if (r < 0)
- return r;
-
- r = kvm_init_coalesced_mmio(kvm);
- if (r < 0)
- return r;
-
- return 0;
-}
-
-#ifdef KVM_EXIT_TPR_ACCESS
-
-static int handle_tpr_access(kvm_vcpu_context_t vcpu)
-{
- struct kvm_run *run = vcpu->run;
- return vcpu->kvm->callbacks->tpr_access(vcpu->kvm->opaque, vcpu,
- run->tpr_access.rip,
- run->tpr_access.is_write);
-}
-
-
-int kvm_enable_vapic(kvm_vcpu_context_t vcpu, uint64_t vapic)
-{
- int r;
- struct kvm_vapic_addr va = {
- .vapic_addr = vapic,
- };
-
- r = ioctl(vcpu->fd, KVM_SET_VAPIC_ADDR, &va);
- if (r == -1) {
- r = -errno;
- perror("kvm_enable_vapic");
- return r;
- }
- return 0;
-}
-
-#endif
-
-int kvm_arch_run(kvm_vcpu_context_t vcpu)
-{
- int r = 0;
- struct kvm_run *run = vcpu->run;
-
-
- switch (run->exit_reason) {
-#ifdef KVM_EXIT_SET_TPR
- case KVM_EXIT_SET_TPR:
- break;
-#endif
-#ifdef KVM_EXIT_TPR_ACCESS
- case KVM_EXIT_TPR_ACCESS:
- r = handle_tpr_access(vcpu);
- break;
-#endif
- default:
- r = 1;
- break;
- }
-
- return r;
-}
-
-#define MAX_ALIAS_SLOTS 4
-static struct {
- uint64_t start;
- uint64_t len;
-} kvm_aliases[MAX_ALIAS_SLOTS];
-
-static int get_alias_slot(uint64_t start)
-{
- int i;
-
- for (i=0; i<MAX_ALIAS_SLOTS; i++)
- if (kvm_aliases[i].start == start)
- return i;
- return -1;
-}
-static int get_free_alias_slot(void)
-{
- int i;
-
- for (i=0; i<MAX_ALIAS_SLOTS; i++)
- if (kvm_aliases[i].len == 0)
- return i;
- return -1;
-}
-
-static void register_alias(int slot, uint64_t start, uint64_t len)
-{
- kvm_aliases[slot].start = start;
- kvm_aliases[slot].len = len;
-}
-
-int kvm_create_memory_alias(kvm_context_t kvm,
- uint64_t phys_start,
- uint64_t len,
- uint64_t target_phys)
-{
- struct kvm_memory_alias alias = {
- .flags = 0,
- .guest_phys_addr = phys_start,
- .memory_size = len,
- .target_phys_addr = target_phys,
- };
- int fd = kvm->vm_fd;
- int r;
- int slot;
-
- slot = get_alias_slot(phys_start);
- if (slot < 0)
- slot = get_free_alias_slot();
- if (slot < 0)
- return -EBUSY;
- alias.slot = slot;
-
- r = ioctl(fd, KVM_SET_MEMORY_ALIAS, &alias);
- if (r == -1)
- return -errno;
-
- register_alias(slot, phys_start, len);
- return 0;
-}
-
-int kvm_destroy_memory_alias(kvm_context_t kvm, uint64_t phys_start)
-{
- return kvm_create_memory_alias(kvm, phys_start, 0, 0);
-}
-
-#ifdef KVM_CAP_IRQCHIP
-
-int kvm_get_lapic(kvm_vcpu_context_t vcpu, struct kvm_lapic_state *s)
-{
- int r;
- if (!kvm_irqchip_in_kernel(vcpu->kvm))
- return 0;
- r = ioctl(vcpu->fd, KVM_GET_LAPIC, s);
- if (r == -1) {
- r = -errno;
- perror("kvm_get_lapic");
- }
- return r;
-}
-
-int kvm_set_lapic(kvm_vcpu_context_t vcpu, struct kvm_lapic_state *s)
-{
- int r;
- if (!kvm_irqchip_in_kernel(vcpu->kvm))
- return 0;
- r = ioctl(vcpu->fd, KVM_SET_LAPIC, s);
- if (r == -1) {
- r = -errno;
- perror("kvm_set_lapic");
- }
- return r;
-}
-
-#endif
-
-#ifdef KVM_CAP_PIT
-
-int kvm_get_pit(kvm_context_t kvm, struct kvm_pit_state *s)
-{
- int r;
- if (!kvm->pit_in_kernel)
- return 0;
- r = ioctl(kvm->vm_fd, KVM_GET_PIT, s);
- if (r == -1) {
- r = -errno;
- perror("kvm_get_pit");
- }
- return r;
-}
-
-int kvm_set_pit(kvm_context_t kvm, struct kvm_pit_state *s)
-{
- int r;
- if (!kvm->pit_in_kernel)
- return 0;
- r = ioctl(kvm->vm_fd, KVM_SET_PIT, s);
- if (r == -1) {
- r = -errno;
- perror("kvm_set_pit");
- }
- return r;
-}
-
-#endif
-
-void kvm_show_code(kvm_vcpu_context_t vcpu)
-{
-#define SHOW_CODE_LEN 50
- int fd = vcpu->fd;
- struct kvm_regs regs;
- struct kvm_sregs sregs;
- int r, n;
- int back_offset;
- unsigned char code;
- char code_str[SHOW_CODE_LEN * 3 + 1];
- unsigned long rip;
- kvm_context_t kvm = vcpu->kvm;
-
- r = ioctl(fd, KVM_GET_SREGS, &sregs);
- if (r == -1) {
- perror("KVM_GET_SREGS");
- return;
- }
- r = ioctl(fd, KVM_GET_REGS, ®s);
- if (r == -1) {
- perror("KVM_GET_REGS");
- return;
- }
- rip = sregs.cs.base + regs.rip;
- back_offset = regs.rip;
- if (back_offset > 20)
- back_offset = 20;
- *code_str = 0;
- for (n = -back_offset; n < SHOW_CODE_LEN-back_offset; ++n) {
- if (n == 0)
- strcat(code_str, " -->");
- r = kvm->callbacks->mmio_read(kvm->opaque, rip + n, &code, 1);
- if (r < 0) {
- strcat(code_str, " xx");
- continue;
- }
- sprintf(code_str + strlen(code_str), " %02x", code);
- }
- fprintf(stderr, "code:%s\n", code_str);
-}
-
-
-/*
- * Returns available msr list. User must free.
- */
-struct kvm_msr_list *kvm_get_msr_list(kvm_context_t kvm)
-{
- struct kvm_msr_list sizer, *msrs;
- int r, e;
-
- sizer.nmsrs = 0;
- r = ioctl(kvm->fd, KVM_GET_MSR_INDEX_LIST, &sizer);
- if (r == -1 && errno != E2BIG)
- return NULL;
- msrs = malloc(sizeof *msrs + sizer.nmsrs * sizeof *msrs->indices);
- if (!msrs) {
- errno = ENOMEM;
- return NULL;
- }
- msrs->nmsrs = sizer.nmsrs;
- r = ioctl(kvm->fd, KVM_GET_MSR_INDEX_LIST, msrs);
- if (r == -1) {
- e = errno;
- free(msrs);
- errno = e;
- return NULL;
- }
- return msrs;
-}
-
-int kvm_get_msrs(kvm_vcpu_context_t vcpu, struct kvm_msr_entry *msrs, int n)
-{
- struct kvm_msrs *kmsrs = malloc(sizeof *kmsrs + n * sizeof *msrs);
- int r, e;
-
- if (!kmsrs) {
- errno = ENOMEM;
- return -1;
- }
- kmsrs->nmsrs = n;
- memcpy(kmsrs->entries, msrs, n * sizeof *msrs);
- r = ioctl(vcpu->fd, KVM_GET_MSRS, kmsrs);
- e = errno;
- memcpy(msrs, kmsrs->entries, n * sizeof *msrs);
- free(kmsrs);
- errno = e;
- return r;
-}
-
-int kvm_set_msrs(kvm_vcpu_context_t vcpu, struct kvm_msr_entry *msrs, int n)
-{
- struct kvm_msrs *kmsrs = malloc(sizeof *kmsrs + n * sizeof *msrs);
- int r, e;
-
- if (!kmsrs) {
- errno = ENOMEM;
- return -1;
- }
- kmsrs->nmsrs = n;
- memcpy(kmsrs->entries, msrs, n * sizeof *msrs);
- r = ioctl(vcpu->fd, KVM_SET_MSRS, kmsrs);
- e = errno;
- free(kmsrs);
- errno = e;
- return r;
-}
-
-static void print_seg(FILE *file, const char *name, struct kvm_segment *seg)
-{
- fprintf(stderr,
- "%s %04x (%08llx/%08x p %d dpl %d db %d s %d type %x l %d"
- " g %d avl %d)\n",
- name, seg->selector, seg->base, seg->limit, seg->present,
- seg->dpl, seg->db, seg->s, seg->type, seg->l, seg->g,
- seg->avl);
-}
-
-static void print_dt(FILE *file, const char *name, struct kvm_dtable *dt)
-{
- fprintf(stderr, "%s %llx/%x\n", name, dt->base, dt->limit);
-}
-
-void kvm_show_regs(kvm_vcpu_context_t vcpu)
-{
- int fd = vcpu->fd;
- struct kvm_regs regs;
- struct kvm_sregs sregs;
- int r;
-
- r = ioctl(fd, KVM_GET_REGS, ®s);
- if (r == -1) {
- perror("KVM_GET_REGS");
- return;
- }
- fprintf(stderr,
- "rax %016llx rbx %016llx rcx %016llx rdx %016llx\n"
- "rsi %016llx rdi %016llx rsp %016llx rbp %016llx\n"
- "r8 %016llx r9 %016llx r10 %016llx r11 %016llx\n"
- "r12 %016llx r13 %016llx r14 %016llx r15 %016llx\n"
- "rip %016llx rflags %08llx\n",
- regs.rax, regs.rbx, regs.rcx, regs.rdx,
- regs.rsi, regs.rdi, regs.rsp, regs.rbp,
- regs.r8, regs.r9, regs.r10, regs.r11,
- regs.r12, regs.r13, regs.r14, regs.r15,
- regs.rip, regs.rflags);
- r = ioctl(fd, KVM_GET_SREGS, &sregs);
- if (r == -1) {
- perror("KVM_GET_SREGS");
- return;
- }
- print_seg(stderr, "cs", &sregs.cs);
- print_seg(stderr, "ds", &sregs.ds);
- print_seg(stderr, "es", &sregs.es);
- print_seg(stderr, "ss", &sregs.ss);
- print_seg(stderr, "fs", &sregs.fs);
- print_seg(stderr, "gs", &sregs.gs);
- print_seg(stderr, "tr", &sregs.tr);
- print_seg(stderr, "ldt", &sregs.ldt);
- print_dt(stderr, "gdt", &sregs.gdt);
- print_dt(stderr, "idt", &sregs.idt);
- fprintf(stderr, "cr0 %llx cr2 %llx cr3 %llx cr4 %llx cr8 %llx"
- " efer %llx\n",
- sregs.cr0, sregs.cr2, sregs.cr3, sregs.cr4, sregs.cr8,
- sregs.efer);
-}
-
-uint64_t kvm_get_apic_base(kvm_vcpu_context_t vcpu)
-{
- return vcpu->run->apic_base;
-}
-
-void kvm_set_cr8(kvm_vcpu_context_t vcpu, uint64_t cr8)
-{
- vcpu->run->cr8 = cr8;
-}
-
-__u64 kvm_get_cr8(kvm_vcpu_context_t vcpu)
-{
- return vcpu->run->cr8;
-}
-
-int kvm_setup_cpuid(kvm_vcpu_context_t vcpu, int nent,
- struct kvm_cpuid_entry *entries)
-{
- struct kvm_cpuid *cpuid;
- int r;
-
- cpuid = malloc(sizeof(*cpuid) + nent * sizeof(*entries));
- if (!cpuid)
- return -ENOMEM;
-
- cpuid->nent = nent;
- memcpy(cpuid->entries, entries, nent * sizeof(*entries));
- r = ioctl(vcpu->fd, KVM_SET_CPUID, cpuid);
-
- free(cpuid);
- return r;
-}
-
-int kvm_setup_cpuid2(kvm_vcpu_context_t vcpu, int nent,
- struct kvm_cpuid_entry2 *entries)
-{
- struct kvm_cpuid2 *cpuid;
- int r;
-
- cpuid = malloc(sizeof(*cpuid) + nent * sizeof(*entries));
- if (!cpuid)
- return -ENOMEM;
-
- cpuid->nent = nent;
- memcpy(cpuid->entries, entries, nent * sizeof(*entries));
- r = ioctl(vcpu->fd, KVM_SET_CPUID2, cpuid);
- if (r == -1) {
- fprintf(stderr, "kvm_setup_cpuid2: %m\n");
- return -errno;
- }
- free(cpuid);
- return r;
-}
-
-int kvm_set_shadow_pages(kvm_context_t kvm, unsigned int nrshadow_pages)
-{
-#ifdef KVM_CAP_MMU_SHADOW_CACHE_CONTROL
- int r;
-
- r = ioctl(kvm->fd, KVM_CHECK_EXTENSION,
- KVM_CAP_MMU_SHADOW_CACHE_CONTROL);
- if (r > 0) {
- r = ioctl(kvm->vm_fd, KVM_SET_NR_MMU_PAGES, nrshadow_pages);
- if (r == -1) {
- fprintf(stderr, "kvm_set_shadow_pages: %m\n");
- return -errno;
- }
- return 0;
- }
-#endif
- return -1;
-}
-
-int kvm_get_shadow_pages(kvm_context_t kvm, unsigned int *nrshadow_pages)
-{
-#ifdef KVM_CAP_MMU_SHADOW_CACHE_CONTROL
- int r;
-
- r = ioctl(kvm->fd, KVM_CHECK_EXTENSION,
- KVM_CAP_MMU_SHADOW_CACHE_CONTROL);
- if (r > 0) {
- *nrshadow_pages = ioctl(kvm->vm_fd, KVM_GET_NR_MMU_PAGES);
- return 0;
- }
-#endif
- return -1;
-}
-
-#ifdef KVM_CAP_VAPIC
-
-static int tpr_access_reporting(kvm_vcpu_context_t vcpu, int enabled)
-{
- int r;
- struct kvm_tpr_access_ctl tac = {
- .enabled = enabled,
- };
-
- r = ioctl(vcpu->kvm->fd, KVM_CHECK_EXTENSION, KVM_CAP_VAPIC);
- if (r == -1 || r == 0)
- return -ENOSYS;
- r = ioctl(vcpu->fd, KVM_TPR_ACCESS_REPORTING, &tac);
- if (r == -1) {
- r = -errno;
- perror("KVM_TPR_ACCESS_REPORTING");
- return r;
- }
- return 0;
-}
-
-int kvm_enable_tpr_access_reporting(kvm_vcpu_context_t vcpu)
-{
- return tpr_access_reporting(vcpu, 1);
-}
-
-int kvm_disable_tpr_access_reporting(kvm_vcpu_context_t vcpu)
-{
- return tpr_access_reporting(vcpu, 0);
-}
-
-#endif
-
-#ifdef KVM_CAP_EXT_CPUID
-
-static struct kvm_cpuid2 *try_get_cpuid(kvm_context_t kvm, int max)
-{
- struct kvm_cpuid2 *cpuid;
- int r, size;
-
- size = sizeof(*cpuid) + max * sizeof(*cpuid->entries);
- cpuid = (struct kvm_cpuid2 *)malloc(size);
- cpuid->nent = max;
- r = ioctl(kvm->fd, KVM_GET_SUPPORTED_CPUID, cpuid);
- if (r == -1)
- r = -errno;
- else if (r == 0 && cpuid->nent >= max)
- r = -E2BIG;
- if (r < 0) {
- if (r == -E2BIG) {
- free(cpuid);
- return NULL;
- } else {
- fprintf(stderr, "KVM_GET_SUPPORTED_CPUID failed: %s\n",
- strerror(-r));
- exit(1);
- }
- }
- return cpuid;
-}
-
-#define R_EAX 0
-#define R_ECX 1
-#define R_EDX 2
-#define R_EBX 3
-#define R_ESP 4
-#define R_EBP 5
-#define R_ESI 6
-#define R_EDI 7
-
-uint32_t kvm_get_supported_cpuid(kvm_context_t kvm, uint32_t function, int reg)
-{
- struct kvm_cpuid2 *cpuid;
- int i, max;
- uint32_t ret = 0;
- uint32_t cpuid_1_edx;
-
- if (!kvm_check_extension(kvm, KVM_CAP_EXT_CPUID)) {
- return -1U;
- }
-
- max = 1;
- while ((cpuid = try_get_cpuid(kvm, max)) == NULL) {
- max *= 2;
- }
-
- for (i = 0; i < cpuid->nent; ++i) {
- if (cpuid->entries[i].function == function) {
- switch (reg) {
- case R_EAX:
- ret = cpuid->entries[i].eax;
- break;
- case R_EBX:
- ret = cpuid->entries[i].ebx;
- break;
- case R_ECX:
- ret = cpuid->entries[i].ecx;
- break;
- case R_EDX:
- ret = cpuid->entries[i].edx;
- if (function == 1) {
- /* kvm misreports the following features
- */
- ret |= 1 << 12; /* MTRR */
- ret |= 1 << 16; /* PAT */
- ret |= 1 << 7; /* MCE */
- ret |= 1 << 14; /* MCA */
- }
-
- /* On Intel, kvm returns cpuid according to
- * the Intel spec, so add missing bits
- * according to the AMD spec:
- */
- if (function == 0x80000001) {
- cpuid_1_edx = kvm_get_supported_cpuid(kvm, 1, R_EDX);
- ret |= cpuid_1_edx & 0xdfeff7ff;
- }
- break;
- }
- }
- }
-
- free(cpuid);
-
- return ret;
-}
-
-#else
-
-uint32_t kvm_get_supported_cpuid(kvm_context_t kvm, uint32_t function, int reg)
-{
- return -1U;
-}
-
-#endif
--
1.6.2.2
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 2/5] qemu-kvm.c memory cleanup
2009-06-18 19:37 ` [PATCH 1/5] get rid of target-i386/libkvm.c Glauber Costa
@ 2009-06-18 19:37 ` Glauber Costa
2009-06-18 19:37 ` [PATCH 3/5] cleanup mmio coalescing functions Glauber Costa
0 siblings, 1 reply; 8+ messages in thread
From: Glauber Costa @ 2009-06-18 19:37 UTC (permalink / raw)
To: kvm; +Cc: avi
Now that libkvm is merged into this file, there is a lot of things we
don't need.
kvm_create_phys_mem() is only used by user/ files, and so can be
removed from this implementation.
kvm_cpu_register_physical_memory() morphs into kvm_set_phys_mem(),
and uses qemu types.
Signed-off-by: Glauber Costa <glommer@redhat.com>
---
qemu-kvm.c | 70 +----------------------------------------------------------
qemu-kvm.h | 16 +------------
2 files changed, 4 insertions(+), 82 deletions(-)
diff --git a/qemu-kvm.c b/qemu-kvm.c
index a2131b7..d061e0a 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -534,52 +534,6 @@ int kvm_create(kvm_context_t kvm, unsigned long phys_mem_bytes, void **vm_mem)
}
-void *kvm_create_phys_mem(kvm_context_t kvm, unsigned long phys_start,
- unsigned long len, int log, int writable)
-{
- int r;
- int prot = PROT_READ;
- void *ptr;
- struct kvm_userspace_memory_region memory = {
- .memory_size = len,
- .guest_phys_addr = phys_start,
- .flags = log ? KVM_MEM_LOG_DIRTY_PAGES : 0,
- };
-
- if (writable)
- prot |= PROT_WRITE;
-
-#if !defined(__s390__)
- ptr = mmap(NULL, len, prot, MAP_ANONYMOUS | MAP_SHARED, -1, 0);
-#else
- ptr = mmap(LIBKVM_S390_ORIGIN, len, prot | PROT_EXEC,
- MAP_FIXED | MAP_SHARED | MAP_ANONYMOUS, -1, 0);
-#endif
- if (ptr == MAP_FAILED) {
- fprintf(stderr, "%s: %s", __func__, strerror(errno));
- return 0;
- }
-
- memset(ptr, 0, len);
-
- memory.userspace_addr = (unsigned long)ptr;
- memory.slot = get_free_slot(kvm);
- DPRINTF("slot %d start %llx len %llx flags %x\n",
- memory.slot,
- memory.guest_phys_addr,
- memory.memory_size,
- memory.flags);
- r = ioctl(kvm->vm_fd, KVM_SET_USER_MEMORY_REGION, &memory);
- if (r == -1) {
- fprintf(stderr, "%s: %s", __func__, strerror(errno));
- return 0;
- }
- register_slot(memory.slot, memory.guest_phys_addr, memory.memory_size,
- memory.userspace_addr, memory.flags);
-
- return ptr;
-}
-
int kvm_register_phys_mem(kvm_context_t kvm,
unsigned long phys_start, void *userspace_addr,
unsigned long len, int log)
@@ -2427,9 +2381,8 @@ static void drop_mapping(target_phys_addr_t start_addr)
}
#endif
-void kvm_cpu_register_physical_memory(target_phys_addr_t start_addr,
- unsigned long size,
- unsigned long phys_offset)
+void kvm_set_phys_mem(target_phys_addr_t start_addr, ram_addr_t size,
+ ram_addr_t phys_offset)
{
int r = 0;
unsigned long area_flags;
@@ -2506,13 +2459,6 @@ void kvm_cpu_register_physical_memory(target_phys_addr_t start_addr,
return;
}
-void kvm_cpu_unregister_physical_memory(target_phys_addr_t start_addr,
- target_phys_addr_t size,
- unsigned long phys_offset)
-{
- kvm_unregister_memory_area(kvm_context, start_addr, size);
-}
-
int kvm_setup_guest_memory(void *area, unsigned long size)
{
int ret = 0;
@@ -2834,18 +2780,6 @@ int qemu_kvm_get_dirty_pages(unsigned long phys_addr, void *buf)
return kvm_get_dirty_pages(kvm_context, phys_addr, buf);
}
-void *kvm_cpu_create_phys_mem(target_phys_addr_t start_addr,
- unsigned long size, int log, int writable)
-{
- return kvm_create_phys_mem(kvm_context, start_addr, size, log, writable);
-}
-
-void kvm_cpu_destroy_phys_mem(target_phys_addr_t start_addr,
- unsigned long size)
-{
- kvm_destroy_phys_mem(kvm_context, start_addr, size);
-}
-
void kvm_mutex_unlock(void)
{
assert(!cpu_single_env);
diff --git a/qemu-kvm.h b/qemu-kvm.h
index 68a5b40..c51566c 100644
--- a/qemu-kvm.h
+++ b/qemu-kvm.h
@@ -46,12 +46,8 @@ void qemu_kvm_cpuid_on_env(CPUState *env);
void kvm_inject_interrupt(CPUState *env, int mask);
void kvm_update_after_sipi(CPUState *env);
void kvm_update_interrupt_request(CPUState *env);
-void kvm_cpu_register_physical_memory(target_phys_addr_t start_addr,
- unsigned long size,
- unsigned long phys_offset);
-void kvm_cpu_unregister_physical_memory(target_phys_addr_t start_addr,
- target_phys_addr_t size,
- unsigned long phys_offset);
+void kvm_set_phys_mem(target_phys_addr_t start_addr, ram_addr_t size,
+ ram_addr_t phys_offset);
void *kvm_cpu_create_phys_mem(target_phys_addr_t start_addr,
unsigned long size, int log, int writable);
@@ -195,14 +191,6 @@ static inline void kvm_sleep_end(void)
kvm_mutex_lock();
}
-static inline void kvm_set_phys_mem(target_phys_addr_t start_addr,
- ram_addr_t size,
- ram_addr_t phys_offset)
-{
- kvm_cpu_register_physical_memory(start_addr, size, phys_offset);
-}
-
-
int kvm_physical_sync_dirty_bitmap(target_phys_addr_t start_addr, target_phys_addr_t end_addr);
int kvm_log_start(target_phys_addr_t phys_addr, target_phys_addr_t len);
--
1.6.2.2
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 3/5] cleanup mmio coalescing functions
2009-06-18 19:37 ` [PATCH 2/5] qemu-kvm.c memory cleanup Glauber Costa
@ 2009-06-18 19:37 ` Glauber Costa
2009-06-18 19:37 ` [PATCH 4/5] remove callbacks structure Glauber Costa
0 siblings, 1 reply; 8+ messages in thread
From: Glauber Costa @ 2009-06-18 19:37 UTC (permalink / raw)
To: kvm; +Cc: avi
remove wrappers that existed only due to qemu/libkvm separation.
Use qemu types for function definitions.
Signed-off-by: Glauber Costa <glommer@redhat.com>
---
qemu-kvm.c | 27 ++++-----------------------
qemu-kvm.h | 5 -----
2 files changed, 4 insertions(+), 28 deletions(-)
diff --git a/qemu-kvm.c b/qemu-kvm.c
index d061e0a..609f992 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -1099,9 +1099,10 @@ int kvm_init_coalesced_mmio(kvm_context_t kvm)
return r;
}
-int kvm_register_coalesced_mmio(kvm_context_t kvm, uint64_t addr, uint32_t size)
+int kvm_coalesce_mmio_region(target_phys_addr_t addr, ram_addr_t size)
{
#ifdef KVM_CAP_COALESCED_MMIO
+ kvm_context_t kvm = kvm_context;
struct kvm_coalesced_mmio_zone zone;
int r;
@@ -1121,9 +1122,10 @@ int kvm_register_coalesced_mmio(kvm_context_t kvm, uint64_t addr, uint32_t size)
return -ENOSYS;
}
-int kvm_unregister_coalesced_mmio(kvm_context_t kvm, uint64_t addr, uint32_t size)
+int kvm_uncoalesce_mmio_region(target_phys_addr_t addr, ram_addr_t size)
{
#ifdef KVM_CAP_COALESCED_MMIO
+ kvm_context_t kvm = kvm_context;
struct kvm_coalesced_mmio_zone zone;
int r;
@@ -2792,27 +2794,6 @@ void kvm_mutex_lock(void)
cpu_single_env = NULL;
}
-int qemu_kvm_register_coalesced_mmio(target_phys_addr_t addr, unsigned int size)
-{
- return kvm_register_coalesced_mmio(kvm_context, addr, size);
-}
-
-int qemu_kvm_unregister_coalesced_mmio(target_phys_addr_t addr,
- unsigned int size)
-{
- return kvm_unregister_coalesced_mmio(kvm_context, addr, size);
-}
-
-int kvm_coalesce_mmio_region(target_phys_addr_t start, ram_addr_t size)
-{
- return kvm_register_coalesced_mmio(kvm_context, start, size);
-}
-
-int kvm_uncoalesce_mmio_region(target_phys_addr_t start, ram_addr_t size)
-{
- return kvm_unregister_coalesced_mmio(kvm_context, start, size);
-}
-
#ifdef USE_KVM_DEVICE_ASSIGNMENT
void kvm_add_ioperm_data(struct ioperm_data *data)
{
diff --git a/qemu-kvm.h b/qemu-kvm.h
index c51566c..982e448 100644
--- a/qemu-kvm.h
+++ b/qemu-kvm.h
@@ -113,11 +113,6 @@ void kvm_tpr_access_report(CPUState *env, uint64_t rip, int is_write);
void kvm_tpr_vcpu_start(CPUState *env);
int qemu_kvm_get_dirty_pages(unsigned long phys_addr, void *buf);
-int qemu_kvm_register_coalesced_mmio(target_phys_addr_t addr,
- unsigned int size);
-int qemu_kvm_unregister_coalesced_mmio(target_phys_addr_t addr,
- unsigned int size);
-
int kvm_coalesce_mmio_region(target_phys_addr_t start, ram_addr_t size);
int kvm_uncoalesce_mmio_region(target_phys_addr_t start, ram_addr_t size);
--
1.6.2.2
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 4/5] remove callbacks structure
2009-06-18 19:37 ` [PATCH 3/5] cleanup mmio coalescing functions Glauber Costa
@ 2009-06-18 19:37 ` Glauber Costa
2009-06-18 19:37 ` [PATCH 5/5] remove wrappers around ex-libkvm functions Glauber Costa
0 siblings, 1 reply; 8+ messages in thread
From: Glauber Costa @ 2009-06-18 19:37 UTC (permalink / raw)
To: kvm; +Cc: avi
The purpose of that was only to allow the user of libkvm
to register functions pointers that corresponded to possible
actions. We don't need that anymore.
Signed-off-by: Glauber Costa <glommer@redhat.com>
---
libkvm-all.h | 4 +-
qemu-kvm.c | 370 +++++++++++++++++++++++++++-------------------------------
2 files changed, 171 insertions(+), 203 deletions(-)
diff --git a/libkvm-all.h b/libkvm-all.h
index 47855be..c538f9f 100644
--- a/libkvm-all.h
+++ b/libkvm-all.h
@@ -173,12 +173,10 @@ struct kvm_callbacks {
* holds information about the KVM instance that gets created by this call.\n
* This should always be your first call to KVM.
*
- * \param callbacks Pointer to a valid kvm_callbacks structure
* \param opaque Not used
* \return NULL on failure
*/
-kvm_context_t kvm_init(struct kvm_callbacks *callbacks,
- void *opaque);
+kvm_context_t kvm_init(void *opaque);
/*!
* \brief Cleanup the KVM context
diff --git a/qemu-kvm.c b/qemu-kvm.c
index 609f992..a8ccd19 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -27,6 +27,7 @@
#include <sys/syscall.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
+#include <signal.h>
#define false 0
#define true 1
@@ -79,6 +80,129 @@ static LIST_HEAD(, ioperm_data) ioperm_head;
int kvm_abi = EXPECTED_KVM_API_VERSION;
int kvm_page_size;
+#ifdef KVM_CAP_SET_GUEST_DEBUG
+static int kvm_debug(void *opaque, void *data,
+ struct kvm_debug_exit_arch *arch_info)
+{
+ int handle = kvm_arch_debug(arch_info);
+ CPUState *env = data;
+
+ if (handle) {
+ kvm_debug_cpu_requested = env;
+ env->kvm_cpu_state.stopped = 1;
+ }
+ return handle;
+}
+#endif
+
+static int kvm_inb(void *opaque, uint16_t addr, uint8_t *data)
+{
+ *data = cpu_inb(0, addr);
+ return 0;
+}
+
+static int kvm_inw(void *opaque, uint16_t addr, uint16_t *data)
+{
+ *data = cpu_inw(0, addr);
+ return 0;
+}
+
+static int kvm_inl(void *opaque, uint16_t addr, uint32_t *data)
+{
+ *data = cpu_inl(0, addr);
+ return 0;
+}
+
+#define PM_IO_BASE 0xb000
+
+static int kvm_outb(void *opaque, uint16_t addr, uint8_t data)
+{
+ if (addr == 0xb2) {
+ switch (data) {
+ case 0: {
+ cpu_outb(0, 0xb3, 0);
+ break;
+ }
+ case 0xf0: {
+ unsigned x;
+
+ /* enable acpi */
+ x = cpu_inw(0, PM_IO_BASE + 4);
+ x &= ~1;
+ cpu_outw(0, PM_IO_BASE + 4, x);
+ break;
+ }
+ case 0xf1: {
+ unsigned x;
+
+ /* enable acpi */
+ x = cpu_inw(0, PM_IO_BASE + 4);
+ x |= 1;
+ cpu_outw(0, PM_IO_BASE + 4, x);
+ break;
+ }
+ default:
+ break;
+ }
+ return 0;
+ }
+ cpu_outb(0, addr, data);
+ return 0;
+}
+
+static int kvm_outw(void *opaque, uint16_t addr, uint16_t data)
+{
+ cpu_outw(0, addr, data);
+ return 0;
+}
+
+static int kvm_outl(void *opaque, uint16_t addr, uint32_t data)
+{
+ cpu_outl(0, addr, data);
+ return 0;
+}
+
+static int kvm_mmio_read(void *opaque, uint64_t addr, uint8_t *data, int len)
+{
+ cpu_physical_memory_rw(addr, data, len, 0);
+ return 0;
+}
+
+static int kvm_mmio_write(void *opaque, uint64_t addr, uint8_t *data, int len)
+{
+ cpu_physical_memory_rw(addr, data, len, 1);
+ return 0;
+}
+
+static int kvm_io_window(void *opaque)
+{
+ return 1;
+}
+
+static int kvm_halt(void *opaque, kvm_vcpu_context_t vcpu)
+{
+ return kvm_arch_halt(opaque, vcpu);
+}
+
+static int kvm_shutdown(void *opaque, void *data)
+{
+ CPUState *env = (CPUState *)data;
+
+ /* stop the current vcpu from going back to guest mode */
+ env->kvm_cpu_state.stopped = 1;
+
+ qemu_system_reset_request();
+ return 1;
+}
+
+static int handle_unhandled(kvm_context_t kvm, kvm_vcpu_context_t vcpu,
+ uint64_t reason)
+{
+ fprintf(stderr, "kvm: unhandled exit %"PRIx64"\n", reason);
+ return -EINVAL;
+}
+
+
static inline void set_gsi(kvm_context_t kvm, unsigned int gsi)
{
uint32_t *bitmap = kvm->used_gsi_bitmap;
@@ -314,8 +438,7 @@ int kvm_dirty_pages_log_reset(kvm_context_t kvm)
}
-kvm_context_t kvm_init(struct kvm_callbacks *callbacks,
- void *opaque)
+kvm_context_t kvm_init(void *opaque)
{
int fd;
kvm_context_t kvm;
@@ -351,7 +474,6 @@ kvm_context_t kvm_init(struct kvm_callbacks *callbacks,
memset(kvm, 0, sizeof(*kvm));
kvm->fd = fd;
kvm->vm_fd = -1;
- kvm->callbacks = callbacks;
kvm->opaque = opaque;
kvm->dirty_pages_log_all = 0;
kvm->no_irqchip_creation = 0;
@@ -736,13 +858,13 @@ static int handle_io(kvm_vcpu_context_t vcpu)
case KVM_EXIT_IO_IN:
switch (run->io.size) {
case 1:
- r = kvm->callbacks->inb(kvm->opaque, addr, p);
+ r = kvm_inb(kvm->opaque, addr, p);
break;
case 2:
- r = kvm->callbacks->inw(kvm->opaque, addr, p);
+ r = kvm_inw(kvm->opaque, addr, p);
break;
case 4:
- r = kvm->callbacks->inl(kvm->opaque, addr, p);
+ r = kvm_inl(kvm->opaque, addr, p);
break;
default:
fprintf(stderr, "bad I/O size %d\n", run->io.size);
@@ -752,15 +874,15 @@ static int handle_io(kvm_vcpu_context_t vcpu)
case KVM_EXIT_IO_OUT:
switch (run->io.size) {
case 1:
- r = kvm->callbacks->outb(kvm->opaque, addr,
+ r = kvm_outb(kvm->opaque, addr,
*(uint8_t *)p);
break;
case 2:
- r = kvm->callbacks->outw(kvm->opaque, addr,
+ r = kvm_outw(kvm->opaque, addr,
*(uint16_t *)p);
break;
case 4:
- r = kvm->callbacks->outl(kvm->opaque, addr,
+ r = kvm_outl(kvm->opaque, addr,
*(uint32_t *)p);
break;
default:
@@ -785,7 +907,7 @@ int handle_debug(kvm_vcpu_context_t vcpu, void *env)
struct kvm_run *run = vcpu->run;
kvm_context_t kvm = vcpu->kvm;
- return kvm->callbacks->debug(kvm->opaque, env, &run->debug.arch);
+ return kvm_debug(kvm->opaque, env, &run->debug.arch);
#else
return 0;
#endif
@@ -855,48 +977,71 @@ static int handle_mmio(kvm_vcpu_context_t vcpu)
return 0;
if (kvm_run->mmio.is_write)
- return kvm->callbacks->mmio_write(kvm->opaque, addr, data,
+ return kvm_mmio_write(kvm->opaque, addr, data,
kvm_run->mmio.len);
else
- return kvm->callbacks->mmio_read(kvm->opaque, addr, data,
+ return kvm_mmio_read(kvm->opaque, addr, data,
kvm_run->mmio.len);
}
int handle_io_window(kvm_context_t kvm)
{
- return kvm->callbacks->io_window(kvm->opaque);
+ return kvm_io_window(kvm->opaque);
}
int handle_halt(kvm_vcpu_context_t vcpu)
{
- return vcpu->kvm->callbacks->halt(vcpu->kvm->opaque, vcpu);
+ return kvm_halt(vcpu->kvm->opaque, vcpu);
}
int handle_shutdown(kvm_context_t kvm, void *env)
{
- return kvm->callbacks->shutdown(kvm->opaque, env);
+ return kvm_shutdown(kvm->opaque, env);
+}
+
+static int kvm_try_push_interrupts(void *opaque)
+{
+ return kvm_arch_try_push_interrupts(opaque);
+}
+
+static void kvm_post_run(void *opaque, void *data)
+{
+ CPUState *env = (CPUState *)data;
+
+ pthread_mutex_lock(&qemu_mutex);
+ kvm_arch_post_kvm_run(opaque, env);
+}
+
+static int kvm_pre_run(void *opaque, void *data)
+{
+ CPUState *env = (CPUState *)data;
+
+ kvm_arch_pre_kvm_run(opaque, env);
+
+ pthread_mutex_unlock(&qemu_mutex);
+ return 0;
}
int try_push_interrupts(kvm_context_t kvm)
{
- return kvm->callbacks->try_push_interrupts(kvm->opaque);
+ return kvm_try_push_interrupts(kvm->opaque);
}
static inline void push_nmi(kvm_context_t kvm)
{
#ifdef KVM_CAP_USER_NMI
- kvm->callbacks->push_nmi(kvm->opaque);
+ kvm_arch_push_nmi(kvm->opaque);
#endif /* KVM_CAP_USER_NMI */
}
void post_kvm_run(kvm_context_t kvm, void *env)
{
- kvm->callbacks->post_kvm_run(kvm->opaque, env);
+ kvm_post_run(kvm->opaque, env);
}
int pre_kvm_run(kvm_context_t kvm, void *env)
{
- return kvm->callbacks->pre_kvm_run(kvm->opaque, env);
+ return kvm_pre_run(kvm->opaque, env);
}
int kvm_get_interrupt_flag(kvm_vcpu_context_t vcpu)
@@ -941,7 +1086,7 @@ again:
struct kvm_coalesced_mmio_ring *ring = (void *)run +
kvm->coalesced_mmio * PAGE_SIZE;
while (ring->first != ring->last) {
- kvm->callbacks->mmio_write(kvm->opaque,
+ kvm_mmio_write(kvm->opaque,
ring->coalesced_mmio[ring->first].phys_addr,
&ring->coalesced_mmio[ring->first].data[0],
ring->coalesced_mmio[ring->first].len);
@@ -961,11 +1106,11 @@ again:
if (1) {
switch (run->exit_reason) {
case KVM_EXIT_UNKNOWN:
- r = kvm->callbacks->unhandled(kvm, vcpu,
+ r = handle_unhandled(kvm, vcpu,
run->hw.hardware_exit_reason);
break;
case KVM_EXIT_FAIL_ENTRY:
- r = kvm->callbacks->unhandled(kvm, vcpu,
+ r = handle_unhandled(kvm, vcpu,
run->fail_entry.hardware_entry_failure_reason);
break;
case KVM_EXIT_EXCEPTION:
@@ -995,11 +1140,11 @@ again:
break;
#if defined(__s390__)
case KVM_EXIT_S390_SIEIC:
- r = kvm->callbacks->s390_handle_intercept(kvm, vcpu,
+ r = kvm_s390_handle_intercept(kvm, vcpu,
run);
break;
case KVM_EXIT_S390_RESET:
- r = kvm->callbacks->s390_handle_reset(kvm, vcpu, run);
+ r = kvm_s390_handle_reset(kvm, vcpu, run);
break;
#endif
default:
@@ -1611,31 +1756,6 @@ void kvm_apic_init(CPUState *env)
kvm_update_interrupt_request(env);
}
-#include <signal.h>
-
-static int kvm_try_push_interrupts(void *opaque)
-{
- return kvm_arch_try_push_interrupts(opaque);
-}
-
-static void kvm_post_run(void *opaque, void *data)
-{
- CPUState *env = (CPUState *)data;
-
- pthread_mutex_lock(&qemu_mutex);
- kvm_arch_post_kvm_run(opaque, env);
-}
-
-static int kvm_pre_run(void *opaque, void *data)
-{
- CPUState *env = (CPUState *)data;
-
- kvm_arch_pre_kvm_run(opaque, env);
-
- pthread_mutex_unlock(&qemu_mutex);
- return 0;
-}
-
static void kvm_do_load_registers(void *_env)
{
CPUState *env = _env;
@@ -2110,160 +2230,10 @@ int kvm_main_loop(void)
return 0;
}
-#ifdef KVM_CAP_SET_GUEST_DEBUG
-static int kvm_debug(void *opaque, void *data,
- struct kvm_debug_exit_arch *arch_info)
-{
- int handle = kvm_arch_debug(arch_info);
- CPUState *env = data;
-
- if (handle) {
- kvm_debug_cpu_requested = env;
- env->kvm_cpu_state.stopped = 1;
- }
- return handle;
-}
-#endif
-
-static int kvm_inb(void *opaque, uint16_t addr, uint8_t *data)
-{
- *data = cpu_inb(0, addr);
- return 0;
-}
-
-static int kvm_inw(void *opaque, uint16_t addr, uint16_t *data)
-{
- *data = cpu_inw(0, addr);
- return 0;
-}
-
-static int kvm_inl(void *opaque, uint16_t addr, uint32_t *data)
-{
- *data = cpu_inl(0, addr);
- return 0;
-}
-
-#define PM_IO_BASE 0xb000
-
-static int kvm_outb(void *opaque, uint16_t addr, uint8_t data)
-{
- if (addr == 0xb2) {
- switch (data) {
- case 0: {
- cpu_outb(0, 0xb3, 0);
- break;
- }
- case 0xf0: {
- unsigned x;
-
- /* enable acpi */
- x = cpu_inw(0, PM_IO_BASE + 4);
- x &= ~1;
- cpu_outw(0, PM_IO_BASE + 4, x);
- break;
- }
- case 0xf1: {
- unsigned x;
-
- /* enable acpi */
- x = cpu_inw(0, PM_IO_BASE + 4);
- x |= 1;
- cpu_outw(0, PM_IO_BASE + 4, x);
- break;
- }
- default:
- break;
- }
- return 0;
- }
- cpu_outb(0, addr, data);
- return 0;
-}
-
-static int kvm_outw(void *opaque, uint16_t addr, uint16_t data)
-{
- cpu_outw(0, addr, data);
- return 0;
-}
-
-static int kvm_outl(void *opaque, uint16_t addr, uint32_t data)
-{
- cpu_outl(0, addr, data);
- return 0;
-}
-
-static int kvm_mmio_read(void *opaque, uint64_t addr, uint8_t *data, int len)
-{
- cpu_physical_memory_rw(addr, data, len, 0);
- return 0;
-}
-
-static int kvm_mmio_write(void *opaque, uint64_t addr, uint8_t *data, int len)
-{
- cpu_physical_memory_rw(addr, data, len, 1);
- return 0;
-}
-
-static int kvm_io_window(void *opaque)
-{
- return 1;
-}
-
-
-static int kvm_halt(void *opaque, kvm_vcpu_context_t vcpu)
-{
- return kvm_arch_halt(opaque, vcpu);
-}
-
-static int kvm_shutdown(void *opaque, void *data)
-{
- CPUState *env = (CPUState *)data;
-
- /* stop the current vcpu from going back to guest mode */
- env->kvm_cpu_state.stopped = 1;
-
- qemu_system_reset_request();
- return 1;
-}
-
-static int handle_unhandled(kvm_context_t kvm, kvm_vcpu_context_t vcpu,
- uint64_t reason)
-{
- fprintf(stderr, "kvm: unhandled exit %"PRIx64"\n", reason);
- return -EINVAL;
-}
-
-static struct kvm_callbacks qemu_kvm_ops = {
-#ifdef KVM_CAP_SET_GUEST_DEBUG
- .debug = kvm_debug,
-#endif
- .inb = kvm_inb,
- .inw = kvm_inw,
- .inl = kvm_inl,
- .outb = kvm_outb,
- .outw = kvm_outw,
- .outl = kvm_outl,
- .mmio_read = kvm_mmio_read,
- .mmio_write = kvm_mmio_write,
- .halt = kvm_halt,
- .shutdown = kvm_shutdown,
- .io_window = kvm_io_window,
- .try_push_interrupts = kvm_try_push_interrupts,
-#ifdef KVM_CAP_USER_NMI
- .push_nmi = kvm_arch_push_nmi,
-#endif
- .post_kvm_run = kvm_post_run,
- .pre_kvm_run = kvm_pre_run,
-#ifdef TARGET_I386
- .tpr_access = handle_tpr_access,
-#endif
- .unhandled = handle_unhandled,
-};
-
int kvm_qemu_init()
{
/* Try to initialize kvm */
- kvm_context = kvm_init(&qemu_kvm_ops, cpu_single_env);
+ kvm_context = kvm_init(cpu_single_env);
if (!kvm_context) {
return -1;
}
--
1.6.2.2
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 5/5] remove wrappers around ex-libkvm functions
2009-06-18 19:37 ` [PATCH 4/5] remove callbacks structure Glauber Costa
@ 2009-06-18 19:37 ` Glauber Costa
0 siblings, 0 replies; 8+ messages in thread
From: Glauber Costa @ 2009-06-18 19:37 UTC (permalink / raw)
To: kvm; +Cc: avi
Some functions in qemu existed only to call libkvm counterparts.
Merge some of them
Signed-off-by: Glauber Costa <glommer@redhat.com>
---
libkvm-all.h | 6 ++--
qemu-kvm.c | 75 ++++++++++++++--------------------------------------------
2 files changed, 21 insertions(+), 60 deletions(-)
diff --git a/libkvm-all.h b/libkvm-all.h
index c538f9f..e2d1d4f 100644
--- a/libkvm-all.h
+++ b/libkvm-all.h
@@ -96,9 +96,9 @@ int kvm_arch_run(kvm_vcpu_context_t vcpu);
void kvm_show_code(kvm_vcpu_context_t vcpu);
int handle_halt(kvm_vcpu_context_t vcpu);
-int handle_shutdown(kvm_context_t kvm, void *env);
-void post_kvm_run(kvm_context_t kvm, void *env);
-int pre_kvm_run(kvm_context_t kvm, void *env);
+int handle_shutdown(kvm_context_t kvm, CPUState *env);
+void post_kvm_run(kvm_context_t kvm, CPUState *env);
+int pre_kvm_run(kvm_context_t kvm, CPUState *env);
int handle_io_window(kvm_context_t kvm);
int handle_debug(kvm_vcpu_context_t vcpu, void *env);
int try_push_interrupts(kvm_context_t kvm);
diff --git a/qemu-kvm.c b/qemu-kvm.c
index a8ccd19..e9805c4 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -174,27 +174,6 @@ static int kvm_mmio_write(void *opaque, uint64_t addr, uint8_t *data, int len)
return 0;
}
-static int kvm_io_window(void *opaque)
-{
- return 1;
-}
-
-static int kvm_halt(void *opaque, kvm_vcpu_context_t vcpu)
-{
- return kvm_arch_halt(opaque, vcpu);
-}
-
-static int kvm_shutdown(void *opaque, void *data)
-{
- CPUState *env = (CPUState *)data;
-
- /* stop the current vcpu from going back to guest mode */
- env->kvm_cpu_state.stopped = 1;
-
- qemu_system_reset_request();
- return 1;
-}
-
static int handle_unhandled(kvm_context_t kvm, kvm_vcpu_context_t vcpu,
uint64_t reason)
{
@@ -986,45 +965,21 @@ static int handle_mmio(kvm_vcpu_context_t vcpu)
int handle_io_window(kvm_context_t kvm)
{
- return kvm_io_window(kvm->opaque);
+ return 1;
}
int handle_halt(kvm_vcpu_context_t vcpu)
{
- return kvm_halt(vcpu->kvm->opaque, vcpu);
+ return kvm_arch_halt(vcpu->kvm->opaque, vcpu);
}
-int handle_shutdown(kvm_context_t kvm, void *env)
+int handle_shutdown(kvm_context_t kvm, CPUState *env)
{
- return kvm_shutdown(kvm->opaque, env);
-}
-
-static int kvm_try_push_interrupts(void *opaque)
-{
- return kvm_arch_try_push_interrupts(opaque);
-}
-
-static void kvm_post_run(void *opaque, void *data)
-{
- CPUState *env = (CPUState *)data;
-
- pthread_mutex_lock(&qemu_mutex);
- kvm_arch_post_kvm_run(opaque, env);
-}
-
-static int kvm_pre_run(void *opaque, void *data)
-{
- CPUState *env = (CPUState *)data;
-
- kvm_arch_pre_kvm_run(opaque, env);
-
- pthread_mutex_unlock(&qemu_mutex);
- return 0;
-}
+ /* stop the current vcpu from going back to guest mode */
+ env->kvm_cpu_state.stopped = 1;
-int try_push_interrupts(kvm_context_t kvm)
-{
- return kvm_try_push_interrupts(kvm->opaque);
+ qemu_system_reset_request();
+ return 1;
}
static inline void push_nmi(kvm_context_t kvm)
@@ -1034,14 +989,20 @@ static inline void push_nmi(kvm_context_t kvm)
#endif /* KVM_CAP_USER_NMI */
}
-void post_kvm_run(kvm_context_t kvm, void *env)
+void post_kvm_run(kvm_context_t kvm, CPUState *env)
{
- kvm_post_run(kvm->opaque, env);
+ pthread_mutex_lock(&qemu_mutex);
+ kvm_arch_post_kvm_run(kvm->opaque, env);
}
-int pre_kvm_run(kvm_context_t kvm, void *env)
+int pre_kvm_run(kvm_context_t kvm, CPUState *env)
{
- return kvm_pre_run(kvm->opaque, env);
+ kvm_arch_pre_kvm_run(kvm->opaque, env);
+
+ if (env->exit_request)
+ return 1;
+ pthread_mutex_unlock(&qemu_mutex);
+ return 0;
}
int kvm_get_interrupt_flag(kvm_vcpu_context_t vcpu)
@@ -1065,7 +1026,7 @@ again:
push_nmi(kvm);
#if !defined(__s390__)
if (!kvm->irqchip_in_kernel)
- run->request_interrupt_window = try_push_interrupts(kvm);
+ run->request_interrupt_window = kvm_arch_try_push_interrupts(env);
#endif
r = pre_kvm_run(kvm, env);
if (r)
--
1.6.2.2
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 0/5 v2] Further cleanups to qemu-kvm.c
2009-06-18 19:37 [PATCH 0/5 v2] Further cleanups to qemu-kvm.c Glauber Costa
2009-06-18 19:37 ` [PATCH 1/5] get rid of target-i386/libkvm.c Glauber Costa
@ 2009-06-21 10:01 ` Avi Kivity
2009-06-21 12:22 ` Avi Kivity
1 sibling, 1 reply; 8+ messages in thread
From: Avi Kivity @ 2009-06-21 10:01 UTC (permalink / raw)
To: Glauber Costa; +Cc: kvm
On 06/18/2009 10:37 PM, Glauber Costa wrote:
> Avi,
>
> This is the patch set that should be applied. It is comprised of
> 4 patches. It however, depends on "[PATCH 1/5] get rid of target-i386/libkvm.c",
> so I'm sending it again, since it does not seem to be already applied by you.
>
>
Applied all, thanks.
--
error compiling committee.c: too many arguments to function
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 0/5 v2] Further cleanups to qemu-kvm.c
2009-06-21 10:01 ` [PATCH 0/5 v2] Further cleanups to qemu-kvm.c Avi Kivity
@ 2009-06-21 12:22 ` Avi Kivity
0 siblings, 0 replies; 8+ messages in thread
From: Avi Kivity @ 2009-06-21 12:22 UTC (permalink / raw)
To: Glauber Costa; +Cc: kvm
On 06/21/2009 01:01 PM, Avi Kivity wrote:
> On 06/18/2009 10:37 PM, Glauber Costa wrote:
>> Avi,
>>
>> This is the patch set that should be applied. It is comprised of
>> 4 patches. It however, depends on "[PATCH 1/5] get rid of
>> target-i386/libkvm.c",
>> so I'm sending it again, since it does not seem to be already applied
>> by you.
>>
>
> Applied all, thanks.
>
Unapplied 2-5, segfaults:
(gdb) bt
#0 0x0000000000553fde in kvm_handle_tpr_access () at
/home/avi/qemu-kvm/qemu-kvm-x86.c:123
#1 kvm_arch_run (vcpu=0x1fa5400) at /home/avi/qemu-kvm/qemu-kvm-x86.c:160
#2 0x000000000052f67d in kvm_run (vcpu=0x1fa5400, env=0x1f90e90) at
/home/avi/qemu-kvm/qemu-kvm.c:1112
#3 0x000000000052fa56 in kvm_cpu_exec (env=0x1f58ca0) at
/home/avi/qemu-kvm/qemu-kvm.c:1777
#4 0x000000000052fe69 in kvm_main_loop_cpu () at
/home/avi/qemu-kvm/qemu-kvm.c:1986
#5 ap_main_loop (_env=<value optimized out>) at
/home/avi/qemu-kvm/qemu-kvm.c:2021
#6 0x00000000010c73da in start_thread () from /lib64/libpthread.so.0
#7 0x0000000007a9a2bd in clone () from /lib64/libc.so.6
--
error compiling committee.c: too many arguments to function
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2009-06-21 12:21 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-06-18 19:37 [PATCH 0/5 v2] Further cleanups to qemu-kvm.c Glauber Costa
2009-06-18 19:37 ` [PATCH 1/5] get rid of target-i386/libkvm.c Glauber Costa
2009-06-18 19:37 ` [PATCH 2/5] qemu-kvm.c memory cleanup Glauber Costa
2009-06-18 19:37 ` [PATCH 3/5] cleanup mmio coalescing functions Glauber Costa
2009-06-18 19:37 ` [PATCH 4/5] remove callbacks structure Glauber Costa
2009-06-18 19:37 ` [PATCH 5/5] remove wrappers around ex-libkvm functions Glauber Costa
2009-06-21 10:01 ` [PATCH 0/5 v2] Further cleanups to qemu-kvm.c Avi Kivity
2009-06-21 12:22 ` Avi Kivity
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox