Peter Maydell <peter.mayd...@linaro.org> writes: > In do_ats_write(), rather than using extended_addresses_enabled() to > decide whether the value we get back from get_phys_addr() is a 64-bit > format PAR or a 32-bit one, use arm_s1_regime_using_lpae_format(). > > This is not really the correct answer, because the PAR format > depends on the AT instruction being used, not just on the > translation regime. However getting this correct requires a > significant refactoring, so that get_phys_addr() returns raw > information about the fault which the caller can then assemble > into a suitable FSR/PAR/syndrome for its purposes, rather than > get_phys_addr() returning a pre-formatted FSR. > > However this change at least improves the situation by making > the PAR work correctly for address translation operations done > at AArch64 EL2 on the EL2 translation regime. In particular, > this is necessary for Xen to be able to run in our emulation, > so this seems like a safer interim fix given that we are in freeze. > > Signed-off-by: Peter Maydell <peter.mayd...@linaro.org>
As far as it goes it seems reasonable: Reviewed-by: Alex Bennée <alex.ben...@linaro.org> > --- > I guess I should have a go at the "correct answer" I sketch > above, but no promises about when I'll get time for that :-( > > target/arm/helper.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/target/arm/helper.c b/target/arm/helper.c > index 96113fe..37af750 100644 > --- a/target/arm/helper.c > +++ b/target/arm/helper.c > @@ -2162,7 +2162,7 @@ static uint64_t do_ats_write(CPUARMState *env, uint64_t > value, > > ret = get_phys_addr(env, value, access_type, mmu_idx, > &phys_addr, &attrs, &prot, &page_size, &fsr, &fi); > - if (extended_addresses_enabled(env)) { > + if (arm_s1_regime_using_lpae_format(env, mmu_idx)) { > /* fsr is a DFSR/IFSR value for the long descriptor > * translation table format, but with WnR always clear. > * Convert it to a 64-bit PAR. -- Alex Bennée