Lines Matching full:user
85 * Save the user access state into ua_state and reset it to disable any
104 * Set the user access state for invoking the signal handler.
115 * Restore the user access state to the values saved in ua_state.
125 static void init_user_layout(struct rt_sigframe_user_layout *user) in init_user_layout() argument
128 sizeof(user->sigframe->uc.uc_mcontext.__reserved); in init_user_layout()
130 memset(user, 0, sizeof(*user)); in init_user_layout()
131 user->size = offsetof(struct rt_sigframe, uc.uc_mcontext.__reserved); in init_user_layout()
133 user->limit = user->size + reserved_size; in init_user_layout()
135 user->limit -= TERMINATOR_SIZE; in init_user_layout()
136 user->limit -= EXTRA_CONTEXT_SIZE; in init_user_layout()
140 static size_t sigframe_size(struct rt_sigframe_user_layout const *user) in sigframe_size() argument
142 return round_up(max(user->size, sizeof(struct rt_sigframe)), 16); in sigframe_size()
153 static int __sigframe_alloc(struct rt_sigframe_user_layout *user, in __sigframe_alloc() argument
158 if (padded_size > user->limit - user->size && in __sigframe_alloc()
159 !user->extra_offset && in __sigframe_alloc()
163 user->limit += EXTRA_CONTEXT_SIZE; in __sigframe_alloc()
164 ret = __sigframe_alloc(user, &user->extra_offset, in __sigframe_alloc()
167 user->limit -= EXTRA_CONTEXT_SIZE; in __sigframe_alloc()
172 user->size += TERMINATOR_SIZE; in __sigframe_alloc()
178 user->limit = SIGFRAME_MAXSZ - TERMINATOR_SIZE; in __sigframe_alloc()
182 if (padded_size > user->limit - user->size) in __sigframe_alloc()
185 *offset = user->size; in __sigframe_alloc()
186 user->size += padded_size; in __sigframe_alloc()
192 * Allocate space for an optional record of <size> bytes in the user
196 static int sigframe_alloc(struct rt_sigframe_user_layout *user, in sigframe_alloc() argument
199 return __sigframe_alloc(user, offset, size, true); in sigframe_alloc()
203 static int sigframe_alloc_end(struct rt_sigframe_user_layout *user) in sigframe_alloc_end() argument
208 user->limit += TERMINATOR_SIZE; in sigframe_alloc_end()
210 ret = sigframe_alloc(user, &user->end_offset, in sigframe_alloc_end()
216 user->limit = user->size; in sigframe_alloc_end()
221 struct rt_sigframe_user_layout const *user, unsigned long offset) in apply_user_offset() argument
223 char __user *base = (char __user *)user->sigframe; in apply_user_offset()
265 static int restore_fpsimd_context(struct user_ctxs *user) in restore_fpsimd_context() argument
271 if (user->fpsimd_size != sizeof(struct fpsimd_context)) in restore_fpsimd_context()
275 err = __copy_from_user(fpsimd.vregs, &(user->fpsimd->vregs), in restore_fpsimd_context()
277 __get_user_error(fpsimd.fpsr, &(user->fpsimd->fpsr), err); in restore_fpsimd_context()
278 __get_user_error(fpsimd.fpcr, &(user->fpsimd->fpcr), err); in restore_fpsimd_context()
303 static int restore_fpmr_context(struct user_ctxs *user) in restore_fpmr_context() argument
308 if (user->fpmr_size != sizeof(*user->fpmr)) in restore_fpmr_context()
311 __get_user_error(fpmr, &user->fpmr->fpmr, err); in restore_fpmr_context()
330 static int restore_poe_context(struct user_ctxs *user, in restore_poe_context() argument
336 if (user->poe_size != sizeof(*user->poe)) in restore_poe_context()
339 __get_user_error(por_el0, &(user->poe->por_el0), err); in restore_poe_context()
388 static int restore_sve_fpsimd_context(struct user_ctxs *user) in restore_sve_fpsimd_context() argument
395 if (user->sve_size < sizeof(*user->sve)) in restore_sve_fpsimd_context()
398 __get_user_error(user_vl, &(user->sve->vl), err); in restore_sve_fpsimd_context()
399 __get_user_error(flags, &(user->sve->flags), err); in restore_sve_fpsimd_context()
423 if (user->sve_size == sizeof(*user->sve)) { in restore_sve_fpsimd_context()
432 if (user->sve_size < SVE_SIG_CONTEXT_SIZE(vq)) in restore_sve_fpsimd_context()
452 (char __user const *)user->sve + in restore_sve_fpsimd_context()
466 /* restore_sigframe() already checked that user->fpsimd != NULL. */ in restore_sve_fpsimd_context()
467 err = __copy_from_user(fpsimd.vregs, user->fpsimd->vregs, in restore_sve_fpsimd_context()
469 __get_user_error(fpsimd.fpsr, &user->fpsimd->fpsr, err); in restore_sve_fpsimd_context()
470 __get_user_error(fpsimd.fpcr, &user->fpsimd->fpcr, err); in restore_sve_fpsimd_context()
481 static int restore_sve_fpsimd_context(struct user_ctxs *user) in restore_sve_fpsimd_context() argument
507 static int restore_tpidr2_context(struct user_ctxs *user) in restore_tpidr2_context() argument
512 if (user->tpidr2_size != sizeof(*user->tpidr2)) in restore_tpidr2_context()
515 __get_user_error(tpidr2_el0, &user->tpidr2->tpidr2, err); in restore_tpidr2_context()
557 static int restore_za_context(struct user_ctxs *user) in restore_za_context() argument
563 if (user->za_size < sizeof(*user->za)) in restore_za_context()
566 __get_user_error(user_vl, &(user->za->vl), err); in restore_za_context()
573 if (user->za_size == sizeof(*user->za)) { in restore_za_context()
580 if (user->za_size < ZA_SIG_CONTEXT_SIZE(vq)) in restore_za_context()
601 (char __user const *)user->za + in restore_za_context()
642 static int restore_zt_context(struct user_ctxs *user) in restore_zt_context() argument
651 if (user->zt_size != ZT_SIG_CONTEXT_SIZE(1)) in restore_zt_context()
654 if (__copy_from_user(&nregs, &(user->zt->nregs), sizeof(nregs))) in restore_zt_context()
671 (char __user const *)user->zt + in restore_zt_context()
684 extern int restore_tpidr2_context(struct user_ctxs *user);
686 extern int restore_za_context(struct user_ctxs *user);
688 extern int restore_zt_context(struct user_ctxs *user);
719 static int restore_gcs_context(struct user_ctxs *user) in restore_gcs_context() argument
724 if (user->gcs_size != sizeof(*user->gcs)) in restore_gcs_context()
727 __get_user_error(gcspr, &user->gcs->gcspr, err); in restore_gcs_context()
728 __get_user_error(enabled, &user->gcs->features_enabled, err); in restore_gcs_context()
764 extern int restore_gcs_context(struct user_ctxs *user);
768 static int parse_user_sigframe(struct user_ctxs *user, in parse_user_sigframe() argument
779 user->fpsimd = NULL; in parse_user_sigframe()
780 user->sve = NULL; in parse_user_sigframe()
781 user->tpidr2 = NULL; in parse_user_sigframe()
782 user->za = NULL; in parse_user_sigframe()
783 user->zt = NULL; in parse_user_sigframe()
784 user->fpmr = NULL; in parse_user_sigframe()
785 user->poe = NULL; in parse_user_sigframe()
786 user->gcs = NULL; in parse_user_sigframe()
826 if (user->fpsimd) in parse_user_sigframe()
829 user->fpsimd = (struct fpsimd_context __user *)head; in parse_user_sigframe()
830 user->fpsimd_size = size; in parse_user_sigframe()
841 if (user->poe) in parse_user_sigframe()
844 user->poe = (struct poe_context __user *)head; in parse_user_sigframe()
845 user->poe_size = size; in parse_user_sigframe()
852 if (user->sve) in parse_user_sigframe()
855 user->sve = (struct sve_context __user *)head; in parse_user_sigframe()
856 user->sve_size = size; in parse_user_sigframe()
863 if (user->tpidr2) in parse_user_sigframe()
866 user->tpidr2 = (struct tpidr2_context __user *)head; in parse_user_sigframe()
867 user->tpidr2_size = size; in parse_user_sigframe()
874 if (user->za) in parse_user_sigframe()
877 user->za = (struct za_context __user *)head; in parse_user_sigframe()
878 user->za_size = size; in parse_user_sigframe()
885 if (user->zt) in parse_user_sigframe()
888 user->zt = (struct zt_context __user *)head; in parse_user_sigframe()
889 user->zt_size = size; in parse_user_sigframe()
896 if (user->fpmr) in parse_user_sigframe()
899 user->fpmr = (struct fpmr_context __user *)head; in parse_user_sigframe()
900 user->fpmr_size = size; in parse_user_sigframe()
907 if (user->gcs) in parse_user_sigframe()
910 user->gcs = (struct gcs_context __user *)head; in parse_user_sigframe()
911 user->gcs_size = size; in parse_user_sigframe()
1002 struct user_ctxs user; in restore_sigframe() local
1022 err = parse_user_sigframe(&user, sf); in restore_sigframe()
1025 if (!user.fpsimd) in restore_sigframe()
1028 if (user.sve) in restore_sigframe()
1029 err = restore_sve_fpsimd_context(&user); in restore_sigframe()
1031 err = restore_fpsimd_context(&user); in restore_sigframe()
1034 if (err == 0 && system_supports_gcs() && user.gcs) in restore_sigframe()
1035 err = restore_gcs_context(&user); in restore_sigframe()
1037 if (err == 0 && system_supports_tpidr2() && user.tpidr2) in restore_sigframe()
1038 err = restore_tpidr2_context(&user); in restore_sigframe()
1040 if (err == 0 && system_supports_fpmr() && user.fpmr) in restore_sigframe()
1041 err = restore_fpmr_context(&user); in restore_sigframe()
1043 if (err == 0 && system_supports_sme() && user.za) in restore_sigframe()
1044 err = restore_za_context(&user); in restore_sigframe()
1046 if (err == 0 && system_supports_sme2() && user.zt) in restore_sigframe()
1047 err = restore_zt_context(&user); in restore_sigframe()
1049 if (err == 0 && system_supports_poe() && user.poe) in restore_sigframe()
1050 err = restore_poe_context(&user, ua_state); in restore_sigframe()
1153 static int setup_sigframe_layout(struct rt_sigframe_user_layout *user, in setup_sigframe_layout() argument
1159 err = sigframe_alloc(user, &user->fpsimd_offset, in setup_sigframe_layout()
1167 err = sigframe_alloc(user, &user->esr_offset, in setup_sigframe_layout()
1175 err = sigframe_alloc(user, &user->gcs_offset, in setup_sigframe_layout()
1195 err = sigframe_alloc(user, &user->sve_offset, in setup_sigframe_layout()
1202 err = sigframe_alloc(user, &user->tpidr2_offset, in setup_sigframe_layout()
1220 err = sigframe_alloc(user, &user->za_offset, in setup_sigframe_layout()
1228 err = sigframe_alloc(user, &user->zt_offset, in setup_sigframe_layout()
1236 err = sigframe_alloc(user, &user->fpmr_offset, in setup_sigframe_layout()
1243 err = sigframe_alloc(user, &user->poe_offset, in setup_sigframe_layout()
1249 return sigframe_alloc_end(user); in setup_sigframe_layout()
1252 static int setup_sigframe(struct rt_sigframe_user_layout *user, in setup_sigframe() argument
1257 struct rt_sigframe __user *sf = user->sigframe; in setup_sigframe()
1260 __put_user_error(regs->regs[29], &user->next_frame->fp, err); in setup_sigframe()
1261 __put_user_error(regs->regs[30], &user->next_frame->lr, err); in setup_sigframe()
1276 apply_user_offset(user, user->fpsimd_offset); in setup_sigframe()
1281 if (err == 0 && user->esr_offset) { in setup_sigframe()
1283 apply_user_offset(user, user->esr_offset); in setup_sigframe()
1290 if (system_supports_gcs() && err == 0 && user->gcs_offset) { in setup_sigframe()
1292 apply_user_offset(user, user->gcs_offset); in setup_sigframe()
1298 err == 0 && user->sve_offset) { in setup_sigframe()
1300 apply_user_offset(user, user->sve_offset); in setup_sigframe()
1307 apply_user_offset(user, user->tpidr2_offset); in setup_sigframe()
1314 apply_user_offset(user, user->fpmr_offset); in setup_sigframe()
1320 apply_user_offset(user, user->poe_offset); in setup_sigframe()
1326 if (system_supports_sme() && err == 0 && user->za_offset) { in setup_sigframe()
1328 apply_user_offset(user, user->za_offset); in setup_sigframe()
1333 if (system_supports_sme2() && err == 0 && user->zt_offset) { in setup_sigframe()
1335 apply_user_offset(user, user->zt_offset); in setup_sigframe()
1339 if (err == 0 && user->extra_offset) { in setup_sigframe()
1340 char __user *sfp = (char __user *)user->sigframe; in setup_sigframe()
1342 apply_user_offset(user, user->extra_offset); in setup_sigframe()
1361 extra_size = sfp + round_up(user->size, 16) - userp; in setup_sigframe()
1376 apply_user_offset(user, user->end_offset); in setup_sigframe()
1385 static int get_sigframe(struct rt_sigframe_user_layout *user, in get_sigframe() argument
1391 init_user_layout(user); in get_sigframe()
1392 err = setup_sigframe_layout(user, false); in get_sigframe()
1399 user->next_frame = (struct frame_record __user *)sp; in get_sigframe()
1401 sp = round_down(sp, 16) - sigframe_size(user); in get_sigframe()
1402 user->sigframe = (struct rt_sigframe __user *)sp; in get_sigframe()
1407 if (!access_ok(user->sigframe, sp_top - sp)) in get_sigframe()
1457 struct rt_sigframe_user_layout *user, int usig) in setup_return() argument
1481 regs->regs[1] = (unsigned long)&user->sigframe->info; in setup_return()
1482 regs->regs[2] = (unsigned long)&user->sigframe->uc; in setup_return()
1484 regs->sp = (unsigned long)user->sigframe; in setup_return()
1485 regs->regs[29] = (unsigned long)&user->next_frame->fp; in setup_return()
1533 struct rt_sigframe_user_layout user; in setup_rt_frame() local
1540 if (get_sigframe(&user, ksig, regs)) in setup_rt_frame()
1544 frame = user.sigframe; in setup_rt_frame()
1550 err |= setup_sigframe(&user, regs, set, &ua_state); in setup_rt_frame()
1555 err = setup_return(regs, ksig, &user, usig); in setup_rt_frame()
1616 * the kernel can handle, and then we build all the user-level signal handling
1699 struct rt_sigframe_user_layout user; in minsigstksz_setup() local
1701 init_user_layout(&user); in minsigstksz_setup()
1707 if (WARN_ON(setup_sigframe_layout(&user, true))) in minsigstksz_setup()
1710 signal_minsigstksz = sigframe_size(&user) + in minsigstksz_setup()