Lines Matching full:user

67 static void init_user_layout(struct rt_sigframe_user_layout *user)  in init_user_layout()  argument
70 sizeof(user->sigframe->uc.uc_mcontext.__reserved); in init_user_layout()
72 memset(user, 0, sizeof(*user)); in init_user_layout()
73 user->size = offsetof(struct rt_sigframe, uc.uc_mcontext.__reserved); in init_user_layout()
75 user->limit = user->size + reserved_size; in init_user_layout()
77 user->limit -= TERMINATOR_SIZE; in init_user_layout()
78 user->limit -= EXTRA_CONTEXT_SIZE; in init_user_layout()
82 static size_t sigframe_size(struct rt_sigframe_user_layout const *user) in sigframe_size() argument
84 return round_up(max(user->size, sizeof(struct rt_sigframe)), 16); in sigframe_size()
95 static int __sigframe_alloc(struct rt_sigframe_user_layout *user, in __sigframe_alloc() argument
100 if (padded_size > user->limit - user->size && in __sigframe_alloc()
101 !user->extra_offset && in __sigframe_alloc()
105 user->limit += EXTRA_CONTEXT_SIZE; in __sigframe_alloc()
106 ret = __sigframe_alloc(user, &user->extra_offset, in __sigframe_alloc()
109 user->limit -= EXTRA_CONTEXT_SIZE; in __sigframe_alloc()
114 user->size += TERMINATOR_SIZE; in __sigframe_alloc()
120 user->limit = SIGFRAME_MAXSZ - TERMINATOR_SIZE; in __sigframe_alloc()
124 if (padded_size > user->limit - user->size) in __sigframe_alloc()
127 *offset = user->size; in __sigframe_alloc()
128 user->size += padded_size; in __sigframe_alloc()
134 * Allocate space for an optional record of <size> bytes in the user
138 static int sigframe_alloc(struct rt_sigframe_user_layout *user, in sigframe_alloc() argument
141 return __sigframe_alloc(user, offset, size, true); in sigframe_alloc()
145 static int sigframe_alloc_end(struct rt_sigframe_user_layout *user) in sigframe_alloc_end() argument
150 user->limit += TERMINATOR_SIZE; in sigframe_alloc_end()
152 ret = sigframe_alloc(user, &user->end_offset, in sigframe_alloc_end()
158 user->limit = user->size; in sigframe_alloc_end()
163 struct rt_sigframe_user_layout const *user, unsigned long offset) in apply_user_offset() argument
165 char __user *base = (char __user *)user->sigframe; in apply_user_offset()
258 static int restore_sve_fpsimd_context(struct user_ctxs *user) in restore_sve_fpsimd_context() argument
265 if (__copy_from_user(&sve, user->sve, sizeof(sve))) in restore_sve_fpsimd_context()
271 if (sve.head.size <= sizeof(*user->sve)) { in restore_sve_fpsimd_context()
293 (char __user const *)user->sve + in restore_sve_fpsimd_context()
303 /* restore_sigframe() already checked that user->fpsimd != NULL. */ in restore_sve_fpsimd_context()
304 err = __copy_from_user(fpsimd.vregs, user->fpsimd->vregs, in restore_sve_fpsimd_context()
306 __get_user_error(fpsimd.fpsr, &user->fpsimd->fpsr, err); in restore_sve_fpsimd_context()
307 __get_user_error(fpsimd.fpcr, &user->fpsimd->fpcr, err); in restore_sve_fpsimd_context()
320 extern int restore_sve_fpsimd_context(struct user_ctxs *user);
325 static int parse_user_sigframe(struct user_ctxs *user, in parse_user_sigframe() argument
336 user->fpsimd = NULL; in parse_user_sigframe()
337 user->sve = NULL; in parse_user_sigframe()
377 if (user->fpsimd) in parse_user_sigframe()
380 if (size < sizeof(*user->fpsimd)) in parse_user_sigframe()
383 user->fpsimd = (struct fpsimd_context __user *)head; in parse_user_sigframe()
394 if (user->sve) in parse_user_sigframe()
397 if (size < sizeof(*user->sve)) in parse_user_sigframe()
400 user->sve = (struct sve_context __user *)head; in parse_user_sigframe()
490 struct user_ctxs user; in restore_sigframe() local
510 err = parse_user_sigframe(&user, sf); in restore_sigframe()
513 if (!user.fpsimd) in restore_sigframe()
516 if (user.sve) { in restore_sigframe()
520 err = restore_sve_fpsimd_context(&user); in restore_sigframe()
522 err = restore_fpsimd_context(user.fpsimd); in restore_sigframe()
569 static int setup_sigframe_layout(struct rt_sigframe_user_layout *user, in setup_sigframe_layout() argument
574 err = sigframe_alloc(user, &user->fpsimd_offset, in setup_sigframe_layout()
581 err = sigframe_alloc(user, &user->esr_offset, in setup_sigframe_layout()
599 err = sigframe_alloc(user, &user->sve_offset, in setup_sigframe_layout()
605 return sigframe_alloc_end(user); in setup_sigframe_layout()
608 static int setup_sigframe(struct rt_sigframe_user_layout *user, in setup_sigframe() argument
612 struct rt_sigframe __user *sf = user->sigframe; in setup_sigframe()
615 __put_user_error(regs->regs[29], &user->next_frame->fp, err); in setup_sigframe()
616 __put_user_error(regs->regs[30], &user->next_frame->lr, err); in setup_sigframe()
631 apply_user_offset(user, user->fpsimd_offset); in setup_sigframe()
636 if (err == 0 && user->esr_offset) { in setup_sigframe()
638 apply_user_offset(user, user->esr_offset); in setup_sigframe()
646 if (system_supports_sve() && err == 0 && user->sve_offset) { in setup_sigframe()
648 apply_user_offset(user, user->sve_offset); in setup_sigframe()
652 if (err == 0 && user->extra_offset) { in setup_sigframe()
653 char __user *sfp = (char __user *)user->sigframe; in setup_sigframe()
655 apply_user_offset(user, user->extra_offset); in setup_sigframe()
674 extra_size = sfp + round_up(user->size, 16) - userp; in setup_sigframe()
689 apply_user_offset(user, user->end_offset); in setup_sigframe()
698 static int get_sigframe(struct rt_sigframe_user_layout *user, in get_sigframe() argument
704 init_user_layout(user); in get_sigframe()
705 err = setup_sigframe_layout(user, false); in get_sigframe()
712 user->next_frame = (struct frame_record __user *)sp; in get_sigframe()
714 sp = round_down(sp, 16) - sigframe_size(user); in get_sigframe()
715 user->sigframe = (struct rt_sigframe __user *)sp; in get_sigframe()
720 if (!access_ok(user->sigframe, sp_top - sp)) in get_sigframe()
727 struct rt_sigframe_user_layout *user, int usig) in setup_return() argument
732 regs->sp = (unsigned long)user->sigframe; in setup_return()
733 regs->regs[29] = (unsigned long)&user->next_frame->fp; in setup_return()
766 struct rt_sigframe_user_layout user; in setup_rt_frame() local
772 if (get_sigframe(&user, ksig, regs)) in setup_rt_frame()
775 frame = user.sigframe; in setup_rt_frame()
781 err |= setup_sigframe(&user, regs, set); in setup_rt_frame()
783 setup_return(regs, &ksig->ka, &user, usig); in setup_rt_frame()
840 * the kernel can handle, and then we build all the user-level signal handling
925 /* Check valid user FS if needed */ in do_notify_resume()
971 struct rt_sigframe_user_layout user; in minsigstksz_setup() local
973 init_user_layout(&user); in minsigstksz_setup()
979 if (WARN_ON(setup_sigframe_layout(&user, true))) in minsigstksz_setup()
982 signal_minsigstksz = sigframe_size(&user) + in minsigstksz_setup()