1 // SPDX-License-Identifier: GPL-2.0
3 * linux/arch/alpha/kernel/signal.c
5 * Copyright (C) 1995 Linus Torvalds
7 * 1997-11-02 Modified for POSIX.1b signals by Richard Henderson
10 #include <linux/sched/signal.h>
11 #include <linux/sched/task_stack.h>
12 #include <linux/kernel.h>
13 #include <linux/signal.h>
14 #include <linux/errno.h>
15 #include <linux/wait.h>
16 #include <linux/ptrace.h>
17 #include <linux/unistd.h>
19 #include <linux/smp.h>
20 #include <linux/stddef.h>
21 #include <linux/tty.h>
22 #include <linux/binfmts.h>
23 #include <linux/bitops.h>
24 #include <linux/syscalls.h>
25 #include <linux/tracehook.h>
27 #include <linux/uaccess.h>
28 #include <asm/sigcontext.h>
29 #include <asm/ucontext.h>
36 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
38 asmlinkage
void ret_from_sys_call(void);
41 * The OSF/1 sigprocmask calling sequence is different from the
42 * C sigprocmask() sequence..
44 SYSCALL_DEFINE2(osf_sigprocmask
, int, how
, unsigned long, newmask
)
50 siginitset(&mask
, newmask
& _BLOCKABLE
);
51 res
= sigprocmask(how
, &mask
, &oldmask
);
53 force_successful_syscall_return();
59 SYSCALL_DEFINE3(osf_sigaction
, int, sig
,
60 const struct osf_sigaction __user
*, act
,
61 struct osf_sigaction __user
*, oact
)
63 struct k_sigaction new_ka
, old_ka
;
68 if (!access_ok(act
, sizeof(*act
)) ||
69 __get_user(new_ka
.sa
.sa_handler
, &act
->sa_handler
) ||
70 __get_user(new_ka
.sa
.sa_flags
, &act
->sa_flags
) ||
71 __get_user(mask
, &act
->sa_mask
))
73 siginitset(&new_ka
.sa
.sa_mask
, mask
);
74 new_ka
.ka_restorer
= NULL
;
77 ret
= do_sigaction(sig
, act
? &new_ka
: NULL
, oact
? &old_ka
: NULL
);
80 if (!access_ok(oact
, sizeof(*oact
)) ||
81 __put_user(old_ka
.sa
.sa_handler
, &oact
->sa_handler
) ||
82 __put_user(old_ka
.sa
.sa_flags
, &oact
->sa_flags
) ||
83 __put_user(old_ka
.sa
.sa_mask
.sig
[0], &oact
->sa_mask
))
90 SYSCALL_DEFINE5(rt_sigaction
, int, sig
, const struct sigaction __user
*, act
,
91 struct sigaction __user
*, oact
,
92 size_t, sigsetsize
, void __user
*, restorer
)
94 struct k_sigaction new_ka
, old_ka
;
97 /* XXX: Don't preclude handling different sized sigset_t's. */
98 if (sigsetsize
!= sizeof(sigset_t
))
102 new_ka
.ka_restorer
= restorer
;
103 if (copy_from_user(&new_ka
.sa
, act
, sizeof(*act
)))
107 ret
= do_sigaction(sig
, act
? &new_ka
: NULL
, oact
? &old_ka
: NULL
);
110 if (copy_to_user(oact
, &old_ka
.sa
, sizeof(*oact
)))
118 * Do a signal return; undo the signal stack.
122 # error "Non SA_SIGINFO frame needs rearranging"
127 struct sigcontext sc
;
128 unsigned int retcode
[3];
135 unsigned int retcode
[3];
138 /* If this changes, userland unwinders that Know Things about our signal
139 frame will break. Do not undertake lightly. It also implies an ABI
140 change wrt the size of siginfo_t, which may cause some pain. */
141 extern char compile_time_assert
142 [offsetof(struct rt_sigframe
, uc
.uc_mcontext
) == 176 ? 1 : -1];
144 #define INSN_MOV_R30_R16 0x47fe0410
145 #define INSN_LDI_R0 0x201f0000
146 #define INSN_CALLSYS 0x00000083
149 restore_sigcontext(struct sigcontext __user
*sc
, struct pt_regs
*regs
)
152 struct switch_stack
*sw
= (struct switch_stack
*)regs
- 1;
153 long i
, err
= __get_user(regs
->pc
, &sc
->sc_pc
);
155 current
->restart_block
.fn
= do_no_restart_syscall
;
157 sw
->r26
= (unsigned long) ret_from_sys_call
;
159 err
|= __get_user(regs
->r0
, sc
->sc_regs
+0);
160 err
|= __get_user(regs
->r1
, sc
->sc_regs
+1);
161 err
|= __get_user(regs
->r2
, sc
->sc_regs
+2);
162 err
|= __get_user(regs
->r3
, sc
->sc_regs
+3);
163 err
|= __get_user(regs
->r4
, sc
->sc_regs
+4);
164 err
|= __get_user(regs
->r5
, sc
->sc_regs
+5);
165 err
|= __get_user(regs
->r6
, sc
->sc_regs
+6);
166 err
|= __get_user(regs
->r7
, sc
->sc_regs
+7);
167 err
|= __get_user(regs
->r8
, sc
->sc_regs
+8);
168 err
|= __get_user(sw
->r9
, sc
->sc_regs
+9);
169 err
|= __get_user(sw
->r10
, sc
->sc_regs
+10);
170 err
|= __get_user(sw
->r11
, sc
->sc_regs
+11);
171 err
|= __get_user(sw
->r12
, sc
->sc_regs
+12);
172 err
|= __get_user(sw
->r13
, sc
->sc_regs
+13);
173 err
|= __get_user(sw
->r14
, sc
->sc_regs
+14);
174 err
|= __get_user(sw
->r15
, sc
->sc_regs
+15);
175 err
|= __get_user(regs
->r16
, sc
->sc_regs
+16);
176 err
|= __get_user(regs
->r17
, sc
->sc_regs
+17);
177 err
|= __get_user(regs
->r18
, sc
->sc_regs
+18);
178 err
|= __get_user(regs
->r19
, sc
->sc_regs
+19);
179 err
|= __get_user(regs
->r20
, sc
->sc_regs
+20);
180 err
|= __get_user(regs
->r21
, sc
->sc_regs
+21);
181 err
|= __get_user(regs
->r22
, sc
->sc_regs
+22);
182 err
|= __get_user(regs
->r23
, sc
->sc_regs
+23);
183 err
|= __get_user(regs
->r24
, sc
->sc_regs
+24);
184 err
|= __get_user(regs
->r25
, sc
->sc_regs
+25);
185 err
|= __get_user(regs
->r26
, sc
->sc_regs
+26);
186 err
|= __get_user(regs
->r27
, sc
->sc_regs
+27);
187 err
|= __get_user(regs
->r28
, sc
->sc_regs
+28);
188 err
|= __get_user(regs
->gp
, sc
->sc_regs
+29);
189 err
|= __get_user(usp
, sc
->sc_regs
+30);
192 for (i
= 0; i
< 31; i
++)
193 err
|= __get_user(sw
->fp
[i
], sc
->sc_fpregs
+i
);
194 err
|= __get_user(sw
->fp
[31], &sc
->sc_fpcr
);
199 /* Note that this syscall is also used by setcontext(3) to install
200 a given sigcontext. This because it's impossible to set *all*
201 registers and transfer control from userland. */
204 do_sigreturn(struct sigcontext __user
*sc
)
206 struct pt_regs
*regs
= current_pt_regs();
209 /* Verify that it's a good sigcontext before using it */
210 if (!access_ok(sc
, sizeof(*sc
)))
212 if (__get_user(set
.sig
[0], &sc
->sc_mask
))
215 set_current_blocked(&set
);
217 if (restore_sigcontext(sc
, regs
))
220 /* Send SIGTRAP if we're single-stepping: */
221 if (ptrace_cancel_bpt (current
)) {
222 send_sig_fault(SIGTRAP
, TRAP_BRKPT
, (void __user
*) regs
->pc
, 0,
232 do_rt_sigreturn(struct rt_sigframe __user
*frame
)
234 struct pt_regs
*regs
= current_pt_regs();
237 /* Verify that it's a good ucontext_t before using it */
238 if (!access_ok(&frame
->uc
, sizeof(frame
->uc
)))
240 if (__copy_from_user(&set
, &frame
->uc
.uc_sigmask
, sizeof(set
)))
243 set_current_blocked(&set
);
245 if (restore_sigcontext(&frame
->uc
.uc_mcontext
, regs
))
248 /* Send SIGTRAP if we're single-stepping: */
249 if (ptrace_cancel_bpt (current
)) {
250 send_sig_fault(SIGTRAP
, TRAP_BRKPT
, (void __user
*) regs
->pc
, 0,
261 * Set up a signal frame.
264 static inline void __user
*
265 get_sigframe(struct ksignal
*ksig
, unsigned long sp
, size_t frame_size
)
267 return (void __user
*)((sigsp(sp
, ksig
) - frame_size
) & -32ul);
271 setup_sigcontext(struct sigcontext __user
*sc
, struct pt_regs
*regs
,
272 unsigned long mask
, unsigned long sp
)
274 struct switch_stack
*sw
= (struct switch_stack
*)regs
- 1;
277 err
|= __put_user(on_sig_stack((unsigned long)sc
), &sc
->sc_onstack
);
278 err
|= __put_user(mask
, &sc
->sc_mask
);
279 err
|= __put_user(regs
->pc
, &sc
->sc_pc
);
280 err
|= __put_user(8, &sc
->sc_ps
);
282 err
|= __put_user(regs
->r0
, sc
->sc_regs
+0);
283 err
|= __put_user(regs
->r1
, sc
->sc_regs
+1);
284 err
|= __put_user(regs
->r2
, sc
->sc_regs
+2);
285 err
|= __put_user(regs
->r3
, sc
->sc_regs
+3);
286 err
|= __put_user(regs
->r4
, sc
->sc_regs
+4);
287 err
|= __put_user(regs
->r5
, sc
->sc_regs
+5);
288 err
|= __put_user(regs
->r6
, sc
->sc_regs
+6);
289 err
|= __put_user(regs
->r7
, sc
->sc_regs
+7);
290 err
|= __put_user(regs
->r8
, sc
->sc_regs
+8);
291 err
|= __put_user(sw
->r9
, sc
->sc_regs
+9);
292 err
|= __put_user(sw
->r10
, sc
->sc_regs
+10);
293 err
|= __put_user(sw
->r11
, sc
->sc_regs
+11);
294 err
|= __put_user(sw
->r12
, sc
->sc_regs
+12);
295 err
|= __put_user(sw
->r13
, sc
->sc_regs
+13);
296 err
|= __put_user(sw
->r14
, sc
->sc_regs
+14);
297 err
|= __put_user(sw
->r15
, sc
->sc_regs
+15);
298 err
|= __put_user(regs
->r16
, sc
->sc_regs
+16);
299 err
|= __put_user(regs
->r17
, sc
->sc_regs
+17);
300 err
|= __put_user(regs
->r18
, sc
->sc_regs
+18);
301 err
|= __put_user(regs
->r19
, sc
->sc_regs
+19);
302 err
|= __put_user(regs
->r20
, sc
->sc_regs
+20);
303 err
|= __put_user(regs
->r21
, sc
->sc_regs
+21);
304 err
|= __put_user(regs
->r22
, sc
->sc_regs
+22);
305 err
|= __put_user(regs
->r23
, sc
->sc_regs
+23);
306 err
|= __put_user(regs
->r24
, sc
->sc_regs
+24);
307 err
|= __put_user(regs
->r25
, sc
->sc_regs
+25);
308 err
|= __put_user(regs
->r26
, sc
->sc_regs
+26);
309 err
|= __put_user(regs
->r27
, sc
->sc_regs
+27);
310 err
|= __put_user(regs
->r28
, sc
->sc_regs
+28);
311 err
|= __put_user(regs
->gp
, sc
->sc_regs
+29);
312 err
|= __put_user(sp
, sc
->sc_regs
+30);
313 err
|= __put_user(0, sc
->sc_regs
+31);
315 for (i
= 0; i
< 31; i
++)
316 err
|= __put_user(sw
->fp
[i
], sc
->sc_fpregs
+i
);
317 err
|= __put_user(0, sc
->sc_fpregs
+31);
318 err
|= __put_user(sw
->fp
[31], &sc
->sc_fpcr
);
320 err
|= __put_user(regs
->trap_a0
, &sc
->sc_traparg_a0
);
321 err
|= __put_user(regs
->trap_a1
, &sc
->sc_traparg_a1
);
322 err
|= __put_user(regs
->trap_a2
, &sc
->sc_traparg_a2
);
328 setup_frame(struct ksignal
*ksig
, sigset_t
*set
, struct pt_regs
*regs
)
330 unsigned long oldsp
, r26
, err
= 0;
331 struct sigframe __user
*frame
;
334 frame
= get_sigframe(ksig
, oldsp
, sizeof(*frame
));
335 if (!access_ok(frame
, sizeof(*frame
)))
338 err
|= setup_sigcontext(&frame
->sc
, regs
, set
->sig
[0], oldsp
);
342 /* Set up to return from userspace. If provided, use a stub
343 already in userspace. */
344 r26
= (unsigned long) ksig
->ka
.ka_restorer
;
346 err
|= __put_user(INSN_MOV_R30_R16
, frame
->retcode
+0);
347 err
|= __put_user(INSN_LDI_R0
+__NR_sigreturn
, frame
->retcode
+1);
348 err
|= __put_user(INSN_CALLSYS
, frame
->retcode
+2);
350 r26
= (unsigned long) frame
->retcode
;
353 /* Check that everything was written properly. */
357 /* "Return" to the handler */
359 regs
->r27
= regs
->pc
= (unsigned long) ksig
->ka
.sa
.sa_handler
;
360 regs
->r16
= ksig
->sig
; /* a0: signal number */
361 regs
->r17
= 0; /* a1: exception code */
362 regs
->r18
= (unsigned long) &frame
->sc
; /* a2: sigcontext pointer */
363 wrusp((unsigned long) frame
);
366 printk("SIG deliver (%s:%d): sp=%p pc=%p ra=%p\n",
367 current
->comm
, current
->pid
, frame
, regs
->pc
, regs
->r26
);
373 setup_rt_frame(struct ksignal
*ksig
, sigset_t
*set
, struct pt_regs
*regs
)
375 unsigned long oldsp
, r26
, err
= 0;
376 struct rt_sigframe __user
*frame
;
379 frame
= get_sigframe(ksig
, oldsp
, sizeof(*frame
));
380 if (!access_ok(frame
, sizeof(*frame
)))
383 err
|= copy_siginfo_to_user(&frame
->info
, &ksig
->info
);
385 /* Create the ucontext. */
386 err
|= __put_user(0, &frame
->uc
.uc_flags
);
387 err
|= __put_user(0, &frame
->uc
.uc_link
);
388 err
|= __put_user(set
->sig
[0], &frame
->uc
.uc_osf_sigmask
);
389 err
|= __save_altstack(&frame
->uc
.uc_stack
, oldsp
);
390 err
|= setup_sigcontext(&frame
->uc
.uc_mcontext
, regs
,
392 err
|= __copy_to_user(&frame
->uc
.uc_sigmask
, set
, sizeof(*set
));
396 /* Set up to return from userspace. If provided, use a stub
397 already in userspace. */
398 r26
= (unsigned long) ksig
->ka
.ka_restorer
;
400 err
|= __put_user(INSN_MOV_R30_R16
, frame
->retcode
+0);
401 err
|= __put_user(INSN_LDI_R0
+__NR_rt_sigreturn
,
403 err
|= __put_user(INSN_CALLSYS
, frame
->retcode
+2);
405 r26
= (unsigned long) frame
->retcode
;
411 /* "Return" to the handler */
413 regs
->r27
= regs
->pc
= (unsigned long) ksig
->ka
.sa
.sa_handler
;
414 regs
->r16
= ksig
->sig
; /* a0: signal number */
415 regs
->r17
= (unsigned long) &frame
->info
; /* a1: siginfo pointer */
416 regs
->r18
= (unsigned long) &frame
->uc
; /* a2: ucontext pointer */
417 wrusp((unsigned long) frame
);
420 printk("SIG deliver (%s:%d): sp=%p pc=%p ra=%p\n",
421 current
->comm
, current
->pid
, frame
, regs
->pc
, regs
->r26
);
429 * OK, we're invoking a handler.
432 handle_signal(struct ksignal
*ksig
, struct pt_regs
*regs
)
434 sigset_t
*oldset
= sigmask_to_save();
437 if (ksig
->ka
.sa
.sa_flags
& SA_SIGINFO
)
438 ret
= setup_rt_frame(ksig
, oldset
, regs
);
440 ret
= setup_frame(ksig
, oldset
, regs
);
442 signal_setup_done(ret
, ksig
, 0);
446 syscall_restart(unsigned long r0
, unsigned long r19
,
447 struct pt_regs
*regs
, struct k_sigaction
*ka
)
451 if (!(ka
->sa
.sa_flags
& SA_RESTART
)) {
458 regs
->r0
= r0
; /* reset v0 and a3 and replay syscall */
462 case ERESTART_RESTARTBLOCK
:
470 * Note that 'init' is a special process: it doesn't get signals it doesn't
471 * want to handle. Thus you cannot kill init even with a SIGKILL even by
474 * Note that we go through the signals twice: once to check the signals that
475 * the kernel can handle, and then we build all the user-level signal handling
476 * stack-frames in one go after that.
478 * "r0" and "r19" are the registers we need to restore for system call
479 * restart. "r0" is also used as an indicator whether we can restart at
480 * all (if we get here from anything but a syscall return, it will be 0)
483 do_signal(struct pt_regs
*regs
, unsigned long r0
, unsigned long r19
)
485 unsigned long single_stepping
= ptrace_cancel_bpt(current
);
488 /* This lets the debugger run, ... */
489 if (get_signal(&ksig
)) {
490 /* ... so re-check the single stepping. */
491 single_stepping
|= ptrace_cancel_bpt(current
);
492 /* Whee! Actually deliver the signal. */
494 syscall_restart(r0
, r19
, regs
, &ksig
.ka
);
495 handle_signal(&ksig
, regs
);
497 single_stepping
|= ptrace_cancel_bpt(current
);
503 /* Reset v0 and a3 and replay syscall. */
508 case ERESTART_RESTARTBLOCK
:
509 /* Set v0 to the restart_syscall and replay */
510 regs
->r0
= __NR_restart_syscall
;
515 restore_saved_sigmask();
518 ptrace_set_bpt(current
); /* re-set breakpoint */
522 do_work_pending(struct pt_regs
*regs
, unsigned long thread_flags
,
523 unsigned long r0
, unsigned long r19
)
526 if (thread_flags
& _TIF_NEED_RESCHED
) {
530 if (thread_flags
& (_TIF_SIGPENDING
|_TIF_NOTIFY_SIGNAL
)) {
531 do_signal(regs
, r0
, r19
);
534 tracehook_notify_resume(regs
);
538 thread_flags
= current_thread_info()->flags
;
539 } while (thread_flags
& _TIF_WORK_MASK
);