10b57cec5SDimitry Andric //===-- platform.h ----------------------------------------------*- C++ -*-===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric 90b57cec5SDimitry Andric #ifndef SCUDO_PLATFORM_H_ 100b57cec5SDimitry Andric #define SCUDO_PLATFORM_H_ 110b57cec5SDimitry Andric 12480093f4SDimitry Andric // Transitive includes of stdint.h specify some of the defines checked below. 13480093f4SDimitry Andric #include <stdint.h> 14480093f4SDimitry Andric 15fe6060f1SDimitry Andric #if defined(__linux__) && !defined(__TRUSTY__) 160b57cec5SDimitry Andric #define SCUDO_LINUX 1 170b57cec5SDimitry Andric #else 180b57cec5SDimitry Andric #define SCUDO_LINUX 0 190b57cec5SDimitry Andric #endif 200b57cec5SDimitry Andric 21480093f4SDimitry Andric // See https://android.googlesource.com/platform/bionic/+/master/docs/defines.md 22480093f4SDimitry Andric #if defined(__BIONIC__) 230b57cec5SDimitry Andric #define SCUDO_ANDROID 1 240b57cec5SDimitry Andric #else 250b57cec5SDimitry Andric #define SCUDO_ANDROID 0 260b57cec5SDimitry Andric #endif 270b57cec5SDimitry Andric 280b57cec5SDimitry Andric #if defined(__Fuchsia__) 290b57cec5SDimitry Andric #define SCUDO_FUCHSIA 1 300b57cec5SDimitry Andric #else 310b57cec5SDimitry Andric #define SCUDO_FUCHSIA 0 320b57cec5SDimitry Andric #endif 330b57cec5SDimitry Andric 34fe6060f1SDimitry Andric #if defined(__TRUSTY__) 35fe6060f1SDimitry Andric #define SCUDO_TRUSTY 1 36fe6060f1SDimitry Andric #else 37fe6060f1SDimitry Andric #define SCUDO_TRUSTY 0 38fe6060f1SDimitry Andric #endif 39fe6060f1SDimitry Andric 4006c3fb27SDimitry Andric #if defined(__riscv) && (__riscv_xlen == 64) 4106c3fb27SDimitry Andric #define SCUDO_RISCV64 1 4206c3fb27SDimitry Andric #else 4306c3fb27SDimitry Andric #define SCUDO_RISCV64 0 4406c3fb27SDimitry Andric #endif 4506c3fb27SDimitry Andric 4681ad6265SDimitry Andric #if defined(__LP64__) 470b57cec5SDimitry Andric #define SCUDO_WORDSIZE 64U 480b57cec5SDimitry Andric #else 490b57cec5SDimitry Andric #define SCUDO_WORDSIZE 32U 500b57cec5SDimitry Andric #endif 510b57cec5SDimitry Andric 520b57cec5SDimitry Andric #if SCUDO_WORDSIZE == 64U 530b57cec5SDimitry Andric #define FIRST_32_SECOND_64(a, b) (b) 540b57cec5SDimitry Andric #else 550b57cec5SDimitry Andric #define FIRST_32_SECOND_64(a, b) (a) 560b57cec5SDimitry Andric #endif 570b57cec5SDimitry Andric 580b57cec5SDimitry Andric #ifndef SCUDO_CAN_USE_PRIMARY64 590b57cec5SDimitry Andric #define SCUDO_CAN_USE_PRIMARY64 (SCUDO_WORDSIZE == 64U) 600b57cec5SDimitry Andric #endif 610b57cec5SDimitry Andric 6206c3fb27SDimitry Andric #ifndef SCUDO_CAN_USE_MTE 6306c3fb27SDimitry Andric #define SCUDO_CAN_USE_MTE (SCUDO_LINUX || SCUDO_TRUSTY) 6406c3fb27SDimitry Andric #endif 6506c3fb27SDimitry Andric 66*5f757f3fSDimitry Andric #ifndef SCUDO_ENABLE_HOOKS 67*5f757f3fSDimitry Andric #define SCUDO_ENABLE_HOOKS 0 68*5f757f3fSDimitry Andric #endif 69*5f757f3fSDimitry Andric 700b57cec5SDimitry Andric #ifndef SCUDO_MIN_ALIGNMENT_LOG 710b57cec5SDimitry Andric // We force malloc-type functions to be aligned to std::max_align_t, but there 720b57cec5SDimitry Andric // is no reason why the minimum alignment for all other functions can't be 8 730b57cec5SDimitry Andric // bytes. Except obviously for applications making incorrect assumptions. 740b57cec5SDimitry Andric // TODO(kostyak): define SCUDO_MIN_ALIGNMENT_LOG 3 750b57cec5SDimitry Andric #define SCUDO_MIN_ALIGNMENT_LOG FIRST_32_SECOND_64(3, 4) 760b57cec5SDimitry Andric #endif 770b57cec5SDimitry Andric 780b57cec5SDimitry Andric #if defined(__aarch64__) 790b57cec5SDimitry Andric #define SCUDO_MMAP_RANGE_SIZE FIRST_32_SECOND_64(1ULL << 32, 1ULL << 48) 800b57cec5SDimitry Andric #else 810b57cec5SDimitry Andric #define SCUDO_MMAP_RANGE_SIZE FIRST_32_SECOND_64(1ULL << 32, 1ULL << 47) 820b57cec5SDimitry Andric #endif 830b57cec5SDimitry Andric 840b57cec5SDimitry Andric // Older gcc have issues aligning to a constexpr, and require an integer. 850b57cec5SDimitry Andric // See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56859 among others. 860b57cec5SDimitry Andric #if defined(__powerpc__) || defined(__powerpc64__) 870b57cec5SDimitry Andric #define SCUDO_CACHE_LINE_SIZE 128 880b57cec5SDimitry Andric #else 890b57cec5SDimitry Andric #define SCUDO_CACHE_LINE_SIZE 64 900b57cec5SDimitry Andric #endif 910b57cec5SDimitry Andric 920b57cec5SDimitry Andric #define SCUDO_POINTER_FORMAT_LENGTH FIRST_32_SECOND_64(8, 12) 930b57cec5SDimitry Andric 940b57cec5SDimitry Andric #endif // SCUDO_PLATFORM_H_ 95