non-portable sigjmp_buf

Jeff Johnston jjohnstn@redhat.com
Thu May 28 08:39:00 GMT 2009


Patch checked in.  Sorry for the delay.  For platforms that need a 
different implementation, they can always override in their libc/machine 
directory.

-- Jeff J.

Neal H. Walfield wrote:
> Ping?
>
> At Sat, 02 May 2009 19:34:26 +0200,
> Neal H. Walfield wrote:
>   
>> Hi,
>>
>> I'm using the sigjmp_buf definition in libc/include/machine/setjmp.h
>> for my operating system, which runs on the amd64 architecture:
>>
>>   typedef int sigjmp_buf[_JBLEN+2];
>>
>> There are two issues with this definition that prevent it from
>> generalizing.  First, it assumes that _JBLEN is in integer-sized
>> units.  This is not always the case: if _JBTYPE is defined, then that
>> is the type that should be used (cf. jmp_buf's definition).  Second,
>> it assumes that the size of sigset_t is an integer.  This is not
>> necessarily the case.  On my system, for instance, sigset_t is a
>> 64-bit quantity.  The attach patch corrects both of these problems.
>> (The definition is modelled after jmp_buf's definition.)
>>
>> There remains a small issue with this approach, which is that on
>> 32-bit architectures with 64-bit sigset_t's, sigsetjmp and siglongjmp
>> may do an unaligned write or read, respectively, when saving the
>> signal mask.  This could be fixed for platforms that decide to use
>> these definitions in the future by changing the definition and the
>> sigsetjmp and siglongjmp implementation, however, this is rather
>> messy.  An alternative is to change the definition of sigjmp_buf to be
>> a structure:
>>
>>   struct _sigjmp_buf
>>   {
>>     _JBTYPE buf[_JBLEN];
>>     int saved_mask;
>>     sigset_t mask;
>>   };
>>   typedef struct _sigjmp_buf sigjmp_buf[1];
>>
>> This is backwards compatible with the current ABI as all users
>> currently assume that the size of registers and sigset_t are equal to
>> sizeof (int).
>>
>> Neal
>>
>> 2009-05-02  Neal H. Walfield  <neal@gnu.org>
>>
>> 	* libc/include/machine/setjmp.h (sigjmp_buf): Size according to
>> 	_JBTYPE and the size of sigset_t.
>>
>> --- newlib/newlib/libc/include/machine/setjmp.h	2008-02-29 23:46:46.000000000 +0100
>> +++ newlib/newlib/libc/include/machine/setjmp.h~	2008-02-29 23:41:19.000000000 +0100
>> @@ -259,7 +259,11 @@
>>  #endif
>>  
>>  /* POSIX sigsetjmp/siglongjmp macros */
>> -typedef int sigjmp_buf[_JBLEN+2];
>> +#ifdef _JBTYPE
>> +typedef _JBTYPE sigjmp_buf[_JBLEN+1+(sizeof (sigset_t)/sizeof (_JBTYPE))];
>> +#else
>> +typedef int sigjmp_buf[_JBLEN+1+(sizeof (sigset_t)/sizeof (int))];
>> +#endif
>>  
>>  #define _SAVEMASK	_JBLEN
>>  #define _SIGMASK	(_JBLEN+1)
>>
>>     



More information about the Newlib mailing list