This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: sigset_t for new arches


On Mon, 13 Nov 2017 15:18:07 PST (-0800), joseph@codesourcery.com wrote:
> On Mon, 13 Nov 2017, Vineet Gupta wrote:
>
>> Hi,
>>
>> This came to light when initial testing ARC port to glibc.
>>
>> ARC glibc sigaction wrapper was failing as Linux kernel expects sa_mask
>> (sigset_t) to be 2 words (for the asm-generic syscall ABI mandated for newer
>> arches) while glibc defines it to be 32 words.
>
> I think the userspace sigset_t is deliberately much larger, to allow for
> possible increase in the number of signals in future without breaking the
> glibc ABI.

Our port (not upstream yet, but we're in linux-next and I just submitted the
PR) assumes this purposefully larger for extensibility, so we allocate a bunch
of padding before our sigcontext to allow it to extend (we want sigcontext at
the end so it can extend too).  There was some talk of changing the default
behavior for new architectures, but IIRC we never got around to it.

Here's the Linux half, which currently has a few more comments:

arch/riscv/include/uapi/asm/ucontext.h

struct ucontext {
        unsigned long     uc_flags;
        struct ucontext  *uc_link;
        stack_t           uc_stack;
        sigset_t          uc_sigmask;
        /* There's some padding here to allow sigset_t to be expanded in the
         * future.  Though this is unlikely, other architectures put uc_sigmask
         * at the end of this structure and explicitly state it can be
         * expanded, so we didn't want to box ourselves in here. */
        __u8              __unused[1024 / 8 - sizeof(sigset_t)];
        /* We can't put uc_sigmask at the end of this structure because we need
         * to be able to expand sigcontext in the future.  For example, the
         * vector ISA extension will almost certainly add ISA state.  We want
         * to ensure all user-visible ISA state can be saved and restored via a
         * ucontext, so we're putting this at the end in order to allow for
         * infinite extensibility.  Since we know this will be extended and we
         * assume sigset_t won't be extended an extreme amount, we're
         * prioritizing this. */
        struct sigcontext uc_mcontext;
};



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]