KVM: arm64: Expose MOPS instructions to guests
authorKristina Martsenko <kristina.martsenko@arm.com>
Fri, 22 Sep 2023 11:25:08 +0000 (12:25 +0100)
committerOliver Upton <oliver.upton@linux.dev>
Mon, 9 Oct 2023 19:54:25 +0000 (19:54 +0000)
Expose the Armv8.8 FEAT_MOPS feature to guests in the ID register and
allow the MOPS instructions to be run in a guest. Only expose MOPS if
the whole system supports it.

Note, it is expected that guests do not use these instructions on MMIO,
similarly to other instructions where ESR_EL2.ISV==0 such as LDP/STP.

Signed-off-by: Kristina Martsenko <kristina.martsenko@arm.com>
Reviewed-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20230922112508.1774352-3-kristina.martsenko@arm.com
Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
arch/arm64/include/asm/kvm_arm.h
arch/arm64/kvm/hyp/include/nvhe/fixed_config.h
arch/arm64/kvm/sys_regs.c

index 5882b2415596416403b8560fef9f3f540d9ed73a..2186927b1d21f002ff61066d7d79c5a2f3be4f2a 100644 (file)
 #define HCR_HOST_NVHE_PROTECTED_FLAGS (HCR_HOST_NVHE_FLAGS | HCR_TSC)
 #define HCR_HOST_VHE_FLAGS (HCR_RW | HCR_TGE | HCR_E2H)
 
-#define HCRX_GUEST_FLAGS (HCRX_EL2_SMPME | HCRX_EL2_TCR2En)
+#define HCRX_GUEST_FLAGS \
+       (HCRX_EL2_SMPME | HCRX_EL2_TCR2En | \
+        (cpus_have_final_cap(ARM64_HAS_MOPS) ? (HCRX_EL2_MSCEn | HCRX_EL2_MCE2) : 0))
 #define HCRX_HOST_FLAGS (HCRX_EL2_MSCEn | HCRX_EL2_TCR2En)
 
 /* TCR_EL2 Registers bits */
index 37440e1dda9306f7abde4cd24cc32c0d229b81ce..e91922daa8ca8e61b5f8e85763580ecae2400dde 100644 (file)
 
 #define PVM_ID_AA64ISAR2_ALLOW (\
        ARM64_FEATURE_MASK(ID_AA64ISAR2_EL1_GPA3) | \
-       ARM64_FEATURE_MASK(ID_AA64ISAR2_EL1_APA3) \
+       ARM64_FEATURE_MASK(ID_AA64ISAR2_EL1_APA3) | \
+       ARM64_FEATURE_MASK(ID_AA64ISAR2_EL1_MOPS) \
        )
 
 u64 pvm_read_id_reg(const struct kvm_vcpu *vcpu, u32 id);
index 57c8190d5438889cf0d52a58adf6fae1d168b039..9601af2aa0624da0899fb475016de20419d29774 100644 (file)
@@ -1344,7 +1344,6 @@ static u64 __kvm_read_sanitised_id_reg(const struct kvm_vcpu *vcpu,
                                 ARM64_FEATURE_MASK(ID_AA64ISAR2_EL1_GPA3));
                if (!cpus_have_final_cap(ARM64_HAS_WFXT))
                        val &= ~ARM64_FEATURE_MASK(ID_AA64ISAR2_EL1_WFxT);
-               val &= ~ARM64_FEATURE_MASK(ID_AA64ISAR2_EL1_MOPS);
                break;
        case SYS_ID_AA64MMFR2_EL1:
                val &= ~ID_AA64MMFR2_EL1_CCIDX_MASK;
@@ -2095,7 +2094,6 @@ static const struct sys_reg_desc sys_reg_descs[] = {
                                        ID_AA64ISAR1_EL1_API |
                                        ID_AA64ISAR1_EL1_APA)),
        ID_WRITABLE(ID_AA64ISAR2_EL1, ~(ID_AA64ISAR2_EL1_RES0 |
-                                       ID_AA64ISAR2_EL1_MOPS |
                                        ID_AA64ISAR2_EL1_APA3 |
                                        ID_AA64ISAR2_EL1_GPA3)),
        ID_UNALLOCATED(6,3),