xref: /freebsd/contrib/llvm-project/compiler-rt/lib/tysan/tysan_platform.h (revision 700637cbb5e582861067a11aaca4d053546871d2)
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)54 template <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)65 template <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()83 uptr ShadowAddr() { return MappingArchImpl<MAPPING_SHADOW_ADDR>(); }
84 
85 ALWAYS_INLINE
AppAddr()86 uptr AppAddr() { return MappingArchImpl<MAPPING_APP_ADDR>(); }
87 
88 ALWAYS_INLINE
AppMask()89 uptr AppMask() { return MappingArchImpl<MAPPING_APP_MASK>(); }
90 
91 } // namespace __tysan
92 
93 #endif
94