4d9c4841989deefb3ce7a30f737cca4e7aca8638
[platform/adaptation/renesas_rcar/renesas_kernel.git] / arch / unicore32 / kernel / signal.c
1 /*
2  * linux/arch/unicore32/kernel/signal.c
3  *
4  * Code specific to PKUnity SoC and UniCore ISA
5  *
6  * Copyright (C) 2001-2010 GUAN Xue-tao
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 as
10  * published by the Free Software Foundation.
11  */
12 #include <linux/errno.h>
13 #include <linux/signal.h>
14 #include <linux/personality.h>
15 #include <linux/freezer.h>
16 #include <linux/uaccess.h>
17 #include <linux/tracehook.h>
18 #include <linux/elf.h>
19 #include <linux/unistd.h>
20
21 #include <asm/cacheflush.h>
22 #include <asm/ucontext.h>
23
24 /*
25  * For UniCore syscalls, we encode the syscall number into the instruction.
26  */
27 #define SWI_SYS_SIGRETURN       (0xff000000) /* error number for new abi */
28 #define SWI_SYS_RT_SIGRETURN    (0xff000000 | (__NR_rt_sigreturn))
29 #define SWI_SYS_RESTART         (0xff000000 | (__NR_restart_syscall))
30
31 #define KERN_SIGRETURN_CODE     (KUSER_VECPAGE_BASE + 0x00000500)
32 #define KERN_RESTART_CODE       (KERN_SIGRETURN_CODE + sizeof(sigreturn_codes))
33
34 const unsigned long sigreturn_codes[3] = {
35         SWI_SYS_SIGRETURN, SWI_SYS_RT_SIGRETURN,
36 };
37
38 const unsigned long syscall_restart_code[2] = {
39         SWI_SYS_RESTART,        /* swi  __NR_restart_syscall */
40         0x69efc004,             /* ldr  pc, [sp], #4 */
41 };
42
43 /*
44  * Do a signal return; undo the signal stack.  These are aligned to 64-bit.
45  */
46 struct sigframe {
47         struct ucontext uc;
48         unsigned long retcode[2];
49 };
50
51 struct rt_sigframe {
52         struct siginfo info;
53         struct sigframe sig;
54 };
55
56 static int restore_sigframe(struct pt_regs *regs, struct sigframe __user *sf)
57 {
58         sigset_t set;
59         int err;
60
61         err = __copy_from_user(&set, &sf->uc.uc_sigmask, sizeof(set));
62         if (err == 0)
63                 set_current_blocked(&set);
64
65         err |= __get_user(regs->UCreg_00, &sf->uc.uc_mcontext.regs.UCreg_00);
66         err |= __get_user(regs->UCreg_01, &sf->uc.uc_mcontext.regs.UCreg_01);
67         err |= __get_user(regs->UCreg_02, &sf->uc.uc_mcontext.regs.UCreg_02);
68         err |= __get_user(regs->UCreg_03, &sf->uc.uc_mcontext.regs.UCreg_03);
69         err |= __get_user(regs->UCreg_04, &sf->uc.uc_mcontext.regs.UCreg_04);
70         err |= __get_user(regs->UCreg_05, &sf->uc.uc_mcontext.regs.UCreg_05);
71         err |= __get_user(regs->UCreg_06, &sf->uc.uc_mcontext.regs.UCreg_06);
72         err |= __get_user(regs->UCreg_07, &sf->uc.uc_mcontext.regs.UCreg_07);
73         err |= __get_user(regs->UCreg_08, &sf->uc.uc_mcontext.regs.UCreg_08);
74         err |= __get_user(regs->UCreg_09, &sf->uc.uc_mcontext.regs.UCreg_09);
75         err |= __get_user(regs->UCreg_10, &sf->uc.uc_mcontext.regs.UCreg_10);
76         err |= __get_user(regs->UCreg_11, &sf->uc.uc_mcontext.regs.UCreg_11);
77         err |= __get_user(regs->UCreg_12, &sf->uc.uc_mcontext.regs.UCreg_12);
78         err |= __get_user(regs->UCreg_13, &sf->uc.uc_mcontext.regs.UCreg_13);
79         err |= __get_user(regs->UCreg_14, &sf->uc.uc_mcontext.regs.UCreg_14);
80         err |= __get_user(regs->UCreg_15, &sf->uc.uc_mcontext.regs.UCreg_15);
81         err |= __get_user(regs->UCreg_16, &sf->uc.uc_mcontext.regs.UCreg_16);
82         err |= __get_user(regs->UCreg_17, &sf->uc.uc_mcontext.regs.UCreg_17);
83         err |= __get_user(regs->UCreg_18, &sf->uc.uc_mcontext.regs.UCreg_18);
84         err |= __get_user(regs->UCreg_19, &sf->uc.uc_mcontext.regs.UCreg_19);
85         err |= __get_user(regs->UCreg_20, &sf->uc.uc_mcontext.regs.UCreg_20);
86         err |= __get_user(regs->UCreg_21, &sf->uc.uc_mcontext.regs.UCreg_21);
87         err |= __get_user(regs->UCreg_22, &sf->uc.uc_mcontext.regs.UCreg_22);
88         err |= __get_user(regs->UCreg_23, &sf->uc.uc_mcontext.regs.UCreg_23);
89         err |= __get_user(regs->UCreg_24, &sf->uc.uc_mcontext.regs.UCreg_24);
90         err |= __get_user(regs->UCreg_25, &sf->uc.uc_mcontext.regs.UCreg_25);
91         err |= __get_user(regs->UCreg_26, &sf->uc.uc_mcontext.regs.UCreg_26);
92         err |= __get_user(regs->UCreg_fp, &sf->uc.uc_mcontext.regs.UCreg_fp);
93         err |= __get_user(regs->UCreg_ip, &sf->uc.uc_mcontext.regs.UCreg_ip);
94         err |= __get_user(regs->UCreg_sp, &sf->uc.uc_mcontext.regs.UCreg_sp);
95         err |= __get_user(regs->UCreg_lr, &sf->uc.uc_mcontext.regs.UCreg_lr);
96         err |= __get_user(regs->UCreg_pc, &sf->uc.uc_mcontext.regs.UCreg_pc);
97         err |= __get_user(regs->UCreg_asr, &sf->uc.uc_mcontext.regs.UCreg_asr);
98
99         err |= !valid_user_regs(regs);
100
101         return err;
102 }
103
104 asmlinkage int __sys_rt_sigreturn(struct pt_regs *regs)
105 {
106         struct rt_sigframe __user *frame;
107
108         /* Always make any pending restarted system calls return -EINTR */
109         current_thread_info()->restart_block.fn = do_no_restart_syscall;
110
111         /*
112          * Since we stacked the signal on a 64-bit boundary,
113          * then 'sp' should be word aligned here.  If it's
114          * not, then the user is trying to mess with us.
115          */
116         if (regs->UCreg_sp & 7)
117                 goto badframe;
118
119         frame = (struct rt_sigframe __user *)regs->UCreg_sp;
120
121         if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
122                 goto badframe;
123
124         if (restore_sigframe(regs, &frame->sig))
125                 goto badframe;
126
127         if (do_sigaltstack(&frame->sig.uc.uc_stack, NULL, regs->UCreg_sp)
128                         == -EFAULT)
129                 goto badframe;
130
131         return regs->UCreg_00;
132
133 badframe:
134         force_sig(SIGSEGV, current);
135         return 0;
136 }
137
138 static int setup_sigframe(struct sigframe __user *sf, struct pt_regs *regs,
139                 sigset_t *set)
140 {
141         int err = 0;
142
143         err |= __put_user(regs->UCreg_00, &sf->uc.uc_mcontext.regs.UCreg_00);
144         err |= __put_user(regs->UCreg_01, &sf->uc.uc_mcontext.regs.UCreg_01);
145         err |= __put_user(regs->UCreg_02, &sf->uc.uc_mcontext.regs.UCreg_02);
146         err |= __put_user(regs->UCreg_03, &sf->uc.uc_mcontext.regs.UCreg_03);
147         err |= __put_user(regs->UCreg_04, &sf->uc.uc_mcontext.regs.UCreg_04);
148         err |= __put_user(regs->UCreg_05, &sf->uc.uc_mcontext.regs.UCreg_05);
149         err |= __put_user(regs->UCreg_06, &sf->uc.uc_mcontext.regs.UCreg_06);
150         err |= __put_user(regs->UCreg_07, &sf->uc.uc_mcontext.regs.UCreg_07);
151         err |= __put_user(regs->UCreg_08, &sf->uc.uc_mcontext.regs.UCreg_08);
152         err |= __put_user(regs->UCreg_09, &sf->uc.uc_mcontext.regs.UCreg_09);
153         err |= __put_user(regs->UCreg_10, &sf->uc.uc_mcontext.regs.UCreg_10);
154         err |= __put_user(regs->UCreg_11, &sf->uc.uc_mcontext.regs.UCreg_11);
155         err |= __put_user(regs->UCreg_12, &sf->uc.uc_mcontext.regs.UCreg_12);
156         err |= __put_user(regs->UCreg_13, &sf->uc.uc_mcontext.regs.UCreg_13);
157         err |= __put_user(regs->UCreg_14, &sf->uc.uc_mcontext.regs.UCreg_14);
158         err |= __put_user(regs->UCreg_15, &sf->uc.uc_mcontext.regs.UCreg_15);
159         err |= __put_user(regs->UCreg_16, &sf->uc.uc_mcontext.regs.UCreg_16);
160         err |= __put_user(regs->UCreg_17, &sf->uc.uc_mcontext.regs.UCreg_17);
161         err |= __put_user(regs->UCreg_18, &sf->uc.uc_mcontext.regs.UCreg_18);
162         err |= __put_user(regs->UCreg_19, &sf->uc.uc_mcontext.regs.UCreg_19);
163         err |= __put_user(regs->UCreg_20, &sf->uc.uc_mcontext.regs.UCreg_20);
164         err |= __put_user(regs->UCreg_21, &sf->uc.uc_mcontext.regs.UCreg_21);
165         err |= __put_user(regs->UCreg_22, &sf->uc.uc_mcontext.regs.UCreg_22);
166         err |= __put_user(regs->UCreg_23, &sf->uc.uc_mcontext.regs.UCreg_23);
167         err |= __put_user(regs->UCreg_24, &sf->uc.uc_mcontext.regs.UCreg_24);
168         err |= __put_user(regs->UCreg_25, &sf->uc.uc_mcontext.regs.UCreg_25);
169         err |= __put_user(regs->UCreg_26, &sf->uc.uc_mcontext.regs.UCreg_26);
170         err |= __put_user(regs->UCreg_fp, &sf->uc.uc_mcontext.regs.UCreg_fp);
171         err |= __put_user(regs->UCreg_ip, &sf->uc.uc_mcontext.regs.UCreg_ip);
172         err |= __put_user(regs->UCreg_sp, &sf->uc.uc_mcontext.regs.UCreg_sp);
173         err |= __put_user(regs->UCreg_lr, &sf->uc.uc_mcontext.regs.UCreg_lr);
174         err |= __put_user(regs->UCreg_pc, &sf->uc.uc_mcontext.regs.UCreg_pc);
175         err |= __put_user(regs->UCreg_asr, &sf->uc.uc_mcontext.regs.UCreg_asr);
176
177         err |= __put_user(current->thread.trap_no,
178                         &sf->uc.uc_mcontext.trap_no);
179         err |= __put_user(current->thread.error_code,
180                         &sf->uc.uc_mcontext.error_code);
181         err |= __put_user(current->thread.address,
182                         &sf->uc.uc_mcontext.fault_address);
183         err |= __put_user(set->sig[0], &sf->uc.uc_mcontext.oldmask);
184
185         err |= __copy_to_user(&sf->uc.uc_sigmask, set, sizeof(*set));
186
187         return err;
188 }
189
190 static inline void __user *get_sigframe(struct k_sigaction *ka,
191                 struct pt_regs *regs, int framesize)
192 {
193         unsigned long sp = regs->UCreg_sp;
194         void __user *frame;
195
196         /*
197          * This is the X/Open sanctioned signal stack switching.
198          */
199         if ((ka->sa.sa_flags & SA_ONSTACK) && !sas_ss_flags(sp))
200                 sp = current->sas_ss_sp + current->sas_ss_size;
201
202         /*
203          * ATPCS B01 mandates 8-byte alignment
204          */
205         frame = (void __user *)((sp - framesize) & ~7);
206
207         /*
208          * Check that we can actually write to the signal frame.
209          */
210         if (!access_ok(VERIFY_WRITE, frame, framesize))
211                 frame = NULL;
212
213         return frame;
214 }
215
216 static int setup_return(struct pt_regs *regs, struct k_sigaction *ka,
217              unsigned long __user *rc, void __user *frame, int usig)
218 {
219         unsigned long handler = (unsigned long)ka->sa.sa_handler;
220         unsigned long retcode;
221         unsigned long asr = regs->UCreg_asr & ~PSR_f;
222
223         unsigned int idx = 0;
224
225         if (ka->sa.sa_flags & SA_SIGINFO)
226                 idx += 1;
227
228         if (__put_user(sigreturn_codes[idx],   rc) ||
229             __put_user(sigreturn_codes[idx+1], rc+1))
230                 return 1;
231
232         retcode = KERN_SIGRETURN_CODE + (idx << 2);
233
234         regs->UCreg_00 = usig;
235         regs->UCreg_sp = (unsigned long)frame;
236         regs->UCreg_lr = retcode;
237         regs->UCreg_pc = handler;
238         regs->UCreg_asr = asr;
239
240         return 0;
241 }
242
243 static int setup_frame(int usig, struct k_sigaction *ka,
244                 sigset_t *set, struct pt_regs *regs)
245 {
246         struct sigframe __user *frame = get_sigframe(ka, regs, sizeof(*frame));
247         int err = 0;
248
249         if (!frame)
250                 return 1;
251
252         /*
253          * Set uc.uc_flags to a value which sc.trap_no would never have.
254          */
255         err |= __put_user(0x5ac3c35a, &frame->uc.uc_flags);
256
257         err |= setup_sigframe(frame, regs, set);
258         if (err == 0)
259                 err |= setup_return(regs, ka, frame->retcode, frame, usig);
260
261         return err;
262 }
263
264 static int setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info,
265                sigset_t *set, struct pt_regs *regs)
266 {
267         struct rt_sigframe __user *frame =
268                         get_sigframe(ka, regs, sizeof(*frame));
269         stack_t stack;
270         int err = 0;
271
272         if (!frame)
273                 return 1;
274
275         err |= copy_siginfo_to_user(&frame->info, info);
276
277         err |= __put_user(0, &frame->sig.uc.uc_flags);
278         err |= __put_user(NULL, &frame->sig.uc.uc_link);
279
280         memset(&stack, 0, sizeof(stack));
281         stack.ss_sp = (void __user *)current->sas_ss_sp;
282         stack.ss_flags = sas_ss_flags(regs->UCreg_sp);
283         stack.ss_size = current->sas_ss_size;
284         err |= __copy_to_user(&frame->sig.uc.uc_stack, &stack, sizeof(stack));
285
286         err |= setup_sigframe(&frame->sig, regs, set);
287         if (err == 0)
288                 err |= setup_return(regs, ka, frame->sig.retcode, frame, usig);
289
290         if (err == 0) {
291                 /*
292                  * For realtime signals we must also set the second and third
293                  * arguments for the signal handler.
294                  */
295                 regs->UCreg_01 = (unsigned long)&frame->info;
296                 regs->UCreg_02 = (unsigned long)&frame->sig.uc;
297         }
298
299         return err;
300 }
301
302 static inline void setup_syscall_restart(struct pt_regs *regs)
303 {
304         regs->UCreg_00 = regs->UCreg_ORIG_00;
305         regs->UCreg_pc -= 4;
306 }
307
308 /*
309  * OK, we're invoking a handler
310  */
311 static void handle_signal(unsigned long sig, struct k_sigaction *ka,
312               siginfo_t *info, struct pt_regs *regs, int syscall)
313 {
314         struct thread_info *thread = current_thread_info();
315         struct task_struct *tsk = current;
316         sigset_t *oldset = sigmask_to_save();
317         int usig = sig;
318         int ret;
319
320         /*
321          * If we were from a system call, check for system call restarting...
322          */
323         if (syscall) {
324                 switch (regs->UCreg_00) {
325                 case -ERESTART_RESTARTBLOCK:
326                 case -ERESTARTNOHAND:
327                         regs->UCreg_00 = -EINTR;
328                         break;
329                 case -ERESTARTSYS:
330                         if (!(ka->sa.sa_flags & SA_RESTART)) {
331                                 regs->UCreg_00 = -EINTR;
332                                 break;
333                         }
334                         /* fallthrough */
335                 case -ERESTARTNOINTR:
336                         setup_syscall_restart(regs);
337                 }
338         }
339
340         /*
341          * translate the signal
342          */
343         if (usig < 32 && thread->exec_domain
344                         && thread->exec_domain->signal_invmap)
345                 usig = thread->exec_domain->signal_invmap[usig];
346
347         /*
348          * Set up the stack frame
349          */
350         if (ka->sa.sa_flags & SA_SIGINFO)
351                 ret = setup_rt_frame(usig, ka, info, oldset, regs);
352         else
353                 ret = setup_frame(usig, ka, oldset, regs);
354
355         /*
356          * Check that the resulting registers are actually sane.
357          */
358         ret |= !valid_user_regs(regs);
359
360         if (ret != 0) {
361                 force_sigsegv(sig, tsk);
362                 return;
363         }
364
365         /*
366          * Block the signal if we were successful.
367          */
368         block_sigmask(ka, sig);
369 }
370
371 /*
372  * Note that 'init' is a special process: it doesn't get signals it doesn't
373  * want to handle. Thus you cannot kill init even with a SIGKILL even by
374  * mistake.
375  *
376  * Note that we go through the signals twice: once to check the signals that
377  * the kernel can handle, and then we build all the user-level signal handling
378  * stack-frames in one go after that.
379  */
380 static void do_signal(struct pt_regs *regs, int syscall)
381 {
382         struct k_sigaction ka;
383         siginfo_t info;
384         int signr;
385
386         /*
387          * We want the common case to go fast, which
388          * is why we may in certain cases get here from
389          * kernel mode. Just return without doing anything
390          * if so.
391          */
392         if (!user_mode(regs))
393                 return;
394
395         signr = get_signal_to_deliver(&info, &ka, regs, NULL);
396         if (signr > 0) {
397                 handle_signal(signr, &ka, &info, regs, syscall);
398                 return;
399         }
400
401         /*
402          * No signal to deliver to the process - restart the syscall.
403          */
404         if (syscall) {
405                 if (regs->UCreg_00 == -ERESTART_RESTARTBLOCK) {
406                                 u32 __user *usp;
407
408                                 regs->UCreg_sp -= 4;
409                                 usp = (u32 __user *)regs->UCreg_sp;
410
411                                 if (put_user(regs->UCreg_pc, usp) == 0) {
412                                         regs->UCreg_pc = KERN_RESTART_CODE;
413                                 } else {
414                                         regs->UCreg_sp += 4;
415                                         force_sigsegv(0, current);
416                                 }
417                 }
418                 if (regs->UCreg_00 == -ERESTARTNOHAND ||
419                     regs->UCreg_00 == -ERESTARTSYS ||
420                     regs->UCreg_00 == -ERESTARTNOINTR) {
421                         setup_syscall_restart(regs);
422                 }
423         }
424         /* If there's no signal to deliver, we just put the saved
425          * sigmask back.
426          */
427         restore_saved_sigmask();
428 }
429
430 asmlinkage void do_notify_resume(struct pt_regs *regs,
431                 unsigned int thread_flags, int syscall)
432 {
433         if (thread_flags & _TIF_SIGPENDING)
434                 do_signal(regs, syscall);
435
436         if (thread_flags & _TIF_NOTIFY_RESUME) {
437                 clear_thread_flag(TIF_NOTIFY_RESUME);
438                 tracehook_notify_resume(regs);
439         }
440 }
441
442 /*
443  * Copy signal return handlers into the vector page, and
444  * set sigreturn to be a pointer to these.
445  */
446 void __init early_signal_init(void)
447 {
448         memcpy((void *)kuser_vecpage_to_vectors(KERN_SIGRETURN_CODE),
449                         sigreturn_codes, sizeof(sigreturn_codes));
450         memcpy((void *)kuser_vecpage_to_vectors(KERN_RESTART_CODE),
451                         syscall_restart_code, sizeof(syscall_restart_code));
452         /* Need not to flush icache, since early_trap_init will do it last. */
453 }