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

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