From: James Clark james.clark@arm.com
FEAT_TRF can control trace generation at different ELs so this will enable support of exclude/include guest rules when it's present without TRBE. With TRBE we'll have to continue to always disable guest trace.
Signed-off-by: James Clark james.clark@arm.com Signed-off-by: James Clark james.clark@linaro.org --- arch/arm64/include/asm/kvm_host.h | 2 ++ arch/arm64/kvm/debug.c | 14 ++++++++++---- 2 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h index 61ff34e1ffef..5dfc3f4f74b2 100644 --- a/arch/arm64/include/asm/kvm_host.h +++ b/arch/arm64/include/asm/kvm_host.h @@ -939,6 +939,8 @@ struct kvm_vcpu_arch { #define HOST_FEAT_HAS_SPE __kvm_single_flag(feats, BIT(0)) /* Save TRBE context if active */ #define HOST_FEAT_HAS_TRBE __kvm_single_flag(feats, BIT(1)) +/* CPU has Feat_TRF */ +#define HOST_FEAT_HAS_TRF __kvm_single_flag(feats, BIT(2))
/* Pointer to the vcpu's SVE FFR for sve_{save,load}_state() */ #define vcpu_sve_pffr(vcpu) (kern_hyp_va((vcpu)->arch.sve_state) + \ diff --git a/arch/arm64/kvm/debug.c b/arch/arm64/kvm/debug.c index cf5558806687..fb41ef5d9db9 100644 --- a/arch/arm64/kvm/debug.c +++ b/arch/arm64/kvm/debug.c @@ -89,10 +89,16 @@ void kvm_arm_init_debug(void) !(read_sysreg_s(SYS_PMBIDR_EL1) & BIT(PMBIDR_EL1_P_SHIFT))) host_data_set_flag(HOST_FEAT_HAS_SPE);
- /* Check if we have TRBE implemented and available at the host */ - if (cpuid_feature_extract_unsigned_field(dfr0, ID_AA64DFR0_EL1_TraceBuffer_SHIFT) && - !(read_sysreg_s(SYS_TRBIDR_EL1) & TRBIDR_EL1_P)) - host_data_set_flag(HOST_FEAT_HAS_TRBE); + if (cpuid_feature_extract_unsigned_field(dfr0, ID_AA64DFR0_EL1_TraceFilt_SHIFT)) { + host_data_set_flag(HOST_FEAT_HAS_TRF); + /* + * The architecture mandates FEAT_TRF with TRBE, so only need to check + * for TRBE if TRF exists. + */ + if (cpuid_feature_extract_unsigned_field(dfr0, ID_AA64DFR0_EL1_TraceBuffer_SHIFT) && + !(read_sysreg_s(SYS_TRBIDR_EL1) & TRBIDR_EL1_P)) + host_data_set_flag(HOST_FEAT_HAS_TRBE); + } }
/**