On Thu, 30 Sep 2021 19:11:30 +0100 Mark Brown <broonie@xxxxxxxxxx> wrote: > By default all SME operations in userspace will trap. When this happens > we allocate storage space for the SME register state, set up the SVE > registers and disable traps. We do not need to initialize ZA since the > architecture guarantees that it will be zeroed when enabled and when we > trap ZA is disabled. > > On syscall we exit streaming mode if we were previously in it and ensure > that all but the lower 128 bits of the registers are zeroed while > preserving the state of ZA. This follows the aarch64 PCS for SME, ZA > state is preserved over a function call and streaming mode is exited. > Since the traps for SME do not distinguish between streaming mode SVE > and ZA usage if ZA is in use rather than reenabling traps we instead > zero the parts of the SVE registers not shared with FPSIMD and leave SME > enabled, this simplifies handling SME traps. If ZA is not in use then we > reenable SME traps and fall through to normal handling of SVE. > > Signed-off-by: Mark Brown <broonie@xxxxxxxxxx> ... continuing the trivial theme of my review today... > > /* > * task_fpsimd_load() won't be called to update CPACR_EL1 in > - * ret_to_user unless TIF_FOREIGN_FPSTATE is still set, which only > - * happens if a context switch or kernel_neon_begin() or context > - * modification (sigreturn, ptrace) intervenes. > - * So, ensure that CPACR_EL1 is already correct for the fast-path case. > + * ret_to_user unless TIF_FOREIGN_FPSTATE is still set, which > + * only happens if a context switch or kernel_neon_begin() or Why the rewrap here? > + * context modification (sigreturn, ptrace) intervenes. So, > + * ensure that CPACR_EL1 is already correct for the fast-path > + * case. > */ > sve_user_disable(); > } > > void do_el0_svc(struct pt_regs *regs) > { > - sve_user_discard(); > + fp_user_discard(); > el0_svc_common(regs, regs->regs[8], __NR_syscalls, sys_call_table); > } >