From: Daniel Henrique Barboza <danielhb413@gmail.com>
To: qemu-devel@nongnu.org
Cc: qemu-ppc@nongnu.org, danielhb413@gmail.com,
peter.maydell@linaro.org, richard.henderson@linaro.org,
Nicholas Piggin <npiggin@gmail.com>
Subject: [PULL 02/60] target/ppc: Fix host PVR matching for KVM
Date: Wed, 31 Aug 2022 15:49:36 -0300 [thread overview]
Message-ID: <20220831185034.23240-3-danielhb413@gmail.com> (raw)
In-Reply-To: <20220831185034.23240-1-danielhb413@gmail.com>
From: Nicholas Piggin <npiggin@gmail.com>
ppc_cpu_compare_class_pvr_mask() should match the best CPU class in the
family, because it is used by the KVM subsystem to find the host CPU
class. Since commit 03ae4133ab8 ("target-ppc: Add pvr_match()
callback"), it matches any class in the family (the first one in the
comparison list).
Since commit f30c843ced5 ("ppc/pnv: Introduce PowerNV machines with
fixed CPU models"), pnv has relied on pnv_match having these new
semantics to check machine compatibility with a CPU family.
Resolve this by adding a parameter to the pvr_match function to select
the best or any match, and restore the old behaviour for the KVM case.
Prior to this fix, e.g., a POWER9 DD2.3 KVM host matches to the
power9_v1.0 class (because that happens to be the first POWER9 family
CPU compared). After the patch, it matches the power9_v2.0 class.
This approach requires pnv_match contain knowledge of the CPU classes
implemented in the same family, which feels ugly. But pushing the 'best'
match down to the class would still require they know about one another
which is not obviously much better. For now this gets things working.
Fixes: 03ae4133ab8 ("target-ppc: Add pvr_match() callback")
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com>
Message-Id: <20220731013358.170187-1-npiggin@gmail.com>
Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com>
---
hw/ppc/pnv.c | 2 +-
target/ppc/cpu-qom.h | 6 ++-
target/ppc/cpu_init.c | 91 +++++++++++++++++++++++++++++++++----------
target/ppc/machine.c | 2 +-
4 files changed, 77 insertions(+), 24 deletions(-)
diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index d3f77c8367..a4cb4cf10b 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -714,7 +714,7 @@ static bool pnv_match_cpu(const char *default_type, const char *cpu_type)
PowerPCCPUClass *ppc =
POWERPC_CPU_CLASS(object_class_by_name(cpu_type));
- return ppc_default->pvr_match(ppc_default, ppc->pvr);
+ return ppc_default->pvr_match(ppc_default, ppc->pvr, false);
}
static void pnv_ipmi_bt_init(ISABus *bus, IPMIBmc *bmc, uint32_t irq)
diff --git a/target/ppc/cpu-qom.h b/target/ppc/cpu-qom.h
index ad7e3c3db9..89ff88f28c 100644
--- a/target/ppc/cpu-qom.h
+++ b/target/ppc/cpu-qom.h
@@ -158,7 +158,11 @@ struct PowerPCCPUClass {
void (*parent_parse_features)(const char *type, char *str, Error **errp);
uint32_t pvr;
- bool (*pvr_match)(struct PowerPCCPUClass *pcc, uint32_t pvr);
+ /*
+ * If @best is false, match if pcc is in the family of pvr
+ * Else match only if pcc is the best match for pvr in this family.
+ */
+ bool (*pvr_match)(struct PowerPCCPUClass *pcc, uint32_t pvr, bool best);
uint64_t pcr_mask; /* Available bits in PCR register */
uint64_t pcr_supported; /* Bits for supported PowerISA versions */
uint32_t svr;
diff --git a/target/ppc/cpu_init.c b/target/ppc/cpu_init.c
index d1493a660c..899c4a586e 100644
--- a/target/ppc/cpu_init.c
+++ b/target/ppc/cpu_init.c
@@ -5912,15 +5912,25 @@ static void init_proc_POWER7(CPUPPCState *env)
ppcPOWER7_irq_init(env_archcpu(env));
}
-static bool ppc_pvr_match_power7(PowerPCCPUClass *pcc, uint32_t pvr)
+static bool ppc_pvr_match_power7(PowerPCCPUClass *pcc, uint32_t pvr, bool best)
{
- if ((pvr & CPU_POWERPC_POWER_SERVER_MASK) == CPU_POWERPC_POWER7P_BASE) {
- return true;
+ uint32_t base = pvr & CPU_POWERPC_POWER_SERVER_MASK;
+ uint32_t pcc_base = pcc->pvr & CPU_POWERPC_POWER_SERVER_MASK;
+
+ if (!best) {
+ if (base == CPU_POWERPC_POWER7_BASE) {
+ return true;
+ }
+ if (base == CPU_POWERPC_POWER7P_BASE) {
+ return true;
+ }
}
- if ((pvr & CPU_POWERPC_POWER_SERVER_MASK) == CPU_POWERPC_POWER7_BASE) {
- return true;
+
+ if (base != pcc_base) {
+ return false;
}
- return false;
+
+ return true;
}
static bool cpu_has_work_POWER7(CPUState *cs)
@@ -6073,18 +6083,27 @@ static void init_proc_POWER8(CPUPPCState *env)
ppcPOWER7_irq_init(env_archcpu(env));
}
-static bool ppc_pvr_match_power8(PowerPCCPUClass *pcc, uint32_t pvr)
+static bool ppc_pvr_match_power8(PowerPCCPUClass *pcc, uint32_t pvr, bool best)
{
- if ((pvr & CPU_POWERPC_POWER_SERVER_MASK) == CPU_POWERPC_POWER8NVL_BASE) {
- return true;
- }
- if ((pvr & CPU_POWERPC_POWER_SERVER_MASK) == CPU_POWERPC_POWER8E_BASE) {
- return true;
+ uint32_t base = pvr & CPU_POWERPC_POWER_SERVER_MASK;
+ uint32_t pcc_base = pcc->pvr & CPU_POWERPC_POWER_SERVER_MASK;
+
+ if (!best) {
+ if (base == CPU_POWERPC_POWER8_BASE) {
+ return true;
+ }
+ if (base == CPU_POWERPC_POWER8E_BASE) {
+ return true;
+ }
+ if (base == CPU_POWERPC_POWER8NVL_BASE) {
+ return true;
+ }
}
- if ((pvr & CPU_POWERPC_POWER_SERVER_MASK) == CPU_POWERPC_POWER8_BASE) {
- return true;
+ if (base != pcc_base) {
+ return false;
}
- return false;
+
+ return true;
}
static bool cpu_has_work_POWER8(CPUState *cs)
@@ -6282,11 +6301,26 @@ static void init_proc_POWER9(CPUPPCState *env)
ppcPOWER9_irq_init(env_archcpu(env));
}
-static bool ppc_pvr_match_power9(PowerPCCPUClass *pcc, uint32_t pvr)
+static bool ppc_pvr_match_power9(PowerPCCPUClass *pcc, uint32_t pvr, bool best)
{
- if ((pvr & CPU_POWERPC_POWER_SERVER_MASK) == CPU_POWERPC_POWER9_BASE) {
+ uint32_t base = pvr & CPU_POWERPC_POWER_SERVER_MASK;
+ uint32_t pcc_base = pcc->pvr & CPU_POWERPC_POWER_SERVER_MASK;
+
+ if (!best) {
+ if (base == CPU_POWERPC_POWER9_BASE) {
+ return true;
+ }
+ }
+
+ if (base != pcc_base) {
+ return false;
+ }
+
+ if ((pvr & 0x0f00) == (pcc->pvr & 0x0f00)) {
+ /* Major DD version matches to power9_v1.0 and power9_v2.0 */
return true;
}
+
return false;
}
@@ -6499,11 +6533,26 @@ static void init_proc_POWER10(CPUPPCState *env)
ppcPOWER9_irq_init(env_archcpu(env));
}
-static bool ppc_pvr_match_power10(PowerPCCPUClass *pcc, uint32_t pvr)
+static bool ppc_pvr_match_power10(PowerPCCPUClass *pcc, uint32_t pvr, bool best)
{
- if ((pvr & CPU_POWERPC_POWER_SERVER_MASK) == CPU_POWERPC_POWER10_BASE) {
+ uint32_t base = pvr & CPU_POWERPC_POWER_SERVER_MASK;
+ uint32_t pcc_base = pcc->pvr & CPU_POWERPC_POWER_SERVER_MASK;
+
+ if (!best) {
+ if (base == CPU_POWERPC_POWER10_BASE) {
+ return true;
+ }
+ }
+
+ if (base != pcc_base) {
+ return false;
+ }
+
+ if ((pvr & 0x0f00) == (pcc->pvr & 0x0f00)) {
+ /* Major DD version matches to power10_v1.0 and power10_v2.0 */
return true;
}
+
return false;
}
@@ -6910,7 +6959,7 @@ static gint ppc_cpu_compare_class_pvr_mask(gconstpointer a, gconstpointer b)
return -1;
}
- if (pcc->pvr_match(pcc, pvr)) {
+ if (pcc->pvr_match(pcc, pvr, true)) {
return 0;
}
@@ -7308,7 +7357,7 @@ static void ppc_cpu_instance_finalize(Object *obj)
ppc_hash64_finalize(cpu);
}
-static bool ppc_pvr_match_default(PowerPCCPUClass *pcc, uint32_t pvr)
+static bool ppc_pvr_match_default(PowerPCCPUClass *pcc, uint32_t pvr, bool best)
{
return pcc->pvr == pvr;
}
diff --git a/target/ppc/machine.c b/target/ppc/machine.c
index a7d9036c09..be6eb3d968 100644
--- a/target/ppc/machine.c
+++ b/target/ppc/machine.c
@@ -234,7 +234,7 @@ static bool pvr_match(PowerPCCPU *cpu, uint32_t pvr)
if (pvr == pcc->pvr) {
return true;
}
- return pcc->pvr_match(pcc, pvr);
+ return pcc->pvr_match(pcc, pvr, true);
}
static int cpu_post_load(void *opaque, int version_id)
--
2.37.2
next prev parent reply other threads:[~2022-08-31 18:56 UTC|newest]
Thread overview: 63+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-08-31 18:49 [PULL 00/60] ppc queue Daniel Henrique Barboza
2022-08-31 18:49 ` [PULL 01/60] pseries: Update SLOF firmware image Daniel Henrique Barboza
2022-08-31 18:49 ` Daniel Henrique Barboza [this message]
2022-08-31 18:49 ` [PULL 03/60] ppc/pnv: Add initial P9/10 SBE model Daniel Henrique Barboza
2022-08-31 18:49 ` [PULL 04/60] fpu: Add rebias bool, value and operation Daniel Henrique Barboza
2022-08-31 18:49 ` [PULL 05/60] target/ppc: Bugfix FP when OE/UE are set Daniel Henrique Barboza
2022-08-31 18:49 ` [PULL 06/60] ppc/pnv: add PHB3 bus init helper Daniel Henrique Barboza
2022-08-31 18:49 ` [PULL 07/60] ppc/pnv: add PnvPHB base/proxy device Daniel Henrique Barboza
2022-08-31 18:49 ` [PULL 08/60] ppc/pnv: turn PnvPHB3 into a PnvPHB backend Daniel Henrique Barboza
2022-08-31 18:49 ` [PULL 09/60] ppc/pnv: add PHB4 bus init helper Daniel Henrique Barboza
2022-08-31 18:49 ` [PULL 10/60] ppc/pnv: turn PnvPHB4 into a PnvPHB backend Daniel Henrique Barboza
2022-08-31 18:49 ` [PULL 11/60] ppc/pnv: add pnv-phb-root-port device Daniel Henrique Barboza
2022-08-31 18:49 ` [PULL 12/60] ppc/pnv: remove pnv-phb3-root-port Daniel Henrique Barboza
2022-08-31 18:49 ` [PULL 13/60] ppc/pnv: remove pnv-phb4-root-port Daniel Henrique Barboza
2022-08-31 18:49 ` [PULL 14/60] ppc/pnv: remove root port name from pnv_phb_attach_root_port() Daniel Henrique Barboza
2022-08-31 18:49 ` [PULL 15/60] ppc/pnv: remove pecc->rp_model Daniel Henrique Barboza
2022-08-31 18:49 ` [PULL 16/60] ppc/pnv: remove PnvPHB4.version Daniel Henrique Barboza
2022-08-31 18:49 ` [PULL 17/60] ppc/pnv: move attach_root_port helper to pnv-phb.c Daniel Henrique Barboza
2022-08-31 18:49 ` [PULL 18/60] ppc/pnv: add phb-id/chip-id PnvPHB3RootBus properties Daniel Henrique Barboza
2022-08-31 18:49 ` [PULL 19/60] ppc/pnv: add phb-id/chip-id PnvPHB4RootBus properties Daniel Henrique Barboza
2022-08-31 18:49 ` [PULL 20/60] ppc/pnv: set root port chassis and slot using Bus properties Daniel Henrique Barboza
2022-08-31 18:49 ` [PULL 21/60] ppc/pnv: add helpers for pnv-phb user devices Daniel Henrique Barboza
2022-08-31 18:49 ` [PULL 22/60] ppc/pnv: turn chip8->phbs[] into a PnvPHB* array Daniel Henrique Barboza
2022-08-31 18:49 ` [PULL 23/60] ppc/pnv: enable user created pnv-phb for powernv8 Daniel Henrique Barboza
2022-08-31 18:49 ` [PULL 24/60] ppc/pnv: add PHB4 helpers for user created pnv-phb Daniel Henrique Barboza
2022-08-31 18:49 ` [PULL 25/60] ppc/pnv: enable user created pnv-phb for powernv9 Daniel Henrique Barboza
2022-08-31 18:50 ` [PULL 26/60] ppc/pnv: change pnv_phb4_get_pec() to also retrieve chip10->pecs Daniel Henrique Barboza
2022-08-31 18:50 ` [PULL 27/60] ppc/pnv: user creatable pnv-phb for powernv10 Daniel Henrique Barboza
2022-08-31 18:50 ` [PULL 28/60] ppc/pnv: consolidate pnv_parent_*_fixup() helpers Daniel Henrique Barboza
2022-08-31 18:50 ` [PULL 29/60] ppc/pnv: fix QOM parenting of user creatable root ports Daniel Henrique Barboza
2022-08-31 18:50 ` [PULL 30/60] ppc/ppc405: Remove taihu machine Daniel Henrique Barboza
2022-08-31 18:50 ` [PULL 31/60] ppc/ppc405: Introduce a PPC405 generic machine Daniel Henrique Barboza
2022-08-31 18:50 ` [PULL 32/60] ppc/ppc405: Move devices under the ref405ep machine Daniel Henrique Barboza
2022-08-31 18:50 ` [PULL 33/60] ppc/ppc405: Move SRAM " Daniel Henrique Barboza
2022-08-31 18:50 ` [PULL 34/60] ppc/ppc405: Introduce a PPC405 SoC Daniel Henrique Barboza
2022-08-31 18:50 ` [PULL 35/60] ppc/ppc405: Start QOMification of the SoC Daniel Henrique Barboza
2022-08-31 18:50 ` [PULL 36/60] ppc/ppc405: QOM'ify CPU Daniel Henrique Barboza
2022-08-31 18:50 ` [PULL 37/60] ppc/ppc4xx: Introduce a DCR device model Daniel Henrique Barboza
2022-08-31 18:50 ` [PULL 38/60] ppc/ppc405: QOM'ify CPC Daniel Henrique Barboza
2022-08-31 18:50 ` [PULL 39/60] ppc/ppc405: QOM'ify GPT Daniel Henrique Barboza
2022-08-31 18:50 ` [PULL 40/60] ppc/ppc405: QOM'ify OCM Daniel Henrique Barboza
2022-08-31 18:50 ` [PULL 41/60] ppc/ppc405: QOM'ify GPIO Daniel Henrique Barboza
2022-08-31 18:50 ` [PULL 42/60] ppc/ppc405: QOM'ify DMA Daniel Henrique Barboza
2022-08-31 18:50 ` [PULL 43/60] ppc/ppc405: QOM'ify EBC Daniel Henrique Barboza
2022-08-31 18:50 ` [PULL 44/60] ppc/ppc405: QOM'ify OPBA Daniel Henrique Barboza
2022-08-31 18:50 ` [PULL 45/60] ppc/ppc405: QOM'ify POB Daniel Henrique Barboza
2022-08-31 18:50 ` [PULL 46/60] ppc/ppc405: QOM'ify PLB Daniel Henrique Barboza
2022-08-31 18:50 ` [PULL 47/60] ppc/ppc405: QOM'ify MAL Daniel Henrique Barboza
2022-08-31 18:50 ` [PULL 48/60] ppc4xx: Move PLB model to ppc4xx_devs.c Daniel Henrique Barboza
2022-08-31 18:50 ` [PULL 49/60] ppc4xx: Rename ppc405-plb to ppc4xx-plb Daniel Henrique Barboza
2022-08-31 18:50 ` [PULL 50/60] ppc4xx: Move EBC model to ppc4xx_devs.c Daniel Henrique Barboza
2022-08-31 18:50 ` [PULL 51/60] ppc4xx: Rename ppc405-ebc to ppc4xx-ebc Daniel Henrique Barboza
2022-08-31 18:50 ` [PULL 52/60] ppc/ppc405: Use an embedded PPCUIC model in SoC state Daniel Henrique Barboza
2022-08-31 18:50 ` [PULL 53/60] hw/intc/ppc-uic: Convert ppc-uic to a PPC4xx DCR device Daniel Henrique Barboza
2022-08-31 18:50 ` [PULL 54/60] ppc/ppc405: Use an explicit I2C object Daniel Henrique Barboza
2022-08-31 18:50 ` [PULL 55/60] ppc/ppc405: QOM'ify FPGA Daniel Henrique Barboza
2022-08-31 18:50 ` [PULL 56/60] ppc405: Move machine specific code to ppc405_boards.c Daniel Henrique Barboza
2022-08-31 18:50 ` [PULL 57/60] hw/ppc/sam3460ex: Remove PPC405 dependency from sam460ex Daniel Henrique Barboza
2022-08-31 18:50 ` [PULL 58/60] hw/ppc/Kconfig: Move imply before select Daniel Henrique Barboza
2022-08-31 18:50 ` [PULL 59/60] ppc/ppc4xx: Fix sdram trace events Daniel Henrique Barboza
2022-08-31 18:50 ` [PULL 60/60] ppc4xx: Fix code style problems reported by checkpatch Daniel Henrique Barboza
2022-08-31 19:37 ` [PULL 00/60] ppc queue BALATON Zoltan
2022-08-31 20:27 ` Daniel Henrique Barboza
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220831185034.23240-3-danielhb413@gmail.com \
--to=danielhb413@gmail.com \
--cc=npiggin@gmail.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
--cc=richard.henderson@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).