From patchwork Wed Jul 29 17:49:18 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Glauber Costa X-Patchwork-Id: 38206 Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by demeter.kernel.org (8.14.2/8.14.2) with ESMTP id n6THnbPl032673 for ; Wed, 29 Jul 2009 17:49:38 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751621AbZG2Rtb (ORCPT ); Wed, 29 Jul 2009 13:49:31 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1751843AbZG2Rtb (ORCPT ); Wed, 29 Jul 2009 13:49:31 -0400 Received: from mx2.redhat.com ([66.187.237.31]:57769 "EHLO mx2.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751621AbZG2RtY (ORCPT ); Wed, 29 Jul 2009 13:49:24 -0400 Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n6THnPaa032765 for ; Wed, 29 Jul 2009 13:49:25 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id n6THnOgg027933; Wed, 29 Jul 2009 13:49:24 -0400 Received: from localhost.localdomain (virtlab1.virt.bos.redhat.com [10.16.72.21]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id n6THnJhs017691; Wed, 29 Jul 2009 13:49:23 -0400 From: Glauber Costa To: kvm@vger.kernel.org Cc: avi@redhat.com Subject: [PATCH 8/9] use kvm_vcpu_ioctl Date: Wed, 29 Jul 2009 13:49:18 -0400 Message-Id: <1248889759-25063-9-git-send-email-glommer@redhat.com> In-Reply-To: <1248889759-25063-8-git-send-email-glommer@redhat.com> References: <1248889759-25063-1-git-send-email-glommer@redhat.com> <1248889759-25063-2-git-send-email-glommer@redhat.com> <1248889759-25063-3-git-send-email-glommer@redhat.com> <1248889759-25063-4-git-send-email-glommer@redhat.com> <1248889759-25063-5-git-send-email-glommer@redhat.com> <1248889759-25063-6-git-send-email-glommer@redhat.com> <1248889759-25063-7-git-send-email-glommer@redhat.com> <1248889759-25063-8-git-send-email-glommer@redhat.com> X-Scanned-By: MIMEDefang 2.58 on 172.16.27.26 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Signed-off-by: Glauber Costa --- kvm-all.c | 2 +- qemu-kvm-x86.c | 66 +++++++++++++++---------------------------------------- qemu-kvm.c | 31 +++++++++++--------------- qemu-kvm.h | 2 + 4 files changed, 34 insertions(+), 67 deletions(-) diff --git a/kvm-all.c b/kvm-all.c index 5a4184b..203f1ab 100644 --- a/kvm-all.c +++ b/kvm-all.c @@ -848,7 +848,6 @@ int kvm_vm_ioctl(KVMState *s, int type, ...) return ret; } -#ifdef KVM_UPSTREAM int kvm_vcpu_ioctl(CPUState *env, int type, ...) { int ret; @@ -865,6 +864,7 @@ int kvm_vcpu_ioctl(CPUState *env, int type, ...) return ret; } +#ifdef KVM_UPSTREAM int kvm_has_sync_mmu(void) { diff --git a/qemu-kvm-x86.c b/qemu-kvm-x86.c index 14f1ee3..63f769a 100644 --- a/qemu-kvm-x86.c +++ b/qemu-kvm-x86.c @@ -174,18 +174,11 @@ static int kvm_handle_tpr_access(kvm_vcpu_context_t vcpu) 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->env->kvm_fd, KVM_SET_VAPIC_ADDR, &va); - if (r == -1) { - r = -errno; - perror("kvm_enable_vapic"); - return r; - } - return 0; + return kvm_vcpu_ioctl(vcpu->env, KVM_SET_VAPIC_ADDR, &va); } #endif @@ -283,28 +276,16 @@ int kvm_destroy_memory_alias(kvm_context_t kvm, uint64_t phys_start) int kvm_get_lapic(kvm_vcpu_context_t vcpu, struct kvm_lapic_state *s) { - int r; if (!kvm_irqchip_in_kernel()) return 0; - r = ioctl(vcpu->env->kvm_fd, KVM_GET_LAPIC, s); - if (r == -1) { - r = -errno; - perror("kvm_get_lapic"); - } - return r; + return kvm_vcpu_ioctl(vcpu->env, KVM_GET_LAPIC, s); } int kvm_set_lapic(kvm_vcpu_context_t vcpu, struct kvm_lapic_state *s) { - int r; if (!kvm_irqchip_in_kernel()) return 0; - r = ioctl(vcpu->env->kvm_fd, KVM_SET_LAPIC, s); - if (r == -1) { - r = -errno; - perror("kvm_set_lapic"); - } - return r; + return kvm_vcpu_ioctl(vcpu->env, KVM_SET_LAPIC, s); } #endif @@ -356,7 +337,7 @@ int kvm_has_pit_state2(kvm_context_t kvm) void kvm_show_code(kvm_vcpu_context_t vcpu) { #define SHOW_CODE_LEN 50 - int fd = vcpu->env->kvm_fd; +// int fd = vcpu->env->kvm_fd; struct kvm_regs regs; struct kvm_sregs sregs; int r, n; @@ -365,13 +346,13 @@ void kvm_show_code(kvm_vcpu_context_t vcpu) char code_str[SHOW_CODE_LEN * 3 + 1]; unsigned long rip; - r = ioctl(fd, KVM_GET_SREGS, &sregs); - if (r == -1) { + r = kvm_vcpu_ioctl(vcpu->env, KVM_GET_SREGS, &sregs); + if (r < 0) { perror("KVM_GET_SREGS"); return; } - r = ioctl(fd, KVM_GET_REGS, ®s); - if (r == -1) { + r = kvm_vcpu_ioctl(vcpu->env, KVM_GET_REGS, ®s); + if (r < 0) { perror("KVM_GET_REGS"); return; } @@ -420,29 +401,25 @@ struct kvm_msr_list *kvm_get_msr_list(kvm_context_t kvm) int kvm_get_msrs(kvm_vcpu_context_t vcpu, struct kvm_msr_entry *msrs, int n) { struct kvm_msrs *kmsrs = qemu_malloc(sizeof *kmsrs + n * sizeof *msrs); - int r, e; + int r; kmsrs->nmsrs = n; memcpy(kmsrs->entries, msrs, n * sizeof *msrs); - r = ioctl(vcpu->env->kvm_fd, KVM_GET_MSRS, kmsrs); - e = errno; + r = kvm_vcpu_ioctl(vcpu->env, KVM_GET_MSRS, kmsrs); 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 = qemu_malloc(sizeof *kmsrs + n * sizeof *msrs); - int r, e; + int r; kmsrs->nmsrs = n; memcpy(kmsrs->entries, msrs, n * sizeof *msrs); - r = ioctl(vcpu->env->kvm_fd, KVM_SET_MSRS, kmsrs); - e = errno; + r = kvm_vcpu_ioctl(vcpu->env, KVM_SET_MSRS, kmsrs); free(kmsrs); - errno = e; return r; } @@ -464,7 +441,7 @@ int kvm_get_mce_cap_supported(kvm_context_t kvm, uint64_t *mce_cap, int kvm_setup_mce(kvm_vcpu_context_t vcpu, uint64_t *mcg_cap) { #ifdef KVM_CAP_MCE - return ioctl(vcpu->env->kvm_fd, KVM_X86_SETUP_MCE, mcg_cap); + return kvm_vcpu_ioctl(vcpu->env, KVM_X86_SETUP_MCE, mcg_cap); #else return -ENOSYS; #endif @@ -473,7 +450,7 @@ int kvm_setup_mce(kvm_vcpu_context_t vcpu, uint64_t *mcg_cap) int kvm_set_mce(kvm_vcpu_context_t vcpu, struct kvm_x86_mce *m) { #ifdef KVM_CAP_MCE - return ioctl(vcpu->env->kvm_fd, KVM_X86_SET_MCE, m); + return kvm_vcpu_ioctl(vcpu->env, KVM_X86_SET_MCE, m); #else return -ENOSYS; #endif @@ -563,7 +540,7 @@ int kvm_setup_cpuid(kvm_vcpu_context_t vcpu, int nent, cpuid->nent = nent; memcpy(cpuid->entries, entries, nent * sizeof(*entries)); - r = ioctl(vcpu->env->kvm_fd, KVM_SET_CPUID, cpuid); + r = kvm_vcpu_ioctl(vcpu->env, KVM_SET_CPUID, cpuid); free(cpuid); return r; @@ -579,10 +556,9 @@ int kvm_setup_cpuid2(kvm_vcpu_context_t vcpu, int nent, cpuid->nent = nent; memcpy(cpuid->entries, entries, nent * sizeof(*entries)); - r = ioctl(vcpu->env->kvm_fd, KVM_SET_CPUID2, cpuid); - if (r == -1) { + r = kvm_vcpu_ioctl(vcpu->env, KVM_SET_CPUID2, cpuid); + if (r < 0) { fprintf(stderr, "kvm_setup_cpuid2: %m\n"); - r = -errno; } free(cpuid); return r; @@ -634,13 +610,7 @@ static int tpr_access_reporting(kvm_vcpu_context_t vcpu, int enabled) r = kvm_ioctl(kvm_state, KVM_CHECK_EXTENSION, KVM_CAP_VAPIC); if (r <= 0) return -ENOSYS; - r = ioctl(vcpu->env->kvm_fd, KVM_TPR_ACCESS_REPORTING, &tac); - if (r == -1) { - r = -errno; - perror("KVM_TPR_ACCESS_REPORTING"); - return r; - } - return 0; + return kvm_vcpu_ioctl(vcpu->env, KVM_TPR_ACCESS_REPORTING, &tac); } int kvm_enable_tpr_access_reporting(kvm_vcpu_context_t vcpu) diff --git a/qemu-kvm.c b/qemu-kvm.c index 6b9b29f..bc06f9f 100644 --- a/qemu-kvm.c +++ b/qemu-kvm.c @@ -812,32 +812,32 @@ int handle_debug(kvm_vcpu_context_t vcpu, void *env) int kvm_get_regs(kvm_vcpu_context_t vcpu, struct kvm_regs *regs) { - return ioctl(vcpu->env->kvm_fd, KVM_GET_REGS, regs); + return kvm_vcpu_ioctl(vcpu->env, KVM_GET_REGS, regs); } int kvm_set_regs(kvm_vcpu_context_t vcpu, struct kvm_regs *regs) { - return ioctl(vcpu->env->kvm_fd, KVM_SET_REGS, regs); + return kvm_vcpu_ioctl(vcpu->env, KVM_SET_REGS, regs); } int kvm_get_fpu(kvm_vcpu_context_t vcpu, struct kvm_fpu *fpu) { - return ioctl(vcpu->env->kvm_fd, KVM_GET_FPU, fpu); + return kvm_vcpu_ioctl(vcpu->env, KVM_GET_FPU, fpu); } int kvm_set_fpu(kvm_vcpu_context_t vcpu, struct kvm_fpu *fpu) { - return ioctl(vcpu->env->kvm_fd, KVM_SET_FPU, fpu); + return kvm_vcpu_ioctl(vcpu->env, KVM_SET_FPU, fpu); } int kvm_get_sregs(kvm_vcpu_context_t vcpu, struct kvm_sregs *sregs) { - return ioctl(vcpu->env->kvm_fd, KVM_GET_SREGS, sregs); + return kvm_vcpu_ioctl(vcpu->env, KVM_GET_SREGS, sregs); } int kvm_set_sregs(kvm_vcpu_context_t vcpu, struct kvm_sregs *sregs) { - return ioctl(vcpu->env->kvm_fd, KVM_SET_SREGS, sregs); + return kvm_vcpu_ioctl(vcpu->env, KVM_SET_SREGS, sregs); } #ifdef KVM_CAP_MP_STATE @@ -847,7 +847,7 @@ int kvm_get_mpstate(kvm_vcpu_context_t vcpu, struct kvm_mp_state *mp_state) r = kvm_ioctl(kvm_state, KVM_CHECK_EXTENSION, KVM_CAP_MP_STATE); if (r > 0) - return ioctl(vcpu->env->kvm_fd, KVM_GET_MP_STATE, mp_state); + return kvm_vcpu_ioctl(vcpu->env, KVM_GET_MP_STATE, mp_state); return -ENOSYS; } @@ -857,7 +857,7 @@ int kvm_set_mpstate(kvm_vcpu_context_t vcpu, struct kvm_mp_state *mp_state) r = kvm_ioctl(kvm_state, KVM_CHECK_EXTENSION, KVM_CAP_MP_STATE); if (r > 0) - return ioctl(vcpu->env->kvm_fd, KVM_SET_MP_STATE, mp_state); + return kvm_vcpu_ioctl(vcpu->env, KVM_SET_MP_STATE, mp_state); return -ENOSYS; } #endif @@ -1034,13 +1034,13 @@ int kvm_inject_irq(kvm_vcpu_context_t vcpu, unsigned irq) struct kvm_interrupt intr; intr.irq = irq; - return ioctl(vcpu->env->kvm_fd, KVM_INTERRUPT, &intr); + return kvm_vcpu_ioctl(vcpu->env, KVM_INTERRUPT, &intr); } #ifdef KVM_CAP_SET_GUEST_DEBUG int kvm_set_guest_debug(kvm_vcpu_context_t vcpu, struct kvm_guest_debug *dbg) { - return ioctl(vcpu->env->kvm_fd, KVM_SET_GUEST_DEBUG, dbg); + return kvm_vcpu_ioctl(vcpu->env, KVM_SET_GUEST_DEBUG, dbg); } #endif @@ -1050,18 +1050,13 @@ int kvm_set_signal_mask(kvm_vcpu_context_t vcpu, const sigset_t *sigset) int r; if (!sigset) { - r = ioctl(vcpu->env->kvm_fd, KVM_SET_SIGNAL_MASK, NULL); - if (r == -1) - r = -errno; - return r; + return kvm_vcpu_ioctl(vcpu->env, KVM_SET_SIGNAL_MASK, NULL); } sigmask = qemu_malloc(sizeof(*sigmask) + sizeof(*sigset)); sigmask->len = 8; memcpy(sigmask->sigset, sigset, sizeof(*sigset)); - r = ioctl(vcpu->env->kvm_fd, KVM_SET_SIGNAL_MASK, sigmask); - if (r == -1) - r = -errno; + r = kvm_vcpu_ioctl(vcpu->env, KVM_SET_SIGNAL_MASK, sigmask); free(sigmask); return r; } @@ -1078,7 +1073,7 @@ int kvm_has_sync_mmu(void) int kvm_inject_nmi(kvm_vcpu_context_t vcpu) { #ifdef KVM_CAP_USER_NMI - return ioctl(vcpu->env->kvm_fd, KVM_NMI); + return kvm_vcpu_ioctl(vcpu->env, KVM_NMI); #else return -ENOSYS; #endif diff --git a/qemu-kvm.h b/qemu-kvm.h index 1dc9873..1fc1e8f 100644 --- a/qemu-kvm.h +++ b/qemu-kvm.h @@ -1202,6 +1202,8 @@ extern KVMState *kvm_state; int kvm_ioctl(KVMState *s, int type, ...); int kvm_vm_ioctl(KVMState *s, int type, ...); +int kvm_vcpu_ioctl(CPUState *env, int type, ...); + int kvm_check_extension(KVMState *s, unsigned int ext); #endif