[patch] SPU errno fix

Jeff Johnston jjohnstn@redhat.com
Thu Jul 17 19:09:00 GMT 2008


Yes, please go ahead.

-- Jeff J.

Ken Werner wrote:
> Hi,
>
> this patch prevents errno from being reset if an assist call is made. Ok to 
> Apply?
>
> Ken
>
> libgloss/ChangeLog:
>
> 2008-07-17  Ken Werner  <ken.werner@de.ibm.com>
>
>         * spu/syscalls.c: Check and set the errno value.
>
> Index: src/libgloss/spu/syscalls.c
> ===================================================================
> --- src.orig/libgloss/spu/syscalls.c
> +++ src/libgloss/spu/syscalls.c
> @@ -29,6 +29,7 @@ POSSIBILITY OF SUCH DAMAGE.
>  
>  Author: Andreas Neukoetter (ti95neuk@de.ibm.com)
>  */
> +#include <spu_intrinsics.h>
>  #include <errno.h>
>  #include "jsre.h"
>  
> @@ -36,6 +37,7 @@ int
>  __send_to_ppe (unsigned int signalcode, unsigned int opcode, void *data)
>  {
>  
> +        int newerrno;
>  	unsigned int	combined = ( ( opcode<<24 )&0xff000000 ) | ( ( unsigned int )data & 0x00ffffff );
>  
>          __vector unsigned int stopfunc = {
> @@ -48,7 +50,13 @@ __send_to_ppe (unsigned int signalcode, 
>          void (*f) (void) = (void *) &stopfunc;
>          asm ("sync");
>          f ();
> -        errno = ((unsigned int *) data)[3];
> +        newerrno = ((unsigned int *) data)[3];
> +        /*
> +         * Note: branchless code to conditionally set errno using
> +         * spu_cmpeq and spu_sel used more space than the following.
> +         */
> +        if (newerrno)
> +                errno = newerrno;
>  
>          /*
>           * Return the rc code stored in slot 0.
>   



More information about the Newlib mailing list