1*ec63e07aSXin Li // Copyright 2020 Google LLC
2*ec63e07aSXin Li //
3*ec63e07aSXin Li // Licensed under the Apache License, Version 2.0 (the "License");
4*ec63e07aSXin Li // you may not use this file except in compliance with the License.
5*ec63e07aSXin Li // You may obtain a copy of the License at
6*ec63e07aSXin Li //
7*ec63e07aSXin Li // https://www.apache.org/licenses/LICENSE-2.0
8*ec63e07aSXin Li //
9*ec63e07aSXin Li // Unless required by applicable law or agreed to in writing, software
10*ec63e07aSXin Li // distributed under the License is distributed on an "AS IS" BASIS,
11*ec63e07aSXin Li // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*ec63e07aSXin Li // See the License for the specific language governing permissions and
13*ec63e07aSXin Li // limitations under the License.
14*ec63e07aSXin Li
15*ec63e07aSXin Li #ifndef SANDBOXED_API_CONFIG_H_
16*ec63e07aSXin Li #define SANDBOXED_API_CONFIG_H_
17*ec63e07aSXin Li
18*ec63e07aSXin Li #include <features.h>
19*ec63e07aSXin Li #include <cstdint>
20*ec63e07aSXin Li
21*ec63e07aSXin Li #include "absl/base/config.h" // IWYU pragma: keep
22*ec63e07aSXin Li
23*ec63e07aSXin Li // GCC/Clang define __x86_64__, Visual Studio uses _M_X64
24*ec63e07aSXin Li #if defined(__x86_64__) || defined(_M_X64)
25*ec63e07aSXin Li #define SAPI_X86_64 1
26*ec63e07aSXin Li
27*ec63e07aSXin Li // Check various spellings for 64-bit POWER. Not checking for Visual Studio, as
28*ec63e07aSXin Li // it does not support 64-bit POWER.
29*ec63e07aSXin Li #elif (defined(__PPC64__) || defined(__powerpc64__) || defined(__ppc64__)) && \
30*ec63e07aSXin Li defined(ABSL_IS_LITTLE_ENDIAN)
31*ec63e07aSXin Li #define SAPI_PPC64_LE 1
32*ec63e07aSXin Li
33*ec63e07aSXin Li // Spellings for AArch64
34*ec63e07aSXin Li #elif defined(__aarch64__) || defined(_M_ARM64)
35*ec63e07aSXin Li #define SAPI_ARM64 1
36*ec63e07aSXin Li
37*ec63e07aSXin Li // 32-bit ARM
38*ec63e07aSXin Li #elif defined(__arm__) || defined(_M_ARM)
39*ec63e07aSXin Li #define SAPI_ARM 1
40*ec63e07aSXin Li
41*ec63e07aSXin Li #endif
42*ec63e07aSXin Li
43*ec63e07aSXin Li namespace sapi {
44*ec63e07aSXin Li
45*ec63e07aSXin Li // Returns whether the executable running under code coverage.
46*ec63e07aSXin Li bool IsCoverageRun();
47*ec63e07aSXin Li
48*ec63e07aSXin Li namespace cpu {
49*ec63e07aSXin Li
50*ec63e07aSXin Li // CPU architectures known to Sandbox2
51*ec63e07aSXin Li enum Architecture : uint16_t {
52*ec63e07aSXin Li // Linux: Use a magic value, so it can be easily spotted in the seccomp-bpf
53*ec63e07aSXin Li // bytecode decompilation stream. Must be < (1<<15), as that is the size of
54*ec63e07aSXin Li // data which can be returned by BPF.
55*ec63e07aSXin Li kUnknown = 0xCAF0,
56*ec63e07aSXin Li kX8664,
57*ec63e07aSXin Li kX86,
58*ec63e07aSXin Li kPPC64LE,
59*ec63e07aSXin Li kArm64,
60*ec63e07aSXin Li kArm,
61*ec63e07aSXin Li kMax = kArm
62*ec63e07aSXin Li };
63*ec63e07aSXin Li
64*ec63e07aSXin Li } // namespace cpu
65*ec63e07aSXin Li
66*ec63e07aSXin Li namespace host_cpu {
67*ec63e07aSXin Li
68*ec63e07aSXin Li // Returns the current host CPU architecture if supported. If not supported,
69*ec63e07aSXin Li // returns cpu::kUnknown.
Architecture()70*ec63e07aSXin Li constexpr cpu::Architecture Architecture() {
71*ec63e07aSXin Li #if defined(SAPI_X86_64)
72*ec63e07aSXin Li return cpu::kX8664;
73*ec63e07aSXin Li #elif defined(SAPI_PPC64_LE)
74*ec63e07aSXin Li return cpu::kPPC64LE;
75*ec63e07aSXin Li #elif defined(SAPI_ARM64)
76*ec63e07aSXin Li return cpu::kArm64;
77*ec63e07aSXin Li #elif defined(SAPI_ARM)
78*ec63e07aSXin Li return cpu::kArm;
79*ec63e07aSXin Li #else
80*ec63e07aSXin Li return cpu::kUnknown;
81*ec63e07aSXin Li #endif
82*ec63e07aSXin Li }
83*ec63e07aSXin Li
IsX8664()84*ec63e07aSXin Li constexpr bool IsX8664() { return Architecture() == cpu::kX8664; }
85*ec63e07aSXin Li
IsPPC64LE()86*ec63e07aSXin Li constexpr bool IsPPC64LE() { return Architecture() == cpu::kPPC64LE; }
87*ec63e07aSXin Li
IsArm64()88*ec63e07aSXin Li constexpr bool IsArm64() { return Architecture() == cpu::kArm64; }
89*ec63e07aSXin Li
IsArm()90*ec63e07aSXin Li constexpr bool IsArm() { return Architecture() == cpu::kArm; }
91*ec63e07aSXin Li
Is64Bit()92*ec63e07aSXin Li constexpr bool Is64Bit() { return sizeof(uintptr_t) == 8; }
93*ec63e07aSXin Li
94*ec63e07aSXin Li } // namespace host_cpu
95*ec63e07aSXin Li
96*ec63e07aSXin Li static_assert(host_cpu::Architecture() != cpu::kUnknown,
97*ec63e07aSXin Li "Host CPU architecture is not supported: One of x86-64, POWER64 "
98*ec63e07aSXin Li "(little endian), ARM or AArch64 is required.");
99*ec63e07aSXin Li
100*ec63e07aSXin Li namespace os {
101*ec63e07aSXin Li
102*ec63e07aSXin Li // Operating Systems known to Sandbox2
103*ec63e07aSXin Li enum Platform : uint16_t {
104*ec63e07aSXin Li kUnknown,
105*ec63e07aSXin Li kAndroid,
106*ec63e07aSXin Li kLinux,
107*ec63e07aSXin Li };
108*ec63e07aSXin Li
109*ec63e07aSXin Li } // namespace os
110*ec63e07aSXin Li
111*ec63e07aSXin Li namespace host_os {
112*ec63e07aSXin Li
113*ec63e07aSXin Li // Returns the current host OS platform if supported. If not supported,
114*ec63e07aSXin Li // returns platforms::kUnknown.
Platform()115*ec63e07aSXin Li constexpr os::Platform Platform() {
116*ec63e07aSXin Li #if defined(__ANDROID__)
117*ec63e07aSXin Li return os::kAndroid;
118*ec63e07aSXin Li #elif defined(__linux__)
119*ec63e07aSXin Li return os::kLinux;
120*ec63e07aSXin Li #else
121*ec63e07aSXin Li return os::kUnknown;
122*ec63e07aSXin Li #endif
123*ec63e07aSXin Li }
124*ec63e07aSXin Li
IsAndroid()125*ec63e07aSXin Li constexpr bool IsAndroid() { return Platform() == os::kAndroid; }
126*ec63e07aSXin Li
IsLinux()127*ec63e07aSXin Li constexpr bool IsLinux() { return Platform() == os::kLinux; }
128*ec63e07aSXin Li
129*ec63e07aSXin Li } // namespace host_os
130*ec63e07aSXin Li
131*ec63e07aSXin Li namespace sanitizers {
132*ec63e07aSXin Li
IsMSan()133*ec63e07aSXin Li constexpr bool IsMSan() {
134*ec63e07aSXin Li #ifdef ABSL_HAVE_MEMORY_SANITIZER
135*ec63e07aSXin Li return true;
136*ec63e07aSXin Li #else
137*ec63e07aSXin Li return false;
138*ec63e07aSXin Li #endif
139*ec63e07aSXin Li }
140*ec63e07aSXin Li
IsTSan()141*ec63e07aSXin Li constexpr bool IsTSan() {
142*ec63e07aSXin Li #ifdef ABSL_HAVE_THREAD_SANITIZER
143*ec63e07aSXin Li return true;
144*ec63e07aSXin Li #else
145*ec63e07aSXin Li return false;
146*ec63e07aSXin Li #endif
147*ec63e07aSXin Li }
148*ec63e07aSXin Li
IsASan()149*ec63e07aSXin Li constexpr bool IsASan() {
150*ec63e07aSXin Li #ifdef ABSL_HAVE_ADDRESS_SANITIZER
151*ec63e07aSXin Li return true;
152*ec63e07aSXin Li #else
153*ec63e07aSXin Li return false;
154*ec63e07aSXin Li #endif
155*ec63e07aSXin Li }
156*ec63e07aSXin Li
IsHwASan()157*ec63e07aSXin Li constexpr bool IsHwASan() {
158*ec63e07aSXin Li #ifdef ABSL_HAVE_HWADDRESS_SANITIZER
159*ec63e07aSXin Li return true;
160*ec63e07aSXin Li #else
161*ec63e07aSXin Li return false;
162*ec63e07aSXin Li #endif
163*ec63e07aSXin Li }
164*ec63e07aSXin Li
IsLSan()165*ec63e07aSXin Li constexpr bool IsLSan() {
166*ec63e07aSXin Li #ifdef ABSL_HAVE_LEAK_SANITIZER
167*ec63e07aSXin Li return true;
168*ec63e07aSXin Li #else
169*ec63e07aSXin Li return false;
170*ec63e07aSXin Li #endif
171*ec63e07aSXin Li }
172*ec63e07aSXin Li
173*ec63e07aSXin Li // Returns whether any of the sanitizers is enabled.
IsAny()174*ec63e07aSXin Li constexpr bool IsAny() {
175*ec63e07aSXin Li return IsMSan() || IsTSan() || IsASan() || IsHwASan() || IsLSan();
176*ec63e07aSXin Li }
177*ec63e07aSXin Li
178*ec63e07aSXin Li } // namespace sanitizers
179*ec63e07aSXin Li
180*ec63e07aSXin Li } // namespace sapi
181*ec63e07aSXin Li
182*ec63e07aSXin Li #endif // SANDBOXED_API_CONFIG_H_
183