Skip to content

Commit c876c3f

Browse files
Marc Zyngieroupton
authored andcommitted
KVM: arm64: Relax trapping of CTR_EL0 when FEAT_EVT is available
CTR_EL0 can often be used in userspace, and it would be nice if KVM didn't have to emulate it unnecessarily. While it isn't possible to trap the cache configuration registers independently from CTR_EL0 in the base ARMv8.0 architecture, FEAT_EVT allows these cache configuration registers (CCSIDR_EL1, CCSIDR2_EL1, CLIDR_EL1 and CSSELR_EL1) to be trapped independently by setting HCR_EL2.TID4. Switch to using TID4 instead of TID2 in the cases where FEAT_EVT is available *and* that KVM doesn't need to sanitise CTR_EL0 to paper over mismatched cache configurations. Signed-off-by: Marc Zyngier <maz@kernel.org> Link: https://lore.kernel.org/r/20230515170016.965378-1-maz@kernel.org Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
1 parent f1fcbaa commit c876c3f

4 files changed

Lines changed: 20 additions & 1 deletion

File tree

arch/arm64/include/asm/kvm_arm.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#define HCR_ATA_SHIFT 56
1919
#define HCR_ATA (UL(1) << HCR_ATA_SHIFT)
2020
#define HCR_AMVOFFEN (UL(1) << 51)
21+
#define HCR_TID4 (UL(1) << 49)
2122
#define HCR_FIEN (UL(1) << 47)
2223
#define HCR_FWB (UL(1) << 46)
2324
#define HCR_API (UL(1) << 41)
@@ -86,7 +87,7 @@
8687
#define HCR_GUEST_FLAGS (HCR_TSC | HCR_TSW | HCR_TWE | HCR_TWI | HCR_VM | \
8788
HCR_BSU_IS | HCR_FB | HCR_TACR | \
8889
HCR_AMO | HCR_SWIO | HCR_TIDCP | HCR_RW | HCR_TLOR | \
89-
HCR_FMO | HCR_IMO | HCR_PTW | HCR_TID3 | HCR_TID2)
90+
HCR_FMO | HCR_IMO | HCR_PTW | HCR_TID3)
9091
#define HCR_VIRT_EXCP_MASK (HCR_VSE | HCR_VI | HCR_VF)
9192
#define HCR_HOST_NVHE_FLAGS (HCR_RW | HCR_API | HCR_APK | HCR_ATA)
9293
#define HCR_HOST_NVHE_PROTECTED_FLAGS (HCR_HOST_NVHE_FLAGS | HCR_TSC)

arch/arm64/include/asm/kvm_emulate.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,12 @@ static inline void vcpu_reset_hcr(struct kvm_vcpu *vcpu)
9595
vcpu->arch.hcr_el2 |= HCR_TVM;
9696
}
9797

98+
if (cpus_have_final_cap(ARM64_HAS_EVT) &&
99+
!cpus_have_final_cap(ARM64_MISMATCHED_CACHE_TYPE))
100+
vcpu->arch.hcr_el2 |= HCR_TID4;
101+
else
102+
vcpu->arch.hcr_el2 |= HCR_TID2;
103+
98104
if (vcpu_el1_is_32bit(vcpu))
99105
vcpu->arch.hcr_el2 &= ~HCR_RW;
100106

arch/arm64/kernel/cpufeature.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2641,6 +2641,17 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
26412641
.cpu_enable = cpu_enable_dit,
26422642
ARM64_CPUID_FIELDS(ID_AA64PFR0_EL1, DIT, IMP)
26432643
},
2644+
{
2645+
.desc = "Enhanced Virtualization Traps",
2646+
.capability = ARM64_HAS_EVT,
2647+
.type = ARM64_CPUCAP_SYSTEM_FEATURE,
2648+
.sys_reg = SYS_ID_AA64MMFR2_EL1,
2649+
.sign = FTR_UNSIGNED,
2650+
.field_pos = ID_AA64MMFR2_EL1_EVT_SHIFT,
2651+
.field_width = 4,
2652+
.min_field_value = ID_AA64MMFR2_EL1_EVT_IMP,
2653+
.matches = has_cpuid_feature,
2654+
},
26442655
{},
26452656
};
26462657

arch/arm64/tools/cpucaps

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ HAS_E0PD
2525
HAS_ECV
2626
HAS_ECV_CNTPOFF
2727
HAS_EPAN
28+
HAS_EVT
2829
HAS_GENERIC_AUTH
2930
HAS_GENERIC_AUTH_ARCH_QARMA3
3031
HAS_GENERIC_AUTH_ARCH_QARMA5

0 commit comments

Comments
 (0)