1 //===------------------------ tysan_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 // This file is a part of TypeSanitizer. 10 // 11 // Platform specific information for TySan. 12 //===----------------------------------------------------------------------===// 13 14 #ifndef TYSAN_PLATFORM_H 15 #define TYSAN_PLATFORM_H 16 17 namespace __tysan { 18 19 #if defined(__x86_64__) || SANITIZER_APPLE 20 struct Mapping { 21 static const uptr kShadowAddr = 0x010000000000ull; 22 static const uptr kAppAddr = 0x550000000000ull; 23 static const uptr kAppMemMsk = ~0x780000000000ull; 24 }; 25 #elif defined(__aarch64__) 26 struct Mapping39 { 27 static const uptr kShadowAddr = 0x0800000000ull; 28 static const uptr kAppAddr = 0x5500000000ull; 29 static const uptr kAppMemMsk = ~0x7800000000ull; 30 }; 31 32 struct Mapping42 { 33 static const uptr kShadowAddr = 0x10000000000ull; 34 static const uptr kAppAddr = 0x2aa00000000ull; 35 static const uptr kAppMemMsk = ~0x3c000000000ull; 36 }; 37 38 struct Mapping48 { 39 static const uptr kShadowAddr = 0x0002000000000ull; 40 static const uptr kAppAddr = 0x0aaaa00000000ull; 41 static const uptr kAppMemMsk = ~0x0fff800000000ull; 42 }; 43 #define TYSAN_RUNTIME_VMA 1 44 #else 45 #error "TySan not supported for this platform!" 46 #endif 47 48 #if TYSAN_RUNTIME_VMA 49 extern int vmaSize; 50 #endif 51 52 enum MappingType { MAPPING_SHADOW_ADDR, MAPPING_APP_ADDR, MAPPING_APP_MASK }; 53 MappingImpl(void)54template <typename Mapping, int Type> uptr MappingImpl(void) { 55 switch (Type) { 56 case MAPPING_SHADOW_ADDR: 57 return Mapping::kShadowAddr; 58 case MAPPING_APP_ADDR: 59 return Mapping::kAppAddr; 60 case MAPPING_APP_MASK: 61 return Mapping::kAppMemMsk; 62 } 63 } 64 MappingArchImpl(void)65template <int Type> uptr MappingArchImpl(void) { 66 #if defined(__aarch64__) && !SANITIZER_APPLE 67 switch (vmaSize) { 68 case 39: 69 return MappingImpl<Mapping39, Type>(); 70 case 42: 71 return MappingImpl<Mapping42, Type>(); 72 case 48: 73 return MappingImpl<Mapping48, Type>(); 74 } 75 DCHECK(0); 76 return 0; 77 #else 78 return MappingImpl<Mapping, Type>(); 79 #endif 80 } 81 82 ALWAYS_INLINE ShadowAddr()83uptr ShadowAddr() { return MappingArchImpl<MAPPING_SHADOW_ADDR>(); } 84 85 ALWAYS_INLINE AppAddr()86uptr AppAddr() { return MappingArchImpl<MAPPING_APP_ADDR>(); } 87 88 ALWAYS_INLINE AppMask()89uptr AppMask() { return MappingArchImpl<MAPPING_APP_MASK>(); } 90 91 } // namespace __tysan 92 93 #endif 94