Blame SOURCES/kvm-spapr-fix-device-tree-properties-when-using-compatib.patch

4a2fec
From 384d7ebbde836477e00c19dbe5f68ece3e0fad1e Mon Sep 17 00:00:00 2001
4a2fec
From: Laurent Vivier <lvivier@redhat.com>
4a2fec
Date: Mon, 22 Jan 2018 16:48:48 +0100
4a2fec
Subject: [PATCH 21/21] spapr: fix device tree properties when using
4a2fec
 compatibility mode
4a2fec
4a2fec
RH-Author: Laurent Vivier <lvivier@redhat.com>
4a2fec
Message-id: <20180122164848.20486-1-lvivier@redhat.com>
4a2fec
Patchwork-id: 78694
4a2fec
O-Subject: [RHV7.5 qemu-kvm-rhev PATCH v2] spapr: fix device tree properties when using compatibility mode
4a2fec
Bugzilla: 1535752
4a2fec
RH-Acked-by: Thomas Huth <thuth@redhat.com>
4a2fec
RH-Acked-by: David Gibson <dgibson@redhat.com>
4a2fec
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
4a2fec
4a2fec
From: Greg Kurz <groug@kaod.org>
4a2fec
4a2fec
Commit 51f84465dd98 changed the compatility mode setting logic:
4a2fec
- machine reset only sets compatibility mode for the boot CPU
4a2fec
- compatibility mode is set for other CPUs when they are put online
4a2fec
  by the guest with the "start-cpu" RTAS call
4a2fec
4a2fec
This causes a regression for machines started with max-compat-cpu:
4a2fec
the device tree nodes related to secondary CPU cores contain wrong
4a2fec
"cpu-version" and "ibm,pa-features" values, as shown below.
4a2fec
4a2fec
Guest started on a POWER8 host with:
4a2fec
     -smp cores=2 -machine pseries,max-cpu-compat=compat7
4a2fec
4a2fec
                        ibm,pa-features = [18 00 f6 3f c7 c0 80 f0 80 00
4a2fec
 00 00 00 00 00 00 00 00 80 00 80 00 80 00 00 00];
4a2fec
                        cpu-version = <0x4d0200>;
4a2fec
4a2fec
                               ^^^
4a2fec
                        second CPU core
4a2fec
4a2fec
                        ibm,pa-features = <0x600f63f 0xc70080c0>;
4a2fec
                        cpu-version = <0xf000003>;
4a2fec
4a2fec
                               ^^^
4a2fec
                          boot CPU core
4a2fec
4a2fec
The second core is advertised in raw POWER8 mode. This happens because
4a2fec
CAS assumes all CPUs to have the same compatibility mode. Since the
4a2fec
boot CPU already has the requested compatibility mode, the CAS code
4a2fec
does not set it for the secondary one, and exposes the bogus device
4a2fec
tree properties in in the CAS response to the guest.
4a2fec
4a2fec
A similar situation is observed when hot-plugging a CPU core. The
4a2fec
related device tree properties are generated and exposed to guest
4a2fec
with the "ibm,configure-connector" RTAS before "start-cpu" is called.
4a2fec
The CPU core is advertised to the guest in raw mode as well.
4a2fec
4a2fec
It both cases, it boils down to the fact that "start-cpu" happens too
4a2fec
late. This can be fixed globally by propagating the compatibility mode
4a2fec
of the boot CPU to the other CPUs during reset.  For this to work, the
4a2fec
compatibility mode of the boot CPU must be set before the machine code
4a2fec
actually resets all CPUs.
4a2fec
4a2fec
It is not needed to set the compatibility mode in "start-cpu" anymore,
4a2fec
so the code is dropped.
4a2fec
4a2fec
Fixes: 51f84465dd98
4a2fec
Signed-off-by: Greg Kurz <groug@kaod.org>
4a2fec
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
4a2fec
(cherry picked from commit 9012a53f067a78022947e18050b145c34a3dc599)
4a2fec
Signed-off-by: Laurent Vivier <lvivier@redhat.com>
4a2fec
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
4a2fec
4a2fec
Conflicts:
4a2fec
	hw/ppc/spapr_rtas.c
4a2fec
because of missing commit:
4a2fec
9a94ee5bb1 "spapr/rtas: disable the decrementer interrupt when a "
4a2fec
            CPU is unplugged"
4a2fec
---
4a2fec
 hw/ppc/spapr.c          | 18 +++++++++---------
4a2fec
 hw/ppc/spapr_cpu_core.c |  7 +++++++
4a2fec
 hw/ppc/spapr_rtas.c     |  9 ---------
4a2fec
 3 files changed, 16 insertions(+), 18 deletions(-)
4a2fec
4a2fec
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
4a2fec
index 2bb3b61..4f1ab14 100644
4a2fec
--- a/hw/ppc/spapr.c
4a2fec
+++ b/hw/ppc/spapr.c
4a2fec
@@ -1442,6 +1442,15 @@ static void ppc_spapr_reset(void)
4a2fec
         spapr_setup_hpt_and_vrma(spapr);
4a2fec
     }
4a2fec
 
4a2fec
+    /* if this reset wasn't generated by CAS, we should reset our
4a2fec
+     * negotiated options and start from scratch */
4a2fec
+    if (!spapr->cas_reboot) {
4a2fec
+        spapr_ovec_cleanup(spapr->ov5_cas);
4a2fec
+        spapr->ov5_cas = spapr_ovec_new();
4a2fec
+
4a2fec
+        ppc_set_compat(first_ppc_cpu, spapr->max_compat_pvr, &error_fatal);
4a2fec
+    }
4a2fec
+
4a2fec
     qemu_devices_reset();
4a2fec
 
4a2fec
     /* DRC reset may cause a device to be unplugged. This will cause troubles
4a2fec
@@ -1462,15 +1471,6 @@ static void ppc_spapr_reset(void)
4a2fec
     rtas_addr = rtas_limit - RTAS_MAX_SIZE;
4a2fec
     fdt_addr = rtas_addr - FDT_MAX_SIZE;
4a2fec
 
4a2fec
-    /* if this reset wasn't generated by CAS, we should reset our
4a2fec
-     * negotiated options and start from scratch */
4a2fec
-    if (!spapr->cas_reboot) {
4a2fec
-        spapr_ovec_cleanup(spapr->ov5_cas);
4a2fec
-        spapr->ov5_cas = spapr_ovec_new();
4a2fec
-
4a2fec
-        ppc_set_compat(first_ppc_cpu, spapr->max_compat_pvr, &error_fatal);
4a2fec
-    }
4a2fec
-
4a2fec
     fdt = spapr_build_fdt(spapr, rtas_addr, spapr->rtas_size);
4a2fec
 
4a2fec
     spapr_load_rtas(spapr, fdt, rtas_addr);
4a2fec
diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c
4a2fec
index 30c15d5..fbabe49 100644
4a2fec
--- a/hw/ppc/spapr_cpu_core.c
4a2fec
+++ b/hw/ppc/spapr_cpu_core.c
4a2fec
@@ -101,6 +101,13 @@ static void spapr_cpu_reset(void *opaque)
4a2fec
             exit(1);
4a2fec
         }
4a2fec
     }
4a2fec
+
4a2fec
+    /* Set compatibility mode to match the boot CPU, which was either set
4a2fec
+     * by the machine reset code or by CAS. This should never fail.
4a2fec
+     */
4a2fec
+    if (cs != first_cpu) {
4a2fec
+        ppc_set_compat(cpu, POWERPC_CPU(first_cpu)->compat_pvr, &error_abort);
4a2fec
+    }
4a2fec
 }
4a2fec
 
4a2fec
 static void spapr_cpu_destroy(PowerPCCPU *cpu)
4a2fec
diff --git a/hw/ppc/spapr_rtas.c b/hw/ppc/spapr_rtas.c
4a2fec
index 93f09a0..94a2799 100644
4a2fec
--- a/hw/ppc/spapr_rtas.c
4a2fec
+++ b/hw/ppc/spapr_rtas.c
4a2fec
@@ -162,7 +162,6 @@ static void rtas_start_cpu(PowerPCCPU *cpu_, sPAPRMachineState *spapr,
4a2fec
     if (cpu != NULL) {
4a2fec
         CPUState *cs = CPU(cpu);
4a2fec
         CPUPPCState *env = &cpu->env;
4a2fec
-        Error *local_err = NULL;
4a2fec
 
4a2fec
         if (!cs->halted) {
4a2fec
             rtas_st(rets, 0, RTAS_OUT_HW_ERROR);
4a2fec
@@ -174,14 +173,6 @@ static void rtas_start_cpu(PowerPCCPU *cpu_, sPAPRMachineState *spapr,
4a2fec
          * new cpu enters */
4a2fec
         kvm_cpu_synchronize_state(cs);
4a2fec
 
4a2fec
-        /* Set compatibility mode to match existing cpus */
4a2fec
-        ppc_set_compat(cpu, POWERPC_CPU(first_cpu)->compat_pvr, &local_err);
4a2fec
-        if (local_err) {
4a2fec
-            error_report_err(local_err);
4a2fec
-            rtas_st(rets, 0, RTAS_OUT_HW_ERROR);
4a2fec
-            return;
4a2fec
-        }
4a2fec
-
4a2fec
         env->msr = (1ULL << MSR_SF) | (1ULL << MSR_ME);
4a2fec
         env->nip = start;
4a2fec
         env->gpr[3] = r3;
4a2fec
-- 
4a2fec
1.8.3.1
4a2fec