Lines Matching refs:user

71 static void init_user_layout(struct rt_sigframe_user_layout *user)  in init_user_layout()  argument
74 sizeof(user->sigframe->uc.uc_mcontext.__reserved); in init_user_layout()
76 memset(user, 0, sizeof(*user)); in init_user_layout()
77 user->size = offsetof(struct rt_sigframe, uc.uc_mcontext.__reserved); in init_user_layout()
79 user->limit = user->size + reserved_size; in init_user_layout()
81 user->limit -= TERMINATOR_SIZE; in init_user_layout()
82 user->limit -= EXTRA_CONTEXT_SIZE; in init_user_layout()
86 static size_t sigframe_size(struct rt_sigframe_user_layout const *user) in sigframe_size() argument
88 return round_up(max(user->size, sizeof(struct rt_sigframe)), 16); in sigframe_size()
99 static int __sigframe_alloc(struct rt_sigframe_user_layout *user, in __sigframe_alloc() argument
104 if (padded_size > user->limit - user->size && in __sigframe_alloc()
105 !user->extra_offset && in __sigframe_alloc()
109 user->limit += EXTRA_CONTEXT_SIZE; in __sigframe_alloc()
110 ret = __sigframe_alloc(user, &user->extra_offset, in __sigframe_alloc()
113 user->limit -= EXTRA_CONTEXT_SIZE; in __sigframe_alloc()
118 user->size += TERMINATOR_SIZE; in __sigframe_alloc()
124 user->limit = SIGFRAME_MAXSZ - TERMINATOR_SIZE; in __sigframe_alloc()
128 if (padded_size > user->limit - user->size) in __sigframe_alloc()
131 *offset = user->size; in __sigframe_alloc()
132 user->size += padded_size; in __sigframe_alloc()
142 static int sigframe_alloc(struct rt_sigframe_user_layout *user, in sigframe_alloc() argument
145 return __sigframe_alloc(user, offset, size, true); in sigframe_alloc()
149 static int sigframe_alloc_end(struct rt_sigframe_user_layout *user) in sigframe_alloc_end() argument
154 user->limit += TERMINATOR_SIZE; in sigframe_alloc_end()
156 ret = sigframe_alloc(user, &user->end_offset, in sigframe_alloc_end()
162 user->limit = user->size; in sigframe_alloc_end()
167 struct rt_sigframe_user_layout const *user, unsigned long offset) in apply_user_offset() argument
169 char __user *base = (char __user *)user->sigframe; in apply_user_offset()
205 static int restore_fpsimd_context(struct user_ctxs *user) in restore_fpsimd_context() argument
211 if (user->fpsimd_size != sizeof(struct fpsimd_context)) in restore_fpsimd_context()
215 err = __copy_from_user(fpsimd.vregs, &(user->fpsimd->vregs), in restore_fpsimd_context()
217 __get_user_error(fpsimd.fpsr, &(user->fpsimd->fpsr), err); in restore_fpsimd_context()
218 __get_user_error(fpsimd.fpcr, &(user->fpsimd->fpcr), err); in restore_fpsimd_context()
273 static int restore_sve_fpsimd_context(struct user_ctxs *user) in restore_sve_fpsimd_context() argument
280 if (user->sve_size < sizeof(*user->sve)) in restore_sve_fpsimd_context()
283 __get_user_error(user_vl, &(user->sve->vl), err); in restore_sve_fpsimd_context()
284 __get_user_error(flags, &(user->sve->flags), err); in restore_sve_fpsimd_context()
308 if (user->sve_size == sizeof(*user->sve)) { in restore_sve_fpsimd_context()
317 if (user->sve_size < SVE_SIG_CONTEXT_SIZE(vq)) in restore_sve_fpsimd_context()
337 (char __user const *)user->sve + in restore_sve_fpsimd_context()
352 err = __copy_from_user(fpsimd.vregs, user->fpsimd->vregs, in restore_sve_fpsimd_context()
354 __get_user_error(fpsimd.fpsr, &user->fpsimd->fpsr, err); in restore_sve_fpsimd_context()
355 __get_user_error(fpsimd.fpcr, &user->fpsimd->fpcr, err); in restore_sve_fpsimd_context()
366 static int restore_sve_fpsimd_context(struct user_ctxs *user) in restore_sve_fpsimd_context() argument
392 static int restore_tpidr2_context(struct user_ctxs *user) in restore_tpidr2_context() argument
397 if (user->tpidr2_size != sizeof(*user->tpidr2)) in restore_tpidr2_context()
400 __get_user_error(tpidr2_el0, &user->tpidr2->tpidr2, err); in restore_tpidr2_context()
442 static int restore_za_context(struct user_ctxs *user) in restore_za_context() argument
448 if (user->za_size < sizeof(*user->za)) in restore_za_context()
451 __get_user_error(user_vl, &(user->za->vl), err); in restore_za_context()
458 if (user->za_size == sizeof(*user->za)) { in restore_za_context()
465 if (user->za_size < ZA_SIG_CONTEXT_SIZE(vq)) in restore_za_context()
486 (char __user const *)user->za + in restore_za_context()
527 static int restore_zt_context(struct user_ctxs *user) in restore_zt_context() argument
536 if (user->zt_size != ZT_SIG_CONTEXT_SIZE(1)) in restore_zt_context()
539 if (__copy_from_user(&nregs, &(user->zt->nregs), sizeof(nregs))) in restore_zt_context()
556 (char __user const *)user->zt + in restore_zt_context()
569 extern int restore_tpidr2_context(struct user_ctxs *user);
571 extern int restore_za_context(struct user_ctxs *user);
573 extern int restore_zt_context(struct user_ctxs *user);
577 static int parse_user_sigframe(struct user_ctxs *user, in parse_user_sigframe() argument
588 user->fpsimd = NULL; in parse_user_sigframe()
589 user->sve = NULL; in parse_user_sigframe()
590 user->tpidr2 = NULL; in parse_user_sigframe()
591 user->za = NULL; in parse_user_sigframe()
592 user->zt = NULL; in parse_user_sigframe()
632 if (user->fpsimd) in parse_user_sigframe()
635 user->fpsimd = (struct fpsimd_context __user *)head; in parse_user_sigframe()
636 user->fpsimd_size = size; in parse_user_sigframe()
647 if (user->sve) in parse_user_sigframe()
650 user->sve = (struct sve_context __user *)head; in parse_user_sigframe()
651 user->sve_size = size; in parse_user_sigframe()
658 if (user->tpidr2) in parse_user_sigframe()
661 user->tpidr2 = (struct tpidr2_context __user *)head; in parse_user_sigframe()
662 user->tpidr2_size = size; in parse_user_sigframe()
669 if (user->za) in parse_user_sigframe()
672 user->za = (struct za_context __user *)head; in parse_user_sigframe()
673 user->za_size = size; in parse_user_sigframe()
680 if (user->zt) in parse_user_sigframe()
683 user->zt = (struct zt_context __user *)head; in parse_user_sigframe()
684 user->zt_size = size; in parse_user_sigframe()
774 struct user_ctxs user; in restore_sigframe() local
794 err = parse_user_sigframe(&user, sf); in restore_sigframe()
797 if (!user.fpsimd) in restore_sigframe()
800 if (user.sve) in restore_sigframe()
801 err = restore_sve_fpsimd_context(&user); in restore_sigframe()
803 err = restore_fpsimd_context(&user); in restore_sigframe()
806 if (err == 0 && system_supports_tpidr2() && user.tpidr2) in restore_sigframe()
807 err = restore_tpidr2_context(&user); in restore_sigframe()
809 if (err == 0 && system_supports_sme() && user.za) in restore_sigframe()
810 err = restore_za_context(&user); in restore_sigframe()
812 if (err == 0 && system_supports_sme2() && user.zt) in restore_sigframe()
813 err = restore_zt_context(&user); in restore_sigframe()
858 static int setup_sigframe_layout(struct rt_sigframe_user_layout *user, in setup_sigframe_layout() argument
864 err = sigframe_alloc(user, &user->fpsimd_offset, in setup_sigframe_layout()
872 err = sigframe_alloc(user, &user->esr_offset, in setup_sigframe_layout()
891 err = sigframe_alloc(user, &user->sve_offset, in setup_sigframe_layout()
898 err = sigframe_alloc(user, &user->tpidr2_offset, in setup_sigframe_layout()
916 err = sigframe_alloc(user, &user->za_offset, in setup_sigframe_layout()
924 err = sigframe_alloc(user, &user->zt_offset, in setup_sigframe_layout()
931 return sigframe_alloc_end(user); in setup_sigframe_layout()
934 static int setup_sigframe(struct rt_sigframe_user_layout *user, in setup_sigframe() argument
938 struct rt_sigframe __user *sf = user->sigframe; in setup_sigframe()
941 __put_user_error(regs->regs[29], &user->next_frame->fp, err); in setup_sigframe()
942 __put_user_error(regs->regs[30], &user->next_frame->lr, err); in setup_sigframe()
957 apply_user_offset(user, user->fpsimd_offset); in setup_sigframe()
962 if (err == 0 && user->esr_offset) { in setup_sigframe()
964 apply_user_offset(user, user->esr_offset); in setup_sigframe()
973 err == 0 && user->sve_offset) { in setup_sigframe()
975 apply_user_offset(user, user->sve_offset); in setup_sigframe()
982 apply_user_offset(user, user->tpidr2_offset); in setup_sigframe()
987 if (system_supports_sme() && err == 0 && user->za_offset) { in setup_sigframe()
989 apply_user_offset(user, user->za_offset); in setup_sigframe()
994 if (system_supports_sme2() && err == 0 && user->zt_offset) { in setup_sigframe()
996 apply_user_offset(user, user->zt_offset); in setup_sigframe()
1000 if (err == 0 && user->extra_offset) { in setup_sigframe()
1001 char __user *sfp = (char __user *)user->sigframe; in setup_sigframe()
1003 apply_user_offset(user, user->extra_offset); in setup_sigframe()
1022 extra_size = sfp + round_up(user->size, 16) - userp; in setup_sigframe()
1037 apply_user_offset(user, user->end_offset); in setup_sigframe()
1046 static int get_sigframe(struct rt_sigframe_user_layout *user, in get_sigframe() argument
1052 init_user_layout(user); in get_sigframe()
1053 err = setup_sigframe_layout(user, false); in get_sigframe()
1060 user->next_frame = (struct frame_record __user *)sp; in get_sigframe()
1062 sp = round_down(sp, 16) - sigframe_size(user); in get_sigframe()
1063 user->sigframe = (struct rt_sigframe __user *)sp; in get_sigframe()
1068 if (!access_ok(user->sigframe, sp_top - sp)) in get_sigframe()
1075 struct rt_sigframe_user_layout *user, int usig) in setup_return() argument
1080 regs->sp = (unsigned long)user->sigframe; in setup_return()
1081 regs->regs[29] = (unsigned long)&user->next_frame->fp; in setup_return()
1133 struct rt_sigframe_user_layout user; in setup_rt_frame() local
1139 if (get_sigframe(&user, ksig, regs)) in setup_rt_frame()
1142 frame = user.sigframe; in setup_rt_frame()
1148 err |= setup_sigframe(&user, regs, set); in setup_rt_frame()
1150 setup_return(regs, &ksig->ka, &user, usig); in setup_rt_frame()
1325 struct rt_sigframe_user_layout user; in minsigstksz_setup() local
1327 init_user_layout(&user); in minsigstksz_setup()
1333 if (WARN_ON(setup_sigframe_layout(&user, true))) in minsigstksz_setup()
1336 signal_minsigstksz = sigframe_size(&user) + in minsigstksz_setup()