summaryrefslogtreecommitdiffstats
path: root/security/sandbox/chromium/sandbox/linux/system_headers/linux_signal.h
blob: f5a73676174038a1d471c0f5603914d7ab2334c9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
// 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_