[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