Lines Matching +full:current +full:- +full:limit

1 // SPDX-License-Identifier: GPL-2.0-only
5 * Copyright (C) 1995-2009 Russell King
12 #include <linux/irq-entry-common.h>
26 #include <asm/debug-monitors.h>
43 * Do a signal return; undo the signal stack. These are aligned to 128-bit.
55 unsigned long limit; /* largest allowed size */ member
71 * Holds any EL0-controlled state that influences unprivileged memory accesses.
76 * itself also expects a well-defined state when entered.
97 ua_state->por_el0 = read_sysreg_s(SYS_POR_EL0); in save_reset_user_access_state()
100 * No ISB required as we can tolerate spurious Overlay faults - in save_reset_user_access_state()
126 write_sysreg_s(ua_state->por_el0, SYS_POR_EL0); in restore_user_access_state()
132 sizeof(user->sigframe->uc.uc_mcontext.__reserved); in init_user_layout()
135 user->size = offsetof(struct rt_sigframe, uc.uc_mcontext.__reserved); in init_user_layout()
137 user->limit = user->size + reserved_size; in init_user_layout()
139 user->limit -= TERMINATOR_SIZE; in init_user_layout()
140 user->limit -= EXTRA_CONTEXT_SIZE; in init_user_layout()
146 return round_up(max(user->size, sizeof(struct rt_sigframe)), 16); in sigframe_size()
150 * Sanity limit on the approximate maximum size of signal frame we'll
152 * not taken into account. This limit is not a guarantee and is
162 if (padded_size > user->limit - user->size && in __sigframe_alloc()
163 !user->extra_offset && in __sigframe_alloc()
167 user->limit += EXTRA_CONTEXT_SIZE; in __sigframe_alloc()
168 ret = __sigframe_alloc(user, &user->extra_offset, in __sigframe_alloc()
171 user->limit -= EXTRA_CONTEXT_SIZE; in __sigframe_alloc()
176 user->size += TERMINATOR_SIZE; in __sigframe_alloc()
182 user->limit = SIGFRAME_MAXSZ - TERMINATOR_SIZE; in __sigframe_alloc()
186 if (padded_size > user->limit - user->size) in __sigframe_alloc()
187 return -ENOMEM; in __sigframe_alloc()
189 *offset = user->size; in __sigframe_alloc()
190 user->size += padded_size; in __sigframe_alloc()
211 /* Un-reserve the space reserved for the terminator: */ in sigframe_alloc_end()
212 user->limit += TERMINATOR_SIZE; in sigframe_alloc_end()
214 ret = sigframe_alloc(user, &user->end_offset, in sigframe_alloc_end()
220 user->limit = user->size; in sigframe_alloc_end()
227 char __user *base = (char __user *)user->sigframe; in apply_user_offset()
254 &current->thread.uw.fpsimd_state; in preserve_fpsimd_context()
257 fpsimd_sync_from_effective_state(current); in preserve_fpsimd_context()
260 err = __copy_to_user(ctx->vregs, fpsimd->vregs, sizeof(fpsimd->vregs)); in preserve_fpsimd_context()
261 __put_user_error(fpsimd->fpsr, &ctx->fpsr, err); in preserve_fpsimd_context()
262 __put_user_error(fpsimd->fpcr, &ctx->fpcr, err); in preserve_fpsimd_context()
265 __put_user_error(FPSIMD_MAGIC, &ctx->head.magic, err); in preserve_fpsimd_context()
266 __put_user_error(sizeof(struct fpsimd_context), &ctx->head.size, err); in preserve_fpsimd_context()
268 return err ? -EFAULT : 0; in preserve_fpsimd_context()
277 if (user->fpsimd_size != sizeof(struct fpsimd_context)) in read_fpsimd_context()
278 return -EINVAL; in read_fpsimd_context()
281 err = __copy_from_user(fpsimd->vregs, &(user->fpsimd->vregs), in read_fpsimd_context()
282 sizeof(fpsimd->vregs)); in read_fpsimd_context()
283 __get_user_error(fpsimd->fpsr, &(user->fpsimd->fpsr), err); in read_fpsimd_context()
284 __get_user_error(fpsimd->fpcr, &(user->fpsimd->fpcr), err); in read_fpsimd_context()
286 return err ? -EFAULT : 0; in read_fpsimd_context()
299 current->thread.svcr &= ~SVCR_SM_MASK; in restore_fpsimd_context()
300 current->thread.fp_type = FP_STATE_FPSIMD; in restore_fpsimd_context()
311 __put_user_error(FPMR_MAGIC, &ctx->head.magic, err); in preserve_fpmr_context()
312 __put_user_error(sizeof(*ctx), &ctx->head.size, err); in preserve_fpmr_context()
313 __put_user_error(current->thread.uw.fpmr, &ctx->fpmr, err); in preserve_fpmr_context()
323 if (user->fpmr_size != sizeof(*user->fpmr)) in restore_fpmr_context()
324 return -EINVAL; in restore_fpmr_context()
326 __get_user_error(fpmr, &user->fpmr->fpmr, err); in restore_fpmr_context()
328 current->thread.uw.fpmr = fpmr; in restore_fpmr_context()
338 __put_user_error(POE_MAGIC, &ctx->head.magic, err); in preserve_poe_context()
339 __put_user_error(sizeof(*ctx), &ctx->head.size, err); in preserve_poe_context()
340 __put_user_error(ua_state->por_el0, &ctx->por_el0, err); in preserve_poe_context()
351 if (user->poe_size != sizeof(*user->poe)) in restore_poe_context()
352 return -EINVAL; in restore_poe_context()
354 __get_user_error(por_el0, &(user->poe->por_el0), err); in restore_poe_context()
356 ua_state->por_el0 = por_el0; in restore_poe_context()
366 u16 reserved[ARRAY_SIZE(ctx->__reserved)]; in preserve_sve_context()
368 unsigned int vl = task_get_sve_vl(current); in preserve_sve_context()
371 if (thread_sm_enabled(&current->thread)) { in preserve_sve_context()
372 vl = task_get_sme_vl(current); in preserve_sve_context()
375 } else if (current->thread.fp_type == FP_STATE_SVE) { in preserve_sve_context()
381 __put_user_error(SVE_MAGIC, &ctx->head.magic, err); in preserve_sve_context()
383 &ctx->head.size, err); in preserve_sve_context()
384 __put_user_error(vl, &ctx->vl, err); in preserve_sve_context()
385 __put_user_error(flags, &ctx->flags, err); in preserve_sve_context()
386 BUILD_BUG_ON(sizeof(ctx->__reserved) != sizeof(reserved)); in preserve_sve_context()
387 err |= __copy_to_user(&ctx->__reserved, reserved, sizeof(reserved)); in preserve_sve_context()
391 current->thread.sve_state, in preserve_sve_context()
395 return err ? -EFAULT : 0; in preserve_sve_context()
406 if (user->sve_size < sizeof(*user->sve)) in restore_sve_fpsimd_context()
407 return -EINVAL; in restore_sve_fpsimd_context()
409 __get_user_error(user_vl, &(user->sve->vl), err); in restore_sve_fpsimd_context()
410 __get_user_error(flags, &(user->sve->flags), err); in restore_sve_fpsimd_context()
417 return -EINVAL; in restore_sve_fpsimd_context()
419 vl = task_get_sme_vl(current); in restore_sve_fpsimd_context()
427 return -EINVAL; in restore_sve_fpsimd_context()
429 vl = task_get_sve_vl(current); in restore_sve_fpsimd_context()
433 return -EINVAL; in restore_sve_fpsimd_context()
436 * Non-streaming SVE state may be preserved without an SVE payload, in in restore_sve_fpsimd_context()
444 if (!sm && user->sve_size == sizeof(*user->sve)) in restore_sve_fpsimd_context()
449 if (user->sve_size < SVE_SIG_CONTEXT_SIZE(vq)) in restore_sve_fpsimd_context()
450 return -EINVAL; in restore_sve_fpsimd_context()
452 sve_alloc(current, true); in restore_sve_fpsimd_context()
453 if (!current->thread.sve_state) { in restore_sve_fpsimd_context()
455 return -ENOMEM; in restore_sve_fpsimd_context()
458 err = __copy_from_user(current->thread.sve_state, in restore_sve_fpsimd_context()
459 (char __user const *)user->sve + in restore_sve_fpsimd_context()
463 return -EFAULT; in restore_sve_fpsimd_context()
466 current->thread.svcr |= SVCR_SM_MASK; in restore_sve_fpsimd_context()
469 current->thread.fp_type = FP_STATE_SVE; in restore_sve_fpsimd_context()
486 return -EINVAL; in restore_sve_fpsimd_context()
489 /* Turn any non-optimised out attempts to use this into a link error: */
501 __put_user_error(TPIDR2_MAGIC, &ctx->head.magic, err); in preserve_tpidr2_context()
502 __put_user_error(sizeof(*ctx), &ctx->head.size, err); in preserve_tpidr2_context()
503 __put_user_error(tpidr2_el0, &ctx->tpidr2, err); in preserve_tpidr2_context()
513 if (user->tpidr2_size != sizeof(*user->tpidr2)) in restore_tpidr2_context()
514 return -EINVAL; in restore_tpidr2_context()
516 __get_user_error(tpidr2_el0, &user->tpidr2->tpidr2, err); in restore_tpidr2_context()
526 u16 reserved[ARRAY_SIZE(ctx->__reserved)]; in preserve_za_context()
527 unsigned int vl = task_get_sme_vl(current); in preserve_za_context()
530 if (thread_za_enabled(&current->thread)) in preserve_za_context()
537 __put_user_error(ZA_MAGIC, &ctx->head.magic, err); in preserve_za_context()
539 &ctx->head.size, err); in preserve_za_context()
540 __put_user_error(vl, &ctx->vl, err); in preserve_za_context()
541 BUILD_BUG_ON(sizeof(ctx->__reserved) != sizeof(reserved)); in preserve_za_context()
542 err |= __copy_to_user(&ctx->__reserved, reserved, sizeof(reserved)); in preserve_za_context()
546 current->thread.sme_state, in preserve_za_context()
550 return err ? -EFAULT : 0; in preserve_za_context()
559 if (user->za_size < sizeof(*user->za)) in restore_za_context()
560 return -EINVAL; in restore_za_context()
562 __get_user_error(user_vl, &(user->za->vl), err); in restore_za_context()
566 if (user_vl != task_get_sme_vl(current)) in restore_za_context()
567 return -EINVAL; in restore_za_context()
569 if (user->za_size == sizeof(*user->za)) { in restore_za_context()
570 current->thread.svcr &= ~SVCR_ZA_MASK; in restore_za_context()
576 if (user->za_size < ZA_SIG_CONTEXT_SIZE(vq)) in restore_za_context()
577 return -EINVAL; in restore_za_context()
579 sme_alloc(current, true); in restore_za_context()
580 if (!current->thread.sme_state) { in restore_za_context()
581 current->thread.svcr &= ~SVCR_ZA_MASK; in restore_za_context()
583 return -ENOMEM; in restore_za_context()
586 err = __copy_from_user(current->thread.sme_state, in restore_za_context()
587 (char __user const *)user->za + in restore_za_context()
591 return -EFAULT; in restore_za_context()
594 current->thread.svcr |= SVCR_ZA_MASK; in restore_za_context()
602 u16 reserved[ARRAY_SIZE(ctx->__reserved)]; in preserve_zt_context()
604 if (WARN_ON(!thread_za_enabled(&current->thread))) in preserve_zt_context()
605 return -EINVAL; in preserve_zt_context()
609 __put_user_error(ZT_MAGIC, &ctx->head.magic, err); in preserve_zt_context()
611 &ctx->head.size, err); in preserve_zt_context()
612 __put_user_error(1, &ctx->nregs, err); in preserve_zt_context()
613 BUILD_BUG_ON(sizeof(ctx->__reserved) != sizeof(reserved)); in preserve_zt_context()
614 err |= __copy_to_user(&ctx->__reserved, reserved, sizeof(reserved)); in preserve_zt_context()
617 thread_zt_state(&current->thread), in preserve_zt_context()
620 return err ? -EFAULT : 0; in preserve_zt_context()
629 if (!thread_za_enabled(&current->thread)) in restore_zt_context()
630 return -EINVAL; in restore_zt_context()
632 if (user->zt_size != ZT_SIG_CONTEXT_SIZE(1)) in restore_zt_context()
633 return -EINVAL; in restore_zt_context()
635 if (__copy_from_user(&nregs, &(user->zt->nregs), sizeof(nregs))) in restore_zt_context()
636 return -EFAULT; in restore_zt_context()
639 return -EINVAL; in restore_zt_context()
641 err = __copy_from_user(thread_zt_state(&current->thread), in restore_zt_context()
642 (char __user const *)user->zt + in restore_zt_context()
646 return -EFAULT; in restore_zt_context()
653 /* Turn any non-optimised out attempts to use these into a link error: */
677 if (task_gcs_el0_enabled(current)) in preserve_gcs_context()
678 gcspr -= 8; in preserve_gcs_context()
680 __put_user_error(GCS_MAGIC, &ctx->head.magic, err); in preserve_gcs_context()
681 __put_user_error(sizeof(*ctx), &ctx->head.size, err); in preserve_gcs_context()
682 __put_user_error(gcspr, &ctx->gcspr, err); in preserve_gcs_context()
683 __put_user_error(0, &ctx->reserved, err); in preserve_gcs_context()
684 __put_user_error(current->thread.gcs_el0_mode, in preserve_gcs_context()
685 &ctx->features_enabled, err); in preserve_gcs_context()
695 if (user->gcs_size != sizeof(*user->gcs)) in restore_gcs_context()
696 return -EINVAL; in restore_gcs_context()
698 __get_user_error(gcspr, &user->gcs->gcspr, err); in restore_gcs_context()
699 __get_user_error(enabled, &user->gcs->features_enabled, err); in restore_gcs_context()
705 return -EINVAL; in restore_gcs_context()
707 err = gcs_check_locked(current, enabled); in restore_gcs_context()
712 if (!task_gcs_el0_enabled(current) && in restore_gcs_context()
714 return -EINVAL; in restore_gcs_context()
720 current->thread.gcs_el0_mode = enabled; in restore_gcs_context()
733 /* Turn any non-optimised out attempts to use these into a link error: */
742 struct sigcontext __user *const sc = &sf->uc.uc_mcontext; in parse_user_sigframe()
744 char __user *base = (char __user *)&sc->__reserved; in parse_user_sigframe()
746 size_t limit = sizeof(sc->__reserved); in parse_user_sigframe() local
750 user->fpsimd = NULL; in parse_user_sigframe()
751 user->sve = NULL; in parse_user_sigframe()
752 user->tpidr2 = NULL; in parse_user_sigframe()
753 user->za = NULL; in parse_user_sigframe()
754 user->zt = NULL; in parse_user_sigframe()
755 user->fpmr = NULL; in parse_user_sigframe()
756 user->poe = NULL; in parse_user_sigframe()
757 user->gcs = NULL; in parse_user_sigframe()
772 if (limit - offset < sizeof(*head)) in parse_user_sigframe()
779 __get_user_error(magic, &head->magic, err); in parse_user_sigframe()
780 __get_user_error(size, &head->size, err); in parse_user_sigframe()
784 if (limit - offset < size) in parse_user_sigframe()
797 if (user->fpsimd) in parse_user_sigframe()
800 user->fpsimd = (struct fpsimd_context __user *)head; in parse_user_sigframe()
801 user->fpsimd_size = size; in parse_user_sigframe()
812 if (user->poe) in parse_user_sigframe()
815 user->poe = (struct poe_context __user *)head; in parse_user_sigframe()
816 user->poe_size = size; in parse_user_sigframe()
823 if (user->sve) in parse_user_sigframe()
826 user->sve = (struct sve_context __user *)head; in parse_user_sigframe()
827 user->sve_size = size; in parse_user_sigframe()
834 if (user->tpidr2) in parse_user_sigframe()
837 user->tpidr2 = (struct tpidr2_context __user *)head; in parse_user_sigframe()
838 user->tpidr2_size = size; in parse_user_sigframe()
845 if (user->za) in parse_user_sigframe()
848 user->za = (struct za_context __user *)head; in parse_user_sigframe()
849 user->za_size = size; in parse_user_sigframe()
856 if (user->zt) in parse_user_sigframe()
859 user->zt = (struct zt_context __user *)head; in parse_user_sigframe()
860 user->zt_size = size; in parse_user_sigframe()
867 if (user->fpmr) in parse_user_sigframe()
870 user->fpmr = (struct fpmr_context __user *)head; in parse_user_sigframe()
871 user->fpmr_size = size; in parse_user_sigframe()
878 if (user->gcs) in parse_user_sigframe()
881 user->gcs = (struct gcs_context __user *)head; in parse_user_sigframe()
882 user->gcs_size = size; in parse_user_sigframe()
897 __get_user_error(extra_datap, &extra->datap, err); in parse_user_sigframe()
898 __get_user_error(extra_size, &extra->size, err); in parse_user_sigframe()
904 if (limit - offset - size < TERMINATOR_SIZE) in parse_user_sigframe()
910 __get_user_error(end_magic, &end->magic, err); in parse_user_sigframe()
911 __get_user_error(end_size, &end->size, err); in parse_user_sigframe()
932 if (extra_size > sfp + SIGFRAME_MAXSZ - userp) in parse_user_sigframe()
940 limit = extra_size; in parse_user_sigframe()
942 if (!access_ok(base, limit)) in parse_user_sigframe()
954 if (limit - offset < size) in parse_user_sigframe()
964 return -EINVAL; in parse_user_sigframe()
975 err = __copy_from_user(&set, &sf->uc.uc_sigmask, sizeof(set)); in restore_sigframe()
980 __get_user_error(regs->regs[i], &sf->uc.uc_mcontext.regs[i], in restore_sigframe()
982 __get_user_error(regs->sp, &sf->uc.uc_mcontext.sp, err); in restore_sigframe()
983 __get_user_error(regs->pc, &sf->uc.uc_mcontext.pc, err); in restore_sigframe()
984 __get_user_error(regs->pstate, &sf->uc.uc_mcontext.pstate, err); in restore_sigframe()
993 err |= !valid_user_regs(&regs->user_regs, current); in restore_sigframe()
999 return -EINVAL; in restore_sigframe()
1037 if (!(current->thread.gcs_el0_mode & PR_SHADOW_STACK_ENABLE)) in gcs_restore_signal()
1052 * then faults will be generated on GCS operations - the main in gcs_restore_signal()
1058 return -EFAULT; in gcs_restore_signal()
1064 return -EINVAL; in gcs_restore_signal()
1069 return -EFAULT; in gcs_restore_signal()
1086 /* Always make any pending restarted system calls return -EINTR */ in SYSCALL_DEFINE0()
1087 current->restart_block.fn = do_no_restart_syscall; in SYSCALL_DEFINE0()
1090 * Since we stacked the signal on a 128-bit boundary, then 'sp' should in SYSCALL_DEFINE0()
1093 if (regs->sp & 15) in SYSCALL_DEFINE0()
1096 frame = (struct rt_sigframe __user *)regs->sp; in SYSCALL_DEFINE0()
1107 if (restore_altstack(&frame->uc.uc_stack)) in SYSCALL_DEFINE0()
1112 return regs->regs[0]; in SYSCALL_DEFINE0()
1115 arm64_notify_segfault(regs->sp); in SYSCALL_DEFINE0()
1123 * this task; otherwise, generates a layout for the current state
1132 err = sigframe_alloc(user, &user->fpsimd_offset, in setup_sigframe_layout()
1139 if (add_all || current->thread.fault_code) { in setup_sigframe_layout()
1140 err = sigframe_alloc(user, &user->esr_offset, in setup_sigframe_layout()
1147 if (system_supports_gcs() && (add_all || current->thread.gcspr_el0)) { in setup_sigframe_layout()
1148 err = sigframe_alloc(user, &user->gcs_offset, in setup_sigframe_layout()
1158 if (add_all || current->thread.fp_type == FP_STATE_SVE || in setup_sigframe_layout()
1159 thread_sm_enabled(&current->thread)) { in setup_sigframe_layout()
1163 vl = thread_get_cur_vl(&current->thread); in setup_sigframe_layout()
1168 err = sigframe_alloc(user, &user->sve_offset, in setup_sigframe_layout()
1175 err = sigframe_alloc(user, &user->tpidr2_offset, in setup_sigframe_layout()
1188 vl = task_get_sme_vl(current); in setup_sigframe_layout()
1190 if (thread_za_enabled(&current->thread)) in setup_sigframe_layout()
1193 err = sigframe_alloc(user, &user->za_offset, in setup_sigframe_layout()
1200 if (add_all || thread_za_enabled(&current->thread)) { in setup_sigframe_layout()
1201 err = sigframe_alloc(user, &user->zt_offset, in setup_sigframe_layout()
1209 err = sigframe_alloc(user, &user->fpmr_offset, in setup_sigframe_layout()
1216 err = sigframe_alloc(user, &user->poe_offset, in setup_sigframe_layout()
1230 struct rt_sigframe __user *sf = user->sigframe; in setup_sigframe()
1233 __put_user_error(regs->regs[29], &user->next_frame->fp, err); in setup_sigframe()
1234 __put_user_error(regs->regs[30], &user->next_frame->lr, err); in setup_sigframe()
1237 __put_user_error(regs->regs[i], &sf->uc.uc_mcontext.regs[i], in setup_sigframe()
1239 __put_user_error(regs->sp, &sf->uc.uc_mcontext.sp, err); in setup_sigframe()
1240 __put_user_error(regs->pc, &sf->uc.uc_mcontext.pc, err); in setup_sigframe()
1241 __put_user_error(regs->pstate, &sf->uc.uc_mcontext.pstate, err); in setup_sigframe()
1243 __put_user_error(current->thread.fault_address, &sf->uc.uc_mcontext.fault_address, err); in setup_sigframe()
1245 err |= __copy_to_user(&sf->uc.uc_sigmask, set, sizeof(*set)); in setup_sigframe()
1249 apply_user_offset(user, user->fpsimd_offset); in setup_sigframe()
1254 if (err == 0 && user->esr_offset) { in setup_sigframe()
1256 apply_user_offset(user, user->esr_offset); in setup_sigframe()
1258 __put_user_error(ESR_MAGIC, &esr_ctx->head.magic, err); in setup_sigframe()
1259 __put_user_error(sizeof(*esr_ctx), &esr_ctx->head.size, err); in setup_sigframe()
1260 __put_user_error(current->thread.fault_code, &esr_ctx->esr, err); in setup_sigframe()
1263 if (system_supports_gcs() && err == 0 && user->gcs_offset) { in setup_sigframe()
1265 apply_user_offset(user, user->gcs_offset); in setup_sigframe()
1271 err == 0 && user->sve_offset) { in setup_sigframe()
1273 apply_user_offset(user, user->sve_offset); in setup_sigframe()
1280 apply_user_offset(user, user->tpidr2_offset); in setup_sigframe()
1287 apply_user_offset(user, user->fpmr_offset); in setup_sigframe()
1293 apply_user_offset(user, user->poe_offset); in setup_sigframe()
1299 if (system_supports_sme() && err == 0 && user->za_offset) { in setup_sigframe()
1301 apply_user_offset(user, user->za_offset); in setup_sigframe()
1306 if (system_supports_sme2() && err == 0 && user->zt_offset) { in setup_sigframe()
1308 apply_user_offset(user, user->zt_offset); in setup_sigframe()
1312 if (err == 0 && user->extra_offset) { in setup_sigframe()
1313 char __user *sfp = (char __user *)user->sigframe; in setup_sigframe()
1315 apply_user_offset(user, user->extra_offset); in setup_sigframe()
1334 extra_size = sfp + round_up(user->size, 16) - userp; in setup_sigframe()
1336 __put_user_error(EXTRA_MAGIC, &extra->head.magic, err); in setup_sigframe()
1337 __put_user_error(EXTRA_CONTEXT_SIZE, &extra->head.size, err); in setup_sigframe()
1338 __put_user_error(extra_datap, &extra->datap, err); in setup_sigframe()
1339 __put_user_error(extra_size, &extra->size, err); in setup_sigframe()
1342 __put_user_error(0, &end->magic, err); in setup_sigframe()
1343 __put_user_error(0, &end->size, err); in setup_sigframe()
1349 apply_user_offset(user, user->end_offset); in setup_sigframe()
1351 __put_user_error(0, &end->magic, err); in setup_sigframe()
1352 __put_user_error(0, &end->size, err); in setup_sigframe()
1369 sp = sp_top = sigsp(regs->sp, ksig); in get_sigframe()
1371 sp = round_down(sp - sizeof(struct frame_record), 16); in get_sigframe()
1372 user->next_frame = (struct frame_record __user *)sp; in get_sigframe()
1374 sp = round_down(sp, 16) - sigframe_size(user); in get_sigframe()
1375 user->sigframe = (struct rt_sigframe __user *)sp; in get_sigframe()
1380 if (!access_ok(user->sigframe, sp_top - sp)) in get_sigframe()
1381 return -EFAULT; in get_sigframe()
1396 if (!task_gcs_el0_enabled(current)) in gcs_signal_entry()
1400 * We are entering a signal handler, current register state is in gcs_signal_entry()
1409 (unsigned long __user *)(gcspr_el0 - 16), &ret); in gcs_signal_entry()
1410 put_user_gcs(GCS_SIGNAL_CAP(gcspr_el0 - 8), in gcs_signal_entry()
1411 (unsigned long __user *)(gcspr_el0 - 8), &ret); in gcs_signal_entry()
1415 gcspr_el0 -= 16; in gcs_signal_entry()
1435 if (ksig->ka.sa.sa_flags & SA_RESTORER) in setup_return()
1436 sigtramp = ksig->ka.sa.sa_restorer; in setup_return()
1438 sigtramp = VDSO_SYMBOL(current->mm->context.vdso, sigtramp); in setup_return()
1452 regs->regs[0] = usig; in setup_return()
1453 if (ksig->ka.sa.sa_flags & SA_SIGINFO) { in setup_return()
1454 regs->regs[1] = (unsigned long)&user->sigframe->info; in setup_return()
1455 regs->regs[2] = (unsigned long)&user->sigframe->uc; in setup_return()
1457 regs->sp = (unsigned long)user->sigframe; in setup_return()
1458 regs->regs[29] = (unsigned long)&user->next_frame->fp; in setup_return()
1459 regs->regs[30] = (unsigned long)sigtramp; in setup_return()
1460 regs->pc = (unsigned long)ksig->ka.sa.sa_handler; in setup_return()
1474 regs->pstate &= ~PSR_BTYPE_MASK; in setup_return()
1475 regs->pstate |= PSR_BTYPE_C; in setup_return()
1479 regs->pstate &= ~PSR_TCO_BIT; in setup_return()
1483 task_smstop_sm(current); in setup_return()
1484 current->thread.svcr &= ~SVCR_ZA_MASK; in setup_return()
1507 __put_user_error(0, &frame->uc.uc_flags, err); in setup_rt_frame()
1508 __put_user_error(NULL, &frame->uc.uc_link, err); in setup_rt_frame()
1510 err |= __save_altstack(&frame->uc.uc_stack, regs->sp); in setup_rt_frame()
1512 if (ksig->ka.sa.sa_flags & SA_SIGINFO) in setup_rt_frame()
1513 err |= copy_siginfo_to_user(&frame->info, &ksig->info); in setup_rt_frame()
1519 * We must not fail if setup_return() succeeded - see comment at the in setup_rt_frame()
1536 regs->regs[8] = __NR_restart_syscall; in setup_restart_syscall()
1545 int usig = ksig->sig; in handle_signal()
1554 if (ksig->ka.sa.sa_flags & SA_SIGINFO) in handle_signal()
1565 ret |= !valid_user_regs(&regs->user_regs, current); in handle_signal()
1577 * the kernel can handle, and then we build all the user-level signal handling
1578 * stack-frames in one go after that.
1591 continue_addr = regs->pc; in arch_do_signal_or_restart()
1592 restart_addr = continue_addr - (compat_thumb_mode(regs) ? 2 : 4); in arch_do_signal_or_restart()
1593 retval = regs->regs[0]; in arch_do_signal_or_restart()
1605 case -ERESTARTNOHAND: in arch_do_signal_or_restart()
1606 case -ERESTARTSYS: in arch_do_signal_or_restart()
1607 case -ERESTARTNOINTR: in arch_do_signal_or_restart()
1608 case -ERESTART_RESTARTBLOCK: in arch_do_signal_or_restart()
1609 regs->regs[0] = regs->orig_x0; in arch_do_signal_or_restart()
1610 regs->pc = restart_addr; in arch_do_signal_or_restart()
1625 if (regs->pc == restart_addr && in arch_do_signal_or_restart()
1626 (retval == -ERESTARTNOHAND || in arch_do_signal_or_restart()
1627 retval == -ERESTART_RESTARTBLOCK || in arch_do_signal_or_restart()
1628 (retval == -ERESTARTSYS && in arch_do_signal_or_restart()
1630 syscall_set_return_value(current, regs, -EINTR, 0); in arch_do_signal_or_restart()
1631 regs->pc = continue_addr; in arch_do_signal_or_restart()
1642 if (syscall && regs->pc == restart_addr) { in arch_do_signal_or_restart()
1643 if (retval == -ERESTART_RESTARTBLOCK) in arch_do_signal_or_restart()
1645 user_rewind_single_step(current); in arch_do_signal_or_restart()
1677 * Compile-time assertions for siginfo_t offsets. Check NSIG* as well, as