mirror of
git://git.musl-libc.org/musl
synced 2024-12-27 01:02:12 +00:00
7c440977db
a mips signal mask contains 128 bits, enough for signals 1 through 128. however, the exit status obtained from the wait-family functions only has room for values up to 127. reportedly signal 128 was causing kernelspace bugs, so it was removed from the kernel recently; even without that issue, however, it was impossible to support it correctly in userspace. at the same time, the bug was masked on musl by SIGRTMAX incorrectly yielding 64 on mips, rather than the "correct" value of 128. now that the _NSIG issue is fixed, SIGRTMAX can be fixed at the same time, exposing the full range of signals for application use. note that the (nonstandardized) libc _NSIG value is actually one greater than the max signal number, and also one greater than the kernel headers' idea of _NSIG. this is the reason for the discrepency with the recent kernel changes. since reducing _NSIG by one brought it down from 129 to 128, rather than from 128 to 127, _NSIG/8, used widely in the musl sources, is unchanged.
104 lines
2.3 KiB
C
104 lines
2.3 KiB
C
#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
|
|
|| defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
|
|
|
|
#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
|
|
typedef unsigned long long greg_t, gregset_t[32];
|
|
typedef struct {
|
|
union {
|
|
double fp_dregs[32];
|
|
struct {
|
|
float _fp_fregs;
|
|
unsigned _fp_pad;
|
|
} fp_fregs[32];
|
|
} fp_r;
|
|
} fpregset_t;
|
|
struct sigcontext
|
|
{
|
|
unsigned sc_regmask, sc_status;
|
|
unsigned long long sc_pc, sc_regs[32], sc_fpregs[32];
|
|
unsigned sc_ownedfp, sc_fpc_csr, sc_fpc_eir, sc_used_math, sc_dsp;
|
|
unsigned long long sc_mdhi, sc_mdlo;
|
|
unsigned long sc_hi1, sc_lo1, sc_hi2, sc_lo2, sc_hi3, sc_lo3;
|
|
};
|
|
typedef struct
|
|
{
|
|
unsigned regmask, status;
|
|
unsigned long long pc, regs[32], fpregs[32];
|
|
unsigned ownedfp, fpc_csr, fpc_eir, used_math, dsp;
|
|
unsigned long long mdhi, mdlo;
|
|
unsigned long hi1, lo1, hi2, lo2, hi3, lo3;
|
|
} mcontext_t;
|
|
#else
|
|
typedef struct {
|
|
unsigned __mc1[2];
|
|
unsigned long long __mc2[65];
|
|
unsigned __mc3[5];
|
|
unsigned long long __mc4[2];
|
|
unsigned __mc5[6];
|
|
} mcontext_t;
|
|
#endif
|
|
|
|
typedef struct __ucontext {
|
|
unsigned long uc_flags;
|
|
struct __ucontext *uc_link;
|
|
stack_t uc_stack;
|
|
mcontext_t uc_mcontext;
|
|
sigset_t uc_sigmask;
|
|
unsigned long uc_regspace[128];
|
|
} ucontext_t;
|
|
|
|
#define SA_NOCLDSTOP 1
|
|
#define SA_NOCLDWAIT 0x10000
|
|
#define SA_SIGINFO 8
|
|
#define SA_ONSTACK 0x08000000
|
|
#define SA_RESTART 0x10000000
|
|
#define SA_NODEFER 0x40000000
|
|
#define SA_RESETHAND 0x80000000
|
|
#define SA_RESTORER 0x04000000
|
|
|
|
#undef SIG_BLOCK
|
|
#undef SIG_UNBLOCK
|
|
#undef SIG_SETMASK
|
|
#define SIG_BLOCK 1
|
|
#define SIG_UNBLOCK 2
|
|
#define SIG_SETMASK 3
|
|
|
|
#endif
|
|
|
|
#define SIGHUP 1
|
|
#define SIGINT 2
|
|
#define SIGQUIT 3
|
|
#define SIGILL 4
|
|
#define SIGTRAP 5
|
|
#define SIGABRT 6
|
|
#define SIGIOT SIGABRT
|
|
#define SIGSTKFLT 7
|
|
#define SIGFPE 8
|
|
#define SIGKILL 9
|
|
#define SIGBUS 10
|
|
#define SIGSEGV 11
|
|
#define SIGSYS 12
|
|
#define SIGPIPE 13
|
|
#define SIGALRM 14
|
|
#define SIGTERM 15
|
|
#define SIGUSR1 16
|
|
#define SIGUSR2 17
|
|
#define SIGCHLD 18
|
|
#define SIGPWR 19
|
|
#define SIGWINCH 20
|
|
#define SIGURG 21
|
|
#define SIGIO 22
|
|
#define SIGPOLL SIGIO
|
|
#define SIGSTOP 23
|
|
#define SIGTSTP 24
|
|
#define SIGCONT 25
|
|
#define SIGTTIN 26
|
|
#define SIGTTOU 27
|
|
#define SIGVTALRM 28
|
|
#define SIGPROF 29
|
|
#define SIGXCPU 30
|
|
#define SIGXFSZ 31
|
|
#define SIGUNUSED SIGSYS
|
|
|
|
#define _NSIG 128
|