1326943Sdim//===-- scudo_platform.h ----------------------------------------*- C++ -*-===//
2326943Sdim//
3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim// See https://llvm.org/LICENSE.txt for license information.
5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6326943Sdim//
7326943Sdim//===----------------------------------------------------------------------===//
8326943Sdim///
9326943Sdim/// Scudo platform specific definitions.
10326943Sdim/// TODO(kostyak): add tests for the compile time defines.
11326943Sdim///
12326943Sdim//===----------------------------------------------------------------------===//
13326943Sdim
14326943Sdim#ifndef SCUDO_PLATFORM_H_
15326943Sdim#define SCUDO_PLATFORM_H_
16326943Sdim
17326943Sdim#include "sanitizer_common/sanitizer_allocator.h"
18326943Sdim
19326943Sdim#if !SANITIZER_LINUX && !SANITIZER_FUCHSIA
20326943Sdim# error "The Scudo hardened allocator is not supported on this platform."
21326943Sdim#endif
22326943Sdim
23326943Sdim#define SCUDO_TSD_EXCLUSIVE_SUPPORTED (!SANITIZER_ANDROID && !SANITIZER_FUCHSIA)
24326943Sdim
25326943Sdim#ifndef SCUDO_TSD_EXCLUSIVE
26326943Sdim// SCUDO_TSD_EXCLUSIVE wasn't defined, use a default TSD model for the platform.
27326943Sdim# if SANITIZER_ANDROID || SANITIZER_FUCHSIA
28326943Sdim// Android and Fuchsia use a pool of TSDs shared between threads.
29326943Sdim#  define SCUDO_TSD_EXCLUSIVE 0
30326943Sdim# elif SANITIZER_LINUX && !SANITIZER_ANDROID
31326943Sdim// Non-Android Linux use an exclusive TSD per thread.
32326943Sdim#  define SCUDO_TSD_EXCLUSIVE 1
33326943Sdim# else
34326943Sdim#  error "No default TSD model defined for this platform."
35326943Sdim# endif  // SANITIZER_ANDROID || SANITIZER_FUCHSIA
36326943Sdim#endif  // SCUDO_TSD_EXCLUSIVE
37326943Sdim
38326943Sdim// If the exclusive TSD model is chosen, make sure the platform supports it.
39326943Sdim#if SCUDO_TSD_EXCLUSIVE && !SCUDO_TSD_EXCLUSIVE_SUPPORTED
40326943Sdim# error "The exclusive TSD model is not supported on this platform."
41326943Sdim#endif
42326943Sdim
43326943Sdim// Maximum number of TSDs that can be created for the Shared model.
44326943Sdim#ifndef SCUDO_SHARED_TSD_POOL_SIZE
45341825Sdim# if SANITIZER_ANDROID
46341825Sdim#  define SCUDO_SHARED_TSD_POOL_SIZE 2U
47341825Sdim# else
48341825Sdim#  define SCUDO_SHARED_TSD_POOL_SIZE 32U
49341825Sdim# endif  // SANITIZER_ANDROID
50326943Sdim#endif  // SCUDO_SHARED_TSD_POOL_SIZE
51326943Sdim
52326943Sdim// The following allows the public interface functions to be disabled.
53326943Sdim#ifndef SCUDO_CAN_USE_PUBLIC_INTERFACE
54326943Sdim# define SCUDO_CAN_USE_PUBLIC_INTERFACE 1
55326943Sdim#endif
56326943Sdim
57341825Sdim// Hooks in the allocation & deallocation paths can become a security concern if
58341825Sdim// implemented improperly, or if overwritten by an attacker. Use with caution.
59341825Sdim#ifndef SCUDO_CAN_USE_HOOKS
60341825Sdim# if SANITIZER_FUCHSIA
61341825Sdim#  define SCUDO_CAN_USE_HOOKS 1
62341825Sdim# else
63341825Sdim#  define SCUDO_CAN_USE_HOOKS 0
64341825Sdim# endif  // SANITIZER_FUCHSIA
65341825Sdim#endif  // SCUDO_CAN_USE_HOOKS
66341825Sdim
67326943Sdimnamespace __scudo {
68326943Sdim
69326943Sdim#if SANITIZER_CAN_USE_ALLOCATOR64
70326943Sdim# if defined(__aarch64__) && SANITIZER_ANDROID
71326943Sdimconst uptr AllocatorSize = 0x4000000000ULL;  // 256G.
72326943Sdim# elif defined(__aarch64__)
73326943Sdimconst uptr AllocatorSize = 0x10000000000ULL;  // 1T.
74326943Sdim# else
75326943Sdimconst uptr AllocatorSize = 0x40000000000ULL;  // 4T.
76326943Sdim# endif
77326943Sdim#else
78326943Sdimconst uptr RegionSizeLog = SANITIZER_ANDROID ? 19 : 20;
79326943Sdim#endif  // SANITIZER_CAN_USE_ALLOCATOR64
80326943Sdim
81326943Sdim#if !defined(SCUDO_SIZE_CLASS_MAP)
82353358Sdim# define SCUDO_SIZE_CLASS_MAP Dense
83326943Sdim#endif
84326943Sdim
85326943Sdim#define SIZE_CLASS_MAP_TYPE SIZE_CLASS_MAP_TYPE_(SCUDO_SIZE_CLASS_MAP)
86326943Sdim#define SIZE_CLASS_MAP_TYPE_(T) SIZE_CLASS_MAP_TYPE__(T)
87326943Sdim#define SIZE_CLASS_MAP_TYPE__(T) T##SizeClassMap
88326943Sdim
89326943Sdimtypedef SIZE_CLASS_MAP_TYPE SizeClassMap;
90326943Sdim
91326943Sdim}  // namespace __scudo
92326943Sdim
93326943Sdim#endif // SCUDO_PLATFORM_H_
94