mirror of
				https://github.com/qemu/qemu.git
				synced 2025-10-31 04:06:46 +00:00 
			
		
		
		
	target-arm: make PAR banked
When EL3 is running in AArch32 (or ARMv7 with Security Extensions) PAR has a secure and a non-secure instance. Signed-off-by: Fabian Aggeler <aggelerf@ethz.ch> Signed-off-by: Greg Bellows <greg.bellows@linaro.org> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Message-id: 1416242878-876-23-git-send-email-greg.bellows@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
		
							parent
							
								
									b848ce2b9c
								
							
						
					
					
						commit
						01c097f796
					
				| @ -279,7 +279,15 @@ typedef struct CPUARMState { | ||||
|             }; | ||||
|             uint64_t far_el[4]; | ||||
|         }; | ||||
|         uint64_t par_el1;  /* Translation result. */ | ||||
|         union { /* Translation result. */ | ||||
|             struct { | ||||
|                 uint64_t _unused_par_0; | ||||
|                 uint64_t par_ns; | ||||
|                 uint64_t _unused_par_1; | ||||
|                 uint64_t par_s; | ||||
|             }; | ||||
|             uint64_t par_el[4]; | ||||
|         }; | ||||
|         uint32_t c9_insn; /* Cache lockdown registers.  */ | ||||
|         uint32_t c9_data; | ||||
|         uint64_t c9_pmcr; /* performance monitor control register */ | ||||
|  | ||||
| @ -1404,6 +1404,7 @@ static void ats_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value) | ||||
|     int prot; | ||||
|     int ret, is_user = ri->opc2 & 2; | ||||
|     int access_type = ri->opc2 & 1; | ||||
|     uint64_t par64; | ||||
| 
 | ||||
|     ret = get_phys_addr(env, value, access_type, is_user, | ||||
|                         &phys_addr, &prot, &page_size); | ||||
| @ -1412,7 +1413,7 @@ static void ats_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value) | ||||
|          * translation table format, but with WnR always clear. | ||||
|          * Convert it to a 64-bit PAR. | ||||
|          */ | ||||
|         uint64_t par64 = (1 << 11); /* LPAE bit always set */ | ||||
|         par64 = (1 << 11); /* LPAE bit always set */ | ||||
|         if (ret == 0) { | ||||
|             par64 |= phys_addr & ~0xfffULL; | ||||
|             /* We don't set the ATTR or SH fields in the PAR. */ | ||||
| @ -1424,7 +1425,6 @@ static void ats_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value) | ||||
|              * fault. | ||||
|              */ | ||||
|         } | ||||
|         env->cp15.par_el1 = par64; | ||||
|     } else { | ||||
|         /* ret is a DFSR/IFSR value for the short descriptor
 | ||||
|          * translation table format (with WnR always clear). | ||||
| @ -1434,23 +1434,25 @@ static void ats_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value) | ||||
|             /* We do not set any attribute bits in the PAR */ | ||||
|             if (page_size == (1 << 24) | ||||
|                 && arm_feature(env, ARM_FEATURE_V7)) { | ||||
|                 env->cp15.par_el1 = (phys_addr & 0xff000000) | 1 << 1; | ||||
|                 par64 = (phys_addr & 0xff000000) | (1 << 1); | ||||
|             } else { | ||||
|                 env->cp15.par_el1 = phys_addr & 0xfffff000; | ||||
|                 par64 = phys_addr & 0xfffff000; | ||||
|             } | ||||
|         } else { | ||||
|             env->cp15.par_el1 = ((ret & (1 << 10)) >> 5) | | ||||
|                 ((ret & (1 << 12)) >> 6) | | ||||
|                 ((ret & 0xf) << 1) | 1; | ||||
|             par64 = ((ret & (1 << 10)) >> 5) | ((ret & (1 << 12)) >> 6) | | ||||
|                     ((ret & 0xf) << 1) | 1; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     A32_BANKED_CURRENT_REG_SET(env, par, par64); | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| static const ARMCPRegInfo vapa_cp_reginfo[] = { | ||||
|     { .name = "PAR", .cp = 15, .crn = 7, .crm = 4, .opc1 = 0, .opc2 = 0, | ||||
|       .access = PL1_RW, .resetvalue = 0, | ||||
|       .fieldoffset = offsetoflow32(CPUARMState, cp15.par_el1), | ||||
|       .bank_fieldoffsets = { offsetoflow32(CPUARMState, cp15.par_s), | ||||
|                              offsetoflow32(CPUARMState, cp15.par_ns) }, | ||||
|       .writefn = par_write }, | ||||
| #ifndef CONFIG_USER_ONLY | ||||
|     { .name = "ATS", .cp = 15, .crn = 7, .crm = 8, .opc1 = 0, .opc2 = CP_ANY, | ||||
| @ -1903,8 +1905,9 @@ static const ARMCPRegInfo lpae_cp_reginfo[] = { | ||||
|       .access = PL1_RW, .type = ARM_CP_CONST | ARM_CP_OVERRIDE, | ||||
|       .resetvalue = 0 }, | ||||
|     { .name = "PAR", .cp = 15, .crm = 7, .opc1 = 0, | ||||
|       .access = PL1_RW, .type = ARM_CP_64BIT, | ||||
|       .fieldoffset = offsetof(CPUARMState, cp15.par_el1), .resetvalue = 0 }, | ||||
|       .access = PL1_RW, .type = ARM_CP_64BIT, .resetvalue = 0, | ||||
|       .bank_fieldoffsets = { offsetof(CPUARMState, cp15.par_s), | ||||
|                              offsetof(CPUARMState, cp15.par_ns)} }, | ||||
|     { .name = "TTBR0", .cp = 15, .crm = 2, .opc1 = 0, | ||||
|       .access = PL1_RW, .type = ARM_CP_64BIT | ARM_CP_NO_MIGRATE, | ||||
|       .bank_fieldoffsets = { offsetof(CPUARMState, cp15.ttbr0_s), | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Fabian Aggeler
						Fabian Aggeler