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