I have modified as below diff to keep TCG if loop as it is and adding if
for KVM case to clear/mask the MTE bits if MTE in KVM mode is not
enabled by user command(if no mte=on).
Is below diff makes sense?
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
index a59417aac8..523996576d 100644
--- a/target/arm/cpu.c
+++ b/target/arm/cpu.c
@@ -2390,15 +2390,20 @@ static void arm_cpu_realizefn(DeviceState *dev,
Error **errp)
#ifndef CONFIG_USER_ONLY
/*
- * If we do not have tag-memory provided by the TCG
- * nor MTE at KVM enabled, reduce MTE support to
- * instructions enabled at EL0.
+ * If we do not have tag-memory provided by the TCG,
+ * reduce MTE support to instructions enabled at EL0.
* This matches Cortex-A710 BROADCASTMTE input being LOW.
*/
- if (cpu->tag_memory == NULL && !cpu->kvm_mte) {
+ if (tcg_enabled() && cpu->tag_memory == NULL) {
cpu->isar.id_aa64pfr1 =
FIELD_DP64(cpu->isar.id_aa64pfr1, ID_AA64PFR1, MTE, 1);
}
+
+ /* Disable MTE, if it is not enabled by the user for KVM mode.
+ */
+ if (kvm_enabled() && !cpu->kvm_mte) {
+ FIELD_DP64(cpu->isar.id_aa64pfr1, ID_AA64PFR1, MTE, 0);
+ }
#endif
}