]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.9-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 12 May 2021 10:24:51 +0000 (12:24 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 12 May 2021 10:24:51 +0000 (12:24 +0200)
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

queue-4.9/kvm-s390-split-kvm_s390_real_to_abs.patch [new file with mode: 0644]
queue-4.9/kvm-s390-vsie-correctly-handle-mvpg-when-in-vsie.patch [new file with mode: 0644]
queue-4.9/kvm-s390-vsie-fix-mvpg-handling-for-prefixing-and-mso.patch [new file with mode: 0644]
queue-4.9/series

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 (file)
index 0000000..76a119a
--- /dev/null
@@ -0,0 +1,71 @@
+From c5d1f6b531e68888cbe6718b3f77a60115d58b9c Mon Sep 17 00:00:00 2001
+From: Claudio Imbrenda <imbrenda@linux.ibm.com>
+Date: Mon, 22 Mar 2021 15:05:58 +0100
+Subject: KVM: s390: split kvm_s390_real_to_abs
+
+From: Claudio Imbrenda <imbrenda@linux.ibm.com>
+
+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 <imbrenda@linux.ibm.com>
+Reviewed-by: David Hildenbrand <david@redhat.com>
+Reviewed-by: Thomas Huth <thuth@redhat.com>
+Cc: stable@vger.kernel.org
+Link: https://lore.kernel.org/r/20210322140559.500716-2-imbrenda@linux.ibm.com
+Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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 (file)
index 0000000..64fa96a
--- /dev/null
@@ -0,0 +1,146 @@
+From bdf7509bbefa20855d5f6bacdc5b62a8489477c9 Mon Sep 17 00:00:00 2001
+From: Claudio Imbrenda <imbrenda@linux.ibm.com>
+Date: Mon, 1 Feb 2021 21:54:13 +0100
+Subject: KVM: s390: VSIE: correctly handle MVPG when in VSIE
+
+From: Claudio Imbrenda <imbrenda@linux.ibm.com>
+
+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 <imbrenda@linux.ibm.com>
+Acked-by: Janosch Frank <frankja@linux.ibm.com>
+Reviewed-by: David Hildenbrand <david@redhat.com>
+Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
+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 <borntraeger@de.ibm.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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 (file)
index 0000000..4db00d3
--- /dev/null
@@ -0,0 +1,52 @@
+From c3171e94cc1cdcc3229565244112e869f052b8d9 Mon Sep 17 00:00:00 2001
+From: Claudio Imbrenda <imbrenda@linux.ibm.com>
+Date: Mon, 22 Mar 2021 15:05:59 +0100
+Subject: KVM: s390: VSIE: fix MVPG handling for prefixing and MSO
+
+From: Claudio Imbrenda <imbrenda@linux.ibm.com>
+
+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 <frankja@linux.ibm.com>
+Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
+Reviewed-by: David Hildenbrand <david@redhat.com>
+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 <borntraeger@de.ibm.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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);
index dbe887f6bd7ada8144e3858b8ae1b1a35207e36e..ea873943ab82d03ad7a805d6162235ef34f4eba6 100644 (file)
@@ -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