From patchwork Wed Aug 22 11:54:43 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jens Freimann X-Patchwork-Id: 179302 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id C31262C0090 for ; Wed, 22 Aug 2012 21:55:25 +1000 (EST) Received: from localhost ([::1]:52617 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1T49Wt-0001JW-FC for incoming@patchwork.ozlabs.org; Wed, 22 Aug 2012 07:55:23 -0400 Received: from eggs.gnu.org ([208.118.235.92]:57186) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1T49Wh-0001JM-0R for qemu-devel@nongnu.org; Wed, 22 Aug 2012 07:55:17 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1T49Wa-0003KD-Kt for qemu-devel@nongnu.org; Wed, 22 Aug 2012 07:55:10 -0400 Received: from e06smtp16.uk.ibm.com ([195.75.94.112]:55800) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1T49Wa-0003Ax-CN for qemu-devel@nongnu.org; Wed, 22 Aug 2012 07:55:04 -0400 Received: from /spool/local by e06smtp16.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 22 Aug 2012 12:55:00 +0100 Received: from b06cxnps4076.portsmouth.uk.ibm.com (9.149.109.198) by e06smtp16.uk.ibm.com (192.168.101.146) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Wed, 22 Aug 2012 12:54:58 +0100 Received: from d06av02.portsmouth.uk.ibm.com (d06av02.portsmouth.uk.ibm.com [9.149.37.228]) by b06cxnps4076.portsmouth.uk.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id q7MBsq9a12320788 for ; Wed, 22 Aug 2012 11:54:52 GMT Received: from d06av02.portsmouth.uk.ibm.com (loopback [127.0.0.1]) by d06av02.portsmouth.uk.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id q7MBsueO010367 for ; Wed, 22 Aug 2012 05:54:57 -0600 Received: from tuxmaker.boeblingen.de.ibm.com (tuxmaker.boeblingen.de.ibm.com [9.152.85.9]) by d06av02.portsmouth.uk.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id q7MBst4d010313; Wed, 22 Aug 2012 05:54:56 -0600 Received: by tuxmaker.boeblingen.de.ibm.com (Postfix, from userid 1122) id C2FA91224437; Wed, 22 Aug 2012 13:54:55 +0200 (CEST) From: Jens Freimann To: Alexander Graf Date: Wed, 22 Aug 2012 13:54:43 +0200 Message-Id: <1345636483-6581-1-git-send-email-jfrei@linux.vnet.ibm.com> X-Mailer: git-send-email 1.7.11.5 x-cbid: 12082211-3548-0000-0000-000002E3A834 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 195.75.94.112 Cc: Heinz Graalfs , qemu-devel , Christian Borntraeger , Jens Freimann , Cornelia Huck , Einar Lueck Subject: [Qemu-devel] [PATCH] s390: use sync regs for register transfer X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org From: Christian Borntraeger Newer kernels provide the guest registers in kvm_run. Lets use those if available. This avoids ioctls on cpu_synchronize_state making intercepts faster. In addition, we have now the prefix register, the access registers the control registers up to date. This helps in certain cases, e.g. for resolving kernel module addresses with gdb on a guest. On return, we only update the gprs, since qemu does not change prefix, crs and acrs. Blindly updating those might cause some expensive flushing in the kernel. Signed-off-by: Christian Borntraeger Signed-off-by: Jens Freimann --- target-s390x/kvm.c | 75 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 51 insertions(+), 24 deletions(-) diff --git a/target-s390x/kvm.c b/target-s390x/kvm.c index 07edf93..4598923 100644 --- a/target-s390x/kvm.c +++ b/target-s390x/kvm.c @@ -88,50 +88,77 @@ void kvm_arch_reset_vcpu(CPUS390XState *env) /* FIXME: add code to reset vcpu. */ } +/* we want to have the prefix, the GPRS, the ACRS and the CRS up to date */ +#define QEMU_NEEDED_REGS (KVM_SYNC_PREFIX | KVM_SYNC_GPRS | \ + KVM_SYNC_ACRS | KVM_SYNC_CRS) + +/* But qemu only changes the GPRS */ +#define QEMU_DIRTY_REGS (KVM_SYNC_GPRS) + int kvm_arch_put_registers(CPUS390XState *env, int level) { struct kvm_regs regs; int ret; int i; - ret = kvm_vcpu_ioctl(env, KVM_GET_REGS, ®s); - if (ret < 0) { - return ret; - } - - for (i = 0; i < 16; i++) { - regs.gprs[i] = env->regs[i]; - } - - ret = kvm_vcpu_ioctl(env, KVM_SET_REGS, ®s); - if (ret < 0) { - return ret; - } - env->kvm_run->psw_addr = env->psw.addr; env->kvm_run->psw_mask = env->psw.mask; - return ret; + if ((env->kvm_run->kvm_valid_regs & QEMU_NEEDED_REGS) == QEMU_NEEDED_REGS) { + env->kvm_run->s.regs.prefix = env->psa; + for (i = 0; i < 16; i++) { + env->kvm_run->s.regs.gprs[i] = env->regs[i]; + env->kvm_run->kvm_dirty_regs |= QEMU_DIRTY_REGS; + } + } else { + for (i = 0; i < 16; i++) { + regs.gprs[i] = env->regs[i]; + } + ret = kvm_vcpu_ioctl(env, KVM_SET_REGS, ®s); + if (ret < 0) { + return ret; + } + /* no prefix available */ + } + /* sregs unchanged */ + + return 0; } int kvm_arch_get_registers(CPUS390XState *env) { int ret; struct kvm_regs regs; + struct kvm_sregs sregs; int i; - ret = kvm_vcpu_ioctl(env, KVM_GET_REGS, ®s); - if (ret < 0) { - return ret; - } - - for (i = 0; i < 16; i++) { - env->regs[i] = regs.gprs[i]; - } - env->psw.addr = env->kvm_run->psw_addr; env->psw.mask = env->kvm_run->psw_mask; + if ((env->kvm_run->kvm_valid_regs & QEMU_NEEDED_REGS) == QEMU_NEEDED_REGS) { + env->psa = env->kvm_run->s.regs.prefix; + for (i = 0; i < 16; i++) { + env->regs[i] = env->kvm_run->s.regs.gprs[i]; + env->cregs[i] = env->kvm_run->s.regs.crs[i]; + env->aregs[i] = env->kvm_run->s.regs.acrs[i]; + } + } else { + ret = kvm_vcpu_ioctl(env, KVM_GET_REGS, ®s); + if (ret < 0) { + return ret; + } + ret = kvm_vcpu_ioctl(env, KVM_GET_SREGS, &sregs); + if (ret < 0) { + return ret; + } + for (i = 0; i < 16; i++) { + env->regs[i] = regs.gprs[i]; + env->cregs[i] = sregs.crs[i]; + env->aregs[i] = sregs.acrs[i]; + } + /* no prefix available */ + } + return 0; }