Lines Matching refs: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()
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()
257 static int restore_sve_fpsimd_context(struct user_ctxs *user) in restore_sve_fpsimd_context() argument
264 if (__copy_from_user(&sve, user->sve, sizeof(sve))) in restore_sve_fpsimd_context()
270 if (sve.head.size <= sizeof(*user->sve)) { in restore_sve_fpsimd_context()
292 (char __user const *)user->sve + in restore_sve_fpsimd_context()
303 err = __copy_from_user(fpsimd.vregs, user->fpsimd->vregs, in restore_sve_fpsimd_context()
305 __get_user_error(fpsimd.fpsr, &user->fpsimd->fpsr, err); in restore_sve_fpsimd_context()
306 __get_user_error(fpsimd.fpcr, &user->fpsimd->fpcr, err); in restore_sve_fpsimd_context()
319 extern int restore_sve_fpsimd_context(struct user_ctxs *user);
324 static int parse_user_sigframe(struct user_ctxs *user, in parse_user_sigframe() argument
335 user->fpsimd = NULL; in parse_user_sigframe()
336 user->sve = NULL; in parse_user_sigframe()
374 if (user->fpsimd) in parse_user_sigframe()
377 if (size < sizeof(*user->fpsimd)) in parse_user_sigframe()
380 user->fpsimd = (struct fpsimd_context __user *)head; in parse_user_sigframe()
391 if (user->sve) in parse_user_sigframe()
394 if (size < sizeof(*user->sve)) in parse_user_sigframe()
397 user->sve = (struct sve_context __user *)head; in parse_user_sigframe()
487 struct user_ctxs user; in restore_sigframe() local
507 err = parse_user_sigframe(&user, sf); in restore_sigframe()
510 if (!user.fpsimd) in restore_sigframe()
513 if (user.sve) { in restore_sigframe()
517 err = restore_sve_fpsimd_context(&user); in restore_sigframe()
519 err = restore_fpsimd_context(user.fpsimd); in restore_sigframe()
566 static int setup_sigframe_layout(struct rt_sigframe_user_layout *user, in setup_sigframe_layout() argument
571 err = sigframe_alloc(user, &user->fpsimd_offset, in setup_sigframe_layout()
578 err = sigframe_alloc(user, &user->esr_offset, in setup_sigframe_layout()
596 err = sigframe_alloc(user, &user->sve_offset, in setup_sigframe_layout()
602 return sigframe_alloc_end(user); in setup_sigframe_layout()
605 static int setup_sigframe(struct rt_sigframe_user_layout *user, in setup_sigframe() argument
609 struct rt_sigframe __user *sf = user->sigframe; in setup_sigframe()
612 __put_user_error(regs->regs[29], &user->next_frame->fp, err); in setup_sigframe()
613 __put_user_error(regs->regs[30], &user->next_frame->lr, err); in setup_sigframe()
628 apply_user_offset(user, user->fpsimd_offset); in setup_sigframe()
633 if (err == 0 && user->esr_offset) { in setup_sigframe()
635 apply_user_offset(user, user->esr_offset); in setup_sigframe()
643 if (system_supports_sve() && err == 0 && user->sve_offset) { in setup_sigframe()
645 apply_user_offset(user, user->sve_offset); in setup_sigframe()
649 if (err == 0 && user->extra_offset) { in setup_sigframe()
650 char __user *sfp = (char __user *)user->sigframe; in setup_sigframe()
652 apply_user_offset(user, user->extra_offset); in setup_sigframe()
671 extra_size = sfp + round_up(user->size, 16) - userp; in setup_sigframe()
686 apply_user_offset(user, user->end_offset); in setup_sigframe()
695 static int get_sigframe(struct rt_sigframe_user_layout *user, in get_sigframe() argument
701 init_user_layout(user); in get_sigframe()
702 err = setup_sigframe_layout(user, false); in get_sigframe()
709 user->next_frame = (struct frame_record __user *)sp; in get_sigframe()
711 sp = round_down(sp, 16) - sigframe_size(user); in get_sigframe()
712 user->sigframe = (struct rt_sigframe __user *)sp; in get_sigframe()
717 if (!access_ok(user->sigframe, sp_top - sp)) in get_sigframe()
724 struct rt_sigframe_user_layout *user, int usig) in setup_return() argument
729 regs->sp = (unsigned long)user->sigframe; in setup_return()
730 regs->regs[29] = (unsigned long)&user->next_frame->fp; in setup_return()
744 struct rt_sigframe_user_layout user; in setup_rt_frame() local
750 if (get_sigframe(&user, ksig, regs)) in setup_rt_frame()
753 frame = user.sigframe; in setup_rt_frame()
759 err |= setup_sigframe(&user, regs, set); in setup_rt_frame()
761 setup_return(regs, &ksig->ka, &user, usig); in setup_rt_frame()
951 struct rt_sigframe_user_layout user; in minsigstksz_setup() local
953 init_user_layout(&user); in minsigstksz_setup()
959 if (WARN_ON(setup_sigframe_layout(&user, true))) in minsigstksz_setup()
962 signal_minsigstksz = sigframe_size(&user) + in minsigstksz_setup()