Lines Matching refs:user

127 static void init_user_layout(struct rt_sigframe_user_layout *user)  in init_user_layout()  argument
130 sizeof(user->sigframe->uc.uc_mcontext.__reserved); in init_user_layout()
132 memset(user, 0, sizeof(*user)); in init_user_layout()
133 user->size = offsetof(struct rt_sigframe, uc.uc_mcontext.__reserved); in init_user_layout()
135 user->limit = user->size + reserved_size; in init_user_layout()
137 user->limit -= TERMINATOR_SIZE; in init_user_layout()
138 user->limit -= EXTRA_CONTEXT_SIZE; in init_user_layout()
142 static size_t sigframe_size(struct rt_sigframe_user_layout const *user) in sigframe_size() argument
144 return round_up(max(user->size, sizeof(struct rt_sigframe)), 16); in sigframe_size()
155 static int __sigframe_alloc(struct rt_sigframe_user_layout *user, in __sigframe_alloc() argument
160 if (padded_size > user->limit - user->size && in __sigframe_alloc()
161 !user->extra_offset && in __sigframe_alloc()
165 user->limit += EXTRA_CONTEXT_SIZE; in __sigframe_alloc()
166 ret = __sigframe_alloc(user, &user->extra_offset, in __sigframe_alloc()
169 user->limit -= EXTRA_CONTEXT_SIZE; in __sigframe_alloc()
174 user->size += TERMINATOR_SIZE; in __sigframe_alloc()
180 user->limit = SIGFRAME_MAXSZ - TERMINATOR_SIZE; in __sigframe_alloc()
184 if (padded_size > user->limit - user->size) in __sigframe_alloc()
187 *offset = user->size; in __sigframe_alloc()
188 user->size += padded_size; in __sigframe_alloc()
198 static int sigframe_alloc(struct rt_sigframe_user_layout *user, in sigframe_alloc() argument
201 return __sigframe_alloc(user, offset, size, true); in sigframe_alloc()
205 static int sigframe_alloc_end(struct rt_sigframe_user_layout *user) in sigframe_alloc_end() argument
210 user->limit += TERMINATOR_SIZE; in sigframe_alloc_end()
212 ret = sigframe_alloc(user, &user->end_offset, in sigframe_alloc_end()
218 user->limit = user->size; in sigframe_alloc_end()
223 struct rt_sigframe_user_layout const *user, unsigned long offset) in apply_user_offset() argument
225 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()
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);
692 static int parse_user_sigframe(struct user_ctxs *user, in parse_user_sigframe() argument
703 user->fpsimd = NULL; in parse_user_sigframe()
704 user->sve = NULL; in parse_user_sigframe()
705 user->tpidr2 = NULL; in parse_user_sigframe()
706 user->za = NULL; in parse_user_sigframe()
707 user->zt = NULL; in parse_user_sigframe()
708 user->fpmr = NULL; in parse_user_sigframe()
709 user->poe = NULL; in parse_user_sigframe()
749 if (user->fpsimd) in parse_user_sigframe()
752 user->fpsimd = (struct fpsimd_context __user *)head; in parse_user_sigframe()
753 user->fpsimd_size = size; in parse_user_sigframe()
764 if (user->poe) in parse_user_sigframe()
767 user->poe = (struct poe_context __user *)head; in parse_user_sigframe()
768 user->poe_size = size; in parse_user_sigframe()
775 if (user->sve) in parse_user_sigframe()
778 user->sve = (struct sve_context __user *)head; in parse_user_sigframe()
779 user->sve_size = size; in parse_user_sigframe()
786 if (user->tpidr2) in parse_user_sigframe()
789 user->tpidr2 = (struct tpidr2_context __user *)head; in parse_user_sigframe()
790 user->tpidr2_size = size; in parse_user_sigframe()
797 if (user->za) in parse_user_sigframe()
800 user->za = (struct za_context __user *)head; in parse_user_sigframe()
801 user->za_size = size; in parse_user_sigframe()
808 if (user->zt) in parse_user_sigframe()
811 user->zt = (struct zt_context __user *)head; in parse_user_sigframe()
812 user->zt_size = size; in parse_user_sigframe()
819 if (user->fpmr) in parse_user_sigframe()
822 user->fpmr = (struct fpmr_context __user *)head; in parse_user_sigframe()
823 user->fpmr_size = size; in parse_user_sigframe()
914 struct user_ctxs user; in restore_sigframe() local
934 err = parse_user_sigframe(&user, sf); in restore_sigframe()
937 if (!user.fpsimd) in restore_sigframe()
940 if (user.sve) in restore_sigframe()
941 err = restore_sve_fpsimd_context(&user); in restore_sigframe()
943 err = restore_fpsimd_context(&user); in restore_sigframe()
946 if (err == 0 && system_supports_tpidr2() && user.tpidr2) in restore_sigframe()
947 err = restore_tpidr2_context(&user); in restore_sigframe()
949 if (err == 0 && system_supports_fpmr() && user.fpmr) in restore_sigframe()
950 err = restore_fpmr_context(&user); in restore_sigframe()
952 if (err == 0 && system_supports_sme() && user.za) in restore_sigframe()
953 err = restore_za_context(&user); in restore_sigframe()
955 if (err == 0 && system_supports_sme2() && user.zt) in restore_sigframe()
956 err = restore_zt_context(&user); in restore_sigframe()
958 if (err == 0 && system_supports_poe() && user.poe) in restore_sigframe()
959 err = restore_poe_context(&user, ua_state); in restore_sigframe()
1007 static int setup_sigframe_layout(struct rt_sigframe_user_layout *user, in setup_sigframe_layout() argument
1013 err = sigframe_alloc(user, &user->fpsimd_offset, in setup_sigframe_layout()
1021 err = sigframe_alloc(user, &user->esr_offset, in setup_sigframe_layout()
1040 err = sigframe_alloc(user, &user->sve_offset, in setup_sigframe_layout()
1047 err = sigframe_alloc(user, &user->tpidr2_offset, in setup_sigframe_layout()
1065 err = sigframe_alloc(user, &user->za_offset, in setup_sigframe_layout()
1073 err = sigframe_alloc(user, &user->zt_offset, in setup_sigframe_layout()
1081 err = sigframe_alloc(user, &user->fpmr_offset, in setup_sigframe_layout()
1088 err = sigframe_alloc(user, &user->poe_offset, in setup_sigframe_layout()
1094 return sigframe_alloc_end(user); in setup_sigframe_layout()
1097 static int setup_sigframe(struct rt_sigframe_user_layout *user, in setup_sigframe() argument
1102 struct rt_sigframe __user *sf = user->sigframe; in setup_sigframe()
1105 __put_user_error(regs->regs[29], &user->next_frame->fp, err); in setup_sigframe()
1106 __put_user_error(regs->regs[30], &user->next_frame->lr, err); in setup_sigframe()
1121 apply_user_offset(user, user->fpsimd_offset); in setup_sigframe()
1126 if (err == 0 && user->esr_offset) { in setup_sigframe()
1128 apply_user_offset(user, user->esr_offset); in setup_sigframe()
1137 err == 0 && user->sve_offset) { in setup_sigframe()
1139 apply_user_offset(user, user->sve_offset); in setup_sigframe()
1146 apply_user_offset(user, user->tpidr2_offset); in setup_sigframe()
1153 apply_user_offset(user, user->fpmr_offset); in setup_sigframe()
1157 if (system_supports_poe() && err == 0 && user->poe_offset) { in setup_sigframe()
1159 apply_user_offset(user, user->poe_offset); in setup_sigframe()
1165 if (system_supports_sme() && err == 0 && user->za_offset) { in setup_sigframe()
1167 apply_user_offset(user, user->za_offset); in setup_sigframe()
1172 if (system_supports_sme2() && err == 0 && user->zt_offset) { in setup_sigframe()
1174 apply_user_offset(user, user->zt_offset); in setup_sigframe()
1178 if (err == 0 && user->extra_offset) { in setup_sigframe()
1179 char __user *sfp = (char __user *)user->sigframe; in setup_sigframe()
1181 apply_user_offset(user, user->extra_offset); in setup_sigframe()
1200 extra_size = sfp + round_up(user->size, 16) - userp; in setup_sigframe()
1215 apply_user_offset(user, user->end_offset); in setup_sigframe()
1224 static int get_sigframe(struct rt_sigframe_user_layout *user, in get_sigframe() argument
1230 init_user_layout(user); in get_sigframe()
1231 err = setup_sigframe_layout(user, false); in get_sigframe()
1238 user->next_frame = (struct frame_record __user *)sp; in get_sigframe()
1240 sp = round_down(sp, 16) - sigframe_size(user); in get_sigframe()
1241 user->sigframe = (struct rt_sigframe __user *)sp; in get_sigframe()
1246 if (!access_ok(user->sigframe, sp_top - sp)) in get_sigframe()
1253 struct rt_sigframe_user_layout *user, int usig) in setup_return() argument
1258 regs->sp = (unsigned long)user->sigframe; in setup_return()
1259 regs->regs[29] = (unsigned long)&user->next_frame->fp; in setup_return()
1311 struct rt_sigframe_user_layout user; in setup_rt_frame() local
1318 if (get_sigframe(&user, ksig, regs)) in setup_rt_frame()
1322 frame = user.sigframe; in setup_rt_frame()
1328 err |= setup_sigframe(&user, regs, set, &ua_state); in setup_rt_frame()
1330 setup_return(regs, &ksig->ka, &user, usig); in setup_rt_frame()
1475 struct rt_sigframe_user_layout user; in minsigstksz_setup() local
1477 init_user_layout(&user); in minsigstksz_setup()
1483 if (WARN_ON(setup_sigframe_layout(&user, true))) in minsigstksz_setup()
1486 signal_minsigstksz = sigframe_size(&user) + in minsigstksz_setup()