1*76559068SAndroid Build Coastguard Worker //===-- platform.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_PLATFORM_H_ 10*76559068SAndroid Build Coastguard Worker #define SCUDO_PLATFORM_H_ 11*76559068SAndroid Build Coastguard Worker 12*76559068SAndroid Build Coastguard Worker // Transitive includes of stdint.h specify some of the defines checked below. 13*76559068SAndroid Build Coastguard Worker #include <stdint.h> 14*76559068SAndroid Build Coastguard Worker 15*76559068SAndroid Build Coastguard Worker #if defined(__linux__) && !defined(__TRUSTY__) 16*76559068SAndroid Build Coastguard Worker #define SCUDO_LINUX 1 17*76559068SAndroid Build Coastguard Worker #else 18*76559068SAndroid Build Coastguard Worker #define SCUDO_LINUX 0 19*76559068SAndroid Build Coastguard Worker #endif 20*76559068SAndroid Build Coastguard Worker 21*76559068SAndroid Build Coastguard Worker // See https://android.googlesource.com/platform/bionic/+/master/docs/defines.md 22*76559068SAndroid Build Coastguard Worker #if defined(__BIONIC__) 23*76559068SAndroid Build Coastguard Worker #define SCUDO_ANDROID 1 24*76559068SAndroid Build Coastguard Worker // Transitive includes of unistd.h will get PAGE_SIZE if it is defined. 25*76559068SAndroid Build Coastguard Worker #include <unistd.h> 26*76559068SAndroid Build Coastguard Worker #if defined(PAGE_SIZE) 27*76559068SAndroid Build Coastguard Worker #define SCUDO_PAGE_SIZE PAGE_SIZE 28*76559068SAndroid Build Coastguard Worker #endif 29*76559068SAndroid Build Coastguard Worker #else 30*76559068SAndroid Build Coastguard Worker #define SCUDO_ANDROID 0 31*76559068SAndroid Build Coastguard Worker #endif 32*76559068SAndroid Build Coastguard Worker 33*76559068SAndroid Build Coastguard Worker #if defined(__Fuchsia__) 34*76559068SAndroid Build Coastguard Worker #define SCUDO_FUCHSIA 1 35*76559068SAndroid Build Coastguard Worker #else 36*76559068SAndroid Build Coastguard Worker #define SCUDO_FUCHSIA 0 37*76559068SAndroid Build Coastguard Worker #endif 38*76559068SAndroid Build Coastguard Worker 39*76559068SAndroid Build Coastguard Worker #if defined(__TRUSTY__) 40*76559068SAndroid Build Coastguard Worker #define SCUDO_TRUSTY 1 41*76559068SAndroid Build Coastguard Worker #else 42*76559068SAndroid Build Coastguard Worker #define SCUDO_TRUSTY 0 43*76559068SAndroid Build Coastguard Worker #endif 44*76559068SAndroid Build Coastguard Worker 45*76559068SAndroid Build Coastguard Worker #if defined(__riscv) && (__riscv_xlen == 64) 46*76559068SAndroid Build Coastguard Worker #define SCUDO_RISCV64 1 47*76559068SAndroid Build Coastguard Worker #else 48*76559068SAndroid Build Coastguard Worker #define SCUDO_RISCV64 0 49*76559068SAndroid Build Coastguard Worker #endif 50*76559068SAndroid Build Coastguard Worker 51*76559068SAndroid Build Coastguard Worker #if defined(__LP64__) 52*76559068SAndroid Build Coastguard Worker #define SCUDO_WORDSIZE 64U 53*76559068SAndroid Build Coastguard Worker #else 54*76559068SAndroid Build Coastguard Worker #define SCUDO_WORDSIZE 32U 55*76559068SAndroid Build Coastguard Worker #endif 56*76559068SAndroid Build Coastguard Worker 57*76559068SAndroid Build Coastguard Worker #if SCUDO_WORDSIZE == 64U 58*76559068SAndroid Build Coastguard Worker #define FIRST_32_SECOND_64(a, b) (b) 59*76559068SAndroid Build Coastguard Worker #else 60*76559068SAndroid Build Coastguard Worker #define FIRST_32_SECOND_64(a, b) (a) 61*76559068SAndroid Build Coastguard Worker #endif 62*76559068SAndroid Build Coastguard Worker 63*76559068SAndroid Build Coastguard Worker #ifndef SCUDO_CAN_USE_PRIMARY64 64*76559068SAndroid Build Coastguard Worker #define SCUDO_CAN_USE_PRIMARY64 (SCUDO_WORDSIZE == 64U) 65*76559068SAndroid Build Coastguard Worker #endif 66*76559068SAndroid Build Coastguard Worker 67*76559068SAndroid Build Coastguard Worker #ifndef SCUDO_CAN_USE_MTE 68*76559068SAndroid Build Coastguard Worker #define SCUDO_CAN_USE_MTE (SCUDO_LINUX || SCUDO_TRUSTY) 69*76559068SAndroid Build Coastguard Worker #endif 70*76559068SAndroid Build Coastguard Worker 71*76559068SAndroid Build Coastguard Worker #ifndef SCUDO_ENABLE_HOOKS 72*76559068SAndroid Build Coastguard Worker #define SCUDO_ENABLE_HOOKS 0 73*76559068SAndroid Build Coastguard Worker #endif 74*76559068SAndroid Build Coastguard Worker 75*76559068SAndroid Build Coastguard Worker #ifndef SCUDO_MIN_ALIGNMENT_LOG 76*76559068SAndroid Build Coastguard Worker // We force malloc-type functions to be aligned to std::max_align_t, but there 77*76559068SAndroid Build Coastguard Worker // is no reason why the minimum alignment for all other functions can't be 8 78*76559068SAndroid Build Coastguard Worker // bytes. Except obviously for applications making incorrect assumptions. 79*76559068SAndroid Build Coastguard Worker // TODO(kostyak): define SCUDO_MIN_ALIGNMENT_LOG 3 80*76559068SAndroid Build Coastguard Worker #define SCUDO_MIN_ALIGNMENT_LOG FIRST_32_SECOND_64(3, 4) 81*76559068SAndroid Build Coastguard Worker #endif 82*76559068SAndroid Build Coastguard Worker 83*76559068SAndroid Build Coastguard Worker #if defined(__aarch64__) 84*76559068SAndroid Build Coastguard Worker #define SCUDO_MMAP_RANGE_SIZE FIRST_32_SECOND_64(1ULL << 32, 1ULL << 48) 85*76559068SAndroid Build Coastguard Worker #else 86*76559068SAndroid Build Coastguard Worker #define SCUDO_MMAP_RANGE_SIZE FIRST_32_SECOND_64(1ULL << 32, 1ULL << 47) 87*76559068SAndroid Build Coastguard Worker #endif 88*76559068SAndroid Build Coastguard Worker 89*76559068SAndroid Build Coastguard Worker // Older gcc have issues aligning to a constexpr, and require an integer. 90*76559068SAndroid Build Coastguard Worker // See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56859 among others. 91*76559068SAndroid Build Coastguard Worker #if defined(__powerpc__) || defined(__powerpc64__) 92*76559068SAndroid Build Coastguard Worker #define SCUDO_CACHE_LINE_SIZE 128 93*76559068SAndroid Build Coastguard Worker #else 94*76559068SAndroid Build Coastguard Worker #define SCUDO_CACHE_LINE_SIZE 64 95*76559068SAndroid Build Coastguard Worker #endif 96*76559068SAndroid Build Coastguard Worker 97*76559068SAndroid Build Coastguard Worker #define SCUDO_POINTER_FORMAT_LENGTH FIRST_32_SECOND_64(8, 12) 98*76559068SAndroid Build Coastguard Worker 99*76559068SAndroid Build Coastguard Worker #endif // SCUDO_PLATFORM_H_ 100