From mboxrd@z Thu Jan 1 00:00:00 1970 From: Christian Borntraeger Subject: [patch 3/4] kvm-s390: fix register setting Date: Tue, 18 Oct 2011 12:27:14 +0200 Message-ID: <20111018103127.177787431@de.ibm.com> References: <20111018102711.259185287@de.ibm.com> Cc: Carsten Otte , Heiko Carstens , Martin Schwidefsky , KVM , Christian Borntraeger To: Avi Kivity , Marcelo Tossati Return-path: Received: from mtagate7.uk.ibm.com ([194.196.100.167]:53225 "EHLO mtagate7.uk.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757414Ab1JRKb3 (ORCPT ); Tue, 18 Oct 2011 06:31:29 -0400 Received: from d06nrmr1806.portsmouth.uk.ibm.com (d06nrmr1806.portsmouth.uk.ibm.com [9.149.39.193]) by mtagate7.uk.ibm.com (8.13.1/8.13.1) with ESMTP id p9IAVSk7025741 for ; Tue, 18 Oct 2011 10:31:28 GMT Received: from d06av02.portsmouth.uk.ibm.com (d06av02.portsmouth.uk.ibm.com [9.149.37.228]) by d06nrmr1806.portsmouth.uk.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id p9IAVSi62568354 for ; Tue, 18 Oct 2011 11:31:28 +0100 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 p9IAVRgc028131 for ; Tue, 18 Oct 2011 04:31:27 -0600 Content-Disposition: inline; filename=502-kvm-register-setting.diff Sender: kvm-owner@vger.kernel.org List-ID: From: Carsten Otte KVM common code does vcpu_load prior to calling our arch ioctls and vcpu_put after we're done here. Via the kvm_arch_vcpu_load/put callbacks we do load the fpu and access register state into the processor, which saves us moving the state on every SIE exit the kernel handles. However this breaks register setting from userspace, because of the following sequence: 1a. vcpu load stores userspace register content 1b. vcpu load loads guest register content 2. kvm_arch_vcpu_ioctl_set_fpu/sregs updates saved guest register content 3a. vcpu put stores the guest registers and overwrites the new content 3b. vcpu put loads the userspace register set again This patch loads the new guest register state into the cpu, so that the correct (new) set of guest registers will be stored in step 3a. Signed-off-by: Carsten Otte Signed-off-by: Christian Borntraeger --- arch/s390/kvm/kvm-s390.c | 2 ++ 1 file changed, 2 insertions(+) Index: b/arch/s390/kvm/kvm-s390.c =================================================================== --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c @@ -394,6 +394,7 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct { memcpy(&vcpu->arch.guest_acrs, &sregs->acrs, sizeof(sregs->acrs)); memcpy(&vcpu->arch.sie_block->gcr, &sregs->crs, sizeof(sregs->crs)); + restore_access_regs(vcpu->arch.guest_acrs); return 0; } @@ -409,6 +410,7 @@ int kvm_arch_vcpu_ioctl_set_fpu(struct k { memcpy(&vcpu->arch.guest_fpregs.fprs, &fpu->fprs, sizeof(fpu->fprs)); vcpu->arch.guest_fpregs.fpc = fpu->fpc; + restore_fp_regs(&vcpu->arch.guest_fpregs); return 0; }