diff options
Diffstat (limited to 'arch/arm64/kvm/debug.c')
| -rw-r--r-- | arch/arm64/kvm/debug.c | 15 | 
1 files changed, 10 insertions, 5 deletions
diff --git a/arch/arm64/kvm/debug.c b/arch/arm64/kvm/debug.c index 3515a273eaa2..3ad6b7c6e4ba 100644 --- a/arch/arm64/kvm/debug.c +++ b/arch/arm64/kvm/debug.c @@ -15,6 +15,12 @@  #include <asm/kvm_arm.h>  #include <asm/kvm_emulate.h> +static int cpu_has_spe(u64 dfr0) +{ +	return cpuid_feature_extract_unsigned_field(dfr0, ID_AA64DFR0_EL1_PMSVer_SHIFT) && +	       !(read_sysreg_s(SYS_PMBIDR_EL1) & PMBIDR_EL1_P); +} +  /**   * kvm_arm_setup_mdcr_el2 - configure vcpu mdcr_el2 value   * @@ -77,13 +83,12 @@ void kvm_init_host_debug_data(void)  	*host_data_ptr(debug_brps) = SYS_FIELD_GET(ID_AA64DFR0_EL1, BRPs, dfr0);  	*host_data_ptr(debug_wrps) = SYS_FIELD_GET(ID_AA64DFR0_EL1, WRPs, dfr0); +	if (cpu_has_spe(dfr0)) +		host_data_set_flag(HAS_SPE); +  	if (has_vhe())  		return; -	if (cpuid_feature_extract_unsigned_field(dfr0, ID_AA64DFR0_EL1_PMSVer_SHIFT) && -	    !(read_sysreg_s(SYS_PMBIDR_EL1) & PMBIDR_EL1_P)) -		host_data_set_flag(HAS_SPE); -  	/* Check if we have BRBE implemented and available at the host */  	if (cpuid_feature_extract_unsigned_field(dfr0, ID_AA64DFR0_EL1_BRBE_SHIFT))  		host_data_set_flag(HAS_BRBE); @@ -102,7 +107,7 @@ void kvm_init_host_debug_data(void)  void kvm_debug_init_vhe(void)  {  	/* Clear PMSCR_EL1.E{0,1}SPE which reset to UNKNOWN values. */ -	if (SYS_FIELD_GET(ID_AA64DFR0_EL1, PMSVer, read_sysreg(id_aa64dfr0_el1))) +	if (host_data_test_flag(HAS_SPE))  		write_sysreg_el1(0, SYS_PMSCR);  }  | 
