diff options
Diffstat (limited to 'sandbox/linux/system_headers/linux_signal.h')
-rw-r--r-- | sandbox/linux/system_headers/linux_signal.h | 129 |
1 files changed, 101 insertions, 28 deletions
diff --git a/sandbox/linux/system_headers/linux_signal.h b/sandbox/linux/system_headers/linux_signal.h index 5db7fc5ea1..fb9a47b8d1 100644 --- a/sandbox/linux/system_headers/linux_signal.h +++ b/sandbox/linux/system_headers/linux_signal.h @@ -5,9 +5,63 @@ #ifndef SANDBOX_LINUX_SYSTEM_HEADERS_LINUX_SIGNAL_H_ #define SANDBOX_LINUX_SYSTEM_HEADERS_LINUX_SIGNAL_H_ +#include <stdint.h> + // NOTE: On some toolchains, signal related ABI is incompatible with Linux's // (not undefined, but defined different values and in different memory // layouts). So, fill the gap here. +#if defined(__i386__) || defined(__x86_64__) || defined(__arm__) || \ + defined(__aarch64__) + +#define LINUX_SIGHUP 1 +#define LINUX_SIGINT 2 +#define LINUX_SIGQUIT 3 +#define LINUX_SIGABRT 6 +#define LINUX_SIGBUS 7 +#define LINUX_SIGUSR1 10 +#define LINUX_SIGSEGV 11 +#define LINUX_SIGUSR2 12 +#define LINUX_SIGPIPE 13 +#define LINUX_SIGTERM 15 +#define LINUX_SIGCHLD 17 +#define LINUX_SIGSYS 31 + +#define LINUX_SIG_BLOCK 0 +#define LINUX_SIG_UNBLOCK 1 + +#define LINUX_SA_SIGINFO 4 +#define LINUX_SA_NODEFER 0x40000000 +#define LINUX_SA_RESTART 0x10000000 + +#define LINUX_SIG_DFL 0 + +#elif defined(__mips__) + +#define LINUX_SIGHUP 1 +#define LINUX_SIGINT 2 +#define LINUX_SIGQUIT 3 +#define LINUX_SIGABRT 6 +#define LINUX_SIGBUS 10 +#define LINUX_SIGSEGV 11 +#define LINUX_SIGSYS 12 +#define LINUX_SIGPIPE 13 +#define LINUX_SIGTERM 15 +#define LINUX_SIGUSR1 16 +#define LINUX_SIGUSR2 17 +#define LINUX_SIGCHLD 18 + +#define LINUX_SIG_BLOCK 1 +#define LINUX_SIG_UNBLOCK 2 + +#define LINUX_SA_SIGINFO 0x00000008 +#define LINUX_SA_NODEFER 0x40000000 +#define LINUX_SA_RESTART 0x10000000 + +#define LINUX_SIG_DFL 0 + +#else +#error "Unsupported platform" +#endif #if defined(__native_client_nonsfi__) #if !defined(__i386__) && !defined(__arm__) @@ -16,20 +70,6 @@ #include <signal.h> -#define LINUX_SIGBUS 7 // 10 in PNaCl toolchain. -#define LINUX_SIGSEGV 11 // 11 in PNaCl toolchain. Defined for consistency. -#define LINUX_SIGCHLD 17 // 20 in PNaCl toolchain. -#define LINUX_SIGSYS 31 // 12 in PNaCl toolchain. - -#define LINUX_SIG_BLOCK 0 // 1 in PNaCl toolchain. -#define LINUX_SIG_UNBLOCK 1 // 2 in PNaCl toolchain. - -#define LINUX_SA_SIGINFO 4 // 2 in PNaCl toolchain. -#define LINUX_SA_NODEFER 0x40000000 // Undefined in PNaCl toolchain. -#define LINUX_SA_RESTART 0x10000000 // Undefined in PNaCl toolchain. - -#define LINUX_SIG_DFL 0 // In PNaCl toolchain, unneeded cast is applied. - struct LinuxSigInfo { int si_signo; int si_errno; @@ -44,22 +84,27 @@ struct LinuxSigInfo { #else // !defined(__native_client_nonsfi__) -// Just alias the toolchain's value. #include <signal.h> -#define LINUX_SIGBUS SIGBUS -#define LINUX_SIGSEGV SIGSEGV -#define LINUX_SIGCHLD SIGCHLD -#define LINUX_SIGSYS SIGSYS - -#define LINUX_SIG_BLOCK SIG_BLOCK -#define LINUX_SIG_UNBLOCK SIG_UNBLOCK - -#define LINUX_SA_SIGINFO SA_SIGINFO -#define LINUX_SA_NODEFER SA_NODEFER -#define LINUX_SA_RESTART SA_RESTART - -#define LINUX_SIG_DFL SIG_DFL +static_assert(LINUX_SIGHUP == SIGHUP, "LINUX_SIGHUP == SIGHUP"); +static_assert(LINUX_SIGINT == SIGINT, "LINUX_SIGINT == SIGINT"); +static_assert(LINUX_SIGQUIT == SIGQUIT, "LINUX_SIGQUIT == SIGQUIT"); +static_assert(LINUX_SIGABRT == SIGABRT, "LINUX_SIGABRT == SIGABRT"); +static_assert(LINUX_SIGBUS == SIGBUS, "LINUX_SIGBUS == SIGBUS"); +static_assert(LINUX_SIGUSR1 == SIGUSR1, "LINUX_SIGUSR1 == SIGUSR1"); +static_assert(LINUX_SIGSEGV == SIGSEGV, "LINUX_SIGSEGV == SIGSEGV"); +static_assert(LINUX_SIGUSR2 == SIGUSR2, "LINUX_SIGUSR2 == SIGUSR2"); +static_assert(LINUX_SIGPIPE == SIGPIPE, "LINUX_SIGPIPE == SIGPIPE"); +static_assert(LINUX_SIGTERM == SIGTERM, "LINUX_SIGTERM == SIGTERM"); +static_assert(LINUX_SIGCHLD == SIGCHLD, "LINUX_SIGCHLD == SIGCHLD"); +static_assert(LINUX_SIGSYS == SIGSYS, "LINUX_SIGSYS == SIGSYS"); +static_assert(LINUX_SIG_BLOCK == SIG_BLOCK, "LINUX_SIG_BLOCK == SIG_BLOCK"); +static_assert(LINUX_SIG_UNBLOCK == SIG_UNBLOCK, + "LINUX_SIG_UNBLOCK == SIG_UNBLOCK"); +static_assert(LINUX_SA_SIGINFO == SA_SIGINFO, "LINUX_SA_SIGINFO == SA_SIGINFO"); +static_assert(LINUX_SA_NODEFER == SA_NODEFER, "LINUX_SA_NODEFER == SA_NODEFER"); +static_assert(LINUX_SA_RESTART == SA_RESTART, "LINUX_SA_RESTART == SA_RESTART"); +static_assert(LINUX_SIG_DFL == SIG_DFL, "LINUX_SIG_DFL == SIG_DFL"); typedef siginfo_t LinuxSigInfo; @@ -70,4 +115,32 @@ typedef siginfo_t LinuxSigInfo; #endif // !defined(__native_client_nonsfi__) +// struct sigset_t is different size in PNaCl from the Linux's. +#if defined(__mips__) +#if !defined(_NSIG_WORDS) +#define _NSIG_WORDS 4 +#endif +struct LinuxSigSet { + unsigned long sig[_NSIG_WORDS]; +}; +#else +typedef uint64_t LinuxSigSet; +#endif + +// struct sigaction is different in PNaCl from the Linux's. +#if defined(__mips__) +struct LinuxSigAction { + unsigned int sa_flags; + void (*kernel_handler)(int); + LinuxSigSet sa_mask; +}; +#else +struct LinuxSigAction { + void (*kernel_handler)(int); + uint32_t sa_flags; + void (*sa_restorer)(void); + LinuxSigSet sa_mask; +}; +#endif + #endif // SANDBOX_LINUX_SYSTEM_HEADERS_LINUX_SIGNAL_H_ |