From: Greg Kroah-Hartman Date: Wed, 12 May 2021 10:24:51 +0000 (+0200) Subject: 4.9-stable patches X-Git-Tag: v5.4.119~50 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=fea42e4bda54a7584ff0fd69b13ec6ae15fce8de;p=thirdparty%2Fkernel%2Fstable-queue.git 4.9-stable patches added patches: kvm-s390-split-kvm_s390_real_to_abs.patch kvm-s390-vsie-correctly-handle-mvpg-when-in-vsie.patch kvm-s390-vsie-fix-mvpg-handling-for-prefixing-and-mso.patch --- diff --git a/queue-4.9/kvm-s390-split-kvm_s390_real_to_abs.patch b/queue-4.9/kvm-s390-split-kvm_s390_real_to_abs.patch new file mode 100644 index 00000000000..76a119a20e7 --- /dev/null +++ b/queue-4.9/kvm-s390-split-kvm_s390_real_to_abs.patch @@ -0,0 +1,71 @@ +From c5d1f6b531e68888cbe6718b3f77a60115d58b9c Mon Sep 17 00:00:00 2001 +From: Claudio Imbrenda +Date: Mon, 22 Mar 2021 15:05:58 +0100 +Subject: KVM: s390: split kvm_s390_real_to_abs + +From: Claudio Imbrenda + +commit c5d1f6b531e68888cbe6718b3f77a60115d58b9c upstream. + +A new function _kvm_s390_real_to_abs will apply prefixing to a real address +with a given prefix value. + +The old kvm_s390_real_to_abs becomes now a wrapper around the new function. + +This is needed to avoid code duplication in vSIE. + +Signed-off-by: Claudio Imbrenda +Reviewed-by: David Hildenbrand +Reviewed-by: Thomas Huth +Cc: stable@vger.kernel.org +Link: https://lore.kernel.org/r/20210322140559.500716-2-imbrenda@linux.ibm.com +Signed-off-by: Christian Borntraeger +Signed-off-by: Greg Kroah-Hartman +--- + arch/s390/kvm/gaccess.h | 23 +++++++++++++++++------ + 1 file changed, 17 insertions(+), 6 deletions(-) + +--- a/arch/s390/kvm/gaccess.h ++++ b/arch/s390/kvm/gaccess.h +@@ -21,17 +21,14 @@ + + /** + * kvm_s390_real_to_abs - convert guest real address to guest absolute address +- * @vcpu - guest virtual cpu ++ * @prefix - guest prefix + * @gra - guest real address + * + * Returns the guest absolute address that corresponds to the passed guest real +- * address @gra of a virtual guest cpu by applying its prefix. ++ * address @gra of by applying the given prefix. + */ +-static inline unsigned long kvm_s390_real_to_abs(struct kvm_vcpu *vcpu, +- unsigned long gra) ++static inline unsigned long _kvm_s390_real_to_abs(u32 prefix, unsigned long gra) + { +- unsigned long prefix = kvm_s390_get_prefix(vcpu); +- + if (gra < 2 * PAGE_SIZE) + gra += prefix; + else if (gra >= prefix && gra < prefix + 2 * PAGE_SIZE) +@@ -40,6 +37,20 @@ static inline unsigned long kvm_s390_rea + } + + /** ++ * kvm_s390_real_to_abs - convert guest real address to guest absolute address ++ * @vcpu - guest virtual cpu ++ * @gra - guest real address ++ * ++ * Returns the guest absolute address that corresponds to the passed guest real ++ * address @gra of a virtual guest cpu by applying its prefix. ++ */ ++static inline unsigned long kvm_s390_real_to_abs(struct kvm_vcpu *vcpu, ++ unsigned long gra) ++{ ++ return _kvm_s390_real_to_abs(kvm_s390_get_prefix(vcpu), gra); ++} ++ ++/** + * kvm_s390_logical_to_effective - convert guest logical to effective address + * @vcpu: guest virtual cpu + * @ga: guest logical address diff --git a/queue-4.9/kvm-s390-vsie-correctly-handle-mvpg-when-in-vsie.patch b/queue-4.9/kvm-s390-vsie-correctly-handle-mvpg-when-in-vsie.patch new file mode 100644 index 00000000000..64fa96ad19e --- /dev/null +++ b/queue-4.9/kvm-s390-vsie-correctly-handle-mvpg-when-in-vsie.patch @@ -0,0 +1,146 @@ +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 +@@ -232,11 +232,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) +@@ -754,6 +749,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. + * +@@ -825,6 +909,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.9/kvm-s390-vsie-fix-mvpg-handling-for-prefixing-and-mso.patch b/queue-4.9/kvm-s390-vsie-fix-mvpg-handling-for-prefixing-and-mso.patch new file mode 100644 index 00000000000..4db00d3dbf5 --- /dev/null +++ b/queue-4.9/kvm-s390-vsie-fix-mvpg-handling-for-prefixing-and-mso.patch @@ -0,0 +1,52 @@ +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 +@@ -772,7 +772,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; +@@ -780,9 +780,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.9/series b/queue-4.9/series index dbe887f6bd7..ea873943ab8 100644 --- a/queue-4.9/series +++ b/queue-4.9/series @@ -89,3 +89,6 @@ alsa-hda-realtek-re-order-alc882-sony-quirk-table-entries.patch alsa-hda-realtek-re-order-alc269-sony-quirk-table-entries.patch alsa-hda-realtek-re-order-alc269-lenovo-quirk-table-entries.patch alsa-hda-realtek-remove-redundant-entry-for-alc861-haier-uniwill-devices.patch +kvm-s390-vsie-correctly-handle-mvpg-when-in-vsie.patch +kvm-s390-vsie-fix-mvpg-handling-for-prefixing-and-mso.patch +kvm-s390-split-kvm_s390_real_to_abs.patch