From: Greg Kroah-Hartman Date: Wed, 12 May 2021 14:20:17 +0000 (+0200) Subject: drop some s390 kvm patches X-Git-Tag: v5.4.119~7 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=796c41f50bf4c2b5bfa609dcb92a0ac72f4d6330;p=thirdparty%2Fkernel%2Fstable-queue.git drop some s390 kvm patches --- diff --git a/queue-4.14/kvm-s390-extend-kvm_s390_shadow_fault-to-return-entry-pointer.patch b/queue-4.14/kvm-s390-extend-kvm_s390_shadow_fault-to-return-entry-pointer.patch deleted file mode 100644 index d42fda42cd8..00000000000 --- a/queue-4.14/kvm-s390-extend-kvm_s390_shadow_fault-to-return-entry-pointer.patch +++ /dev/null @@ -1,172 +0,0 @@ -From 5ac14bac08ae827b619f21bcceaaac3b8c497e31 Mon Sep 17 00:00:00 2001 -From: Claudio Imbrenda -Date: Mon, 1 Feb 2021 17:26:54 +0100 -Subject: KVM: s390: extend kvm_s390_shadow_fault to return entry pointer - -From: Claudio Imbrenda - -commit 5ac14bac08ae827b619f21bcceaaac3b8c497e31 upstream. - -Extend kvm_s390_shadow_fault to return the pointer to the valid leaf -DAT table entry, or to the invalid entry. - -Also return some flags in the lower bits of the address: -PEI_DAT_PROT: indicates that DAT protection applies because of the - protection bit in the segment (or, if EDAT, region) tables. -PEI_NOT_PTE: indicates that the address of the DAT table entry returned - does not refer to a PTE, but to a segment or region table. - -Signed-off-by: Claudio Imbrenda -Cc: stable@vger.kernel.org -Reviewed-by: Janosch Frank -Reviewed-by: David Hildenbrand -Reviewed-by: Christian Borntraeger -Link: https://lore.kernel.org/r/20210302174443.514363-3-imbrenda@linux.ibm.com -[borntraeger@de.ibm.com: fold in a fix from Claudio] -Signed-off-by: Christian Borntraeger -Signed-off-by: Greg Kroah-Hartman ---- - arch/s390/kvm/gaccess.c | 30 +++++++++++++++++++++++++----- - arch/s390/kvm/gaccess.h | 6 +++++- - arch/s390/kvm/vsie.c | 8 ++++---- - 3 files changed, 34 insertions(+), 10 deletions(-) - ---- a/arch/s390/kvm/gaccess.c -+++ b/arch/s390/kvm/gaccess.c -@@ -976,7 +976,9 @@ int kvm_s390_check_low_addr_prot_real(st - * kvm_s390_shadow_tables - walk the guest page table and create shadow tables - * @sg: pointer to the shadow guest address space structure - * @saddr: faulting address in the shadow gmap -- * @pgt: pointer to the page table address result -+ * @pgt: pointer to the beginning of the page table for the given address if -+ * successful (return value 0), or to the first invalid DAT entry in -+ * case of exceptions (return value > 0) - * @fake: pgt references contiguous guest memory block, not a pgtable - */ - static int kvm_s390_shadow_tables(struct gmap *sg, unsigned long saddr, -@@ -1034,6 +1036,7 @@ static int kvm_s390_shadow_tables(struct - rfte.val = ptr; - goto shadow_r2t; - } -+ *pgt = ptr + vaddr.rfx * 8; - rc = gmap_read_table(parent, ptr + vaddr.rfx * 8, &rfte.val); - if (rc) - return rc; -@@ -1060,6 +1063,7 @@ shadow_r2t: - rste.val = ptr; - goto shadow_r3t; - } -+ *pgt = ptr + vaddr.rsx * 8; - rc = gmap_read_table(parent, ptr + vaddr.rsx * 8, &rste.val); - if (rc) - return rc; -@@ -1087,6 +1091,7 @@ shadow_r3t: - rtte.val = ptr; - goto shadow_sgt; - } -+ *pgt = ptr + vaddr.rtx * 8; - rc = gmap_read_table(parent, ptr + vaddr.rtx * 8, &rtte.val); - if (rc) - return rc; -@@ -1123,6 +1128,7 @@ shadow_sgt: - ste.val = ptr; - goto shadow_pgt; - } -+ *pgt = ptr + vaddr.sx * 8; - rc = gmap_read_table(parent, ptr + vaddr.sx * 8, &ste.val); - if (rc) - return rc; -@@ -1157,6 +1163,8 @@ shadow_pgt: - * @vcpu: virtual cpu - * @sg: pointer to the shadow guest address space structure - * @saddr: faulting address in the shadow gmap -+ * @datptr: will contain the address of the faulting DAT table entry, or of -+ * the valid leaf, plus some flags - * - * Returns: - 0 if the shadow fault was successfully resolved - * - > 0 (pgm exception code) on exceptions while faulting -@@ -1165,11 +1173,11 @@ shadow_pgt: - * - -ENOMEM if out of memory - */ - int kvm_s390_shadow_fault(struct kvm_vcpu *vcpu, struct gmap *sg, -- unsigned long saddr) -+ unsigned long saddr, unsigned long *datptr) - { - union vaddress vaddr; - union page_table_entry pte; -- unsigned long pgt; -+ unsigned long pgt = 0; - int dat_protection, fake; - int rc; - -@@ -1191,8 +1199,20 @@ int kvm_s390_shadow_fault(struct kvm_vcp - pte.val = pgt + vaddr.px * PAGE_SIZE; - goto shadow_page; - } -- if (!rc) -- rc = gmap_read_table(sg->parent, pgt + vaddr.px * 8, &pte.val); -+ -+ switch (rc) { -+ case PGM_SEGMENT_TRANSLATION: -+ case PGM_REGION_THIRD_TRANS: -+ case PGM_REGION_SECOND_TRANS: -+ case PGM_REGION_FIRST_TRANS: -+ pgt |= PEI_NOT_PTE; -+ break; -+ case 0: -+ pgt += vaddr.px * 8; -+ rc = gmap_read_table(sg->parent, pgt, &pte.val); -+ } -+ if (datptr) -+ *datptr = pgt | dat_protection * PEI_DAT_PROT; - if (!rc && pte.i) - rc = PGM_PAGE_TRANSLATION; - if (!rc && pte.z) ---- a/arch/s390/kvm/gaccess.h -+++ b/arch/s390/kvm/gaccess.h -@@ -390,7 +390,11 @@ void ipte_unlock(struct kvm_vcpu *vcpu); - int ipte_lock_held(struct kvm_vcpu *vcpu); - int kvm_s390_check_low_addr_prot_real(struct kvm_vcpu *vcpu, unsigned long gra); - -+/* MVPG PEI indication bits */ -+#define PEI_DAT_PROT 2 -+#define PEI_NOT_PTE 4 -+ - int kvm_s390_shadow_fault(struct kvm_vcpu *vcpu, struct gmap *shadow, -- unsigned long saddr); -+ unsigned long saddr, unsigned long *datptr); - - #endif /* __KVM_S390_GACCESS_H */ ---- a/arch/s390/kvm/vsie.c -+++ b/arch/s390/kvm/vsie.c -@@ -440,10 +440,10 @@ static int map_prefix(struct kvm_vcpu *v - /* with mso/msl, the prefix lies at offset *mso* */ - prefix += scb_s->mso; - -- rc = kvm_s390_shadow_fault(vcpu, vsie_page->gmap, prefix); -+ rc = kvm_s390_shadow_fault(vcpu, vsie_page->gmap, prefix, NULL); - if (!rc && (scb_s->ecb & ECB_TE)) - rc = kvm_s390_shadow_fault(vcpu, vsie_page->gmap, -- prefix + PAGE_SIZE); -+ prefix + PAGE_SIZE, NULL); - /* - * We don't have to mprotect, we will be called for all unshadows. - * SIE will detect if protection applies and trigger a validity. -@@ -746,7 +746,7 @@ static int handle_fault(struct kvm_vcpu - current->thread.gmap_addr, 1); - - rc = kvm_s390_shadow_fault(vcpu, vsie_page->gmap, -- current->thread.gmap_addr); -+ current->thread.gmap_addr, NULL); - if (rc > 0) { - rc = inject_fault(vcpu, rc, - current->thread.gmap_addr, -@@ -768,7 +768,7 @@ static void handle_last_fault(struct kvm - { - if (vsie_page->fault_addr) - kvm_s390_shadow_fault(vcpu, vsie_page->gmap, -- vsie_page->fault_addr); -+ vsie_page->fault_addr, NULL); - vsie_page->fault_addr = 0; - } - diff --git a/queue-4.14/kvm-s390-vsie-correctly-handle-mvpg-when-in-vsie.patch b/queue-4.14/kvm-s390-vsie-correctly-handle-mvpg-when-in-vsie.patch deleted file mode 100644 index aabe416fb24..00000000000 --- a/queue-4.14/kvm-s390-vsie-correctly-handle-mvpg-when-in-vsie.patch +++ /dev/null @@ -1,146 +0,0 @@ -From bdf7509bbefa20855d5f6bacdc5b62a8489477c9 Mon Sep 17 00:00:00 2001 -From: Claudio Imbrenda -Date: Mon, 1 Feb 2021 21:54:13 +0100 -Subject: KVM: s390: VSIE: correctly handle MVPG when in VSIE - -From: Claudio Imbrenda - -commit bdf7509bbefa20855d5f6bacdc5b62a8489477c9 upstream. - -Correctly handle the MVPG instruction when issued by a VSIE guest. - -Fixes: a3508fbe9dc6d ("KVM: s390: vsie: initial support for nested virtualization") -Cc: stable@vger.kernel.org # f85f1baaa189: KVM: s390: split kvm_s390_logical_to_effective -Signed-off-by: Claudio Imbrenda -Acked-by: Janosch Frank -Reviewed-by: David Hildenbrand -Acked-by: Christian Borntraeger -Link: https://lore.kernel.org/r/20210302174443.514363-4-imbrenda@linux.ibm.com -[borntraeger@de.ibm.com: apply fixup from Claudio] -Signed-off-by: Christian Borntraeger -Signed-off-by: Greg Kroah-Hartman ---- - arch/s390/kvm/vsie.c | 98 ++++++++++++++++++++++++++++++++++++++++++++++++--- - 1 file changed, 93 insertions(+), 5 deletions(-) - ---- a/arch/s390/kvm/vsie.c -+++ b/arch/s390/kvm/vsie.c -@@ -249,11 +249,6 @@ static void unshadow_scb(struct kvm_vcpu - memcpy((void *)((u64)scb_o + 0xc0), - (void *)((u64)scb_s + 0xc0), 0xf0 - 0xc0); - break; -- case ICPT_PARTEXEC: -- /* MVPG only */ -- memcpy((void *)((u64)scb_o + 0xc0), -- (void *)((u64)scb_s + 0xc0), 0xd0 - 0xc0); -- break; - } - - if (scb_s->ihcpu != 0xffffU) -@@ -821,6 +816,95 @@ static int handle_stfle(struct kvm_vcpu - } - - /* -+ * Get a register for a nested guest. -+ * @vcpu the vcpu of the guest -+ * @vsie_page the vsie_page for the nested guest -+ * @reg the register number, the upper 4 bits are ignored. -+ * returns: the value of the register. -+ */ -+static u64 vsie_get_register(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page, u8 reg) -+{ -+ /* no need to validate the parameter and/or perform error handling */ -+ reg &= 0xf; -+ switch (reg) { -+ case 15: -+ return vsie_page->scb_s.gg15; -+ case 14: -+ return vsie_page->scb_s.gg14; -+ default: -+ return vcpu->run->s.regs.gprs[reg]; -+ } -+} -+ -+static int vsie_handle_mvpg(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page) -+{ -+ struct kvm_s390_sie_block *scb_s = &vsie_page->scb_s; -+ unsigned long pei_dest, pei_src, src, dest, mask; -+ u64 *pei_block = &vsie_page->scb_o->mcic; -+ int edat, rc_dest, rc_src; -+ union ctlreg0 cr0; -+ -+ cr0.val = vcpu->arch.sie_block->gcr[0]; -+ edat = cr0.edat && test_kvm_facility(vcpu->kvm, 8); -+ mask = _kvm_s390_logical_to_effective(&scb_s->gpsw, PAGE_MASK); -+ -+ dest = vsie_get_register(vcpu, vsie_page, scb_s->ipb >> 20) & mask; -+ src = vsie_get_register(vcpu, vsie_page, scb_s->ipb >> 16) & mask; -+ -+ rc_dest = kvm_s390_shadow_fault(vcpu, vsie_page->gmap, dest, &pei_dest); -+ rc_src = kvm_s390_shadow_fault(vcpu, vsie_page->gmap, src, &pei_src); -+ /* -+ * Either everything went well, or something non-critical went wrong -+ * e.g. because of a race. In either case, simply retry. -+ */ -+ if (rc_dest == -EAGAIN || rc_src == -EAGAIN || (!rc_dest && !rc_src)) { -+ retry_vsie_icpt(vsie_page); -+ return -EAGAIN; -+ } -+ /* Something more serious went wrong, propagate the error */ -+ if (rc_dest < 0) -+ return rc_dest; -+ if (rc_src < 0) -+ return rc_src; -+ -+ /* The only possible suppressing exception: just deliver it */ -+ if (rc_dest == PGM_TRANSLATION_SPEC || rc_src == PGM_TRANSLATION_SPEC) { -+ clear_vsie_icpt(vsie_page); -+ rc_dest = kvm_s390_inject_program_int(vcpu, PGM_TRANSLATION_SPEC); -+ WARN_ON_ONCE(rc_dest); -+ return 1; -+ } -+ -+ /* -+ * Forward the PEI intercept to the guest if it was a page fault, or -+ * also for segment and region table faults if EDAT applies. -+ */ -+ if (edat) { -+ rc_dest = rc_dest == PGM_ASCE_TYPE ? rc_dest : 0; -+ rc_src = rc_src == PGM_ASCE_TYPE ? rc_src : 0; -+ } else { -+ rc_dest = rc_dest != PGM_PAGE_TRANSLATION ? rc_dest : 0; -+ rc_src = rc_src != PGM_PAGE_TRANSLATION ? rc_src : 0; -+ } -+ if (!rc_dest && !rc_src) { -+ pei_block[0] = pei_dest; -+ pei_block[1] = pei_src; -+ return 1; -+ } -+ -+ retry_vsie_icpt(vsie_page); -+ -+ /* -+ * The host has edat, and the guest does not, or it was an ASCE type -+ * exception. The host needs to inject the appropriate DAT interrupts -+ * into the guest. -+ */ -+ if (rc_dest) -+ return inject_fault(vcpu, rc_dest, dest, 1); -+ return inject_fault(vcpu, rc_src, src, 0); -+} -+ -+/* - * Run the vsie on a shadow scb and a shadow gmap, without any further - * sanity checks, handling SIE faults. - * -@@ -898,6 +982,10 @@ static int do_vsie_run(struct kvm_vcpu * - if ((scb_s->ipa & 0xf000) != 0xf000) - scb_s->ipa += 0x1000; - break; -+ case ICPT_PARTEXEC: -+ if (scb_s->ipa == 0xb254) -+ rc = vsie_handle_mvpg(vcpu, vsie_page); -+ break; - } - return rc; - } diff --git a/queue-4.14/kvm-s390-vsie-fix-mvpg-handling-for-prefixing-and-mso.patch b/queue-4.14/kvm-s390-vsie-fix-mvpg-handling-for-prefixing-and-mso.patch deleted file mode 100644 index e7c01256127..00000000000 --- a/queue-4.14/kvm-s390-vsie-fix-mvpg-handling-for-prefixing-and-mso.patch +++ /dev/null @@ -1,52 +0,0 @@ -From c3171e94cc1cdcc3229565244112e869f052b8d9 Mon Sep 17 00:00:00 2001 -From: Claudio Imbrenda -Date: Mon, 22 Mar 2021 15:05:59 +0100 -Subject: KVM: s390: VSIE: fix MVPG handling for prefixing and MSO - -From: Claudio Imbrenda - -commit c3171e94cc1cdcc3229565244112e869f052b8d9 upstream. - -Prefixing needs to be applied to the guest real address to translate it -into a guest absolute address. - -The value of MSO needs to be added to a guest-absolute address in order to -obtain the host-virtual. - -Fixes: bdf7509bbefa ("s390/kvm: VSIE: correctly handle MVPG when in VSIE") -Reported-by: Janosch Frank -Signed-off-by: Claudio Imbrenda -Reviewed-by: David Hildenbrand -Cc: stable@vger.kernel.org -Link: https://lore.kernel.org/r/20210322140559.500716-3-imbrenda@linux.ibm.com -[borntraeger@de.ibm.com simplify mso] -Signed-off-by: Christian Borntraeger -Signed-off-by: Greg Kroah-Hartman ---- - arch/s390/kvm/vsie.c | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - ---- a/arch/s390/kvm/vsie.c -+++ b/arch/s390/kvm/vsie.c -@@ -839,7 +839,7 @@ static u64 vsie_get_register(struct kvm_ - static int vsie_handle_mvpg(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page) - { - struct kvm_s390_sie_block *scb_s = &vsie_page->scb_s; -- unsigned long pei_dest, pei_src, src, dest, mask; -+ unsigned long pei_dest, pei_src, src, dest, mask, prefix; - u64 *pei_block = &vsie_page->scb_o->mcic; - int edat, rc_dest, rc_src; - union ctlreg0 cr0; -@@ -847,9 +847,12 @@ static int vsie_handle_mvpg(struct kvm_v - cr0.val = vcpu->arch.sie_block->gcr[0]; - edat = cr0.edat && test_kvm_facility(vcpu->kvm, 8); - mask = _kvm_s390_logical_to_effective(&scb_s->gpsw, PAGE_MASK); -+ prefix = scb_s->prefix << GUEST_PREFIX_SHIFT; - - dest = vsie_get_register(vcpu, vsie_page, scb_s->ipb >> 20) & mask; -+ dest = _kvm_s390_real_to_abs(prefix, dest) + scb_s->mso; - src = vsie_get_register(vcpu, vsie_page, scb_s->ipb >> 16) & mask; -+ src = _kvm_s390_real_to_abs(prefix, src) + scb_s->mso; - - rc_dest = kvm_s390_shadow_fault(vcpu, vsie_page->gmap, dest, &pei_dest); - rc_src = kvm_s390_shadow_fault(vcpu, vsie_page->gmap, src, &pei_src); diff --git a/queue-4.19/kvm-s390-extend-kvm_s390_shadow_fault-to-return-entry-pointer.patch b/queue-4.19/kvm-s390-extend-kvm_s390_shadow_fault-to-return-entry-pointer.patch deleted file mode 100644 index 2a54ecb4038..00000000000 --- a/queue-4.19/kvm-s390-extend-kvm_s390_shadow_fault-to-return-entry-pointer.patch +++ /dev/null @@ -1,172 +0,0 @@ -From 5ac14bac08ae827b619f21bcceaaac3b8c497e31 Mon Sep 17 00:00:00 2001 -From: Claudio Imbrenda -Date: Mon, 1 Feb 2021 17:26:54 +0100 -Subject: KVM: s390: extend kvm_s390_shadow_fault to return entry pointer - -From: Claudio Imbrenda - -commit 5ac14bac08ae827b619f21bcceaaac3b8c497e31 upstream. - -Extend kvm_s390_shadow_fault to return the pointer to the valid leaf -DAT table entry, or to the invalid entry. - -Also return some flags in the lower bits of the address: -PEI_DAT_PROT: indicates that DAT protection applies because of the - protection bit in the segment (or, if EDAT, region) tables. -PEI_NOT_PTE: indicates that the address of the DAT table entry returned - does not refer to a PTE, but to a segment or region table. - -Signed-off-by: Claudio Imbrenda -Cc: stable@vger.kernel.org -Reviewed-by: Janosch Frank -Reviewed-by: David Hildenbrand -Reviewed-by: Christian Borntraeger -Link: https://lore.kernel.org/r/20210302174443.514363-3-imbrenda@linux.ibm.com -[borntraeger@de.ibm.com: fold in a fix from Claudio] -Signed-off-by: Christian Borntraeger -Signed-off-by: Greg Kroah-Hartman ---- - arch/s390/kvm/gaccess.c | 30 +++++++++++++++++++++++++----- - arch/s390/kvm/gaccess.h | 6 +++++- - arch/s390/kvm/vsie.c | 8 ++++---- - 3 files changed, 34 insertions(+), 10 deletions(-) - ---- a/arch/s390/kvm/gaccess.c -+++ b/arch/s390/kvm/gaccess.c -@@ -976,7 +976,9 @@ int kvm_s390_check_low_addr_prot_real(st - * kvm_s390_shadow_tables - walk the guest page table and create shadow tables - * @sg: pointer to the shadow guest address space structure - * @saddr: faulting address in the shadow gmap -- * @pgt: pointer to the page table address result -+ * @pgt: pointer to the beginning of the page table for the given address if -+ * successful (return value 0), or to the first invalid DAT entry in -+ * case of exceptions (return value > 0) - * @fake: pgt references contiguous guest memory block, not a pgtable - */ - static int kvm_s390_shadow_tables(struct gmap *sg, unsigned long saddr, -@@ -1034,6 +1036,7 @@ static int kvm_s390_shadow_tables(struct - rfte.val = ptr; - goto shadow_r2t; - } -+ *pgt = ptr + vaddr.rfx * 8; - rc = gmap_read_table(parent, ptr + vaddr.rfx * 8, &rfte.val); - if (rc) - return rc; -@@ -1059,6 +1062,7 @@ shadow_r2t: - rste.val = ptr; - goto shadow_r3t; - } -+ *pgt = ptr + vaddr.rsx * 8; - rc = gmap_read_table(parent, ptr + vaddr.rsx * 8, &rste.val); - if (rc) - return rc; -@@ -1085,6 +1089,7 @@ shadow_r3t: - rtte.val = ptr; - goto shadow_sgt; - } -+ *pgt = ptr + vaddr.rtx * 8; - rc = gmap_read_table(parent, ptr + vaddr.rtx * 8, &rtte.val); - if (rc) - return rc; -@@ -1120,6 +1125,7 @@ shadow_sgt: - ste.val = ptr; - goto shadow_pgt; - } -+ *pgt = ptr + vaddr.sx * 8; - rc = gmap_read_table(parent, ptr + vaddr.sx * 8, &ste.val); - if (rc) - return rc; -@@ -1154,6 +1160,8 @@ shadow_pgt: - * @vcpu: virtual cpu - * @sg: pointer to the shadow guest address space structure - * @saddr: faulting address in the shadow gmap -+ * @datptr: will contain the address of the faulting DAT table entry, or of -+ * the valid leaf, plus some flags - * - * Returns: - 0 if the shadow fault was successfully resolved - * - > 0 (pgm exception code) on exceptions while faulting -@@ -1162,11 +1170,11 @@ shadow_pgt: - * - -ENOMEM if out of memory - */ - int kvm_s390_shadow_fault(struct kvm_vcpu *vcpu, struct gmap *sg, -- unsigned long saddr) -+ unsigned long saddr, unsigned long *datptr) - { - union vaddress vaddr; - union page_table_entry pte; -- unsigned long pgt; -+ unsigned long pgt = 0; - int dat_protection, fake; - int rc; - -@@ -1188,8 +1196,20 @@ int kvm_s390_shadow_fault(struct kvm_vcp - pte.val = pgt + vaddr.px * PAGE_SIZE; - goto shadow_page; - } -- if (!rc) -- rc = gmap_read_table(sg->parent, pgt + vaddr.px * 8, &pte.val); -+ -+ switch (rc) { -+ case PGM_SEGMENT_TRANSLATION: -+ case PGM_REGION_THIRD_TRANS: -+ case PGM_REGION_SECOND_TRANS: -+ case PGM_REGION_FIRST_TRANS: -+ pgt |= PEI_NOT_PTE; -+ break; -+ case 0: -+ pgt += vaddr.px * 8; -+ rc = gmap_read_table(sg->parent, pgt, &pte.val); -+ } -+ if (datptr) -+ *datptr = pgt | dat_protection * PEI_DAT_PROT; - if (!rc && pte.i) - rc = PGM_PAGE_TRANSLATION; - if (!rc && pte.z) ---- a/arch/s390/kvm/gaccess.h -+++ b/arch/s390/kvm/gaccess.h -@@ -387,7 +387,11 @@ void ipte_unlock(struct kvm_vcpu *vcpu); - int ipte_lock_held(struct kvm_vcpu *vcpu); - int kvm_s390_check_low_addr_prot_real(struct kvm_vcpu *vcpu, unsigned long gra); - -+/* MVPG PEI indication bits */ -+#define PEI_DAT_PROT 2 -+#define PEI_NOT_PTE 4 -+ - int kvm_s390_shadow_fault(struct kvm_vcpu *vcpu, struct gmap *shadow, -- unsigned long saddr); -+ unsigned long saddr, unsigned long *datptr); - - #endif /* __KVM_S390_GACCESS_H */ ---- a/arch/s390/kvm/vsie.c -+++ b/arch/s390/kvm/vsie.c -@@ -447,10 +447,10 @@ static int map_prefix(struct kvm_vcpu *v - /* with mso/msl, the prefix lies at offset *mso* */ - prefix += scb_s->mso; - -- rc = kvm_s390_shadow_fault(vcpu, vsie_page->gmap, prefix); -+ rc = kvm_s390_shadow_fault(vcpu, vsie_page->gmap, prefix, NULL); - if (!rc && (scb_s->ecb & ECB_TE)) - rc = kvm_s390_shadow_fault(vcpu, vsie_page->gmap, -- prefix + PAGE_SIZE); -+ prefix + PAGE_SIZE, NULL); - /* - * We don't have to mprotect, we will be called for all unshadows. - * SIE will detect if protection applies and trigger a validity. -@@ -741,7 +741,7 @@ static int handle_fault(struct kvm_vcpu - current->thread.gmap_addr, 1); - - rc = kvm_s390_shadow_fault(vcpu, vsie_page->gmap, -- current->thread.gmap_addr); -+ current->thread.gmap_addr, NULL); - if (rc > 0) { - rc = inject_fault(vcpu, rc, - current->thread.gmap_addr, -@@ -763,7 +763,7 @@ static void handle_last_fault(struct kvm - { - if (vsie_page->fault_addr) - kvm_s390_shadow_fault(vcpu, vsie_page->gmap, -- vsie_page->fault_addr); -+ vsie_page->fault_addr, NULL); - vsie_page->fault_addr = 0; - } - diff --git a/queue-4.19/kvm-s390-vsie-correctly-handle-mvpg-when-in-vsie.patch b/queue-4.19/kvm-s390-vsie-correctly-handle-mvpg-when-in-vsie.patch deleted file mode 100644 index 327a3e90d41..00000000000 --- a/queue-4.19/kvm-s390-vsie-correctly-handle-mvpg-when-in-vsie.patch +++ /dev/null @@ -1,146 +0,0 @@ -From bdf7509bbefa20855d5f6bacdc5b62a8489477c9 Mon Sep 17 00:00:00 2001 -From: Claudio Imbrenda -Date: Mon, 1 Feb 2021 21:54:13 +0100 -Subject: KVM: s390: VSIE: correctly handle MVPG when in VSIE - -From: Claudio Imbrenda - -commit bdf7509bbefa20855d5f6bacdc5b62a8489477c9 upstream. - -Correctly handle the MVPG instruction when issued by a VSIE guest. - -Fixes: a3508fbe9dc6d ("KVM: s390: vsie: initial support for nested virtualization") -Cc: stable@vger.kernel.org # f85f1baaa189: KVM: s390: split kvm_s390_logical_to_effective -Signed-off-by: Claudio Imbrenda -Acked-by: Janosch Frank -Reviewed-by: David Hildenbrand -Acked-by: Christian Borntraeger -Link: https://lore.kernel.org/r/20210302174443.514363-4-imbrenda@linux.ibm.com -[borntraeger@de.ibm.com: apply fixup from Claudio] -Signed-off-by: Christian Borntraeger -Signed-off-by: Greg Kroah-Hartman ---- - arch/s390/kvm/vsie.c | 98 ++++++++++++++++++++++++++++++++++++++++++++++++--- - 1 file changed, 93 insertions(+), 5 deletions(-) - ---- a/arch/s390/kvm/vsie.c -+++ b/arch/s390/kvm/vsie.c -@@ -252,11 +252,6 @@ static void unshadow_scb(struct kvm_vcpu - memcpy((void *)((u64)scb_o + 0xc0), - (void *)((u64)scb_s + 0xc0), 0xf0 - 0xc0); - break; -- case ICPT_PARTEXEC: -- /* MVPG only */ -- memcpy((void *)((u64)scb_o + 0xc0), -- (void *)((u64)scb_s + 0xc0), 0xd0 - 0xc0); -- break; - } - - if (scb_s->ihcpu != 0xffffU) -@@ -816,6 +811,95 @@ static int handle_stfle(struct kvm_vcpu - } - - /* -+ * Get a register for a nested guest. -+ * @vcpu the vcpu of the guest -+ * @vsie_page the vsie_page for the nested guest -+ * @reg the register number, the upper 4 bits are ignored. -+ * returns: the value of the register. -+ */ -+static u64 vsie_get_register(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page, u8 reg) -+{ -+ /* no need to validate the parameter and/or perform error handling */ -+ reg &= 0xf; -+ switch (reg) { -+ case 15: -+ return vsie_page->scb_s.gg15; -+ case 14: -+ return vsie_page->scb_s.gg14; -+ default: -+ return vcpu->run->s.regs.gprs[reg]; -+ } -+} -+ -+static int vsie_handle_mvpg(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page) -+{ -+ struct kvm_s390_sie_block *scb_s = &vsie_page->scb_s; -+ unsigned long pei_dest, pei_src, src, dest, mask; -+ u64 *pei_block = &vsie_page->scb_o->mcic; -+ int edat, rc_dest, rc_src; -+ union ctlreg0 cr0; -+ -+ cr0.val = vcpu->arch.sie_block->gcr[0]; -+ edat = cr0.edat && test_kvm_facility(vcpu->kvm, 8); -+ mask = _kvm_s390_logical_to_effective(&scb_s->gpsw, PAGE_MASK); -+ -+ dest = vsie_get_register(vcpu, vsie_page, scb_s->ipb >> 20) & mask; -+ src = vsie_get_register(vcpu, vsie_page, scb_s->ipb >> 16) & mask; -+ -+ rc_dest = kvm_s390_shadow_fault(vcpu, vsie_page->gmap, dest, &pei_dest); -+ rc_src = kvm_s390_shadow_fault(vcpu, vsie_page->gmap, src, &pei_src); -+ /* -+ * Either everything went well, or something non-critical went wrong -+ * e.g. because of a race. In either case, simply retry. -+ */ -+ if (rc_dest == -EAGAIN || rc_src == -EAGAIN || (!rc_dest && !rc_src)) { -+ retry_vsie_icpt(vsie_page); -+ return -EAGAIN; -+ } -+ /* Something more serious went wrong, propagate the error */ -+ if (rc_dest < 0) -+ return rc_dest; -+ if (rc_src < 0) -+ return rc_src; -+ -+ /* The only possible suppressing exception: just deliver it */ -+ if (rc_dest == PGM_TRANSLATION_SPEC || rc_src == PGM_TRANSLATION_SPEC) { -+ clear_vsie_icpt(vsie_page); -+ rc_dest = kvm_s390_inject_program_int(vcpu, PGM_TRANSLATION_SPEC); -+ WARN_ON_ONCE(rc_dest); -+ return 1; -+ } -+ -+ /* -+ * Forward the PEI intercept to the guest if it was a page fault, or -+ * also for segment and region table faults if EDAT applies. -+ */ -+ if (edat) { -+ rc_dest = rc_dest == PGM_ASCE_TYPE ? rc_dest : 0; -+ rc_src = rc_src == PGM_ASCE_TYPE ? rc_src : 0; -+ } else { -+ rc_dest = rc_dest != PGM_PAGE_TRANSLATION ? rc_dest : 0; -+ rc_src = rc_src != PGM_PAGE_TRANSLATION ? rc_src : 0; -+ } -+ if (!rc_dest && !rc_src) { -+ pei_block[0] = pei_dest; -+ pei_block[1] = pei_src; -+ return 1; -+ } -+ -+ retry_vsie_icpt(vsie_page); -+ -+ /* -+ * The host has edat, and the guest does not, or it was an ASCE type -+ * exception. The host needs to inject the appropriate DAT interrupts -+ * into the guest. -+ */ -+ if (rc_dest) -+ return inject_fault(vcpu, rc_dest, dest, 1); -+ return inject_fault(vcpu, rc_src, src, 0); -+} -+ -+/* - * Run the vsie on a shadow scb and a shadow gmap, without any further - * sanity checks, handling SIE faults. - * -@@ -895,6 +979,10 @@ static int do_vsie_run(struct kvm_vcpu * - if ((scb_s->ipa & 0xf000) != 0xf000) - scb_s->ipa += 0x1000; - break; -+ case ICPT_PARTEXEC: -+ if (scb_s->ipa == 0xb254) -+ rc = vsie_handle_mvpg(vcpu, vsie_page); -+ break; - } - return rc; - } diff --git a/queue-4.19/kvm-s390-vsie-fix-mvpg-handling-for-prefixing-and-mso.patch b/queue-4.19/kvm-s390-vsie-fix-mvpg-handling-for-prefixing-and-mso.patch deleted file mode 100644 index 5863706bb24..00000000000 --- a/queue-4.19/kvm-s390-vsie-fix-mvpg-handling-for-prefixing-and-mso.patch +++ /dev/null @@ -1,52 +0,0 @@ -From c3171e94cc1cdcc3229565244112e869f052b8d9 Mon Sep 17 00:00:00 2001 -From: Claudio Imbrenda -Date: Mon, 22 Mar 2021 15:05:59 +0100 -Subject: KVM: s390: VSIE: fix MVPG handling for prefixing and MSO - -From: Claudio Imbrenda - -commit c3171e94cc1cdcc3229565244112e869f052b8d9 upstream. - -Prefixing needs to be applied to the guest real address to translate it -into a guest absolute address. - -The value of MSO needs to be added to a guest-absolute address in order to -obtain the host-virtual. - -Fixes: bdf7509bbefa ("s390/kvm: VSIE: correctly handle MVPG when in VSIE") -Reported-by: Janosch Frank -Signed-off-by: Claudio Imbrenda -Reviewed-by: David Hildenbrand -Cc: stable@vger.kernel.org -Link: https://lore.kernel.org/r/20210322140559.500716-3-imbrenda@linux.ibm.com -[borntraeger@de.ibm.com simplify mso] -Signed-off-by: Christian Borntraeger -Signed-off-by: Greg Kroah-Hartman ---- - arch/s390/kvm/vsie.c | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - ---- a/arch/s390/kvm/vsie.c -+++ b/arch/s390/kvm/vsie.c -@@ -834,7 +834,7 @@ static u64 vsie_get_register(struct kvm_ - static int vsie_handle_mvpg(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page) - { - struct kvm_s390_sie_block *scb_s = &vsie_page->scb_s; -- unsigned long pei_dest, pei_src, src, dest, mask; -+ unsigned long pei_dest, pei_src, src, dest, mask, prefix; - u64 *pei_block = &vsie_page->scb_o->mcic; - int edat, rc_dest, rc_src; - union ctlreg0 cr0; -@@ -842,9 +842,12 @@ static int vsie_handle_mvpg(struct kvm_v - cr0.val = vcpu->arch.sie_block->gcr[0]; - edat = cr0.edat && test_kvm_facility(vcpu->kvm, 8); - mask = _kvm_s390_logical_to_effective(&scb_s->gpsw, PAGE_MASK); -+ prefix = scb_s->prefix << GUEST_PREFIX_SHIFT; - - dest = vsie_get_register(vcpu, vsie_page, scb_s->ipb >> 20) & mask; -+ dest = _kvm_s390_real_to_abs(prefix, dest) + scb_s->mso; - src = vsie_get_register(vcpu, vsie_page, scb_s->ipb >> 16) & mask; -+ src = _kvm_s390_real_to_abs(prefix, src) + scb_s->mso; - - rc_dest = kvm_s390_shadow_fault(vcpu, vsie_page->gmap, dest, &pei_dest); - rc_src = kvm_s390_shadow_fault(vcpu, vsie_page->gmap, src, &pei_src); diff --git a/queue-5.4/kvm-s390-extend-kvm_s390_shadow_fault-to-return-entry-pointer.patch b/queue-5.4/kvm-s390-extend-kvm_s390_shadow_fault-to-return-entry-pointer.patch deleted file mode 100644 index dec4c0f1abf..00000000000 --- a/queue-5.4/kvm-s390-extend-kvm_s390_shadow_fault-to-return-entry-pointer.patch +++ /dev/null @@ -1,172 +0,0 @@ -From 5ac14bac08ae827b619f21bcceaaac3b8c497e31 Mon Sep 17 00:00:00 2001 -From: Claudio Imbrenda -Date: Mon, 1 Feb 2021 17:26:54 +0100 -Subject: KVM: s390: extend kvm_s390_shadow_fault to return entry pointer - -From: Claudio Imbrenda - -commit 5ac14bac08ae827b619f21bcceaaac3b8c497e31 upstream. - -Extend kvm_s390_shadow_fault to return the pointer to the valid leaf -DAT table entry, or to the invalid entry. - -Also return some flags in the lower bits of the address: -PEI_DAT_PROT: indicates that DAT protection applies because of the - protection bit in the segment (or, if EDAT, region) tables. -PEI_NOT_PTE: indicates that the address of the DAT table entry returned - does not refer to a PTE, but to a segment or region table. - -Signed-off-by: Claudio Imbrenda -Cc: stable@vger.kernel.org -Reviewed-by: Janosch Frank -Reviewed-by: David Hildenbrand -Reviewed-by: Christian Borntraeger -Link: https://lore.kernel.org/r/20210302174443.514363-3-imbrenda@linux.ibm.com -[borntraeger@de.ibm.com: fold in a fix from Claudio] -Signed-off-by: Christian Borntraeger -Signed-off-by: Greg Kroah-Hartman ---- - arch/s390/kvm/gaccess.c | 30 +++++++++++++++++++++++++----- - arch/s390/kvm/gaccess.h | 6 +++++- - arch/s390/kvm/vsie.c | 8 ++++---- - 3 files changed, 34 insertions(+), 10 deletions(-) - ---- a/arch/s390/kvm/gaccess.c -+++ b/arch/s390/kvm/gaccess.c -@@ -976,7 +976,9 @@ int kvm_s390_check_low_addr_prot_real(st - * kvm_s390_shadow_tables - walk the guest page table and create shadow tables - * @sg: pointer to the shadow guest address space structure - * @saddr: faulting address in the shadow gmap -- * @pgt: pointer to the page table address result -+ * @pgt: pointer to the beginning of the page table for the given address if -+ * successful (return value 0), or to the first invalid DAT entry in -+ * case of exceptions (return value > 0) - * @fake: pgt references contiguous guest memory block, not a pgtable - */ - static int kvm_s390_shadow_tables(struct gmap *sg, unsigned long saddr, -@@ -1034,6 +1036,7 @@ static int kvm_s390_shadow_tables(struct - rfte.val = ptr; - goto shadow_r2t; - } -+ *pgt = ptr + vaddr.rfx * 8; - rc = gmap_read_table(parent, ptr + vaddr.rfx * 8, &rfte.val); - if (rc) - return rc; -@@ -1059,6 +1062,7 @@ shadow_r2t: - rste.val = ptr; - goto shadow_r3t; - } -+ *pgt = ptr + vaddr.rsx * 8; - rc = gmap_read_table(parent, ptr + vaddr.rsx * 8, &rste.val); - if (rc) - return rc; -@@ -1085,6 +1089,7 @@ shadow_r3t: - rtte.val = ptr; - goto shadow_sgt; - } -+ *pgt = ptr + vaddr.rtx * 8; - rc = gmap_read_table(parent, ptr + vaddr.rtx * 8, &rtte.val); - if (rc) - return rc; -@@ -1120,6 +1125,7 @@ shadow_sgt: - ste.val = ptr; - goto shadow_pgt; - } -+ *pgt = ptr + vaddr.sx * 8; - rc = gmap_read_table(parent, ptr + vaddr.sx * 8, &ste.val); - if (rc) - return rc; -@@ -1154,6 +1160,8 @@ shadow_pgt: - * @vcpu: virtual cpu - * @sg: pointer to the shadow guest address space structure - * @saddr: faulting address in the shadow gmap -+ * @datptr: will contain the address of the faulting DAT table entry, or of -+ * the valid leaf, plus some flags - * - * Returns: - 0 if the shadow fault was successfully resolved - * - > 0 (pgm exception code) on exceptions while faulting -@@ -1162,11 +1170,11 @@ shadow_pgt: - * - -ENOMEM if out of memory - */ - int kvm_s390_shadow_fault(struct kvm_vcpu *vcpu, struct gmap *sg, -- unsigned long saddr) -+ unsigned long saddr, unsigned long *datptr) - { - union vaddress vaddr; - union page_table_entry pte; -- unsigned long pgt; -+ unsigned long pgt = 0; - int dat_protection, fake; - int rc; - -@@ -1188,8 +1196,20 @@ int kvm_s390_shadow_fault(struct kvm_vcp - pte.val = pgt + vaddr.px * PAGE_SIZE; - goto shadow_page; - } -- if (!rc) -- rc = gmap_read_table(sg->parent, pgt + vaddr.px * 8, &pte.val); -+ -+ switch (rc) { -+ case PGM_SEGMENT_TRANSLATION: -+ case PGM_REGION_THIRD_TRANS: -+ case PGM_REGION_SECOND_TRANS: -+ case PGM_REGION_FIRST_TRANS: -+ pgt |= PEI_NOT_PTE; -+ break; -+ case 0: -+ pgt += vaddr.px * 8; -+ rc = gmap_read_table(sg->parent, pgt, &pte.val); -+ } -+ if (datptr) -+ *datptr = pgt | dat_protection * PEI_DAT_PROT; - if (!rc && pte.i) - rc = PGM_PAGE_TRANSLATION; - if (!rc && pte.z) ---- a/arch/s390/kvm/gaccess.h -+++ b/arch/s390/kvm/gaccess.h -@@ -387,7 +387,11 @@ void ipte_unlock(struct kvm_vcpu *vcpu); - int ipte_lock_held(struct kvm_vcpu *vcpu); - int kvm_s390_check_low_addr_prot_real(struct kvm_vcpu *vcpu, unsigned long gra); - -+/* MVPG PEI indication bits */ -+#define PEI_DAT_PROT 2 -+#define PEI_NOT_PTE 4 -+ - int kvm_s390_shadow_fault(struct kvm_vcpu *vcpu, struct gmap *shadow, -- unsigned long saddr); -+ unsigned long saddr, unsigned long *datptr); - - #endif /* __KVM_S390_GACCESS_H */ ---- a/arch/s390/kvm/vsie.c -+++ b/arch/s390/kvm/vsie.c -@@ -613,10 +613,10 @@ static int map_prefix(struct kvm_vcpu *v - /* with mso/msl, the prefix lies at offset *mso* */ - prefix += scb_s->mso; - -- rc = kvm_s390_shadow_fault(vcpu, vsie_page->gmap, prefix); -+ rc = kvm_s390_shadow_fault(vcpu, vsie_page->gmap, prefix, NULL); - if (!rc && (scb_s->ecb & ECB_TE)) - rc = kvm_s390_shadow_fault(vcpu, vsie_page->gmap, -- prefix + PAGE_SIZE); -+ prefix + PAGE_SIZE, NULL); - /* - * We don't have to mprotect, we will be called for all unshadows. - * SIE will detect if protection applies and trigger a validity. -@@ -907,7 +907,7 @@ static int handle_fault(struct kvm_vcpu - current->thread.gmap_addr, 1); - - rc = kvm_s390_shadow_fault(vcpu, vsie_page->gmap, -- current->thread.gmap_addr); -+ current->thread.gmap_addr, NULL); - if (rc > 0) { - rc = inject_fault(vcpu, rc, - current->thread.gmap_addr, -@@ -929,7 +929,7 @@ static void handle_last_fault(struct kvm - { - if (vsie_page->fault_addr) - kvm_s390_shadow_fault(vcpu, vsie_page->gmap, -- vsie_page->fault_addr); -+ vsie_page->fault_addr, NULL); - vsie_page->fault_addr = 0; - } - diff --git a/queue-5.4/kvm-s390-vsie-correctly-handle-mvpg-when-in-vsie.patch b/queue-5.4/kvm-s390-vsie-correctly-handle-mvpg-when-in-vsie.patch deleted file mode 100644 index 1d58dd8b6b0..00000000000 --- a/queue-5.4/kvm-s390-vsie-correctly-handle-mvpg-when-in-vsie.patch +++ /dev/null @@ -1,146 +0,0 @@ -From bdf7509bbefa20855d5f6bacdc5b62a8489477c9 Mon Sep 17 00:00:00 2001 -From: Claudio Imbrenda -Date: Mon, 1 Feb 2021 21:54:13 +0100 -Subject: KVM: s390: VSIE: correctly handle MVPG when in VSIE - -From: Claudio Imbrenda - -commit bdf7509bbefa20855d5f6bacdc5b62a8489477c9 upstream. - -Correctly handle the MVPG instruction when issued by a VSIE guest. - -Fixes: a3508fbe9dc6d ("KVM: s390: vsie: initial support for nested virtualization") -Cc: stable@vger.kernel.org # f85f1baaa189: KVM: s390: split kvm_s390_logical_to_effective -Signed-off-by: Claudio Imbrenda -Acked-by: Janosch Frank -Reviewed-by: David Hildenbrand -Acked-by: Christian Borntraeger -Link: https://lore.kernel.org/r/20210302174443.514363-4-imbrenda@linux.ibm.com -[borntraeger@de.ibm.com: apply fixup from Claudio] -Signed-off-by: Christian Borntraeger -Signed-off-by: Greg Kroah-Hartman ---- - arch/s390/kvm/vsie.c | 98 ++++++++++++++++++++++++++++++++++++++++++++++++--- - 1 file changed, 93 insertions(+), 5 deletions(-) - ---- a/arch/s390/kvm/vsie.c -+++ b/arch/s390/kvm/vsie.c -@@ -416,11 +416,6 @@ static void unshadow_scb(struct kvm_vcpu - memcpy((void *)((u64)scb_o + 0xc0), - (void *)((u64)scb_s + 0xc0), 0xf0 - 0xc0); - break; -- case ICPT_PARTEXEC: -- /* MVPG only */ -- memcpy((void *)((u64)scb_o + 0xc0), -- (void *)((u64)scb_s + 0xc0), 0xd0 - 0xc0); -- break; - } - - if (scb_s->ihcpu != 0xffffU) -@@ -982,6 +977,95 @@ static int handle_stfle(struct kvm_vcpu - } - - /* -+ * Get a register for a nested guest. -+ * @vcpu the vcpu of the guest -+ * @vsie_page the vsie_page for the nested guest -+ * @reg the register number, the upper 4 bits are ignored. -+ * returns: the value of the register. -+ */ -+static u64 vsie_get_register(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page, u8 reg) -+{ -+ /* no need to validate the parameter and/or perform error handling */ -+ reg &= 0xf; -+ switch (reg) { -+ case 15: -+ return vsie_page->scb_s.gg15; -+ case 14: -+ return vsie_page->scb_s.gg14; -+ default: -+ return vcpu->run->s.regs.gprs[reg]; -+ } -+} -+ -+static int vsie_handle_mvpg(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page) -+{ -+ struct kvm_s390_sie_block *scb_s = &vsie_page->scb_s; -+ unsigned long pei_dest, pei_src, src, dest, mask; -+ u64 *pei_block = &vsie_page->scb_o->mcic; -+ int edat, rc_dest, rc_src; -+ union ctlreg0 cr0; -+ -+ cr0.val = vcpu->arch.sie_block->gcr[0]; -+ edat = cr0.edat && test_kvm_facility(vcpu->kvm, 8); -+ mask = _kvm_s390_logical_to_effective(&scb_s->gpsw, PAGE_MASK); -+ -+ dest = vsie_get_register(vcpu, vsie_page, scb_s->ipb >> 20) & mask; -+ src = vsie_get_register(vcpu, vsie_page, scb_s->ipb >> 16) & mask; -+ -+ rc_dest = kvm_s390_shadow_fault(vcpu, vsie_page->gmap, dest, &pei_dest); -+ rc_src = kvm_s390_shadow_fault(vcpu, vsie_page->gmap, src, &pei_src); -+ /* -+ * Either everything went well, or something non-critical went wrong -+ * e.g. because of a race. In either case, simply retry. -+ */ -+ if (rc_dest == -EAGAIN || rc_src == -EAGAIN || (!rc_dest && !rc_src)) { -+ retry_vsie_icpt(vsie_page); -+ return -EAGAIN; -+ } -+ /* Something more serious went wrong, propagate the error */ -+ if (rc_dest < 0) -+ return rc_dest; -+ if (rc_src < 0) -+ return rc_src; -+ -+ /* The only possible suppressing exception: just deliver it */ -+ if (rc_dest == PGM_TRANSLATION_SPEC || rc_src == PGM_TRANSLATION_SPEC) { -+ clear_vsie_icpt(vsie_page); -+ rc_dest = kvm_s390_inject_program_int(vcpu, PGM_TRANSLATION_SPEC); -+ WARN_ON_ONCE(rc_dest); -+ return 1; -+ } -+ -+ /* -+ * Forward the PEI intercept to the guest if it was a page fault, or -+ * also for segment and region table faults if EDAT applies. -+ */ -+ if (edat) { -+ rc_dest = rc_dest == PGM_ASCE_TYPE ? rc_dest : 0; -+ rc_src = rc_src == PGM_ASCE_TYPE ? rc_src : 0; -+ } else { -+ rc_dest = rc_dest != PGM_PAGE_TRANSLATION ? rc_dest : 0; -+ rc_src = rc_src != PGM_PAGE_TRANSLATION ? rc_src : 0; -+ } -+ if (!rc_dest && !rc_src) { -+ pei_block[0] = pei_dest; -+ pei_block[1] = pei_src; -+ return 1; -+ } -+ -+ retry_vsie_icpt(vsie_page); -+ -+ /* -+ * The host has edat, and the guest does not, or it was an ASCE type -+ * exception. The host needs to inject the appropriate DAT interrupts -+ * into the guest. -+ */ -+ if (rc_dest) -+ return inject_fault(vcpu, rc_dest, dest, 1); -+ return inject_fault(vcpu, rc_src, src, 0); -+} -+ -+/* - * Run the vsie on a shadow scb and a shadow gmap, without any further - * sanity checks, handling SIE faults. - * -@@ -1072,6 +1156,10 @@ static int do_vsie_run(struct kvm_vcpu * - if ((scb_s->ipa & 0xf000) != 0xf000) - scb_s->ipa += 0x1000; - break; -+ case ICPT_PARTEXEC: -+ if (scb_s->ipa == 0xb254) -+ rc = vsie_handle_mvpg(vcpu, vsie_page); -+ break; - } - return rc; - } diff --git a/queue-5.4/kvm-s390-vsie-fix-mvpg-handling-for-prefixing-and-mso.patch b/queue-5.4/kvm-s390-vsie-fix-mvpg-handling-for-prefixing-and-mso.patch deleted file mode 100644 index 1dd4e4e8ad4..00000000000 --- a/queue-5.4/kvm-s390-vsie-fix-mvpg-handling-for-prefixing-and-mso.patch +++ /dev/null @@ -1,52 +0,0 @@ -From c3171e94cc1cdcc3229565244112e869f052b8d9 Mon Sep 17 00:00:00 2001 -From: Claudio Imbrenda -Date: Mon, 22 Mar 2021 15:05:59 +0100 -Subject: KVM: s390: VSIE: fix MVPG handling for prefixing and MSO - -From: Claudio Imbrenda - -commit c3171e94cc1cdcc3229565244112e869f052b8d9 upstream. - -Prefixing needs to be applied to the guest real address to translate it -into a guest absolute address. - -The value of MSO needs to be added to a guest-absolute address in order to -obtain the host-virtual. - -Fixes: bdf7509bbefa ("s390/kvm: VSIE: correctly handle MVPG when in VSIE") -Reported-by: Janosch Frank -Signed-off-by: Claudio Imbrenda -Reviewed-by: David Hildenbrand -Cc: stable@vger.kernel.org -Link: https://lore.kernel.org/r/20210322140559.500716-3-imbrenda@linux.ibm.com -[borntraeger@de.ibm.com simplify mso] -Signed-off-by: Christian Borntraeger -Signed-off-by: Greg Kroah-Hartman ---- - arch/s390/kvm/vsie.c | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - ---- a/arch/s390/kvm/vsie.c -+++ b/arch/s390/kvm/vsie.c -@@ -1000,7 +1000,7 @@ static u64 vsie_get_register(struct kvm_ - static int vsie_handle_mvpg(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page) - { - struct kvm_s390_sie_block *scb_s = &vsie_page->scb_s; -- unsigned long pei_dest, pei_src, src, dest, mask; -+ unsigned long pei_dest, pei_src, src, dest, mask, prefix; - u64 *pei_block = &vsie_page->scb_o->mcic; - int edat, rc_dest, rc_src; - union ctlreg0 cr0; -@@ -1008,9 +1008,12 @@ static int vsie_handle_mvpg(struct kvm_v - cr0.val = vcpu->arch.sie_block->gcr[0]; - edat = cr0.edat && test_kvm_facility(vcpu->kvm, 8); - mask = _kvm_s390_logical_to_effective(&scb_s->gpsw, PAGE_MASK); -+ prefix = scb_s->prefix << GUEST_PREFIX_SHIFT; - - dest = vsie_get_register(vcpu, vsie_page, scb_s->ipb >> 20) & mask; -+ dest = _kvm_s390_real_to_abs(prefix, dest) + scb_s->mso; - src = vsie_get_register(vcpu, vsie_page, scb_s->ipb >> 16) & mask; -+ src = _kvm_s390_real_to_abs(prefix, src) + scb_s->mso; - - rc_dest = kvm_s390_shadow_fault(vcpu, vsie_page->gmap, dest, &pei_dest); - rc_src = kvm_s390_shadow_fault(vcpu, vsie_page->gmap, src, &pei_src);