| //===-- scudo_platform.h ----------------------------------------*- C++ -*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| /// |
| /// Scudo platform specific definitions. |
| /// TODO(kostyak): add tests for the compile time defines. |
| /// |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef SCUDO_PLATFORM_H_ |
| #define SCUDO_PLATFORM_H_ |
| |
| #include "sanitizer_common/sanitizer_allocator.h" |
| |
| #if !SANITIZER_LINUX && !SANITIZER_FUCHSIA |
| # error "The Scudo hardened allocator is not supported on this platform." |
| #endif |
| |
| #define SCUDO_TSD_EXCLUSIVE_SUPPORTED (!SANITIZER_ANDROID && !SANITIZER_FUCHSIA) |
| |
| #ifndef SCUDO_TSD_EXCLUSIVE |
| // SCUDO_TSD_EXCLUSIVE wasn't defined, use a default TSD model for the platform. |
| # if SANITIZER_ANDROID || SANITIZER_FUCHSIA |
| // Android and Fuchsia use a pool of TSDs shared between threads. |
| # define SCUDO_TSD_EXCLUSIVE 0 |
| # elif SANITIZER_LINUX && !SANITIZER_ANDROID |
| // Non-Android Linux use an exclusive TSD per thread. |
| # define SCUDO_TSD_EXCLUSIVE 1 |
| # else |
| # error "No default TSD model defined for this platform." |
| # endif // SANITIZER_ANDROID || SANITIZER_FUCHSIA |
| #endif // SCUDO_TSD_EXCLUSIVE |
| |
| // If the exclusive TSD model is chosen, make sure the platform supports it. |
| #if SCUDO_TSD_EXCLUSIVE && !SCUDO_TSD_EXCLUSIVE_SUPPORTED |
| # error "The exclusive TSD model is not supported on this platform." |
| #endif |
| |
| // Maximum number of TSDs that can be created for the Shared model. |
| #ifndef SCUDO_SHARED_TSD_POOL_SIZE |
| # if SANITIZER_ANDROID |
| # define SCUDO_SHARED_TSD_POOL_SIZE 2U |
| # else |
| # define SCUDO_SHARED_TSD_POOL_SIZE 32U |
| # endif // SANITIZER_ANDROID |
| #endif // SCUDO_SHARED_TSD_POOL_SIZE |
| |
| // The following allows the public interface functions to be disabled. |
| #ifndef SCUDO_CAN_USE_PUBLIC_INTERFACE |
| # define SCUDO_CAN_USE_PUBLIC_INTERFACE 1 |
| #endif |
| |
| // Hooks in the allocation & deallocation paths can become a security concern if |
| // implemented improperly, or if overwritten by an attacker. Use with caution. |
| #ifndef SCUDO_CAN_USE_HOOKS |
| # if SANITIZER_FUCHSIA |
| # define SCUDO_CAN_USE_HOOKS 1 |
| # else |
| # define SCUDO_CAN_USE_HOOKS 0 |
| # endif // SANITIZER_FUCHSIA |
| #endif // SCUDO_CAN_USE_HOOKS |
| |
| namespace __scudo { |
| |
| #if SANITIZER_CAN_USE_ALLOCATOR64 |
| # if defined(__aarch64__) && SANITIZER_ANDROID |
| const uptr AllocatorSize = 0x4000000000ULL; // 256G. |
| # elif defined(__aarch64__) |
| const uptr AllocatorSize = 0x10000000000ULL; // 1T. |
| # else |
| const uptr AllocatorSize = 0x40000000000ULL; // 4T. |
| # endif |
| #else |
| const uptr RegionSizeLog = SANITIZER_ANDROID ? 19 : 20; |
| #endif // SANITIZER_CAN_USE_ALLOCATOR64 |
| |
| #if !defined(SCUDO_SIZE_CLASS_MAP) |
| # define SCUDO_SIZE_CLASS_MAP Dense |
| #endif |
| |
| #define SIZE_CLASS_MAP_TYPE SIZE_CLASS_MAP_TYPE_(SCUDO_SIZE_CLASS_MAP) |
| #define SIZE_CLASS_MAP_TYPE_(T) SIZE_CLASS_MAP_TYPE__(T) |
| #define SIZE_CLASS_MAP_TYPE__(T) T##SizeClassMap |
| |
| typedef SIZE_CLASS_MAP_TYPE SizeClassMap; |
| |
| } // namespace __scudo |
| |
| #endif // SCUDO_PLATFORM_H_ |