diff --git a/0201-spapr-Don-t-trigger-a-CAS-reboot-for-XICS-XIVE-mode-.patch b/0201-spapr-Don-t-trigger-a-CAS-reboot-for-XICS-XIVE-mode-.patch
new file mode 100644
index 0000000..812a801
--- /dev/null
+++ b/0201-spapr-Don-t-trigger-a-CAS-reboot-for-XICS-XIVE-mode-.patch
@@ -0,0 +1,90 @@
+From: David Gibson <david@gibson.dropbear.id.au>
+Date: Fri, 18 Oct 2019 15:19:31 +1100
+Subject: [PATCH] spapr: Don't trigger a CAS reboot for XICS/XIVE mode
+ changeover
+
+PAPR allows the interrupt controller used on a POWER9 machine (XICS or
+XIVE) to be selected by the guest operating system, by using the
+ibm,client-architecture-support (CAS) feature negotiation call.
+
+Currently, if the guest selects an interrupt controller different from the
+one selected at initial boot, this causes the system to be reset with the
+new model and the boot starts again.  This means we run through the SLOF
+boot process twice, as well as any other bootloader (e.g. grub) in use
+before the OS calls CAS.  This can be confusing and/or inconvenient for
+users.
+
+Thanks to two fairly recent changes, we no longer need this reboot.  1) we
+now completely regenerate the device tree when CAS is called (meaning we
+don't need special case updates for all the device tree changes caused by
+the interrupt controller mode change),  2) we now have explicit code paths
+to activate and deactivate the different interrupt controllers, rather than
+just implicitly calling those at machine reset time.
+
+We can therefore eliminate the reboot for changing irq mode, simply by
+putting a call to spapr_irq_update_active_intc() before we call
+spapr_h_cas_compose_response() (which gives the updated device tree to
+the guest firmware and OS).
+
+Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
+Reviewed-by: Cedric Le Goater <clg@fr.ibm.com>
+Reviewed-by: Greg Kurz <groug@kaod.org>
+(cherry picked from commit 8deb8019d696c75e6ecaee7545026b62aba2f1bb)
+---
+ hw/ppc/spapr_hcall.c | 33 +++++++++++++--------------------
+ 1 file changed, 13 insertions(+), 20 deletions(-)
+
+diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c
+index 140f05c1c6..05a7ca275b 100644
+--- a/hw/ppc/spapr_hcall.c
++++ b/hw/ppc/spapr_hcall.c
+@@ -1767,21 +1767,10 @@ static target_ulong h_client_architecture_support(PowerPCCPU *cpu,
+     }
+     spapr->cas_pre_isa3_guest = !spapr_ovec_test(ov1_guest, OV1_PPC_3_00);
+     spapr_ovec_cleanup(ov1_guest);
+-    if (!spapr->cas_reboot) {
+-        /* If spapr_machine_reset() did not set up a HPT but one is necessary
+-         * (because the guest isn't going to use radix) then set it up here. */
+-        if ((spapr->patb_entry & PATE1_GR) && !guest_radix) {
+-            /* legacy hash or new hash: */
+-            spapr_setup_hpt_and_vrma(spapr);
+-        }
+-        spapr->cas_reboot =
+-            (spapr_h_cas_compose_response(spapr, args[1], args[2],
+-                                          ov5_updates) != 0);
+-    }
+ 
+     /*
+-     * Ensure the guest asks for an interrupt mode we support; otherwise
+-     * terminate the boot.
++     * Ensure the guest asks for an interrupt mode we support;
++     * otherwise terminate the boot.
+      */
+     if (guest_xive) {
+         if (!spapr->irq->xive) {
+@@ -1797,14 +1786,18 @@ static target_ulong h_client_architecture_support(PowerPCCPU *cpu,
+         }
+     }
+ 
+-    /*
+-     * Generate a machine reset when we have an update of the
+-     * interrupt mode. Only required when the machine supports both
+-     * modes.
+-     */
++    spapr_irq_update_active_intc(spapr);
++
+     if (!spapr->cas_reboot) {
+-        spapr->cas_reboot = spapr_ovec_test(ov5_updates, OV5_XIVE_EXPLOIT)
+-            && spapr->irq->xics && spapr->irq->xive;
++        /* If spapr_machine_reset() did not set up a HPT but one is necessary
++         * (because the guest isn't going to use radix) then set it up here. */
++        if ((spapr->patb_entry & PATE1_GR) && !guest_radix) {
++            /* legacy hash or new hash: */
++            spapr_setup_hpt_and_vrma(spapr);
++        }
++        spapr->cas_reboot =
++            (spapr_h_cas_compose_response(spapr, args[1], args[2],
++                                          ov5_updates) != 0);
+     }
+ 
+     spapr_ovec_cleanup(ov5_updates);
diff --git a/qemu.spec b/qemu.spec
index 0328d23..1720b5c 100644
--- a/qemu.spec
+++ b/qemu.spec
@@ -161,7 +161,7 @@
 Summary: QEMU is a FAST! processor emulator
 Name: qemu
 Version: 4.2.0
-Release: 4%{?rcrel}%{?dist}
+Release: 5%{?rcrel}%{?dist}
 Epoch: 2
 License: GPLv2 and BSD and MIT and CC-BY
 URL: http://www.qemu.org/
@@ -306,6 +306,9 @@ Patch0115: 0115-virtiofsd-passthrough_ll-Pass-errno-to-fuse_reply_er.patch
 Patch0116: 0116-virtiofsd-stop-all-queue-threads-on-exit-in-virtio_l.patch
 Patch0117: 0117-virtiofsd-add-some-options-to-the-help-message.patch
 
+# Fix ppc shutdown issue (bz #1784961)
+Patch0201: 0201-spapr-Don-t-trigger-a-CAS-reboot-for-XICS-XIVE-mode-.patch
+
 
 # documentation deps
 BuildRequires: texinfo
@@ -2007,6 +2010,9 @@ getent passwd qemu >/dev/null || \
 
 
 %changelog
+* Sat Feb 15 2020 Cole Robinson <crobinso@redhat.com> - 2:4.2.0-5
+- Fix ppc shutdown issue (bz #1784961)
+
 * Tue Jan 28 2020 Cole Robinson <crobinso@redhat.com> - 2:4.2.0-4
 - virtio-fs support