[patch] SPU errno fix

Jeff Johnston jjohnstn@redhat.com
Fri Jul 18 15:58:00 GMT 2008


Patch checked in.

-- Jeff J.

Jeff Johnston wrote:
> 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