On 9 August 2018 at 05:21, Richard Henderson <richard.hender...@linaro.org> wrote: > SVE vector length can change when changing EL, or when writing > to one of the ZCR_ELn registers. > > For correctness, our implementation requires that predicate bits > that are inaccessible are never set. Which means noticing length > changes and zeroing the appropriate register bits. > > Signed-off-by: Richard Henderson <richard.hender...@linaro.org> > ---
> +/* > + * Notice a change in SVE vector size when changing EL. > + */ > +void aarch64_sve_change_el(CPUARMState *env, int old_el, int new_el) > +{ > + int old_len, new_len; > + > + /* Nothing to do if no SVE. */ > + if (!arm_feature(env, ARM_FEATURE_SVE)) { > + return; > + } > + > + /* Nothing to do if FP is disabled in either EL. */ > + if (fp_exception_el(env, old_el) || fp_exception_el(env, new_el)) { > + return; > + } > + > + /* > + * When FP is enabled, but SVE is disabled, the effective len is 0. > + * ??? How should sve_exception_el interact with AArch32 state? > + * That isn't included in the CheckSVEEnabled pseudocode, so is the > + * host kernel required to explicitly disable SVE for an EL using aa32? > + */ I'm not clear what you're asking here. If the EL is AArch32 then why does it make a difference if SVE is enabled or disabled? You can't get at it... > + old_len = (sve_exception_el(env, old_el) > + ? 0 : sve_zcr_len_for_el(env, old_el)); > + new_len = (sve_exception_el(env, new_el) > + ? 0 : sve_zcr_len_for_el(env, new_el)); > + > + /* When changing vector length, clear inaccessible state. */ > + if (new_len < old_len) { > + aarch64_sve_narrow_vq(env, new_len + 1); > + } > +} > +#endif thanks -- PMM