From patchwork Wed May 4 19:43:42 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Kiszka X-Patchwork-Id: 754742 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter2.kernel.org (8.14.4/8.14.3) with ESMTP id p44Jilr7024698 for ; Wed, 4 May 2011 19:44:47 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755636Ab1EDTog (ORCPT ); Wed, 4 May 2011 15:44:36 -0400 Received: from fmmailgate01.web.de ([217.72.192.221]:38488 "EHLO fmmailgate01.web.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755579Ab1EDToS (ORCPT ); Wed, 4 May 2011 15:44:18 -0400 Received: from smtp04.web.de ( [172.20.0.225]) by fmmailgate01.web.de (Postfix) with ESMTP id 20B8E18E4B2C7; Wed, 4 May 2011 21:44:14 +0200 (CEST) Received: from [88.64.22.120] (helo=localhost.localdomain) by smtp04.web.de with asmtp (TLSv1:AES256-SHA:256) (WEB.DE 4.110 #2) id 1QHhzZ-0006mo-02; Wed, 04 May 2011 21:44:14 +0200 From: Jan Kiszka To: Avi Kivity , Marcelo Tosatti Cc: kvm@vger.kernel.org Subject: [PATCH 08/19] qemu-kvm: Use upstream kvm_arch_get/put_registers Date: Wed, 4 May 2011 21:43:42 +0200 Message-Id: X-Mailer: git-send-email 1.7.1 In-Reply-To: References: In-Reply-To: References: X-Sender: jan.kiszka@web.de X-Provags-ID: V01U2FsdGVkX1+rLes/hpvToud5vMCeATpwlHKNhWIzabMZkeqk gL2Y4E1a+Y8YuBGTRVsAoW4ce7vBqC/pRQ4OmyQLP8pocrl7UZ yTI7CSUQQ= Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.6 (demeter2.kernel.org [140.211.167.43]); Wed, 04 May 2011 19:44:47 +0000 (UTC) From: Jan Kiszka Having two implementations of these services used to be a source of constant pain in the past. Now they are almost equivalent, and we can switch to upstream's versions. We just need to import the APIC bits into the upstream code until they are merge as well. Signed-off-by: Jan Kiszka --- qemu-kvm-ia64.c | 4 +- qemu-kvm-x86.c | 67 ----------------------------------------------------- qemu-kvm.c | 8 +++--- qemu-kvm.h | 2 - target-i386/kvm.c | 12 +++++++-- 5 files changed, 15 insertions(+), 78 deletions(-) diff --git a/qemu-kvm-ia64.c b/qemu-kvm-ia64.c index c3c7918..bda57b6 100644 --- a/qemu-kvm-ia64.c +++ b/qemu-kvm-ia64.c @@ -16,12 +16,12 @@ int kvm_arch_qemu_create_context(void) return 0; } -void kvm_arch_load_regs(CPUState *env, int level) +void kvm_arch_put_registers(CPUState *env, int level) { } -void kvm_arch_save_regs(CPUState *env) +void kvm_arch_get_registers(CPUState *env) { } diff --git a/qemu-kvm-x86.c b/qemu-kvm-x86.c index 9d546d0..f7cd30d 100644 --- a/qemu-kvm-x86.c +++ b/qemu-kvm-x86.c @@ -474,73 +474,6 @@ int kvm_arch_qemu_create_context(void) return 0; } -#define XSAVE_CWD_RIP 2 -#define XSAVE_CWD_RDP 4 -#define XSAVE_MXCSR 6 -#define XSAVE_ST_SPACE 8 -#define XSAVE_XMM_SPACE 40 -#define XSAVE_XSTATE_BV 128 -#define XSAVE_YMMH_SPACE 144 - -void kvm_arch_load_regs(CPUState *env, int level) -{ - int rc; - - assert(kvm_cpu_is_stopped(env) || qemu_cpu_is_self(env)); - - kvm_getput_regs(env, 1); - - kvm_put_xsave(env); - kvm_put_xcrs(env); - - kvm_put_sregs(env); - - rc = kvm_put_msrs(env, level); - if (rc < 0) { - perror("kvm__msrs FAILED"); - } - - if (level >= KVM_PUT_RESET_STATE) { - kvm_put_mp_state(env); - kvm_load_lapic(env); - } - if (level == KVM_PUT_FULL_STATE) { - if (env->kvm_vcpu_update_vapic) { - kvm_tpr_enable_vapic(env); - } - } - - kvm_put_vcpu_events(env, level); - kvm_put_debugregs(env); - - /* must be last */ - kvm_guest_debug_workarounds(env); -} - -void kvm_arch_save_regs(CPUState *env) -{ - int rc; - - assert(kvm_cpu_is_stopped(env) || qemu_cpu_is_self(env)); - - kvm_getput_regs(env, 0); - - kvm_get_xsave(env); - kvm_get_xcrs(env); - - kvm_get_sregs(env); - - rc = kvm_get_msrs(env); - if (rc < 0) { - perror("kvm_get_msrs FAILED"); - } - - kvm_get_mp_state(env); - kvm_save_lapic(env); - kvm_get_vcpu_events(env); - kvm_get_debugregs(env); -} - static int _kvm_arch_init_vcpu(CPUState *env) { kvm_arch_reset_vcpu(env); diff --git a/qemu-kvm.c b/qemu-kvm.c index d86fdcc..508580e 100644 --- a/qemu-kvm.c +++ b/qemu-kvm.c @@ -483,7 +483,7 @@ int kvm_run(CPUState *env) again: if (env->kvm_vcpu_dirty) { - kvm_arch_load_regs(env, KVM_PUT_RUNTIME_STATE); + kvm_arch_put_registers(env, KVM_PUT_RUNTIME_STATE); env->kvm_vcpu_dirty = 0; } push_nmi(kvm); @@ -1102,7 +1102,7 @@ static void do_kvm_cpu_synchronize_state(void *_env) CPUState *env = _env; if (!env->kvm_vcpu_dirty) { - kvm_arch_save_regs(env); + kvm_arch_get_registers(env); env->kvm_vcpu_dirty = 1; } } @@ -1116,13 +1116,13 @@ void kvm_cpu_synchronize_state(CPUState *env) void kvm_cpu_synchronize_post_reset(CPUState *env) { - kvm_arch_load_regs(env, KVM_PUT_RESET_STATE); + kvm_arch_put_registers(env, KVM_PUT_RESET_STATE); env->kvm_vcpu_dirty = 0; } void kvm_cpu_synchronize_post_init(CPUState *env) { - kvm_arch_load_regs(env, KVM_PUT_FULL_STATE); + kvm_arch_put_registers(env, KVM_PUT_FULL_STATE); env->kvm_vcpu_dirty = 0; } diff --git a/qemu-kvm.h b/qemu-kvm.h index 79eb90d..654ea2e 100644 --- a/qemu-kvm.h +++ b/qemu-kvm.h @@ -657,8 +657,6 @@ int kvm_qemu_destroy_memory_alias(uint64_t phys_start); int kvm_arch_qemu_create_context(void); -void kvm_arch_save_regs(CPUState *env); -void kvm_arch_load_regs(CPUState *env, int level); int kvm_arch_has_work(CPUState *env); void kvm_arch_process_irqchip_events(CPUState *env); int kvm_arch_try_push_interrupts(void *opaque); diff --git a/target-i386/kvm.c b/target-i386/kvm.c index 7974e62..bbc324b 100644 --- a/target-i386/kvm.c +++ b/target-i386/kvm.c @@ -331,7 +331,6 @@ int kvm_arch_on_sigbus(int code, void *addr) return 0; } -#ifdef OBSOLETE_KVM_IMPL static int kvm_inject_mce_oldstyle(CPUState *env) { #ifdef KVM_CAP_MCE @@ -363,7 +362,6 @@ static int kvm_inject_mce_oldstyle(CPUState *env) #endif /* KVM_CAP_MCE */ return 0; } -#endif static void cpu_update_state(void *opaque, int running, int reason) { @@ -1454,7 +1452,6 @@ static int kvm_get_debugregs(CPUState *env) return 0; } -#ifdef OBSOLETE_KVM_IMPL int kvm_arch_put_registers(CPUState *env, int level) { int ret; @@ -1491,6 +1488,8 @@ int kvm_arch_put_registers(CPUState *env, int level) if (ret < 0) { return ret; } + + kvm_load_lapic(env); } ret = kvm_put_vcpu_events(env, level); if (ret < 0) { @@ -1500,6 +1499,11 @@ int kvm_arch_put_registers(CPUState *env, int level) if (ret < 0) { return ret; } + if (level == KVM_PUT_FULL_STATE) { + if (env->kvm_vcpu_update_vapic) { + kvm_tpr_enable_vapic(env); + } + } /* must be last */ ret = kvm_guest_debug_workarounds(env); if (ret < 0) { @@ -1538,6 +1542,7 @@ int kvm_arch_get_registers(CPUState *env) if (ret < 0) { return ret; } + kvm_save_lapic(env); ret = kvm_get_vcpu_events(env); if (ret < 0) { return ret; @@ -1549,6 +1554,7 @@ int kvm_arch_get_registers(CPUState *env) return 0; } +#ifdef OBSOLETE_KVM_IMPL void kvm_arch_pre_run(CPUState *env, struct kvm_run *run) { int ret;