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