aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390
diff options
context:
space:
mode:
authorChristian Borntraeger <borntraeger@de.ibm.com>2013-01-25 09:34:15 -0500
committerGleb Natapov <gleb@redhat.com>2013-01-30 05:35:51 -0500
commit15bc8d8457875f495c59d933b05770ba88d1eacb (patch)
tree1ea834b756406655dda62844b29b3fe8b41d4cc2 /arch/s390
parentc45c528e899094b9049b3c900e2cf1f00aa0490c (diff)
s390/kvm: Fix store status for ACRS/FPRS
On store status we need to copy the current state of registers into a save area. Currently we might save stale versions: The sie state descriptor doesnt have fields for guest ACRS,FPRS, those registers are simply stored in the host registers. The host program must copy these away if needed. We do that in vcpu_put/load. If we now do a store status in KVM code between vcpu_put/load, the saved values are not up-to-date. Lets collect the ACRS/FPRS before saving them. This also fixes some strange problems with hotplug and virtio-ccw, since the low level machine check handler (on hotplug a machine check will happen) will revalidate all registers with the content of the save area. Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> CC: stable@vger.kernel.org Signed-off-by: Gleb Natapov <gleb@redhat.com>
Diffstat (limited to 'arch/s390')
-rw-r--r--arch/s390/kvm/kvm-s390.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
index 5b01f0953900..4377d1886631 100644
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -770,6 +770,14 @@ int kvm_s390_vcpu_store_status(struct kvm_vcpu *vcpu, unsigned long addr)
770 } else 770 } else
771 prefix = 0; 771 prefix = 0;
772 772
773 /*
774 * The guest FPRS and ACRS are in the host FPRS/ACRS due to the lazy
775 * copying in vcpu load/put. Lets update our copies before we save
776 * it into the save area
777 */
778 save_fp_regs(&vcpu->arch.guest_fpregs);
779 save_access_regs(vcpu->run->s.regs.acrs);
780
773 if (__guestcopy(vcpu, addr + offsetof(struct save_area, fp_regs), 781 if (__guestcopy(vcpu, addr + offsetof(struct save_area, fp_regs),
774 vcpu->arch.guest_fpregs.fprs, 128, prefix)) 782 vcpu->arch.guest_fpregs.fprs, 128, prefix))
775 return -EFAULT; 783 return -EFAULT;