KVM: s390: vsie: Use virt_to_phys for facility control block
authorNina Schoetterl-Glausch <nsg@linux.ibm.com>
Tue, 19 Mar 2024 16:44:20 +0000 (17:44 +0100)
committerAlexander Gordeev <agordeev@linux.ibm.com>
Wed, 17 Apr 2024 11:37:59 +0000 (13:37 +0200)
In order for SIE to interpretively execute STFLE, it requires the real
or absolute address of a facility-list control block.
Before writing the location into the shadow SIE control block, convert
it from a virtual address.
We currently do not run into this bug because the lower 31 bits are the
same for virtual and physical addresses.

Signed-off-by: Nina Schoetterl-Glausch <nsg@linux.ibm.com>
Link: https://lore.kernel.org/r/20240319164420.4053380-3-nsg@linux.ibm.com
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
Message-Id: <20240319164420.4053380-3-nsg@linux.ibm.com>
Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
arch/s390/kvm/vsie.c

index b2c9f010f0fefd6744289d03a7f1e7c294b791e6..d8527a046cf7595ead8f0a8d2ec69f0c705c79ff 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/list.h>
 #include <linux/bitmap.h>
 #include <linux/sched/signal.h>
+#include <linux/io.h>
 
 #include <asm/gmap.h>
 #include <asm/mmu_context.h>
@@ -1005,7 +1006,7 @@ static int handle_stfle(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page)
                if (read_guest_real(vcpu, fac, &vsie_page->fac,
                                    stfle_size() * sizeof(u64)))
                        return set_validity_icpt(scb_s, 0x1090U);
-               scb_s->fac = (__u32)(__u64) &vsie_page->fac;
+               scb_s->fac = (u32)virt_to_phys(&vsie_page->fac);
        }
        return 0;
 }