target/arm: Add SMEEXC_EL to TB flags
This is CheckSMEAccess, which is the basis for a set of related tests for various SME cpregs and instructions. Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20220620175235.60881-3-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
		
							parent
							
								
									9e5ec745e3
								
							
						
					
					
						commit
						6b2ca83e4c
					
				| @ -1134,6 +1134,7 @@ void aarch64_sync_64_to_32(CPUARMState *env); | ||||
| 
 | ||||
| int fp_exception_el(CPUARMState *env, int cur_el); | ||||
| int sve_exception_el(CPUARMState *env, int cur_el); | ||||
| int sme_exception_el(CPUARMState *env, int cur_el); | ||||
| 
 | ||||
| /**
 | ||||
|  * sve_vqm1_for_el: | ||||
| @ -3148,6 +3149,7 @@ FIELD(TBFLAG_A64, ATA, 15, 1) | ||||
| FIELD(TBFLAG_A64, TCMA, 16, 2) | ||||
| FIELD(TBFLAG_A64, MTE_ACTIVE, 18, 1) | ||||
| FIELD(TBFLAG_A64, MTE0_ACTIVE, 19, 1) | ||||
| FIELD(TBFLAG_A64, SMEEXC_EL, 20, 2) | ||||
| 
 | ||||
| /*
 | ||||
|  * Helpers for using the above. | ||||
|  | ||||
| @ -6218,6 +6218,55 @@ int sve_exception_el(CPUARMState *env, int el) | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Return the exception level to which exceptions should be taken for SME. | ||||
|  * C.f. the ARM pseudocode function CheckSMEAccess. | ||||
|  */ | ||||
| int sme_exception_el(CPUARMState *env, int el) | ||||
| { | ||||
| #ifndef CONFIG_USER_ONLY | ||||
|     if (el <= 1 && !el_is_in_host(env, el)) { | ||||
|         switch (FIELD_EX64(env->cp15.cpacr_el1, CPACR_EL1, SMEN)) { | ||||
|         case 1: | ||||
|             if (el != 0) { | ||||
|                 break; | ||||
|             } | ||||
|             /* fall through */ | ||||
|         case 0: | ||||
|         case 2: | ||||
|             return 1; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     if (el <= 2 && arm_is_el2_enabled(env)) { | ||||
|         /* CPTR_EL2 changes format with HCR_EL2.E2H (regardless of TGE). */ | ||||
|         if (env->cp15.hcr_el2 & HCR_E2H) { | ||||
|             switch (FIELD_EX64(env->cp15.cptr_el[2], CPTR_EL2, SMEN)) { | ||||
|             case 1: | ||||
|                 if (el != 0 || !(env->cp15.hcr_el2 & HCR_TGE)) { | ||||
|                     break; | ||||
|                 } | ||||
|                 /* fall through */ | ||||
|             case 0: | ||||
|             case 2: | ||||
|                 return 2; | ||||
|             } | ||||
|         } else { | ||||
|             if (FIELD_EX64(env->cp15.cptr_el[2], CPTR_EL2, TSM)) { | ||||
|                 return 2; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     /* CPTR_EL3.  Since ESM is negative we must check for EL3.  */ | ||||
|     if (arm_feature(env, ARM_FEATURE_EL3) | ||||
|         && !FIELD_EX64(env->cp15.cptr_el[3], CPTR_EL3, ESM)) { | ||||
|         return 3; | ||||
|     } | ||||
| #endif | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Given that SVE is enabled, return the vector length for EL. | ||||
|  */ | ||||
| @ -11197,6 +11246,9 @@ static CPUARMTBFlags rebuild_hflags_a64(CPUARMState *env, int el, int fp_el, | ||||
|         } | ||||
|         DP_TBFLAG_A64(flags, SVEEXC_EL, sve_el); | ||||
|     } | ||||
|     if (cpu_isar_feature(aa64_sme, env_archcpu(env))) { | ||||
|         DP_TBFLAG_A64(flags, SMEEXC_EL, sme_exception_el(env, el)); | ||||
|     } | ||||
| 
 | ||||
|     sctlr = regime_sctlr(env, stage1); | ||||
| 
 | ||||
|  | ||||
| @ -14603,6 +14603,7 @@ static void aarch64_tr_init_disas_context(DisasContextBase *dcbase, | ||||
|     dc->align_mem = EX_TBFLAG_ANY(tb_flags, ALIGN_MEM); | ||||
|     dc->pstate_il = EX_TBFLAG_ANY(tb_flags, PSTATE__IL); | ||||
|     dc->sve_excp_el = EX_TBFLAG_A64(tb_flags, SVEEXC_EL); | ||||
|     dc->sme_excp_el = EX_TBFLAG_A64(tb_flags, SMEEXC_EL); | ||||
|     dc->vl = (EX_TBFLAG_A64(tb_flags, VL) + 1) * 16; | ||||
|     dc->pauth_active = EX_TBFLAG_A64(tb_flags, PAUTH_ACTIVE); | ||||
|     dc->bt = EX_TBFLAG_A64(tb_flags, BT); | ||||
|  | ||||
| @ -42,6 +42,7 @@ typedef struct DisasContext { | ||||
|     bool ns;        /* Use non-secure CPREG bank on access */ | ||||
|     int fp_excp_el; /* FP exception EL or 0 if enabled */ | ||||
|     int sve_excp_el; /* SVE exception EL or 0 if enabled */ | ||||
|     int sme_excp_el; /* SME exception EL or 0 if enabled */ | ||||
|     int vl;          /* current vector length in bytes */ | ||||
|     bool vfp_enabled; /* FP enabled via FPSCR.EN */ | ||||
|     int vec_len; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Richard Henderson
						Richard Henderson