more gcc 3.5 stuff

Benjamin Herrenschmidt benh at kernel.crashing.org
Tue Apr 13 21:02:35 EST 2004


On Tue, 2004-04-13 at 20:53, Anton Blanchard wrote:
> Hi,
>
> gcc 3.5 doesnt like signal32.c, I made these changes a while ago but
> didnt get past a quick boot test. Ben, do they look OK?

Looks good, but need testing just in case...

Ben.

> Anton
>
> diff -puN arch/ppc64/kernel/signal32.c~gcc-3.5fixes arch/ppc64/kernel/signal32.c
> --- foobar2/arch/ppc64/kernel/signal32.c~gcc-3.5fixes	2004-02-29 15:59:43.880544559 +1100
> +++ foobar2-anton/arch/ppc64/kernel/signal32.c	2004-02-29 16:11:23.472388589 +1100
> @@ -297,12 +297,15 @@ long sys32_sigaction(int sig, struct old
>
>  	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);
>  	}
>
> @@ -353,7 +356,10 @@ long sys32_rt_sigaction(int sig, const s
>  		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);
> @@ -618,6 +624,7 @@ int sys32_sigaltstack(u32 newstack, u32
>  	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
> @@ -626,14 +633,16 @@ int sys32_sigaltstack(u32 newstack, u32
>  	sp = regs->gpr[1];
>
>  	/* Put new stack info in local 64 bit stack struct */
> -	if (newstack &&
> -		(get_user((long)uss.ss_sp,
> -			  &((stack_32_t *)(long)newstack)->ss_sp) ||
> -		 __get_user(uss.ss_flags,
> -			 &((stack_32_t *)(long)newstack)->ss_flags) ||
> -		 __get_user(uss.ss_size,
> -			 &((stack_32_t *)(long)newstack)->ss_size)))
> -		return -EFAULT;
> +	if (newstack) {
> +			if (get_user(ss_sp,
> +			  	&((stack_32_t *)(long)newstack)->ss_sp) ||
> +		 	__get_user(uss.ss_flags,
> +			 	&((stack_32_t *)(long)newstack)->ss_flags) ||
> +		 	__get_user(uss.ss_size,
> +			 	&((stack_32_t *)(long)newstack)->ss_size))
> +				return -EFAULT;
> +		uss.ss_sp = compat_ptr(ss_sp);
> +	}
>
>  	old_fs = get_fs();
>  	set_fs(KERNEL_DS);
>
--
Benjamin Herrenschmidt <benh at kernel.crashing.org>


** Sent via the linuxppc64-dev mail list. See http://lists.linuxppc.org/





More information about the Linuxppc64-dev mailing list