1*76559068SAndroid Build Coastguard Worker //===-- allocator_config.h --------------------------------------*- C++ -*-===// 2*76559068SAndroid Build Coastguard Worker // 3*76559068SAndroid Build Coastguard Worker // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*76559068SAndroid Build Coastguard Worker // See https://llvm.org/LICENSE.txt for license information. 5*76559068SAndroid Build Coastguard Worker // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*76559068SAndroid Build Coastguard Worker // 7*76559068SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 8*76559068SAndroid Build Coastguard Worker 9*76559068SAndroid Build Coastguard Worker #ifndef SCUDO_ALLOCATOR_CONFIG_H_ 10*76559068SAndroid Build Coastguard Worker #define SCUDO_ALLOCATOR_CONFIG_H_ 11*76559068SAndroid Build Coastguard Worker 12*76559068SAndroid Build Coastguard Worker #include "combined.h" 13*76559068SAndroid Build Coastguard Worker #include "common.h" 14*76559068SAndroid Build Coastguard Worker #include "condition_variable.h" 15*76559068SAndroid Build Coastguard Worker #include "flags.h" 16*76559068SAndroid Build Coastguard Worker #include "primary32.h" 17*76559068SAndroid Build Coastguard Worker #include "primary64.h" 18*76559068SAndroid Build Coastguard Worker #include "secondary.h" 19*76559068SAndroid Build Coastguard Worker #include "size_class_map.h" 20*76559068SAndroid Build Coastguard Worker #include "tsd_exclusive.h" 21*76559068SAndroid Build Coastguard Worker #include "tsd_shared.h" 22*76559068SAndroid Build Coastguard Worker 23*76559068SAndroid Build Coastguard Worker // To import a custom configuration, define `SCUDO_USE_CUSTOM_CONFIG` and 24*76559068SAndroid Build Coastguard Worker // aliasing the `Config` like: 25*76559068SAndroid Build Coastguard Worker // 26*76559068SAndroid Build Coastguard Worker // namespace scudo { 27*76559068SAndroid Build Coastguard Worker // // The instance of Scudo will be initiated with `Config`. 28*76559068SAndroid Build Coastguard Worker // typedef CustomConfig Config; 29*76559068SAndroid Build Coastguard Worker // // Aliasing as default configuration to run the tests with this config. 30*76559068SAndroid Build Coastguard Worker // typedef CustomConfig DefaultConfig; 31*76559068SAndroid Build Coastguard Worker // } // namespace scudo 32*76559068SAndroid Build Coastguard Worker // 33*76559068SAndroid Build Coastguard Worker // Put them in the header `custom_scudo_config.h` then you will be using the 34*76559068SAndroid Build Coastguard Worker // custom configuration and able to run all the tests as well. 35*76559068SAndroid Build Coastguard Worker #ifdef SCUDO_USE_CUSTOM_CONFIG 36*76559068SAndroid Build Coastguard Worker #include "custom_scudo_config.h" 37*76559068SAndroid Build Coastguard Worker #endif 38*76559068SAndroid Build Coastguard Worker 39*76559068SAndroid Build Coastguard Worker namespace scudo { 40*76559068SAndroid Build Coastguard Worker 41*76559068SAndroid Build Coastguard Worker // Scudo uses a structure as a template argument that specifies the 42*76559068SAndroid Build Coastguard Worker // configuration options for the various subcomponents of the allocator. See the 43*76559068SAndroid Build Coastguard Worker // following configs as examples and check `allocator_config.def` for all the 44*76559068SAndroid Build Coastguard Worker // available options. 45*76559068SAndroid Build Coastguard Worker 46*76559068SAndroid Build Coastguard Worker #ifndef SCUDO_USE_CUSTOM_CONFIG 47*76559068SAndroid Build Coastguard Worker 48*76559068SAndroid Build Coastguard Worker // Default configurations for various platforms. Note this is only enabled when 49*76559068SAndroid Build Coastguard Worker // there's no custom configuration in the build system. 50*76559068SAndroid Build Coastguard Worker struct DefaultConfig { 51*76559068SAndroid Build Coastguard Worker static const bool MaySupportMemoryTagging = true; 52*76559068SAndroid Build Coastguard Worker template <class A> using TSDRegistryT = TSDRegistryExT<A>; // Exclusive 53*76559068SAndroid Build Coastguard Worker 54*76559068SAndroid Build Coastguard Worker struct Primary { 55*76559068SAndroid Build Coastguard Worker using SizeClassMap = DefaultSizeClassMap; 56*76559068SAndroid Build Coastguard Worker #if SCUDO_CAN_USE_PRIMARY64 57*76559068SAndroid Build Coastguard Worker static const uptr RegionSizeLog = 32U; 58*76559068SAndroid Build Coastguard Worker static const uptr GroupSizeLog = 21U; 59*76559068SAndroid Build Coastguard Worker typedef uptr CompactPtrT; 60*76559068SAndroid Build Coastguard Worker static const uptr CompactPtrScale = 0; 61*76559068SAndroid Build Coastguard Worker static const bool EnableRandomOffset = true; 62*76559068SAndroid Build Coastguard Worker static const uptr MapSizeIncrement = 1UL << 18; 63*76559068SAndroid Build Coastguard Worker #else 64*76559068SAndroid Build Coastguard Worker static const uptr RegionSizeLog = 19U; 65*76559068SAndroid Build Coastguard Worker static const uptr GroupSizeLog = 19U; 66*76559068SAndroid Build Coastguard Worker typedef uptr CompactPtrT; 67*76559068SAndroid Build Coastguard Worker #endif 68*76559068SAndroid Build Coastguard Worker static const s32 MinReleaseToOsIntervalMs = INT32_MIN; 69*76559068SAndroid Build Coastguard Worker static const s32 MaxReleaseToOsIntervalMs = INT32_MAX; 70*76559068SAndroid Build Coastguard Worker }; 71*76559068SAndroid Build Coastguard Worker #if SCUDO_CAN_USE_PRIMARY64 72*76559068SAndroid Build Coastguard Worker template <typename Config> using PrimaryT = SizeClassAllocator64<Config>; 73*76559068SAndroid Build Coastguard Worker #else 74*76559068SAndroid Build Coastguard Worker template <typename Config> using PrimaryT = SizeClassAllocator32<Config>; 75*76559068SAndroid Build Coastguard Worker #endif 76*76559068SAndroid Build Coastguard Worker 77*76559068SAndroid Build Coastguard Worker struct Secondary { 78*76559068SAndroid Build Coastguard Worker struct Cache { 79*76559068SAndroid Build Coastguard Worker static const u32 EntriesArraySize = 32U; 80*76559068SAndroid Build Coastguard Worker static const u32 QuarantineSize = 0U; 81*76559068SAndroid Build Coastguard Worker static const u32 DefaultMaxEntriesCount = 32U; 82*76559068SAndroid Build Coastguard Worker static const uptr DefaultMaxEntrySize = 1UL << 19; 83*76559068SAndroid Build Coastguard Worker static const s32 MinReleaseToOsIntervalMs = INT32_MIN; 84*76559068SAndroid Build Coastguard Worker static const s32 MaxReleaseToOsIntervalMs = INT32_MAX; 85*76559068SAndroid Build Coastguard Worker }; 86*76559068SAndroid Build Coastguard Worker template <typename Config> using CacheT = MapAllocatorCache<Config>; 87*76559068SAndroid Build Coastguard Worker }; 88*76559068SAndroid Build Coastguard Worker 89*76559068SAndroid Build Coastguard Worker template <typename Config> using SecondaryT = MapAllocator<Config>; 90*76559068SAndroid Build Coastguard Worker }; 91*76559068SAndroid Build Coastguard Worker 92*76559068SAndroid Build Coastguard Worker #endif // SCUDO_USE_CUSTOM_CONFIG 93*76559068SAndroid Build Coastguard Worker 94*76559068SAndroid Build Coastguard Worker struct AndroidConfig { 95*76559068SAndroid Build Coastguard Worker static const bool MaySupportMemoryTagging = true; 96*76559068SAndroid Build Coastguard Worker template <class A> 97*76559068SAndroid Build Coastguard Worker using TSDRegistryT = TSDRegistrySharedT<A, 8U, 2U>; // Shared, max 8 TSDs. 98*76559068SAndroid Build Coastguard Worker 99*76559068SAndroid Build Coastguard Worker struct Primary { 100*76559068SAndroid Build Coastguard Worker using SizeClassMap = AndroidSizeClassMap; 101*76559068SAndroid Build Coastguard Worker #if SCUDO_CAN_USE_PRIMARY64 102*76559068SAndroid Build Coastguard Worker static const uptr RegionSizeLog = 28U; 103*76559068SAndroid Build Coastguard Worker typedef u32 CompactPtrT; 104*76559068SAndroid Build Coastguard Worker static const uptr CompactPtrScale = SCUDO_MIN_ALIGNMENT_LOG; 105*76559068SAndroid Build Coastguard Worker static const uptr GroupSizeLog = 20U; 106*76559068SAndroid Build Coastguard Worker static const bool EnableRandomOffset = true; 107*76559068SAndroid Build Coastguard Worker static const uptr MapSizeIncrement = 1UL << 18; 108*76559068SAndroid Build Coastguard Worker #else 109*76559068SAndroid Build Coastguard Worker static const uptr RegionSizeLog = 18U; 110*76559068SAndroid Build Coastguard Worker static const uptr GroupSizeLog = 18U; 111*76559068SAndroid Build Coastguard Worker typedef uptr CompactPtrT; 112*76559068SAndroid Build Coastguard Worker #endif 113*76559068SAndroid Build Coastguard Worker static const s32 MinReleaseToOsIntervalMs = 1000; 114*76559068SAndroid Build Coastguard Worker static const s32 MaxReleaseToOsIntervalMs = 1000; 115*76559068SAndroid Build Coastguard Worker }; 116*76559068SAndroid Build Coastguard Worker #if SCUDO_CAN_USE_PRIMARY64 117*76559068SAndroid Build Coastguard Worker template <typename Config> using PrimaryT = SizeClassAllocator64<Config>; 118*76559068SAndroid Build Coastguard Worker #else 119*76559068SAndroid Build Coastguard Worker template <typename Config> using PrimaryT = SizeClassAllocator32<Config>; 120*76559068SAndroid Build Coastguard Worker #endif 121*76559068SAndroid Build Coastguard Worker 122*76559068SAndroid Build Coastguard Worker struct Secondary { 123*76559068SAndroid Build Coastguard Worker struct Cache { 124*76559068SAndroid Build Coastguard Worker static const u32 EntriesArraySize = 256U; 125*76559068SAndroid Build Coastguard Worker static const u32 QuarantineSize = 32U; 126*76559068SAndroid Build Coastguard Worker static const u32 DefaultMaxEntriesCount = 32U; 127*76559068SAndroid Build Coastguard Worker static const uptr DefaultMaxEntrySize = 2UL << 20; 128*76559068SAndroid Build Coastguard Worker static const s32 MinReleaseToOsIntervalMs = 0; 129*76559068SAndroid Build Coastguard Worker static const s32 MaxReleaseToOsIntervalMs = 1000; 130*76559068SAndroid Build Coastguard Worker }; 131*76559068SAndroid Build Coastguard Worker template <typename Config> using CacheT = MapAllocatorCache<Config>; 132*76559068SAndroid Build Coastguard Worker }; 133*76559068SAndroid Build Coastguard Worker 134*76559068SAndroid Build Coastguard Worker template <typename Config> using SecondaryT = MapAllocator<Config>; 135*76559068SAndroid Build Coastguard Worker }; 136*76559068SAndroid Build Coastguard Worker 137*76559068SAndroid Build Coastguard Worker #if SCUDO_CAN_USE_PRIMARY64 138*76559068SAndroid Build Coastguard Worker struct FuchsiaConfig { 139*76559068SAndroid Build Coastguard Worker static const bool MaySupportMemoryTagging = false; 140*76559068SAndroid Build Coastguard Worker template <class A> 141*76559068SAndroid Build Coastguard Worker using TSDRegistryT = TSDRegistrySharedT<A, 8U, 4U>; // Shared, max 8 TSDs. 142*76559068SAndroid Build Coastguard Worker 143*76559068SAndroid Build Coastguard Worker struct Primary { 144*76559068SAndroid Build Coastguard Worker using SizeClassMap = FuchsiaSizeClassMap; 145*76559068SAndroid Build Coastguard Worker #if SCUDO_RISCV64 146*76559068SAndroid Build Coastguard Worker // Support 39-bit VMA for riscv-64 147*76559068SAndroid Build Coastguard Worker static const uptr RegionSizeLog = 28U; 148*76559068SAndroid Build Coastguard Worker static const uptr GroupSizeLog = 19U; 149*76559068SAndroid Build Coastguard Worker static const bool EnableContiguousRegions = false; 150*76559068SAndroid Build Coastguard Worker #else 151*76559068SAndroid Build Coastguard Worker static const uptr RegionSizeLog = 30U; 152*76559068SAndroid Build Coastguard Worker static const uptr GroupSizeLog = 21U; 153*76559068SAndroid Build Coastguard Worker #endif 154*76559068SAndroid Build Coastguard Worker typedef u32 CompactPtrT; 155*76559068SAndroid Build Coastguard Worker static const bool EnableRandomOffset = true; 156*76559068SAndroid Build Coastguard Worker static const uptr MapSizeIncrement = 1UL << 18; 157*76559068SAndroid Build Coastguard Worker static const uptr CompactPtrScale = SCUDO_MIN_ALIGNMENT_LOG; 158*76559068SAndroid Build Coastguard Worker static const s32 MinReleaseToOsIntervalMs = INT32_MIN; 159*76559068SAndroid Build Coastguard Worker static const s32 MaxReleaseToOsIntervalMs = INT32_MAX; 160*76559068SAndroid Build Coastguard Worker }; 161*76559068SAndroid Build Coastguard Worker template <typename Config> using PrimaryT = SizeClassAllocator64<Config>; 162*76559068SAndroid Build Coastguard Worker 163*76559068SAndroid Build Coastguard Worker struct Secondary { 164*76559068SAndroid Build Coastguard Worker template <typename Config> using CacheT = MapAllocatorNoCache<Config>; 165*76559068SAndroid Build Coastguard Worker }; 166*76559068SAndroid Build Coastguard Worker template <typename Config> using SecondaryT = MapAllocator<Config>; 167*76559068SAndroid Build Coastguard Worker }; 168*76559068SAndroid Build Coastguard Worker 169*76559068SAndroid Build Coastguard Worker struct TrustyConfig { 170*76559068SAndroid Build Coastguard Worker static const bool MaySupportMemoryTagging = true; 171*76559068SAndroid Build Coastguard Worker template <class A> 172*76559068SAndroid Build Coastguard Worker using TSDRegistryT = TSDRegistrySharedT<A, 1U, 1U>; // Shared, max 1 TSD. 173*76559068SAndroid Build Coastguard Worker 174*76559068SAndroid Build Coastguard Worker struct Primary { 175*76559068SAndroid Build Coastguard Worker using SizeClassMap = TrustySizeClassMap; 176*76559068SAndroid Build Coastguard Worker static const uptr RegionSizeLog = 28U; 177*76559068SAndroid Build Coastguard Worker static const uptr GroupSizeLog = 20U; 178*76559068SAndroid Build Coastguard Worker typedef u32 CompactPtrT; 179*76559068SAndroid Build Coastguard Worker static const bool EnableRandomOffset = false; 180*76559068SAndroid Build Coastguard Worker static const uptr MapSizeIncrement = 1UL << 12; 181*76559068SAndroid Build Coastguard Worker static const uptr CompactPtrScale = SCUDO_MIN_ALIGNMENT_LOG; 182*76559068SAndroid Build Coastguard Worker static const s32 MinReleaseToOsIntervalMs = INT32_MIN; 183*76559068SAndroid Build Coastguard Worker static const s32 MaxReleaseToOsIntervalMs = INT32_MAX; 184*76559068SAndroid Build Coastguard Worker }; 185*76559068SAndroid Build Coastguard Worker template <typename Config> using PrimaryT = SizeClassAllocator64<Config>; 186*76559068SAndroid Build Coastguard Worker 187*76559068SAndroid Build Coastguard Worker struct Secondary { 188*76559068SAndroid Build Coastguard Worker template <typename Config> using CacheT = MapAllocatorNoCache<Config>; 189*76559068SAndroid Build Coastguard Worker }; 190*76559068SAndroid Build Coastguard Worker 191*76559068SAndroid Build Coastguard Worker template <typename Config> using SecondaryT = MapAllocator<Config>; 192*76559068SAndroid Build Coastguard Worker }; 193*76559068SAndroid Build Coastguard Worker #endif 194*76559068SAndroid Build Coastguard Worker 195*76559068SAndroid Build Coastguard Worker #ifndef SCUDO_USE_CUSTOM_CONFIG 196*76559068SAndroid Build Coastguard Worker 197*76559068SAndroid Build Coastguard Worker #if SCUDO_ANDROID 198*76559068SAndroid Build Coastguard Worker typedef AndroidConfig Config; 199*76559068SAndroid Build Coastguard Worker #elif SCUDO_FUCHSIA 200*76559068SAndroid Build Coastguard Worker typedef FuchsiaConfig Config; 201*76559068SAndroid Build Coastguard Worker #elif SCUDO_TRUSTY 202*76559068SAndroid Build Coastguard Worker typedef TrustyConfig Config; 203*76559068SAndroid Build Coastguard Worker #else 204*76559068SAndroid Build Coastguard Worker typedef DefaultConfig Config; 205*76559068SAndroid Build Coastguard Worker #endif 206*76559068SAndroid Build Coastguard Worker 207*76559068SAndroid Build Coastguard Worker #endif // SCUDO_USE_CUSTOM_CONFIG 208*76559068SAndroid Build Coastguard Worker 209*76559068SAndroid Build Coastguard Worker } // namespace scudo 210*76559068SAndroid Build Coastguard Worker 211*76559068SAndroid Build Coastguard Worker #endif // SCUDO_ALLOCATOR_CONFIG_H_ 212