| // Copyright 2020 Google LLC |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // https://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #ifndef SANDBOXED_API_CONFIG_H_ |
| #define SANDBOXED_API_CONFIG_H_ |
| |
| #include <features.h> |
| #include <cstdint> |
| |
| #include "absl/base/config.h" // IWYU pragma: keep |
| |
| // GCC/Clang define __x86_64__, Visual Studio uses _M_X64 |
| #if defined(__x86_64__) || defined(_M_X64) |
| #define SAPI_X86_64 1 |
| |
| // Check various spellings for 64-bit POWER. Not checking for Visual Studio, as |
| // it does not support 64-bit POWER. |
| #elif (defined(__PPC64__) || defined(__powerpc64__) || defined(__ppc64__)) && \ |
| defined(ABSL_IS_LITTLE_ENDIAN) |
| #define SAPI_PPC64_LE 1 |
| |
| // Spellings for AArch64 |
| #elif defined(__aarch64__) || defined(_M_ARM64) |
| #define SAPI_ARM64 1 |
| |
| // 32-bit ARM |
| #elif defined(__arm__) || defined(_M_ARM) |
| #define SAPI_ARM 1 |
| |
| #endif |
| |
| namespace sapi { |
| |
| // Returns whether the executable running under code coverage. |
| bool IsCoverageRun(); |
| |
| namespace cpu { |
| |
| // CPU architectures known to Sandbox2 |
| enum Architecture : uint16_t { |
| // Linux: Use a magic value, so it can be easily spotted in the seccomp-bpf |
| // bytecode decompilation stream. Must be < (1<<15), as that is the size of |
| // data which can be returned by BPF. |
| kUnknown = 0xCAF0, |
| kX8664, |
| kX86, |
| kPPC64LE, |
| kArm64, |
| kArm, |
| kMax = kArm |
| }; |
| |
| } // namespace cpu |
| |
| namespace host_cpu { |
| |
| // Returns the current host CPU architecture if supported. If not supported, |
| // returns cpu::kUnknown. |
| constexpr cpu::Architecture Architecture() { |
| #if defined(SAPI_X86_64) |
| return cpu::kX8664; |
| #elif defined(SAPI_PPC64_LE) |
| return cpu::kPPC64LE; |
| #elif defined(SAPI_ARM64) |
| return cpu::kArm64; |
| #elif defined(SAPI_ARM) |
| return cpu::kArm; |
| #else |
| return cpu::kUnknown; |
| #endif |
| } |
| |
| constexpr bool IsX8664() { return Architecture() == cpu::kX8664; } |
| |
| constexpr bool IsPPC64LE() { return Architecture() == cpu::kPPC64LE; } |
| |
| constexpr bool IsArm64() { return Architecture() == cpu::kArm64; } |
| |
| constexpr bool IsArm() { return Architecture() == cpu::kArm; } |
| |
| constexpr bool Is64Bit() { return sizeof(uintptr_t) == 8; } |
| |
| } // namespace host_cpu |
| |
| static_assert(host_cpu::Architecture() != cpu::kUnknown, |
| "Host CPU architecture is not supported: One of x86-64, POWER64 " |
| "(little endian), ARM or AArch64 is required."); |
| |
| namespace os { |
| |
| // Operating Systems known to Sandbox2 |
| enum Platform : uint16_t { |
| kUnknown, |
| kAndroid, |
| kLinux, |
| }; |
| |
| } // namespace os |
| |
| namespace host_os { |
| |
| // Returns the current host OS platform if supported. If not supported, |
| // returns platforms::kUnknown. |
| constexpr os::Platform Platform() { |
| #if defined(__ANDROID__) |
| return os::kAndroid; |
| #elif defined(__linux__) |
| return os::kLinux; |
| #else |
| return os::kUnknown; |
| #endif |
| } |
| |
| constexpr bool IsAndroid() { return Platform() == os::kAndroid; } |
| |
| constexpr bool IsLinux() { return Platform() == os::kLinux; } |
| |
| } // namespace host_os |
| |
| namespace sanitizers { |
| |
| constexpr bool IsMSan() { |
| #ifdef ABSL_HAVE_MEMORY_SANITIZER |
| return true; |
| #else |
| return false; |
| #endif |
| } |
| |
| constexpr bool IsTSan() { |
| #ifdef ABSL_HAVE_THREAD_SANITIZER |
| return true; |
| #else |
| return false; |
| #endif |
| } |
| |
| constexpr bool IsASan() { |
| #ifdef ABSL_HAVE_ADDRESS_SANITIZER |
| return true; |
| #else |
| return false; |
| #endif |
| } |
| |
| constexpr bool IsHwASan() { |
| #ifdef ABSL_HAVE_HWADDRESS_SANITIZER |
| return true; |
| #else |
| return false; |
| #endif |
| } |
| |
| constexpr bool IsLSan() { |
| #ifdef ABSL_HAVE_LEAK_SANITIZER |
| return true; |
| #else |
| return false; |
| #endif |
| } |
| |
| // Returns whether any of the sanitizers is enabled. |
| constexpr bool IsAny() { |
| return IsMSan() || IsTSan() || IsASan() || IsHwASan() || IsLSan(); |
| } |
| |
| } // namespace sanitizers |
| |
| } // namespace sapi |
| |
| #endif // SANDBOXED_API_CONFIG_H_ |