1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef SANDBOX_LINUX_SYSTEM_HEADERS_LINUX_SIGNAL_H_
6 #define SANDBOX_LINUX_SYSTEM_HEADERS_LINUX_SIGNAL_H_
7 
8 #include <stdint.h>
9 
10 // NOTE: On some toolchains, signal related ABI is incompatible with Linux's
11 // (not undefined, but defined different values and in different memory
12 // layouts). So, fill the gap here.
13 #if defined(__i386__) || defined(__x86_64__) || defined(__arm__) || \
14     defined(__aarch64__)
15 
16 #define LINUX_SIGHUP 1
17 #define LINUX_SIGINT 2
18 #define LINUX_SIGQUIT 3
19 #define LINUX_SIGABRT 6
20 #define LINUX_SIGBUS 7
21 #define LINUX_SIGUSR1 10
22 #define LINUX_SIGSEGV 11
23 #define LINUX_SIGUSR2 12
24 #define LINUX_SIGPIPE 13
25 #define LINUX_SIGTERM 15
26 #define LINUX_SIGCHLD 17
27 #define LINUX_SIGSYS 31
28 
29 #define LINUX_SIG_BLOCK 0
30 #define LINUX_SIG_UNBLOCK 1
31 
32 #define LINUX_SA_SIGINFO 4
33 #define LINUX_SA_NODEFER 0x40000000
34 #define LINUX_SA_RESTART 0x10000000
35 
36 #define LINUX_SIG_DFL 0
37 
38 #elif defined(__mips__)
39 
40 #define LINUX_SIGHUP 1
41 #define LINUX_SIGINT 2
42 #define LINUX_SIGQUIT 3
43 #define LINUX_SIGABRT 6
44 #define LINUX_SIGBUS 10
45 #define LINUX_SIGSEGV 11
46 #define LINUX_SIGSYS 12
47 #define LINUX_SIGPIPE 13
48 #define LINUX_SIGTERM 15
49 #define LINUX_SIGUSR1 16
50 #define LINUX_SIGUSR2 17
51 #define LINUX_SIGCHLD 18
52 
53 #define LINUX_SIG_BLOCK 1
54 #define LINUX_SIG_UNBLOCK 2
55 
56 #define LINUX_SA_SIGINFO 0x00000008
57 #define LINUX_SA_NODEFER 0x40000000
58 #define LINUX_SA_RESTART 0x10000000
59 
60 #define LINUX_SIG_DFL 0
61 
62 #else
63 #error "Unsupported platform"
64 #endif
65 
66 #if defined(__native_client_nonsfi__)
67 #if !defined(__i386__) && !defined(__arm__)
68 #error "Unsupported platform"
69 #endif
70 
71 #include <signal.h>
72 
73 struct LinuxSigInfo {
74   int si_signo;
75   int si_errno;
76   int si_code;
77 
78   // Extra data is followed by the |si_code|. The length depends on the
79   // signal number.
80   char _sifields[1];
81 };
82 
83 #include "sandbox/linux/system_headers/linux_ucontext.h"
84 
85 #else  // !defined(__native_client_nonsfi__)
86 
87 #include <signal.h>
88 
89 static_assert(LINUX_SIGHUP == SIGHUP, "LINUX_SIGHUP == SIGHUP");
90 static_assert(LINUX_SIGINT == SIGINT, "LINUX_SIGINT == SIGINT");
91 static_assert(LINUX_SIGQUIT == SIGQUIT, "LINUX_SIGQUIT == SIGQUIT");
92 static_assert(LINUX_SIGABRT == SIGABRT, "LINUX_SIGABRT == SIGABRT");
93 static_assert(LINUX_SIGBUS == SIGBUS, "LINUX_SIGBUS == SIGBUS");
94 static_assert(LINUX_SIGUSR1 == SIGUSR1, "LINUX_SIGUSR1 == SIGUSR1");
95 static_assert(LINUX_SIGSEGV == SIGSEGV, "LINUX_SIGSEGV == SIGSEGV");
96 static_assert(LINUX_SIGUSR2 == SIGUSR2, "LINUX_SIGUSR2 == SIGUSR2");
97 static_assert(LINUX_SIGPIPE == SIGPIPE, "LINUX_SIGPIPE == SIGPIPE");
98 static_assert(LINUX_SIGTERM == SIGTERM, "LINUX_SIGTERM == SIGTERM");
99 static_assert(LINUX_SIGCHLD == SIGCHLD, "LINUX_SIGCHLD == SIGCHLD");
100 static_assert(LINUX_SIGSYS == SIGSYS, "LINUX_SIGSYS == SIGSYS");
101 static_assert(LINUX_SIG_BLOCK == SIG_BLOCK, "LINUX_SIG_BLOCK == SIG_BLOCK");
102 static_assert(LINUX_SIG_UNBLOCK == SIG_UNBLOCK,
103               "LINUX_SIG_UNBLOCK == SIG_UNBLOCK");
104 static_assert(LINUX_SA_SIGINFO == SA_SIGINFO, "LINUX_SA_SIGINFO == SA_SIGINFO");
105 static_assert(LINUX_SA_NODEFER == SA_NODEFER, "LINUX_SA_NODEFER == SA_NODEFER");
106 static_assert(LINUX_SA_RESTART == SA_RESTART, "LINUX_SA_RESTART == SA_RESTART");
107 static_assert(LINUX_SIG_DFL == SIG_DFL, "LINUX_SIG_DFL == SIG_DFL");
108 
109 typedef siginfo_t LinuxSigInfo;
110 
111 #if defined(__ANDROID__)
112 // Android's signal.h doesn't define ucontext etc.
113 #include "sandbox/linux/system_headers/linux_ucontext.h"
114 #endif  // defined(__ANDROID__)
115 
116 #endif  // !defined(__native_client_nonsfi__)
117 
118 // struct sigset_t is different size in PNaCl from the Linux's.
119 #if defined(__mips__)
120 #if !defined(_NSIG_WORDS)
121 #define _NSIG_WORDS 4
122 #endif
123 struct LinuxSigSet {
124   unsigned long sig[_NSIG_WORDS];
125 };
126 #else
127 typedef uint64_t LinuxSigSet;
128 #endif
129 
130 // struct sigaction is different in PNaCl from the Linux's.
131 #if defined(__mips__)
132 struct LinuxSigAction {
133   unsigned int sa_flags;
134   void (*kernel_handler)(int);
135   LinuxSigSet sa_mask;
136 };
137 #else
138 struct LinuxSigAction {
139   void (*kernel_handler)(int);
140   uint32_t sa_flags;
141   void (*sa_restorer)(void);
142   LinuxSigSet sa_mask;
143 };
144 #endif
145 
146 #endif  // SANDBOX_LINUX_SYSTEM_HEADERS_LINUX_SIGNAL_H_
147