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
17namespace __tysan {
18
19#if defined(__x86_64__) || SANITIZER_APPLE
20struct Mapping {
21 static const uptr kShadowAddr = 0x010000000000ull;
22 static const uptr kAppAddr = 0x550000000000ull;
23 static const uptr kAppMemMsk = ~0x780000000000ull;
24};
25#elif defined(__aarch64__)
26struct Mapping39 {
27 static const uptr kShadowAddr = 0x0800000000ull;
28 static const uptr kAppAddr = 0x5500000000ull;
29 static const uptr kAppMemMsk = ~0x7800000000ull;
30};
31
32struct Mapping42 {
33 static const uptr kShadowAddr = 0x10000000000ull;
34 static const uptr kAppAddr = 0x2aa00000000ull;
35 static const uptr kAppMemMsk = ~0x3c000000000ull;
36};
37
38struct 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
49extern int vmaSize;
50#endif
51
52enum MappingType { MAPPING_SHADOW_ADDR, MAPPING_APP_ADDR, MAPPING_APP_MASK };
53
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
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
82ALWAYS_INLINE
83uptr ShadowAddr() { return MappingArchImpl<MAPPING_SHADOW_ADDR>(); }
84
85ALWAYS_INLINE
86uptr AppAddr() { return MappingArchImpl<MAPPING_APP_ADDR>(); }
87
88ALWAYS_INLINE
89uptr AppMask() { return MappingArchImpl<MAPPING_APP_MASK>(); }
90
91} // namespace __tysan
92
93#endif
94