| // Copyright 2015 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef SANDBOX_LINUX_SYSTEM_HEADERS_LINUX_SIGNAL_H_ |
| #define SANDBOX_LINUX_SYSTEM_HEADERS_LINUX_SIGNAL_H_ |
| |
| #include <stdint.h> |
| |
| #include "build/build_config.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__) |
| #error "Unsupported platform" |
| #endif |
| |
| #include <signal.h> |
| |
| struct LinuxSigInfo { |
| int si_signo; |
| int si_errno; |
| int si_code; |
| |
| // Extra data is followed by the |si_code|. The length depends on the |
| // signal number. |
| char _sifields[1]; |
| }; |
| |
| #include "sandbox/linux/system_headers/linux_ucontext.h" |
| |
| #else // !defined(__native_client_nonsfi__) |
| |
| #include <signal.h> |
| |
| 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; |
| |
| #endif // !defined(__native_client_nonsfi__) |
| |
| // struct sigset_t is different size in PNaCl from the Linux's. |
| #if (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) |
| #if !defined(_NSIG_WORDS) |
| #define _NSIG_WORDS 4 |
| #endif |
| struct LinuxSigSet { |
| unsigned long sig[_NSIG_WORDS]; |
| }; |
| #elif defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_64_BITS) |
| #if !defined(_NSIG_WORDS) |
| #define _NSIG_WORDS 2 |
| #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_ |