Index: sandbox/linux/system_headers/linux_signal.h |
diff --git a/sandbox/linux/system_headers/linux_signal.h b/sandbox/linux/system_headers/linux_signal.h |
index 5db7fc5ea1dba01b659232c92c03b21a42380d6e..6801b71cee741aeb4b7d098b3c828869bad7f206 100644 |
--- a/sandbox/linux/system_headers/linux_signal.h |
+++ b/sandbox/linux/system_headers/linux_signal.h |
@@ -8,6 +8,58 @@ |
// 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 +68,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 +82,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 +113,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_ |