Lines Matching refs:user

72 static void init_user_layout(struct rt_sigframe_user_layout *user)
75 sizeof(user->sigframe->uc.uc_mcontext.__reserved);
77 memset(user, 0, sizeof(*user));
78 user->size = offsetof(struct rt_sigframe, uc.uc_mcontext.__reserved);
80 user->limit = user->size + reserved_size;
82 user->limit -= TERMINATOR_SIZE;
83 user->limit -= EXTRA_CONTEXT_SIZE;
87 static size_t sigframe_size(struct rt_sigframe_user_layout const *user)
89 return round_up(max(user->size, sizeof(struct rt_sigframe)), 16);
100 static int __sigframe_alloc(struct rt_sigframe_user_layout *user,
105 if (padded_size > user->limit - user->size &&
106 !user->extra_offset &&
110 user->limit += EXTRA_CONTEXT_SIZE;
111 ret = __sigframe_alloc(user, &user->extra_offset,
114 user->limit -= EXTRA_CONTEXT_SIZE;
119 user->size += TERMINATOR_SIZE;
125 user->limit = SIGFRAME_MAXSZ - TERMINATOR_SIZE;
129 if (padded_size > user->limit - user->size)
132 *offset = user->size;
133 user->size += padded_size;
139 * Allocate space for an optional record of <size> bytes in the user
143 static int sigframe_alloc(struct rt_sigframe_user_layout *user,
146 return __sigframe_alloc(user, offset, size, true);
150 static int sigframe_alloc_end(struct rt_sigframe_user_layout *user)
155 user->limit += TERMINATOR_SIZE;
157 ret = sigframe_alloc(user, &user->end_offset,
163 user->limit = user->size;
168 struct rt_sigframe_user_layout const *user, unsigned long offset)
170 char __user *base = (char __user *)user->sigframe;
208 static int restore_fpsimd_context(struct user_ctxs *user)
214 if (user->fpsimd_size != sizeof(struct fpsimd_context))
218 err = __copy_from_user(fpsimd.vregs, &(user->fpsimd->vregs),
220 __get_user_error(fpsimd.fpsr, &(user->fpsimd->fpsr), err);
221 __get_user_error(fpsimd.fpcr, &(user->fpsimd->fpcr), err);
246 static int restore_fpmr_context(struct user_ctxs *user)
251 if (user->fpmr_size != sizeof(*user->fpmr))
254 __get_user_error(fpmr, &user->fpmr->fpmr, err);
303 static int restore_sve_fpsimd_context(struct user_ctxs *user)
310 if (user->sve_size < sizeof(*user->sve))
313 __get_user_error(user_vl, &(user->sve->vl), err);
314 __get_user_error(flags, &(user->sve->flags), err);
338 if (user->sve_size == sizeof(*user->sve)) {
347 if (user->sve_size < SVE_SIG_CONTEXT_SIZE(vq))
367 (char __user const *)user->sve +
381 /* restore_sigframe() already checked that user->fpsimd != NULL. */
382 err = __copy_from_user(fpsimd.vregs, user->fpsimd->vregs,
384 __get_user_error(fpsimd.fpsr, &user->fpsimd->fpsr, err);
385 __get_user_error(fpsimd.fpcr, &user->fpsimd->fpcr, err);
396 static int restore_sve_fpsimd_context(struct user_ctxs *user)
422 static int restore_tpidr2_context(struct user_ctxs *user)
427 if (user->tpidr2_size != sizeof(*user->tpidr2))
430 __get_user_error(tpidr2_el0, &user->tpidr2->tpidr2, err);
472 static int restore_za_context(struct user_ctxs *user)
478 if (user->za_size < sizeof(*user->za))
481 __get_user_error(user_vl, &(user->za->vl), err);
488 if (user->za_size == sizeof(*user->za)) {
495 if (user->za_size < ZA_SIG_CONTEXT_SIZE(vq))
516 (char __user const *)user->za +
557 static int restore_zt_context(struct user_ctxs *user)
566 if (user->zt_size != ZT_SIG_CONTEXT_SIZE(1))
569 if (__copy_from_user(&nregs, &(user->zt->nregs), sizeof(nregs)))
586 (char __user const *)user->zt +
599 extern int restore_tpidr2_context(struct user_ctxs *user);
601 extern int restore_za_context(struct user_ctxs *user);
603 extern int restore_zt_context(struct user_ctxs *user);
607 static int parse_user_sigframe(struct user_ctxs *user,
618 user->fpsimd = NULL;
619 user->sve = NULL;
620 user->tpidr2 = NULL;
621 user->za = NULL;
622 user->zt = NULL;
623 user->fpmr = NULL;
663 if (user->fpsimd)
666 user->fpsimd = (struct fpsimd_context __user *)head;
667 user->fpsimd_size = size;
678 if (user->sve)
681 user->sve = (struct sve_context __user *)head;
682 user->sve_size = size;
689 if (user->tpidr2)
692 user->tpidr2 = (struct tpidr2_context __user *)head;
693 user->tpidr2_size = size;
700 if (user->za)
703 user->za = (struct za_context __user *)head;
704 user->za_size = size;
711 if (user->zt)
714 user->zt = (struct zt_context __user *)head;
715 user->zt_size = size;
722 if (user->fpmr)
725 user->fpmr = (struct fpmr_context __user *)head;
726 user->fpmr_size = size;
816 struct user_ctxs user;
836 err = parse_user_sigframe(&user, sf);
839 if (!user.fpsimd)
842 if (user.sve)
843 err = restore_sve_fpsimd_context(&user);
845 err = restore_fpsimd_context(&user);
848 if (err == 0 && system_supports_tpidr2() && user.tpidr2)
849 err = restore_tpidr2_context(&user);
851 if (err == 0 && system_supports_fpmr() && user.fpmr)
852 err = restore_fpmr_context(&user);
854 if (err == 0 && system_supports_sme() && user.za)
855 err = restore_za_context(&user);
857 if (err == 0 && system_supports_sme2() && user.zt)
858 err = restore_zt_context(&user);
903 static int setup_sigframe_layout(struct rt_sigframe_user_layout *user,
909 err = sigframe_alloc(user, &user->fpsimd_offset,
917 err = sigframe_alloc(user, &user->esr_offset,
936 err = sigframe_alloc(user, &user->sve_offset,
943 err = sigframe_alloc(user, &user->tpidr2_offset,
961 err = sigframe_alloc(user, &user->za_offset,
969 err = sigframe_alloc(user, &user->zt_offset,
977 err = sigframe_alloc(user, &user->fpmr_offset,
983 return sigframe_alloc_end(user);
986 static int setup_sigframe(struct rt_sigframe_user_layout *user,
990 struct rt_sigframe __user *sf = user->sigframe;
993 __put_user_error(regs->regs[29], &user->next_frame->fp, err);
994 __put_user_error(regs->regs[30], &user->next_frame->lr, err);
1009 apply_user_offset(user, user->fpsimd_offset);
1014 if (err == 0 && user->esr_offset) {
1016 apply_user_offset(user, user->esr_offset);
1025 err == 0 && user->sve_offset) {
1027 apply_user_offset(user, user->sve_offset);
1034 apply_user_offset(user, user->tpidr2_offset);
1041 apply_user_offset(user, user->fpmr_offset);
1046 if (system_supports_sme() && err == 0 && user->za_offset) {
1048 apply_user_offset(user, user->za_offset);
1053 if (system_supports_sme2() && err == 0 && user->zt_offset) {
1055 apply_user_offset(user, user->zt_offset);
1059 if (err == 0 && user->extra_offset) {
1060 char __user *sfp = (char __user *)user->sigframe;
1062 apply_user_offset(user, user->extra_offset);
1081 extra_size = sfp + round_up(user->size, 16) - userp;
1096 apply_user_offset(user, user->end_offset);
1105 static int get_sigframe(struct rt_sigframe_user_layout *user,
1111 init_user_layout(user);
1112 err = setup_sigframe_layout(user, false);
1119 user->next_frame = (struct frame_record __user *)sp;
1121 sp = round_down(sp, 16) - sigframe_size(user);
1122 user->sigframe = (struct rt_sigframe __user *)sp;
1127 if (!access_ok(user->sigframe, sp_top - sp))
1134 struct rt_sigframe_user_layout *user, int usig)
1139 regs->sp = (unsigned long)user->sigframe;
1140 regs->regs[29] = (unsigned long)&user->next_frame->fp;
1192 struct rt_sigframe_user_layout user;
1198 if (get_sigframe(&user, ksig, regs))
1201 frame = user.sigframe;
1207 err |= setup_sigframe(&user, regs, set);
1209 setup_return(regs, &ksig->ka, &user, usig);
1266 * the kernel can handle, and then we build all the user-level signal handling
1349 struct rt_sigframe_user_layout user;
1351 init_user_layout(&user);
1357 if (WARN_ON(setup_sigframe_layout(&user, true)))
1360 signal_minsigstksz = sigframe_size(&user) +