159c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat// Copyright 2015 The Chromium Authors. All rights reserved. 259c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat// Use of this source code is governed by a BSD-style license that can be 359c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat// found in the LICENSE file. 459c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat 559c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat#ifndef SANDBOX_LINUX_SYSTEM_HEADERS_LINUX_SIGNAL_H_ 659c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat#define SANDBOX_LINUX_SYSTEM_HEADERS_LINUX_SIGNAL_H_ 759c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat 8cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#include <stdint.h> 9cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko 1059c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat// NOTE: On some toolchains, signal related ABI is incompatible with Linux's 1159c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat// (not undefined, but defined different values and in different memory 1259c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat// layouts). So, fill the gap here. 13cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#if defined(__i386__) || defined(__x86_64__) || defined(__arm__) || \ 14cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko defined(__aarch64__) 15cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko 16cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#define LINUX_SIGHUP 1 17cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#define LINUX_SIGINT 2 18cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#define LINUX_SIGQUIT 3 19cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#define LINUX_SIGABRT 6 20cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#define LINUX_SIGBUS 7 21cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#define LINUX_SIGUSR1 10 22cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#define LINUX_SIGSEGV 11 23cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#define LINUX_SIGUSR2 12 24cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#define LINUX_SIGPIPE 13 25cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#define LINUX_SIGTERM 15 26cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#define LINUX_SIGCHLD 17 27cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#define LINUX_SIGSYS 31 28cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko 29cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#define LINUX_SIG_BLOCK 0 30cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#define LINUX_SIG_UNBLOCK 1 31cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko 32cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#define LINUX_SA_SIGINFO 4 33cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#define LINUX_SA_NODEFER 0x40000000 34cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#define LINUX_SA_RESTART 0x10000000 35cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko 36cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#define LINUX_SIG_DFL 0 37cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko 38cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#elif defined(__mips__) 39cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko 40cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#define LINUX_SIGHUP 1 41cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#define LINUX_SIGINT 2 42cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#define LINUX_SIGQUIT 3 43cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#define LINUX_SIGABRT 6 44cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#define LINUX_SIGBUS 10 45cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#define LINUX_SIGSEGV 11 46cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#define LINUX_SIGSYS 12 47cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#define LINUX_SIGPIPE 13 48cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#define LINUX_SIGTERM 15 49cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#define LINUX_SIGUSR1 16 50cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#define LINUX_SIGUSR2 17 51cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#define LINUX_SIGCHLD 18 52cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko 53cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#define LINUX_SIG_BLOCK 1 54cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#define LINUX_SIG_UNBLOCK 2 55cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko 56cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#define LINUX_SA_SIGINFO 0x00000008 57cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#define LINUX_SA_NODEFER 0x40000000 58cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#define LINUX_SA_RESTART 0x10000000 59cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko 60cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#define LINUX_SIG_DFL 0 61cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko 62cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#else 63cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#error "Unsupported platform" 64cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#endif 6559c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat 6659c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat#if defined(__native_client_nonsfi__) 6759c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat#if !defined(__i386__) && !defined(__arm__) 6859c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat#error "Unsupported platform" 6959c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat#endif 7059c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat 7159c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat#include <signal.h> 7259c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat 7359c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Eratstruct LinuxSigInfo { 7459c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat int si_signo; 7559c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat int si_errno; 7659c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat int si_code; 7759c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat 7859c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat // Extra data is followed by the |si_code|. The length depends on the 7959c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat // signal number. 8059c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat char _sifields[1]; 8159c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat}; 8259c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat 8359c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat#include "sandbox/linux/system_headers/linux_ucontext.h" 8459c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat 8559c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat#else // !defined(__native_client_nonsfi__) 8659c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat 8759c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat#include <signal.h> 8859c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat 89cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkostatic_assert(LINUX_SIGHUP == SIGHUP, "LINUX_SIGHUP == SIGHUP"); 90cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkostatic_assert(LINUX_SIGINT == SIGINT, "LINUX_SIGINT == SIGINT"); 91cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkostatic_assert(LINUX_SIGQUIT == SIGQUIT, "LINUX_SIGQUIT == SIGQUIT"); 92cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkostatic_assert(LINUX_SIGABRT == SIGABRT, "LINUX_SIGABRT == SIGABRT"); 93cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkostatic_assert(LINUX_SIGBUS == SIGBUS, "LINUX_SIGBUS == SIGBUS"); 94cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkostatic_assert(LINUX_SIGUSR1 == SIGUSR1, "LINUX_SIGUSR1 == SIGUSR1"); 95cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkostatic_assert(LINUX_SIGSEGV == SIGSEGV, "LINUX_SIGSEGV == SIGSEGV"); 96cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkostatic_assert(LINUX_SIGUSR2 == SIGUSR2, "LINUX_SIGUSR2 == SIGUSR2"); 97cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkostatic_assert(LINUX_SIGPIPE == SIGPIPE, "LINUX_SIGPIPE == SIGPIPE"); 98cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkostatic_assert(LINUX_SIGTERM == SIGTERM, "LINUX_SIGTERM == SIGTERM"); 99cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkostatic_assert(LINUX_SIGCHLD == SIGCHLD, "LINUX_SIGCHLD == SIGCHLD"); 100cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkostatic_assert(LINUX_SIGSYS == SIGSYS, "LINUX_SIGSYS == SIGSYS"); 101cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkostatic_assert(LINUX_SIG_BLOCK == SIG_BLOCK, "LINUX_SIG_BLOCK == SIG_BLOCK"); 102cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkostatic_assert(LINUX_SIG_UNBLOCK == SIG_UNBLOCK, 103cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko "LINUX_SIG_UNBLOCK == SIG_UNBLOCK"); 104cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkostatic_assert(LINUX_SA_SIGINFO == SA_SIGINFO, "LINUX_SA_SIGINFO == SA_SIGINFO"); 105cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkostatic_assert(LINUX_SA_NODEFER == SA_NODEFER, "LINUX_SA_NODEFER == SA_NODEFER"); 106cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkostatic_assert(LINUX_SA_RESTART == SA_RESTART, "LINUX_SA_RESTART == SA_RESTART"); 107cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkostatic_assert(LINUX_SIG_DFL == SIG_DFL, "LINUX_SIG_DFL == SIG_DFL"); 10859c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat 10959c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erattypedef siginfo_t LinuxSigInfo; 11059c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat 11159c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat#if defined(__ANDROID__) 11259c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat// Android's signal.h doesn't define ucontext etc. 11359c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat#include "sandbox/linux/system_headers/linux_ucontext.h" 11459c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat#endif // defined(__ANDROID__) 11559c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat 11659c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat#endif // !defined(__native_client_nonsfi__) 11759c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat 118cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko// struct sigset_t is different size in PNaCl from the Linux's. 119cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#if defined(__mips__) 120cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#if !defined(_NSIG_WORDS) 121cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#define _NSIG_WORDS 4 122cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#endif 123cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkostruct LinuxSigSet { 124cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko unsigned long sig[_NSIG_WORDS]; 125cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko}; 126cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#else 127cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkotypedef uint64_t LinuxSigSet; 128cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#endif 129cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko 130cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko// struct sigaction is different in PNaCl from the Linux's. 131cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#if defined(__mips__) 132cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkostruct LinuxSigAction { 133cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko unsigned int sa_flags; 134cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko void (*kernel_handler)(int); 135cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko LinuxSigSet sa_mask; 136cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko}; 137cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#else 138cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkostruct LinuxSigAction { 139cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko void (*kernel_handler)(int); 140cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko uint32_t sa_flags; 141cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko void (*sa_restorer)(void); 142cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko LinuxSigSet sa_mask; 143cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko}; 144cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#endif 145cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko 14659c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat#endif // SANDBOX_LINUX_SYSTEM_HEADERS_LINUX_SIGNAL_H_ 147