| From 9522b37f5a8c7bfabe46eecadf2e130f1103f337 Mon Sep 17 00:00:00 2001 |
| From: David Hildenbrand <dahi@linux.vnet.ibm.com> |
| Date: Tue, 8 Mar 2016 12:24:30 +0100 |
| Subject: KVM: s390: correct fprs on SIGP (STOP AND) STORE STATUS |
| |
| From: David Hildenbrand <dahi@linux.vnet.ibm.com> |
| |
| commit 9522b37f5a8c7bfabe46eecadf2e130f1103f337 upstream. |
| |
| With MACHINE_HAS_VX, we convert the floating point registers from the |
| vector registeres when storing the status. For other VCPUs, these are |
| stored to vcpu->run->s.regs.vrs, but we are using current->thread.fpu.vxrs, |
| which resolves to the currently loaded VCPU. |
| |
| So kvm_s390_store_status_unloaded() currently writes the wrong floating |
| point registers (converted from the vector registers) when called from |
| another VCPU on a z13. |
| |
| This is only the case for old user space not handling SIGP STORE STATUS and |
| SIGP STOP AND STORE STATUS, but relying on the kernel implementation. All |
| other calls come from the loaded VCPU via kvm_s390_store_status(). |
| |
| Fixes: 9abc2a08a7d6 (KVM: s390: fix memory overwrites when vx is disabled) |
| Reviewed-by: Christian Borntraeger <borntraeger@de.ibm.com> |
| Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com> |
| Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> |
| Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/s390/kvm/kvm-s390.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/arch/s390/kvm/kvm-s390.c |
| +++ b/arch/s390/kvm/kvm-s390.c |
| @@ -2249,7 +2249,7 @@ int kvm_s390_store_status_unloaded(struc |
| |
| /* manually convert vector registers if necessary */ |
| if (MACHINE_HAS_VX) { |
| - convert_vx_to_fp(fprs, current->thread.fpu.vxrs); |
| + convert_vx_to_fp(fprs, (__vector128 *) vcpu->run->s.regs.vrs); |
| rc = write_guest_abs(vcpu, gpa + __LC_FPREGS_SAVE_AREA, |
| fprs, 128); |
| } else { |