X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Fppc64%2Fkernel%2Fsignal32.c;h=106f008afc6fa9dff633cf2b3c434290df9f8dac;hb=9bf4aaab3e101692164d49b7ca357651eb691cb6;hp=c8f6294a2f0007fd78c36d172fa6a1b0ec26f01f;hpb=db216c3d5e4c040e557a50f8f5d35d5c415e8c1c;p=linux-2.6.git diff --git a/arch/ppc64/kernel/signal32.c b/arch/ppc64/kernel/signal32.c index c8f6294a2..106f008af 100644 --- a/arch/ppc64/kernel/signal32.c +++ b/arch/ppc64/kernel/signal32.c @@ -130,11 +130,10 @@ static int save_user_regs(struct pt_regs *regs, struct mcontext32 __user *frame, { elf_greg_t64 *gregs = (elf_greg_t64 *)regs; int i, err = 0; - - /* Make sure floating point registers are stored in regs */ - if (regs->msr & MSR_FP) - giveup_fpu(current); - + + /* Make sure floating point registers are stored in regs */ + flush_fp_to_thread(current); + /* save general and floating-point registers */ for (i = 0; i <= PT_RESULT; i ++) err |= __put_user((unsigned int)gregs[i], &frame->mc_gregs[i]); @@ -148,8 +147,7 @@ static int save_user_regs(struct pt_regs *regs, struct mcontext32 __user *frame, #ifdef CONFIG_ALTIVEC /* save altivec registers */ if (current->thread.used_vr) { - if (regs->msr & MSR_VEC) - giveup_altivec(current); + flush_altivec_to_thread(current); if (__copy_to_user(&frame->mc_vregs, current->thread.vr, ELF_NVRREG32 * sizeof(vector128))) return 1; @@ -300,12 +298,15 @@ long sys32_sigaction(int sig, struct old_sigaction32 __user *act, if (act) { compat_old_sigset_t mask; + compat_uptr_t handler, restorer; - if (get_user((long)new_ka.sa.sa_handler, &act->sa_handler) || - __get_user((long)new_ka.sa.sa_restorer, &act->sa_restorer) || + if (get_user(handler, &act->sa_handler) || + __get_user(restorer, &act->sa_restorer) || __get_user(new_ka.sa.sa_flags, &act->sa_flags) || __get_user(mask, &act->sa_mask)) return -EFAULT; + new_ka.sa.sa_handler = compat_ptr(handler); + new_ka.sa.sa_restorer = compat_ptr(restorer); siginitset(&new_ka.sa.sa_mask, mask); } @@ -356,7 +357,10 @@ long sys32_rt_sigaction(int sig, const struct sigaction32 __user *act, return -EINVAL; if (act) { - ret = get_user((long)new_ka.sa.sa_handler, &act->sa_handler); + compat_uptr_t handler; + + ret = get_user(handler, &act->sa_handler); + new_ka.sa.sa_handler = compat_ptr(handler); ret |= __copy_from_user(&set32, &act->sa_mask, sizeof(compat_sigset_t)); sigset_from_compat(&new_ka.sa.sa_mask, &set32); @@ -598,6 +602,7 @@ int sys32_sigaltstack(u32 __new, u32 __old, int r5, int ret; mm_segment_t old_fs; unsigned long sp; + compat_uptr_t ss_sp; /* * set sp to the user stack on entry to the system call @@ -606,11 +611,13 @@ int sys32_sigaltstack(u32 __new, u32 __old, int r5, sp = regs->gpr[1]; /* Put new stack info in local 64 bit stack struct */ - if (newstack && - (get_user((long)uss.ss_sp, &newstack->ss_sp) || - __get_user(uss.ss_flags, &newstack->ss_flags) || - __get_user(uss.ss_size, &newstack->ss_size))) - return -EFAULT; + if (newstack) { + if (get_user(ss_sp, &newstack->ss_sp) || + __get_user(uss.ss_flags, &newstack->ss_flags) || + __get_user(uss.ss_size, &newstack->ss_size)) + return -EFAULT; + uss.ss_sp = compat_ptr(ss_sp); + } old_fs = get_fs(); set_fs(KERNEL_DS); @@ -934,7 +941,7 @@ int do_signal32(sigset_t *oldset, struct pt_regs *regs) ka = (signr == 0)? NULL: ¤t->sighand->action[signr-1]; - if (regs->trap == 0x0C00 /* System Call! */ + if (TRAP(regs) == 0x0C00 /* System Call! */ && regs->ccr & 0x10000000 /* error signalled */ && ((ret = regs->gpr[3]) == ERESTARTSYS || ret == ERESTARTNOHAND || ret == ERESTARTNOINTR