KVM: s390: use READ_ONCE() to read fpc register value
authorHeiko Carstens <hca@linux.ibm.com>
Thu, 30 Nov 2023 17:56:01 +0000 (18:56 +0100)
committerAlexander Gordeev <agordeev@linux.ibm.com>
Mon, 11 Dec 2023 13:33:05 +0000 (14:33 +0100)
Use READ_ONCE() to read a vcpu's floating point register value from
the memory mapped area. This avoids that, depending on code
generation, a different value is tested for validity than the one that
is used, since user space can modify the area concurrently and the
compiler is free to generate code that reads the value multiple times.

Reviewed-by: Christian Borntraeger <borntraeger@linux.ibm.com>
Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
arch/s390/kvm/kvm-s390.c

index 16e32174807f727f521102b11bce111c8fa54003..1a1af4db5afc7f99d997a29a16462b378932f538 100644 (file)
@@ -4962,7 +4962,7 @@ static void sync_regs(struct kvm_vcpu *vcpu)
                current->thread.fpu.regs = vcpu->run->s.regs.vrs;
        else
                current->thread.fpu.regs = vcpu->run->s.regs.fprs;
-       current->thread.fpu.fpc = vcpu->run->s.regs.fpc;
+       current->thread.fpu.fpc = READ_ONCE(vcpu->run->s.regs.fpc);
        if (test_fp_ctl(current->thread.fpu.fpc))
                /* User space provided an invalid FPC, let's clear it */
                current->thread.fpu.fpc = 0;