2 * signal32.c: Support 32bit signal syscalls.
4 * Copyright (C) 2001 IBM
5 * Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
6 * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu)
8 * These routines maintain argument size conversion between 32bit and 64bit
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License
13 * as published by the Free Software Foundation; either version
14 * 2 of the License, or (at your option) any later version.
17 #include <linux/config.h>
18 #include <linux/sched.h>
20 #include <linux/smp.h>
21 #include <linux/smp_lock.h>
22 #include <linux/kernel.h>
23 #include <linux/signal.h>
24 #include <linux/syscalls.h>
25 #include <linux/errno.h>
26 #include <linux/elf.h>
27 #include <linux/compat.h>
28 #include <linux/ptrace.h>
29 #include <asm/ppc32.h>
30 #include <asm/uaccess.h>
31 #include <asm/ppcdebug.h>
32 #include <asm/unistd.h>
33 #include <asm/cacheflush.h>
38 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
40 #define GP_REGS_SIZE32 min(sizeof(elf_gregset_t32), sizeof(struct pt_regs32))
43 * When we have signals to deliver, we set up on the
44 * user stack, going down from the original stack pointer:
46 * a sigcontext32 struct
47 * a gap of __SIGNAL_FRAMESIZE32 bytes
49 * Each of these things must be a multiple of 16 bytes in size.
53 struct mcontext32 mctx
; /* all the register values */
55 * Programs using the rs6000/xcoff abi can save up to 19 gp
56 * regs and 18 fp regs below sp before decrementing it.
61 /* We use the mc_pad field for the signal return trampoline. */
65 * When we have rt signals to deliver, we set up on the
66 * user stack, going down from the original stack pointer:
67 * one rt_sigframe32 struct (siginfo + ucontext + ABI gap)
68 * a gap of __SIGNAL_FRAMESIZE32+16 bytes
69 * (the +16 is to get the siginfo and ucontext32 in the same
70 * positions as in older kernels).
72 * Each of these things must be a multiple of 16 bytes in size.
75 struct rt_sigframe32
{
76 compat_siginfo_t info
;
79 * Programs using the rs6000/xcoff abi can save up to 19 gp
80 * regs and 18 fp regs below sp before decrementing it.
87 * Common utility functions used by signal and context support
92 * Restore the user process's signal mask
93 * (implemented in signal.c)
95 extern void restore_sigmask(sigset_t
*set
);
98 * Functions for flipping sigsets (thanks to brain dead generic
99 * implementation that makes things simple for little endian only
101 static inline void compat_from_sigset(compat_sigset_t
*compat
, sigset_t
*set
)
103 switch (_NSIG_WORDS
) {
104 case 4: compat
->sig
[5] = set
->sig
[3] & 0xffffffffull
;
105 compat
->sig
[7] = set
->sig
[3] >> 32;
106 case 3: compat
->sig
[4] = set
->sig
[2] & 0xffffffffull
;
107 compat
->sig
[5] = set
->sig
[2] >> 32;
108 case 2: compat
->sig
[2] = set
->sig
[1] & 0xffffffffull
;
109 compat
->sig
[3] = set
->sig
[1] >> 32;
110 case 1: compat
->sig
[0] = set
->sig
[0] & 0xffffffffull
;
111 compat
->sig
[1] = set
->sig
[0] >> 32;
115 static inline void sigset_from_compat(sigset_t
*set
, compat_sigset_t
*compat
)
117 switch (_NSIG_WORDS
) {
118 case 4: set
->sig
[3] = compat
->sig
[6] | (((long)compat
->sig
[7]) << 32);
119 case 3: set
->sig
[2] = compat
->sig
[4] | (((long)compat
->sig
[5]) << 32);
120 case 2: set
->sig
[1] = compat
->sig
[2] | (((long)compat
->sig
[3]) << 32);
121 case 1: set
->sig
[0] = compat
->sig
[0] | (((long)compat
->sig
[1]) << 32);
127 * Save the current user registers on the user stack.
128 * We only save the altivec registers if the process has used
129 * altivec instructions at some point.
131 static int save_user_regs(struct pt_regs
*regs
, struct mcontext32 __user
*frame
, int sigret
)
133 elf_greg_t64
*gregs
= (elf_greg_t64
*)regs
;
136 /* Make sure floating point registers are stored in regs */
137 flush_fp_to_thread(current
);
139 /* save general and floating-point registers */
140 for (i
= 0; i
<= PT_RESULT
; i
++)
141 err
|= __put_user((unsigned int)gregs
[i
], &frame
->mc_gregs
[i
]);
142 err
|= __copy_to_user(&frame
->mc_fregs
, current
->thread
.fpr
,
143 ELF_NFPREG
* sizeof(double));
147 current
->thread
.fpscr
= 0; /* turn off all fp exceptions */
149 #ifdef CONFIG_ALTIVEC
150 /* save altivec registers */
151 if (current
->thread
.used_vr
) {
152 flush_altivec_to_thread(current
);
153 if (__copy_to_user(&frame
->mc_vregs
, current
->thread
.vr
,
154 ELF_NVRREG32
* sizeof(vector128
)))
156 /* set MSR_VEC in the saved MSR value to indicate that
157 frame->mc_vregs contains valid data */
158 if (__put_user(regs
->msr
| MSR_VEC
, &frame
->mc_gregs
[PT_MSR
]))
161 /* else assert((regs->msr & MSR_VEC) == 0) */
163 /* We always copy to/from vrsave, it's 0 if we don't have or don't
164 * use altivec. Since VSCR only contains 32 bits saved in the least
165 * significant bits of a vector, we "cheat" and stuff VRSAVE in the
166 * most significant bits of that same vector. --BenH
168 if (__put_user(current
->thread
.vrsave
, (u32 __user
*)&frame
->mc_vregs
[32]))
170 #endif /* CONFIG_ALTIVEC */
173 /* Set up the sigreturn trampoline: li r0,sigret; sc */
174 if (__put_user(0x38000000UL
+ sigret
, &frame
->tramp
[0])
175 || __put_user(0x44000002UL
, &frame
->tramp
[1]))
177 flush_icache_range((unsigned long) &frame
->tramp
[0],
178 (unsigned long) &frame
->tramp
[2]);
185 * Restore the current user register values from the user stack,
188 static long restore_user_regs(struct pt_regs
*regs
,
189 struct mcontext32 __user
*sr
, int sig
)
191 elf_greg_t64
*gregs
= (elf_greg_t64
*)regs
;
194 unsigned int save_r2
= 0;
195 #ifdef CONFIG_ALTIVEC
200 * restore general registers but not including MSR or SOFTE. Also
201 * take care of keeping r2 (TLS) intact if not a signal
204 save_r2
= (unsigned int)regs
->gpr
[2];
205 for (i
= 0; i
<= PT_RESULT
; i
++) {
206 if ((i
== PT_MSR
) || (i
== PT_SOFTE
))
208 err
|= __get_user(gregs
[i
], &sr
->mc_gregs
[i
]);
211 regs
->gpr
[2] = (unsigned long) save_r2
;
215 /* force the process to reload the FP registers from
216 current->thread when it next does FP instructions */
217 regs
->msr
&= ~(MSR_FP
| MSR_FE0
| MSR_FE1
);
218 if (__copy_from_user(current
->thread
.fpr
, &sr
->mc_fregs
,
219 sizeof(sr
->mc_fregs
)))
222 #ifdef CONFIG_ALTIVEC
223 /* force the process to reload the altivec registers from
224 current->thread when it next does altivec instructions */
225 regs
->msr
&= ~MSR_VEC
;
226 if (!__get_user(msr
, &sr
->mc_gregs
[PT_MSR
]) && (msr
& MSR_VEC
) != 0) {
227 /* restore altivec registers from the stack */
228 if (__copy_from_user(current
->thread
.vr
, &sr
->mc_vregs
,
229 sizeof(sr
->mc_vregs
)))
231 } else if (current
->thread
.used_vr
)
232 memset(current
->thread
.vr
, 0, ELF_NVRREG32
* sizeof(vector128
));
234 /* Always get VRSAVE back */
235 if (__get_user(current
->thread
.vrsave
, (u32 __user
*)&sr
->mc_vregs
[32]))
237 #endif /* CONFIG_ALTIVEC */
241 if (last_task_used_math
== current
)
242 last_task_used_math
= NULL
;
243 if (last_task_used_altivec
== current
)
244 last_task_used_altivec
= NULL
;
252 * Start of nonRT signal support
254 * sigset_t is 32 bits for non-rt signals
257 * sigaction sys32_sigaction
258 * sigreturn sys32_sigreturn
260 * Note sigsuspend has no special 32 bit routine - uses the 64 bit routine
267 * Atomically swap in the new signal mask, and wait for a signal.
269 long sys32_sigsuspend(old_sigset_t mask
, int p2
, int p3
, int p4
, int p6
, int p7
,
270 struct pt_regs
*regs
)
275 spin_lock_irq(¤t
->sighand
->siglock
);
276 saveset
= current
->blocked
;
277 siginitset(¤t
->blocked
, mask
);
279 spin_unlock_irq(¤t
->sighand
->siglock
);
281 regs
->result
= -EINTR
;
282 regs
->gpr
[3] = EINTR
;
283 regs
->ccr
|= 0x10000000;
285 current
->state
= TASK_INTERRUPTIBLE
;
287 if (do_signal32(&saveset
, regs
))
289 * Returning 0 means we return to userspace via
290 * ret_from_except and thus restore all user
291 * registers from *regs. This is what we need
292 * to do when a signal has been delivered.
298 long sys32_sigaction(int sig
, struct old_sigaction32 __user
*act
,
299 struct old_sigaction32 __user
*oact
)
301 struct k_sigaction new_ka
, old_ka
;
308 compat_old_sigset_t mask
;
309 compat_uptr_t handler
, restorer
;
311 if (get_user(handler
, &act
->sa_handler
) ||
312 __get_user(restorer
, &act
->sa_restorer
) ||
313 __get_user(new_ka
.sa
.sa_flags
, &act
->sa_flags
) ||
314 __get_user(mask
, &act
->sa_mask
))
316 new_ka
.sa
.sa_handler
= compat_ptr(handler
);
317 new_ka
.sa
.sa_restorer
= compat_ptr(restorer
);
318 siginitset(&new_ka
.sa
.sa_mask
, mask
);
321 ret
= do_sigaction(sig
, act
? &new_ka
: NULL
, oact
? &old_ka
: NULL
);
323 if (put_user((long)old_ka
.sa
.sa_handler
, &oact
->sa_handler
) ||
324 __put_user((long)old_ka
.sa
.sa_restorer
, &oact
->sa_restorer
) ||
325 __put_user(old_ka
.sa
.sa_flags
, &oact
->sa_flags
) ||
326 __put_user(old_ka
.sa
.sa_mask
.sig
[0], &oact
->sa_mask
))
336 * Start of RT signal support
338 * sigset_t is 64 bits for rt signals
341 * sigaction sys32_rt_sigaction
342 * sigpending sys32_rt_sigpending
343 * sigprocmask sys32_rt_sigprocmask
344 * sigreturn sys32_rt_sigreturn
345 * sigqueueinfo sys32_rt_sigqueueinfo
346 * sigsuspend sys32_rt_sigsuspend
350 * copy_siginfo_to_user32
355 long sys32_rt_sigaction(int sig
, const struct sigaction32 __user
*act
,
356 struct sigaction32 __user
*oact
, size_t sigsetsize
)
358 struct k_sigaction new_ka
, old_ka
;
360 compat_sigset_t set32
;
362 /* XXX: Don't preclude handling different sized sigset_t's. */
363 if (sigsetsize
!= sizeof(compat_sigset_t
))
367 compat_uptr_t handler
;
369 ret
= get_user(handler
, &act
->sa_handler
);
370 new_ka
.sa
.sa_handler
= compat_ptr(handler
);
371 ret
|= __copy_from_user(&set32
, &act
->sa_mask
,
372 sizeof(compat_sigset_t
));
373 sigset_from_compat(&new_ka
.sa
.sa_mask
, &set32
);
374 ret
|= __get_user(new_ka
.sa
.sa_flags
, &act
->sa_flags
);
379 ret
= do_sigaction(sig
, act
? &new_ka
: NULL
, oact
? &old_ka
: NULL
);
381 compat_from_sigset(&set32
, &old_ka
.sa
.sa_mask
);
382 ret
= put_user((long)old_ka
.sa
.sa_handler
, &oact
->sa_handler
);
383 ret
|= __copy_to_user(&oact
->sa_mask
, &set32
,
384 sizeof(compat_sigset_t
));
385 ret
|= __put_user(old_ka
.sa
.sa_flags
, &oact
->sa_flags
);
391 * Note: it is necessary to treat how as an unsigned int, with the
392 * corresponding cast to a signed int to insure that the proper
393 * conversion (sign extension) between the register representation
394 * of a signed int (msr in 32-bit mode) and the register representation
395 * of a signed int (msr in 64-bit mode) is performed.
397 long sys32_rt_sigprocmask(u32 how
, compat_sigset_t __user
*set
,
398 compat_sigset_t __user
*oset
, size_t sigsetsize
)
404 mm_segment_t old_fs
= get_fs();
407 if (copy_from_user (&s32
, set
, sizeof(compat_sigset_t
)))
409 sigset_from_compat(&s
, &s32
);
413 /* This is valid because of the set_fs() */
414 up
= (sigset_t __user
*) &s
;
415 ret
= sys_rt_sigprocmask((int)how
, set
? up
: NULL
, oset
? up
: NULL
,
421 compat_from_sigset(&s32
, &s
);
422 if (copy_to_user (oset
, &s32
, sizeof(compat_sigset_t
)))
428 long sys32_rt_sigpending(compat_sigset_t __user
*set
, compat_size_t sigsetsize
)
433 mm_segment_t old_fs
= get_fs();
436 /* The __user pointer cast is valid because of the set_fs() */
437 ret
= sys_rt_sigpending((sigset_t __user
*) &s
, sigsetsize
);
440 compat_from_sigset(&s32
, &s
);
441 if (copy_to_user (set
, &s32
, sizeof(compat_sigset_t
)))
448 int copy_siginfo_to_user32(struct compat_siginfo __user
*d
, siginfo_t
*s
)
452 if (!access_ok (VERIFY_WRITE
, d
, sizeof(*d
)))
455 /* If you change siginfo_t structure, please be sure
456 * this code is fixed accordingly.
457 * It should never copy any pad contained in the structure
458 * to avoid security leaks, but must copy the generic
459 * 3 ints plus the relevant union member.
460 * This routine must convert siginfo from 64bit to 32bit as well
463 err
= __put_user(s
->si_signo
, &d
->si_signo
);
464 err
|= __put_user(s
->si_errno
, &d
->si_errno
);
465 err
|= __put_user((short)s
->si_code
, &d
->si_code
);
467 err
|= __copy_to_user(&d
->_sifields
._pad
, &s
->_sifields
._pad
,
469 else switch(s
->si_code
>> 16) {
470 case __SI_CHLD
>> 16:
471 err
|= __put_user(s
->si_pid
, &d
->si_pid
);
472 err
|= __put_user(s
->si_uid
, &d
->si_uid
);
473 err
|= __put_user(s
->si_utime
, &d
->si_utime
);
474 err
|= __put_user(s
->si_stime
, &d
->si_stime
);
475 err
|= __put_user(s
->si_status
, &d
->si_status
);
477 case __SI_FAULT
>> 16:
478 err
|= __put_user((unsigned int)(unsigned long)s
->si_addr
,
481 case __SI_POLL
>> 16:
482 err
|= __put_user(s
->si_band
, &d
->si_band
);
483 err
|= __put_user(s
->si_fd
, &d
->si_fd
);
485 case __SI_TIMER
>> 16:
486 err
|= __put_user(s
->si_tid
, &d
->si_tid
);
487 err
|= __put_user(s
->si_overrun
, &d
->si_overrun
);
488 err
|= __put_user(s
->si_int
, &d
->si_int
);
490 case __SI_RT
>> 16: /* This is not generated by the kernel as of now. */
491 case __SI_MESGQ
>> 16:
492 err
|= __put_user(s
->si_int
, &d
->si_int
);
494 case __SI_KILL
>> 16:
496 err
|= __put_user(s
->si_pid
, &d
->si_pid
);
497 err
|= __put_user(s
->si_uid
, &d
->si_uid
);
504 * Note: it is necessary to treat pid and sig as unsigned ints, with the
505 * corresponding cast to a signed int to insure that the proper conversion
506 * (sign extension) between the register representation of a signed int
507 * (msr in 32-bit mode) and the register representation of a signed int
508 * (msr in 64-bit mode) is performed.
510 long sys32_rt_sigqueueinfo(u32 pid
, u32 sig
, compat_siginfo_t __user
*uinfo
)
514 mm_segment_t old_fs
= get_fs();
516 if (copy_from_user (&info
, uinfo
, 3*sizeof(int)) ||
517 copy_from_user (info
._sifields
._pad
, uinfo
->_sifields
._pad
, SI_PAD_SIZE32
))
520 /* The __user pointer cast is valid becasuse of the set_fs() */
521 ret
= sys_rt_sigqueueinfo((int)pid
, (int)sig
, (siginfo_t __user
*) &info
);
526 int sys32_rt_sigsuspend(compat_sigset_t __user
* unewset
, size_t sigsetsize
, int p3
,
527 int p4
, int p6
, int p7
, struct pt_regs
*regs
)
529 sigset_t saveset
, newset
;
532 /* XXX: Don't preclude handling different sized sigset_t's. */
533 if (sigsetsize
!= sizeof(sigset_t
))
536 if (copy_from_user(&s32
, unewset
, sizeof(s32
)))
540 * Swap the 2 words of the 64-bit sigset_t (they are stored
541 * in the "wrong" endian in 32-bit user storage).
543 sigset_from_compat(&newset
, &s32
);
545 sigdelsetmask(&newset
, ~_BLOCKABLE
);
546 spin_lock_irq(¤t
->sighand
->siglock
);
547 saveset
= current
->blocked
;
548 current
->blocked
= newset
;
550 spin_unlock_irq(¤t
->sighand
->siglock
);
552 regs
->result
= -EINTR
;
553 regs
->gpr
[3] = EINTR
;
554 regs
->ccr
|= 0x10000000;
556 current
->state
= TASK_INTERRUPTIBLE
;
558 if (do_signal32(&saveset
, regs
))
560 * Returning 0 means we return to userspace via
561 * ret_from_except and thus restore all user
562 * registers from *regs. This is what we need
563 * to do when a signal has been delivered.
570 * Start Alternate signal stack support
573 * sigaltatck sys32_sigaltstack
576 int sys32_sigaltstack(u32 __new
, u32 __old
, int r5
,
577 int r6
, int r7
, int r8
, struct pt_regs
*regs
)
579 stack_32_t __user
* newstack
= (stack_32_t __user
*)(long) __new
;
580 stack_32_t __user
* oldstack
= (stack_32_t __user
*)(long) __old
;
588 * set sp to the user stack on entry to the system call
589 * the system call router sets R9 to the saved registers
593 /* Put new stack info in local 64 bit stack struct */
595 if (get_user(ss_sp
, &newstack
->ss_sp
) ||
596 __get_user(uss
.ss_flags
, &newstack
->ss_flags
) ||
597 __get_user(uss
.ss_size
, &newstack
->ss_size
))
599 uss
.ss_sp
= compat_ptr(ss_sp
);
604 /* The __user pointer casts are valid because of the set_fs() */
605 ret
= do_sigaltstack(
606 newstack
? (stack_t __user
*) &uss
: NULL
,
607 oldstack
? (stack_t __user
*) &uoss
: NULL
,
610 /* Copy the stack information to the user output buffer */
611 if (!ret
&& oldstack
&&
612 (put_user((long)uoss
.ss_sp
, &oldstack
->ss_sp
) ||
613 __put_user(uoss
.ss_flags
, &oldstack
->ss_flags
) ||
614 __put_user(uoss
.ss_size
, &oldstack
->ss_size
)))
621 * Set up a signal frame for a "real-time" signal handler
622 * (one which gets siginfo).
624 static int handle_rt_signal32(unsigned long sig
, struct k_sigaction
*ka
,
625 siginfo_t
*info
, sigset_t
*oldset
,
626 struct pt_regs
* regs
, unsigned long newsp
)
628 struct rt_sigframe32 __user
*rt_sf
;
629 struct mcontext32 __user
*frame
;
630 unsigned long origsp
= newsp
;
631 compat_sigset_t c_oldset
;
633 /* Set up Signal Frame */
634 /* Put a Real Time Context onto stack */
635 newsp
-= sizeof(*rt_sf
);
636 rt_sf
= (struct rt_sigframe32 __user
*)newsp
;
638 /* create a stack frame for the caller of the handler */
639 newsp
-= __SIGNAL_FRAMESIZE32
+ 16;
641 if (!access_ok(VERIFY_WRITE
, (void __user
*)newsp
, origsp
- newsp
))
644 compat_from_sigset(&c_oldset
, oldset
);
646 /* Put the siginfo & fill in most of the ucontext */
647 if (copy_siginfo_to_user32(&rt_sf
->info
, info
)
648 || __put_user(0, &rt_sf
->uc
.uc_flags
)
649 || __put_user(0, &rt_sf
->uc
.uc_link
)
650 || __put_user(current
->sas_ss_sp
, &rt_sf
->uc
.uc_stack
.ss_sp
)
651 || __put_user(sas_ss_flags(regs
->gpr
[1]),
652 &rt_sf
->uc
.uc_stack
.ss_flags
)
653 || __put_user(current
->sas_ss_size
, &rt_sf
->uc
.uc_stack
.ss_size
)
654 || __put_user((u32
)(u64
)&rt_sf
->uc
.uc_mcontext
, &rt_sf
->uc
.uc_regs
)
655 || __copy_to_user(&rt_sf
->uc
.uc_sigmask
, &c_oldset
, sizeof(c_oldset
)))
658 /* Save user registers on the stack */
659 frame
= &rt_sf
->uc
.uc_mcontext
;
660 if (put_user(regs
->gpr
[1], (u32 __user
*)newsp
))
663 if (vdso32_rt_sigtramp
&& current
->thread
.vdso_base
) {
664 if (save_user_regs(regs
, frame
, 0))
666 regs
->link
= current
->thread
.vdso_base
+ vdso32_rt_sigtramp
;
668 if (save_user_regs(regs
, frame
, __NR_rt_sigreturn
))
670 regs
->link
= (unsigned long) frame
->tramp
;
672 regs
->gpr
[1] = (unsigned long) newsp
;
674 regs
->gpr
[4] = (unsigned long) &rt_sf
->info
;
675 regs
->gpr
[5] = (unsigned long) &rt_sf
->uc
;
676 regs
->gpr
[6] = (unsigned long) rt_sf
;
677 regs
->nip
= (unsigned long) ka
->sa
.sa_handler
;
681 if (test_thread_flag(TIF_SINGLESTEP
))
682 ptrace_notify(SIGTRAP
);
688 printk("badframe in handle_rt_signal, regs=%p frame=%p newsp=%lx\n",
691 force_sigsegv(sig
, current
);
695 static long do_setcontext32(struct ucontext32 __user
*ucp
, struct pt_regs
*regs
, int sig
)
697 compat_sigset_t c_set
;
701 if (__copy_from_user(&c_set
, &ucp
->uc_sigmask
, sizeof(c_set
))
702 || __get_user(mcp
, &ucp
->uc_regs
))
704 sigset_from_compat(&set
, &c_set
);
705 restore_sigmask(&set
);
706 if (restore_user_regs(regs
, (struct mcontext32 __user
*)(u64
)mcp
, sig
))
713 * Handle {get,set,swap}_context operations for 32 bits processes
716 long sys32_swapcontext(struct ucontext32 __user
*old_ctx
,
717 struct ucontext32 __user
*new_ctx
,
718 int ctx_size
, int r6
, int r7
, int r8
, struct pt_regs
*regs
)
721 compat_sigset_t c_set
;
723 /* Context size is for future use. Right now, we only make sure
724 * we are passed something we understand
726 if (ctx_size
< sizeof(struct ucontext32
))
729 if (old_ctx
!= NULL
) {
730 compat_from_sigset(&c_set
, ¤t
->blocked
);
731 if (!access_ok(VERIFY_WRITE
, old_ctx
, sizeof(*old_ctx
))
732 || save_user_regs(regs
, &old_ctx
->uc_mcontext
, 0)
733 || __copy_to_user(&old_ctx
->uc_sigmask
, &c_set
, sizeof(c_set
))
734 || __put_user((u32
)(u64
)&old_ctx
->uc_mcontext
, &old_ctx
->uc_regs
))
739 if (!access_ok(VERIFY_READ
, new_ctx
, sizeof(*new_ctx
))
740 || __get_user(tmp
, (u8 __user
*) new_ctx
)
741 || __get_user(tmp
, (u8 __user
*) (new_ctx
+ 1) - 1))
745 * If we get a fault copying the context into the kernel's
746 * image of the user's registers, we can't just return -EFAULT
747 * because the user's registers will be corrupted. For instance
748 * the NIP value may have been updated but not some of the
749 * other registers. Given that we have done the access_ok
750 * and successfully read the first and last bytes of the region
751 * above, this should only happen in an out-of-memory situation
752 * or if another thread unmaps the region containing the context.
753 * We kill the task with a SIGSEGV in this situation.
755 if (do_setcontext32(new_ctx
, regs
, 0))
761 long sys32_rt_sigreturn(int r3
, int r4
, int r5
, int r6
, int r7
, int r8
,
762 struct pt_regs
*regs
)
764 struct rt_sigframe32 __user
*rt_sf
;
768 /* Always make any pending restarted system calls return -EINTR */
769 current_thread_info()->restart_block
.fn
= do_no_restart_syscall
;
771 rt_sf
= (struct rt_sigframe32 __user
*)
772 (regs
->gpr
[1] + __SIGNAL_FRAMESIZE32
+ 16);
773 if (!access_ok(VERIFY_READ
, rt_sf
, sizeof(*rt_sf
)))
775 if (do_setcontext32(&rt_sf
->uc
, regs
, 1))
779 * It's not clear whether or why it is desirable to save the
780 * sigaltstack setting on signal delivery and restore it on
781 * signal return. But other architectures do this and we have
782 * always done it up until now so it is probably better not to
783 * change it. -- paulus
784 * We use the sys32_ version that does the 32/64 bits conversion
785 * and takes userland pointer directly. What about error checking ?
788 sys32_sigaltstack((u32
)(u64
)&rt_sf
->uc
.uc_stack
, 0, 0, 0, 0, 0, regs
);
795 force_sig(SIGSEGV
, current
);
801 * OK, we're invoking a handler
803 static int handle_signal32(unsigned long sig
, struct k_sigaction
*ka
,
804 siginfo_t
*info
, sigset_t
*oldset
,
805 struct pt_regs
* regs
, unsigned long newsp
)
807 struct sigcontext32 __user
*sc
;
808 struct sigregs32 __user
*frame
;
809 unsigned long origsp
= newsp
;
811 /* Set up Signal Frame */
812 newsp
-= sizeof(struct sigregs32
);
813 frame
= (struct sigregs32 __user
*) newsp
;
815 /* Put a sigcontext on the stack */
816 newsp
-= sizeof(*sc
);
817 sc
= (struct sigcontext32 __user
*) newsp
;
819 /* create a stack frame for the caller of the handler */
820 newsp
-= __SIGNAL_FRAMESIZE32
;
822 if (!access_ok(VERIFY_WRITE
, (void __user
*) newsp
, origsp
- newsp
))
826 #error "Please adjust handle_signal32()"
828 if (__put_user((u32
)(u64
)ka
->sa
.sa_handler
, &sc
->handler
)
829 || __put_user(oldset
->sig
[0], &sc
->oldmask
)
830 || __put_user((oldset
->sig
[0] >> 32), &sc
->_unused
[3])
831 || __put_user((u32
)(u64
)frame
, &sc
->regs
)
832 || __put_user(sig
, &sc
->signal
))
835 if (vdso32_sigtramp
&& current
->thread
.vdso_base
) {
836 if (save_user_regs(regs
, &frame
->mctx
, 0))
838 regs
->link
= current
->thread
.vdso_base
+ vdso32_sigtramp
;
840 if (save_user_regs(regs
, &frame
->mctx
, __NR_sigreturn
))
842 regs
->link
= (unsigned long) frame
->mctx
.tramp
;
845 if (put_user(regs
->gpr
[1], (u32 __user
*)newsp
))
847 regs
->gpr
[1] = (unsigned long) newsp
;
849 regs
->gpr
[4] = (unsigned long) sc
;
850 regs
->nip
= (unsigned long) ka
->sa
.sa_handler
;
854 if (test_thread_flag(TIF_SINGLESTEP
))
855 ptrace_notify(SIGTRAP
);
861 printk("badframe in handle_signal, regs=%p frame=%x newsp=%x\n",
862 regs
, frame
, *newspp
);
864 force_sigsegv(sig
, current
);
869 * Do a signal return; undo the signal stack.
871 long sys32_sigreturn(int r3
, int r4
, int r5
, int r6
, int r7
, int r8
,
872 struct pt_regs
*regs
)
874 struct sigcontext32 __user
*sc
;
875 struct sigcontext32 sigctx
;
876 struct mcontext32 __user
*sr
;
880 /* Always make any pending restarted system calls return -EINTR */
881 current_thread_info()->restart_block
.fn
= do_no_restart_syscall
;
883 sc
= (struct sigcontext32 __user
*)(regs
->gpr
[1] + __SIGNAL_FRAMESIZE32
);
884 if (copy_from_user(&sigctx
, sc
, sizeof(sigctx
)))
888 * Note that PPC32 puts the upper 32 bits of the sigmask in the
889 * unused part of the signal stackframe
891 set
.sig
[0] = sigctx
.oldmask
+ ((long)(sigctx
._unused
[3]) << 32);
892 restore_sigmask(&set
);
894 sr
= (struct mcontext32 __user
*)(u64
)sigctx
.regs
;
895 if (!access_ok(VERIFY_READ
, sr
, sizeof(*sr
))
896 || restore_user_regs(regs
, sr
, 1))
903 force_sig(SIGSEGV
, current
);
910 * Start of do_signal32 routine
912 * This routine gets control when a pending signal needs to be processed
913 * in the 32 bit target thread -
915 * It handles both rt and non-rt signals
919 * Note that 'init' is a special process: it doesn't get signals it doesn't
920 * want to handle. Thus you cannot kill init even with a SIGKILL even by
924 int do_signal32(sigset_t
*oldset
, struct pt_regs
*regs
)
927 unsigned int frame
, newsp
;
929 struct k_sigaction ka
;
932 oldset
= ¤t
->blocked
;
936 signr
= get_signal_to_deliver(&info
, &ka
, regs
, NULL
);
938 if (TRAP(regs
) == 0x0C00 /* System Call! */
939 && regs
->ccr
& 0x10000000 /* error signalled */
940 && ((ret
= regs
->gpr
[3]) == ERESTARTSYS
941 || ret
== ERESTARTNOHAND
|| ret
== ERESTARTNOINTR
942 || ret
== ERESTART_RESTARTBLOCK
)) {
945 && (ret
== ERESTARTNOHAND
|| ret
== ERESTART_RESTARTBLOCK
946 || (ret
== ERESTARTSYS
947 && !(ka
.sa
.sa_flags
& SA_RESTART
)))) {
948 /* make the system call return an EINTR error */
949 regs
->result
= -EINTR
;
950 regs
->gpr
[3] = EINTR
;
951 /* note that the cr0.SO bit is already set */
953 regs
->nip
-= 4; /* Back up & retry system call */
956 if (ret
== ERESTART_RESTARTBLOCK
)
957 regs
->gpr
[0] = __NR_restart_syscall
;
959 regs
->gpr
[3] = regs
->orig_gpr3
;
964 return 0; /* no signals delivered */
966 if ((ka
.sa
.sa_flags
& SA_ONSTACK
) && current
->sas_ss_size
967 && (!on_sig_stack(regs
->gpr
[1])))
968 newsp
= (current
->sas_ss_sp
+ current
->sas_ss_size
);
970 newsp
= regs
->gpr
[1];
973 /* Whee! Actually deliver the signal. */
974 if (ka
.sa
.sa_flags
& SA_SIGINFO
)
975 ret
= handle_rt_signal32(signr
, &ka
, &info
, oldset
, regs
, newsp
);
977 ret
= handle_signal32(signr
, &ka
, &info
, oldset
, regs
, newsp
);
980 spin_lock_irq(¤t
->sighand
->siglock
);
981 sigorsets(¤t
->blocked
, ¤t
->blocked
,
983 if (!(ka
.sa
.sa_flags
& SA_NODEFER
))
984 sigaddset(¤t
->blocked
, signr
);
986 spin_unlock_irq(¤t
->sighand
->siglock
);