xref: /openbmc/linux/arch/riscv/kernel/signal.c (revision 35b288d6)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Copyright (C) 2009 Sunplus Core Technology Co., Ltd.
4  *  Chen Liqin <liqin.chen@sunplusct.com>
5  *  Lennox Wu <lennox.wu@sunplusct.com>
6  * Copyright (C) 2012 Regents of the University of California
7  */
8 
9 #include <linux/compat.h>
10 #include <linux/signal.h>
11 #include <linux/uaccess.h>
12 #include <linux/syscalls.h>
13 #include <linux/resume_user_mode.h>
14 #include <linux/linkage.h>
15 
16 #include <asm/ucontext.h>
17 #include <asm/vdso.h>
18 #include <asm/signal.h>
19 #include <asm/signal32.h>
20 #include <asm/switch_to.h>
21 #include <asm/csr.h>
22 #include <asm/cacheflush.h>
23 
24 extern u32 __user_rt_sigreturn[2];
25 
26 #define DEBUG_SIG 0
27 
28 struct rt_sigframe {
29 	struct siginfo info;
30 	struct ucontext uc;
31 #ifndef CONFIG_MMU
32 	u32 sigreturn_code[2];
33 #endif
34 };
35 
36 #ifdef CONFIG_FPU
37 static long restore_fp_state(struct pt_regs *regs,
38 			     union __riscv_fp_state __user *sc_fpregs)
39 {
40 	long err;
41 	struct __riscv_d_ext_state __user *state = &sc_fpregs->d;
42 	size_t i;
43 
44 	err = __copy_from_user(&current->thread.fstate, state, sizeof(*state));
45 	if (unlikely(err))
46 		return err;
47 
48 	fstate_restore(current, regs);
49 
50 	/* We support no other extension state at this time. */
51 	for (i = 0; i < ARRAY_SIZE(sc_fpregs->q.reserved); i++) {
52 		u32 value;
53 
54 		err = __get_user(value, &sc_fpregs->q.reserved[i]);
55 		if (unlikely(err))
56 			break;
57 		if (value != 0)
58 			return -EINVAL;
59 	}
60 
61 	return err;
62 }
63 
64 static long save_fp_state(struct pt_regs *regs,
65 			  union __riscv_fp_state __user *sc_fpregs)
66 {
67 	long err;
68 	struct __riscv_d_ext_state __user *state = &sc_fpregs->d;
69 	size_t i;
70 
71 	fstate_save(current, regs);
72 	err = __copy_to_user(state, &current->thread.fstate, sizeof(*state));
73 	if (unlikely(err))
74 		return err;
75 
76 	/* We support no other extension state at this time. */
77 	for (i = 0; i < ARRAY_SIZE(sc_fpregs->q.reserved); i++) {
78 		err = __put_user(0, &sc_fpregs->q.reserved[i]);
79 		if (unlikely(err))
80 			break;
81 	}
82 
83 	return err;
84 }
85 #else
86 #define save_fp_state(task, regs) (0)
87 #define restore_fp_state(task, regs) (0)
88 #endif
89 
90 static long restore_sigcontext(struct pt_regs *regs,
91 	struct sigcontext __user *sc)
92 {
93 	long err;
94 	/* sc_regs is structured the same as the start of pt_regs */
95 	err = __copy_from_user(regs, &sc->sc_regs, sizeof(sc->sc_regs));
96 	/* Restore the floating-point state. */
97 	if (has_fpu())
98 		err |= restore_fp_state(regs, &sc->sc_fpregs);
99 	return err;
100 }
101 
102 SYSCALL_DEFINE0(rt_sigreturn)
103 {
104 	struct pt_regs *regs = current_pt_regs();
105 	struct rt_sigframe __user *frame;
106 	struct task_struct *task;
107 	sigset_t set;
108 
109 	/* Always make any pending restarted system calls return -EINTR */
110 	current->restart_block.fn = do_no_restart_syscall;
111 
112 	frame = (struct rt_sigframe __user *)regs->sp;
113 
114 	if (!access_ok(frame, sizeof(*frame)))
115 		goto badframe;
116 
117 	if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
118 		goto badframe;
119 
120 	set_current_blocked(&set);
121 
122 	if (restore_sigcontext(regs, &frame->uc.uc_mcontext))
123 		goto badframe;
124 
125 	if (restore_altstack(&frame->uc.uc_stack))
126 		goto badframe;
127 
128 	regs->cause = -1UL;
129 
130 	return regs->a0;
131 
132 badframe:
133 	task = current;
134 	if (show_unhandled_signals) {
135 		pr_info_ratelimited(
136 			"%s[%d]: bad frame in %s: frame=%p pc=%p sp=%p\n",
137 			task->comm, task_pid_nr(task), __func__,
138 			frame, (void *)regs->epc, (void *)regs->sp);
139 	}
140 	force_sig(SIGSEGV);
141 	return 0;
142 }
143 
144 static long setup_sigcontext(struct rt_sigframe __user *frame,
145 	struct pt_regs *regs)
146 {
147 	struct sigcontext __user *sc = &frame->uc.uc_mcontext;
148 	long err;
149 	/* sc_regs is structured the same as the start of pt_regs */
150 	err = __copy_to_user(&sc->sc_regs, regs, sizeof(sc->sc_regs));
151 	/* Save the floating-point state. */
152 	if (has_fpu())
153 		err |= save_fp_state(regs, &sc->sc_fpregs);
154 	return err;
155 }
156 
157 static inline void __user *get_sigframe(struct ksignal *ksig,
158 	struct pt_regs *regs, size_t framesize)
159 {
160 	unsigned long sp;
161 	/* Default to using normal stack */
162 	sp = regs->sp;
163 
164 	/*
165 	 * If we are on the alternate signal stack and would overflow it, don't.
166 	 * Return an always-bogus address instead so we will die with SIGSEGV.
167 	 */
168 	if (on_sig_stack(sp) && !likely(on_sig_stack(sp - framesize)))
169 		return (void __user __force *)(-1UL);
170 
171 	/* This is the X/Open sanctioned signal stack switching. */
172 	sp = sigsp(sp, ksig) - framesize;
173 
174 	/* Align the stack frame. */
175 	sp &= ~0xfUL;
176 
177 	return (void __user *)sp;
178 }
179 
180 static int setup_rt_frame(struct ksignal *ksig, sigset_t *set,
181 	struct pt_regs *regs)
182 {
183 	struct rt_sigframe __user *frame;
184 	long err = 0;
185 	unsigned long __maybe_unused addr;
186 
187 	frame = get_sigframe(ksig, regs, sizeof(*frame));
188 	if (!access_ok(frame, sizeof(*frame)))
189 		return -EFAULT;
190 
191 	err |= copy_siginfo_to_user(&frame->info, &ksig->info);
192 
193 	/* Create the ucontext. */
194 	err |= __put_user(0, &frame->uc.uc_flags);
195 	err |= __put_user(NULL, &frame->uc.uc_link);
196 	err |= __save_altstack(&frame->uc.uc_stack, regs->sp);
197 	err |= setup_sigcontext(frame, regs);
198 	err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
199 	if (err)
200 		return -EFAULT;
201 
202 	/* Set up to return from userspace. */
203 #ifdef CONFIG_MMU
204 	regs->ra = (unsigned long)VDSO_SYMBOL(
205 		current->mm->context.vdso, rt_sigreturn);
206 #else
207 	/*
208 	 * For the nommu case we don't have a VDSO.  Instead we push two
209 	 * instructions to call the rt_sigreturn syscall onto the user stack.
210 	 */
211 	if (copy_to_user(&frame->sigreturn_code, __user_rt_sigreturn,
212 			 sizeof(frame->sigreturn_code)))
213 		return -EFAULT;
214 
215 	addr = (unsigned long)&frame->sigreturn_code;
216 	/* Make sure the two instructions are pushed to icache. */
217 	flush_icache_range(addr, addr + sizeof(frame->sigreturn_code));
218 
219 	regs->ra = addr;
220 #endif /* CONFIG_MMU */
221 
222 	/*
223 	 * Set up registers for signal handler.
224 	 * Registers that we don't modify keep the value they had from
225 	 * user-space at the time we took the signal.
226 	 * We always pass siginfo and mcontext, regardless of SA_SIGINFO,
227 	 * since some things rely on this (e.g. glibc's debug/segfault.c).
228 	 */
229 	regs->epc = (unsigned long)ksig->ka.sa.sa_handler;
230 	regs->sp = (unsigned long)frame;
231 	regs->a0 = ksig->sig;                     /* a0: signal number */
232 	regs->a1 = (unsigned long)(&frame->info); /* a1: siginfo pointer */
233 	regs->a2 = (unsigned long)(&frame->uc);   /* a2: ucontext pointer */
234 
235 #if DEBUG_SIG
236 	pr_info("SIG deliver (%s:%d): sig=%d pc=%p ra=%p sp=%p\n",
237 		current->comm, task_pid_nr(current), ksig->sig,
238 		(void *)regs->epc, (void *)regs->ra, frame);
239 #endif
240 
241 	return 0;
242 }
243 
244 static void handle_signal(struct ksignal *ksig, struct pt_regs *regs)
245 {
246 	sigset_t *oldset = sigmask_to_save();
247 	int ret;
248 
249 	/* Are we from a system call? */
250 	if (regs->cause == EXC_SYSCALL) {
251 		/* Avoid additional syscall restarting via ret_from_exception */
252 		regs->cause = -1UL;
253 		/* If so, check system call restarting.. */
254 		switch (regs->a0) {
255 		case -ERESTART_RESTARTBLOCK:
256 		case -ERESTARTNOHAND:
257 			regs->a0 = -EINTR;
258 			break;
259 
260 		case -ERESTARTSYS:
261 			if (!(ksig->ka.sa.sa_flags & SA_RESTART)) {
262 				regs->a0 = -EINTR;
263 				break;
264 			}
265 			fallthrough;
266 		case -ERESTARTNOINTR:
267                         regs->a0 = regs->orig_a0;
268 			regs->epc -= 0x4;
269 			break;
270 		}
271 	}
272 
273 	rseq_signal_deliver(ksig, regs);
274 
275 	/* Set up the stack frame */
276 	if (is_compat_task())
277 		ret = compat_setup_rt_frame(ksig, oldset, regs);
278 	else
279 		ret = setup_rt_frame(ksig, oldset, regs);
280 
281 	signal_setup_done(ret, ksig, 0);
282 }
283 
284 static void do_signal(struct pt_regs *regs)
285 {
286 	struct ksignal ksig;
287 
288 	if (get_signal(&ksig)) {
289 		/* Actually deliver the signal */
290 		handle_signal(&ksig, regs);
291 		return;
292 	}
293 
294 	/* Did we come from a system call? */
295 	if (regs->cause == EXC_SYSCALL) {
296 		/* Avoid additional syscall restarting via ret_from_exception */
297 		regs->cause = -1UL;
298 
299 		/* Restart the system call - no handlers present */
300 		switch (regs->a0) {
301 		case -ERESTARTNOHAND:
302 		case -ERESTARTSYS:
303 		case -ERESTARTNOINTR:
304                         regs->a0 = regs->orig_a0;
305 			regs->epc -= 0x4;
306 			break;
307 		case -ERESTART_RESTARTBLOCK:
308                         regs->a0 = regs->orig_a0;
309 			regs->a7 = __NR_restart_syscall;
310 			regs->epc -= 0x4;
311 			break;
312 		}
313 	}
314 
315 	/*
316 	 * If there is no signal to deliver, we just put the saved
317 	 * sigmask back.
318 	 */
319 	restore_saved_sigmask();
320 }
321 
322 /*
323  * Handle any pending work on the resume-to-userspace path, as indicated by
324  * _TIF_WORK_MASK. Entered from assembly with IRQs off.
325  */
326 asmlinkage __visible void do_work_pending(struct pt_regs *regs,
327 					  unsigned long thread_info_flags)
328 {
329 	do {
330 		if (thread_info_flags & _TIF_NEED_RESCHED) {
331 			schedule();
332 		} else {
333 			local_irq_enable();
334 			if (thread_info_flags & _TIF_UPROBE)
335 				uprobe_notify_resume(regs);
336 			/* Handle pending signal delivery */
337 			if (thread_info_flags & (_TIF_SIGPENDING |
338 						 _TIF_NOTIFY_SIGNAL))
339 				do_signal(regs);
340 			if (thread_info_flags & _TIF_NOTIFY_RESUME)
341 				resume_user_mode_work(regs);
342 		}
343 		local_irq_disable();
344 		thread_info_flags = read_thread_flags();
345 	} while (thread_info_flags & _TIF_WORK_MASK);
346 }
347