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