1//===-- scudo_platform.h ----------------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8///
9/// Scudo platform specific definitions.
10/// TODO(kostyak): add tests for the compile time defines.
11///
12//===----------------------------------------------------------------------===//
13
14#ifndef SCUDO_PLATFORM_H_
15#define SCUDO_PLATFORM_H_
16
17#include "sanitizer_common/sanitizer_allocator.h"
18
19#if !SANITIZER_LINUX && !SANITIZER_FUCHSIA
20# error "The Scudo hardened allocator is not supported on this platform."
21#endif
22
23#define SCUDO_TSD_EXCLUSIVE_SUPPORTED (!SANITIZER_ANDROID && !SANITIZER_FUCHSIA)
24
25#ifndef SCUDO_TSD_EXCLUSIVE
26// SCUDO_TSD_EXCLUSIVE wasn't defined, use a default TSD model for the platform.
27# if SANITIZER_ANDROID || SANITIZER_FUCHSIA
28// Android and Fuchsia use a pool of TSDs shared between threads.
29#  define SCUDO_TSD_EXCLUSIVE 0
30# elif SANITIZER_LINUX && !SANITIZER_ANDROID
31// Non-Android Linux use an exclusive TSD per thread.
32#  define SCUDO_TSD_EXCLUSIVE 1
33# else
34#  error "No default TSD model defined for this platform."
35# endif  // SANITIZER_ANDROID || SANITIZER_FUCHSIA
36#endif  // SCUDO_TSD_EXCLUSIVE
37
38// If the exclusive TSD model is chosen, make sure the platform supports it.
39#if SCUDO_TSD_EXCLUSIVE && !SCUDO_TSD_EXCLUSIVE_SUPPORTED
40# error "The exclusive TSD model is not supported on this platform."
41#endif
42
43// Maximum number of TSDs that can be created for the Shared model.
44#ifndef SCUDO_SHARED_TSD_POOL_SIZE
45# if SANITIZER_ANDROID
46#  define SCUDO_SHARED_TSD_POOL_SIZE 2U
47# else
48#  define SCUDO_SHARED_TSD_POOL_SIZE 32U
49# endif  // SANITIZER_ANDROID
50#endif  // SCUDO_SHARED_TSD_POOL_SIZE
51
52// The following allows the public interface functions to be disabled.
53#ifndef SCUDO_CAN_USE_PUBLIC_INTERFACE
54# define SCUDO_CAN_USE_PUBLIC_INTERFACE 1
55#endif
56
57// Hooks in the allocation & deallocation paths can become a security concern if
58// implemented improperly, or if overwritten by an attacker. Use with caution.
59#ifndef SCUDO_CAN_USE_HOOKS
60# if SANITIZER_FUCHSIA
61#  define SCUDO_CAN_USE_HOOKS 1
62# else
63#  define SCUDO_CAN_USE_HOOKS 0
64# endif  // SANITIZER_FUCHSIA
65#endif  // SCUDO_CAN_USE_HOOKS
66
67namespace __scudo {
68
69#if SANITIZER_CAN_USE_ALLOCATOR64
70# if defined(__aarch64__) && SANITIZER_ANDROID
71const uptr AllocatorSize = 0x4000000000ULL;  // 256G.
72# elif defined(__aarch64__)
73const uptr AllocatorSize = 0x10000000000ULL;  // 1T.
74# else
75const uptr AllocatorSize = 0x40000000000ULL;  // 4T.
76# endif
77#else
78const uptr RegionSizeLog = SANITIZER_ANDROID ? 19 : 20;
79#endif  // SANITIZER_CAN_USE_ALLOCATOR64
80
81#if !defined(SCUDO_SIZE_CLASS_MAP)
82# define SCUDO_SIZE_CLASS_MAP Dense
83#endif
84
85#define SIZE_CLASS_MAP_TYPE SIZE_CLASS_MAP_TYPE_(SCUDO_SIZE_CLASS_MAP)
86#define SIZE_CLASS_MAP_TYPE_(T) SIZE_CLASS_MAP_TYPE__(T)
87#define SIZE_CLASS_MAP_TYPE__(T) T##SizeClassMap
88
89typedef SIZE_CLASS_MAP_TYPE SizeClassMap;
90
91}  // namespace __scudo
92
93#endif // SCUDO_PLATFORM_H_
94