From patchwork Fri Mar 12 14:20:49 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Kiszka X-Patchwork-Id: 47679 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 07E2FB7D19 for ; Sat, 13 Mar 2010 01:21:42 +1100 (EST) Received: from localhost ([127.0.0.1]:57464 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Nq5kA-0006p9-IA for incoming@patchwork.ozlabs.org; Fri, 12 Mar 2010 09:21:38 -0500 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Nq5jX-0006oE-73 for qemu-devel@nongnu.org; Fri, 12 Mar 2010 09:20:59 -0500 Received: from [199.232.76.173] (port=54034 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Nq5jW-0006nz-5K for qemu-devel@nongnu.org; Fri, 12 Mar 2010 09:20:58 -0500 Received: from Debian-exim by monty-python.gnu.org with spam-scanned (Exim 4.60) (envelope-from ) id 1Nq5jU-0006be-CY for qemu-devel@nongnu.org; Fri, 12 Mar 2010 09:20:57 -0500 Received: from thoth.sbs.de ([192.35.17.2]:20131) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1Nq5jT-0006b4-Ls for qemu-devel@nongnu.org; Fri, 12 Mar 2010 09:20:56 -0500 Received: from mail3.siemens.de (localhost [127.0.0.1]) by thoth.sbs.de (8.12.11.20060308/8.12.11) with ESMTP id o2CEKpD7003592; Fri, 12 Mar 2010 15:20:51 +0100 Received: from localhost.localdomain (mchn012c.ww002.siemens.net [139.25.109.167] (may be forged)) by mail3.siemens.de (8.12.11.20060308/8.12.11) with ESMTP id o2CEKpdC000964; Fri, 12 Mar 2010 15:20:51 +0100 From: Jan Kiszka To: Avi Kivity , Marcelo Tosatti Date: Fri, 12 Mar 2010 15:20:49 +0100 Message-Id: <4ca56fc84370d3aa29ea78758c96cabe369057aa.1268403648.git.jan.kiszka@siemens.com> X-Mailer: git-send-email 1.6.0.2 In-Reply-To: References: In-Reply-To: References: X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.4-2.6 Cc: qemu-devel@nongnu.org, kvm@vger.kernel.org Subject: [Qemu-devel] [PATCH v4 1/2] KVM: x86: Add debug register saving and restoring X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Make use of the new KVM_GET/SET_DEBUGREGS to save/restore the x86 debug registers. Signed-off-by: Jan Kiszka --- kvm-all.c | 11 ++++++++++ kvm.h | 1 + target-i386/kvm.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+), 0 deletions(-) diff --git a/kvm-all.c b/kvm-all.c index 8ca480d..c469b6a 100644 --- a/kvm-all.c +++ b/kvm-all.c @@ -67,6 +67,7 @@ struct KVMState int migration_log; int vcpu_events; int robust_singlestep; + int debugregs; #ifdef KVM_CAP_SET_GUEST_DEBUG struct kvm_sw_breakpoint_head kvm_sw_breakpoints; #endif @@ -676,6 +677,11 @@ int kvm_init(int smp_cpus) kvm_check_extension(s, KVM_CAP_X86_ROBUST_SINGLESTEP); #endif + s->debugregs = 0; +#ifdef KVM_CAP_DEBUGREGS + s->debugregs = kvm_check_extension(s, KVM_CAP_DEBUGREGS); +#endif + ret = kvm_arch_init(s, smp_cpus); if (ret < 0) goto err; @@ -955,6 +961,11 @@ int kvm_has_robust_singlestep(void) return kvm_state->robust_singlestep; } +int kvm_has_debugregs(void) +{ + return kvm_state->debugregs; +} + void kvm_setup_guest_memory(void *start, size_t size) { if (!kvm_has_sync_mmu()) { diff --git a/kvm.h b/kvm.h index b0d07c8..c6faf20 100644 --- a/kvm.h +++ b/kvm.h @@ -44,6 +44,7 @@ int kvm_log_stop(target_phys_addr_t phys_addr, ram_addr_t size); int kvm_has_sync_mmu(void); int kvm_has_vcpu_events(void); int kvm_has_robust_singlestep(void); +int kvm_has_debugregs(void); void kvm_cpu_register_phys_memory_client(void); diff --git a/target-i386/kvm.c b/target-i386/kvm.c index 123dcc8..b5c3c27 100644 --- a/target-i386/kvm.c +++ b/target-i386/kvm.c @@ -903,6 +903,53 @@ static int kvm_guest_debug_workarounds(CPUState *env) } #ifdef KVM_UPSTREAM +static int kvm_put_debugregs(CPUState *env) +{ +#ifdef KVM_CAP_DEBUGREGS + struct kvm_debugregs dbgregs; + int i; + + if (!kvm_has_debugregs()) { + return 0; + } + + for (i = 0; i < 4; i++) { + dbgregs.db[i] = env->dr[i]; + } + dbgregs.dr6 = env->dr[6]; + dbgregs.dr7 = env->dr[7]; + dbgregs.flags = 0; + + return kvm_vcpu_ioctl(env, KVM_SET_DEBUGREGS, &dbgregs); +#else + return 0; +#endif +} + +static int kvm_get_debugregs(CPUState *env) +{ +#ifdef KVM_CAP_DEBUGREGS + struct kvm_debugregs dbgregs; + int i, ret; + + if (!kvm_has_debugregs()) { + return 0; + } + + ret = kvm_vcpu_ioctl(env, KVM_GET_DEBUGREGS, &dbgregs); + if (ret < 0) { + return ret; + } + for (i = 0; i < 4; i++) { + env->dr[i] = dbgregs.db[i]; + } + env->dr[4] = env->dr[6] = dbgregs.dr6; + env->dr[5] = env->dr[7] = dbgregs.dr7; +#endif + + return 0; +} + int kvm_arch_put_registers(CPUState *env, int level) { int ret; @@ -938,6 +985,10 @@ int kvm_arch_put_registers(CPUState *env, int level) if (ret < 0) return ret; + ret = kvm_put_debugregs(env); + if (ret < 0) + return ret; + return 0; } @@ -969,6 +1020,10 @@ int kvm_arch_get_registers(CPUState *env) if (ret < 0) return ret; + ret = kvm_get_debugregs(env); + if (ret < 0) + return ret; + return 0; }