76daa3
From ad017413736e51417a4b67e965ad1e968518a957 Mon Sep 17 00:00:00 2001
76daa3
From: David Gibson <dgibson@redhat.com>
76daa3
Date: Fri, 11 Aug 2017 06:09:09 +0200
76daa3
Subject: [PATCH 2/3] target/ppc: Add stub implementation of the PSSCR
76daa3
MIME-Version: 1.0
76daa3
Content-Type: text/plain; charset=UTF-8
76daa3
Content-Transfer-Encoding: 8bit
76daa3
76daa3
RH-Author: David Gibson <dgibson@redhat.com>
76daa3
Message-id: <20170811060909.31369-3-dgibson@redhat.com>
76daa3
Patchwork-id: 75934
76daa3
O-Subject: [RHEL-7.4-ALT qemu-kvm PATCH 2/2] target/ppc: Add stub implementation of the PSSCR
76daa3
Bugzilla: 1478822
76daa3
RH-Acked-by: Thomas Huth <thuth@redhat.com>
76daa3
RH-Acked-by: Laurent Vivier <lvivier@redhat.com>
76daa3
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
76daa3
76daa3
From: David Gibson <david@gibson.dropbear.id.au>
76daa3
76daa3
The PSSCR register added in POWER9 controls certain power saving mode
76daa3
behaviours.  Mostly, it's not relevant to TCG, however because qemu
76daa3
doesn't know about it yet, it doesn't synchronize the state with KVM,
76daa3
and thus it doesn't get migrated.
76daa3
76daa3
To fix that, this adds a minimal stub implementation of the register.
76daa3
This isn't complete, even to the extent that an implementation is
76daa3
possible in TCG, just enough to get migration working.  We need to
76daa3
come back later and at least properly filter the various fields in the
76daa3
register based on privilege level.
76daa3
76daa3
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
76daa3
Reviewed-by: Cédric Le Goater <clg@kaod.org>
76daa3
Reviewed-by: Greg Kurz <groug@kaod.org>
76daa3
Reviewed-by: Thomas Huth <thuth@redhat.com>
76daa3
(cherry picked from commit b8af5b2d5f67b0e1b274f8532f42a47bfe46ea3b)
76daa3
76daa3
Signed-off-by: David Gibson <dgibson@redhat.com>
76daa3
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
76daa3
---
76daa3
 target/ppc/cpu.h            | 1 +
76daa3
 target/ppc/translate_init.c | 5 +++++
76daa3
 2 files changed, 6 insertions(+)
76daa3
76daa3
diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
76daa3
index a2d7b6f..5fc8eca 100644
76daa3
--- a/target/ppc/cpu.h
76daa3
+++ b/target/ppc/cpu.h
76daa3
@@ -1764,6 +1764,7 @@ int ppc_compat_max_threads(PowerPCCPU *cpu);
76daa3
 #define SPR_IC                (0x350)
76daa3
 #define SPR_VTB               (0x351)
76daa3
 #define SPR_MMCRC             (0x353)
76daa3
+#define SPR_PSSCR             (0x357)
76daa3
 #define SPR_440_INV0          (0x370)
76daa3
 #define SPR_440_INV1          (0x371)
76daa3
 #define SPR_440_INV2          (0x372)
76daa3
diff --git a/target/ppc/translate_init.c b/target/ppc/translate_init.c
76daa3
index 624bc1c..968717d 100644
76daa3
--- a/target/ppc/translate_init.c
76daa3
+++ b/target/ppc/translate_init.c
76daa3
@@ -8842,6 +8842,11 @@ static void init_proc_POWER9(CPUPPCState *env)
76daa3
                      spr_read_generic, spr_write_generic,
76daa3
                      KVM_REG_PPC_TIDR, 0);
76daa3
 
76daa3
+    /* FIXME: Filter fields properly based on privilege level */
76daa3
+    spr_register_kvm_hv(env, SPR_PSSCR, "PSSCR", NULL, NULL, NULL, NULL,
76daa3
+                        spr_read_generic, spr_write_generic,
76daa3
+                        KVM_REG_PPC_PSSCR, 0);
76daa3
+
76daa3
     /* env variables */
76daa3
 #if !defined(CONFIG_USER_ONLY)
76daa3
     env->slb_nr = 32;
76daa3
-- 
76daa3
1.8.3.1
76daa3