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