asan_mapping.h revision 7f790caa37ec1c9807c877297d30e040e83ed215
1e3365aa452673f7ea3244bb6638551f13ab7570dNick Lewycky//===-- asan_mapping.h ------------------------------------------*- C++ -*-===//
23ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar//
33ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar//                     The LLVM Compiler Infrastructure
43ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar//
53ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// This file is distributed under the University of Illinois Open Source
63ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// License. See LICENSE.TXT for details.
73ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar//
83ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar//===----------------------------------------------------------------------===//
93ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar//
103ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// This file is a part of AddressSanitizer, an address sanity checker.
113ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar//
1253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar// Defines ASan memory mapping.
131b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar//===----------------------------------------------------------------------===//
141b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar#ifndef ASAN_MAPPING_H
151b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar#define ASAN_MAPPING_H
164ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar
17f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar#include "asan_internal.h"
1827e738d0d3f781672a5999d2a9e2827b00a97d0cDaniel Dunbar
190648262df75d97b464c2be0ed867da3615659785Daniel Dunbar// The full explanation of the memory mapping could be found here:
201b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar// http://code.google.com/p/address-sanitizer/wiki/AddressSanitizerAlgorithm
21f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar//
22f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar// Typical shadow mapping on Linux/x86_64 with SHADOW_OFFSET == 0x00007fff8000:
230648262df75d97b464c2be0ed867da3615659785Daniel Dunbar// || `[0x10007fff8000, 0x7fffffffffff]` || HighMem    ||
24ab41e63821dc60ad144d0684df8d79a9eef86b75Douglas Gregor// || `[0x02008fff7000, 0x10007fff7fff]` || HighShadow ||
25ab41e63821dc60ad144d0684df8d79a9eef86b75Douglas Gregor// || `[0x00008fff7000, 0x02008fff6fff]` || ShadowGap  ||
267f9fc3f7ce076645cb6aefc99c64d9446caf13d6Chris Lattner// || `[0x00007fff8000, 0x00008fff6fff]` || LowShadow  ||
271368954db9ce2989ed8f03f5c65e8ee775a5229aDaniel Dunbar// || `[0x000000000000, 0x00007fff7fff]` || LowMem     ||
284d7b14734f2285695dcec347f8718b512093390aTed Kremenek//
29548f6c8e8010b181cb151df92f0a989363cb993eDavid Blaikie// When SHADOW_OFFSET is zero (-pie):
308f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar// || `[0x100000000000, 0x7fffffffffff]` || HighMem    ||
310648262df75d97b464c2be0ed867da3615659785Daniel Dunbar// || `[0x020000000000, 0x0fffffffffff]` || HighShadow ||
32256053b31e697fdf0cc48f17d621c82fc3b8dff0Michael J. Spencer// || `[0x000000040000, 0x01ffffffffff]` || ShadowGap  ||
3303013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer//
3403013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer// Special case when something is already mapped between
35ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar// 0x003000000000 and 0x005000000000 (e.g. when prelink is installed):
36f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar// || `[0x10007fff8000, 0x7fffffffffff]` || HighMem    ||
3718d7f3af752c41a197552a1ff25ddd639224b4bbChandler Carruth// || `[0x02008fff7000, 0x10007fff7fff]` || HighShadow ||
38f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar// || `[0x005000000000, 0x02008fff6fff]` || ShadowGap3 ||
39f2462be34a49e2108c9b4151f8e6d3fe1b916179Dylan Noblesmith// || `[0x003000000000, 0x004fffffffff]` || MidMem     ||
4069d3b4f7c9fa818d2536b4f1b220b942ae392128Dylan Noblesmith// || `[0x000a7fff8000, 0x002fffffffff]` || ShadowGap2 ||
41cc8a94565ec2ff459dcee9ef34237fdcdfc69b3fDylan Noblesmith// || `[0x00067fff8000, 0x000a7fff7fff]` || MidShadow  ||
42cc8a94565ec2ff459dcee9ef34237fdcdfc69b3fDylan Noblesmith// || `[0x00008fff7000, 0x00067fff7fff]` || ShadowGap  ||
431b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar// || `[0x00007fff8000, 0x00008fff6fff]` || LowShadow  ||
4492b369928b8e9ad156fb6eec2bf9f21d657bd69bChris Lattner// || `[0x000000000000, 0x00007fff7fff]` || LowMem     ||
451b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar//
465f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner// Default Linux/i386 mapping:
479606a57b6f2c43bf438a958fdffea1de60f6b2b7Sebastian Pop// || `[0x40000000, 0xffffffff]` || HighMem    ||
485f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner// || `[0x28000000, 0x3fffffff]` || HighShadow ||
4910a82cde7c317c5dd41dc3faf17f503c52ce2a3dBob Wilson// || `[0x24000000, 0x27ffffff]` || ShadowGap  ||
50d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie// || `[0x20000000, 0x23ffffff]` || LowShadow  ||
517e46d0b8436d844d77f3ff580b6e1204e0407044Nick Lewycky// || `[0x00000000, 0x1fffffff]` || LowMem     ||
524762a2da74875d2ae94e0d77d38ed964816cce36Sebastian Pop//
534762a2da74875d2ae94e0d77d38ed964816cce36Sebastian Pop// Default Linux/MIPS mapping:
54abac441b7d114d5980864093ee0643bf68f1a8f2Chad Rosier// || `[0x2aaa8000, 0xffffffff]` || HighMem    ||
5543302d4144b5291961aa160d2fe191c09a9d8ad1Daniel Dunbar// || `[0x0fffd000, 0x2aaa7fff]` || HighShadow ||
56c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbar// || `[0x0bffd000, 0x0fffcfff]` || ShadowGap  ||
57c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbar// || `[0x0aaa8000, 0x0bffcfff]` || LowShadow  ||
58951c5705771a57eca0bca07aae5d4738619dd6c6Joerg Sonnenberger// || `[0x00000000, 0x0aaa7fff]` || LowMem     ||
59c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbar
602b81910618f63e4ce2373c926a26e76b4b91373fChad Rosierstatic const u64 kDefaultShadowScale = 3;
612b81910618f63e4ce2373c926a26e76b4b91373fChad Rosierstatic const u64 kDefaultShadowOffset32 = 1ULL << 29;
622b81910618f63e4ce2373c926a26e76b4b91373fChad Rosierstatic const u64 kDefaultShadowOffset64 = 1ULL << 44;
63f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbarstatic const u64 kDefaultShort64bitShadowOffset = 0x7FFF8000;  // < 2G.
64f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbarstatic const u64 kPPC64_ShadowOffset64 = 1ULL << 41;
65b9da55780eb66fb09e771dbc5ff01eec5c4d957bDavid Blaikiestatic const u64 kMIPS32_ShadowOffset32 = 0x0aaa8000;
66f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar
67f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar#if ASAN_FLEXIBLE_MAPPING_AND_OFFSET == 1
68f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbarextern SANITIZER_INTERFACE_ATTRIBUTE uptr __asan_mapping_scale;
69f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbarextern SANITIZER_INTERFACE_ATTRIBUTE uptr __asan_mapping_offset;
70f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar# define SHADOW_SCALE (__asan_mapping_scale)
71f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar# define SHADOW_OFFSET (__asan_mapping_offset)
72f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar#else
73f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar# define SHADOW_SCALE kDefaultShadowScale
74225c41706dc0f3682236e351820d339e14390e00Daniel Dunbar# if SANITIZER_ANDROID
75d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer#  define SHADOW_OFFSET (0)
76d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer# else
770bbad519aa068206f1e158d5073f72a39fbe83c5Daniel Dunbar#  if SANITIZER_WORDSIZE == 32
78225c41706dc0f3682236e351820d339e14390e00Daniel Dunbar#   if defined(__mips__)
795f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner#     define SHADOW_OFFSET kMIPS32_ShadowOffset32
80f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith#   else
81d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer#     define SHADOW_OFFSET kDefaultShadowOffset32
82d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer#   endif
83d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer#  else
84d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer#   if defined(__powerpc64__)
85225c41706dc0f3682236e351820d339e14390e00Daniel Dunbar#    define SHADOW_OFFSET kPPC64_ShadowOffset64
863ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar#   elif SANITIZER_MAC
873ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar#    define SHADOW_OFFSET kDefaultShadowOffset64
883ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar#   else
891b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar#    define SHADOW_OFFSET kDefaultShort64bitShadowOffset
9018d7f3af752c41a197552a1ff25ddd639224b4bbChandler Carruth#   endif
9118d7f3af752c41a197552a1ff25ddd639224b4bbChandler Carruth#  endif
9218d7f3af752c41a197552a1ff25ddd639224b4bbChandler Carruth# endif
9318d7f3af752c41a197552a1ff25ddd639224b4bbChandler Carruth#endif  // ASAN_FLEXIBLE_MAPPING_AND_OFFSET
9418d7f3af752c41a197552a1ff25ddd639224b4bbChandler Carruth
953ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar#define SHADOW_GRANULARITY (1ULL << SHADOW_SCALE)
963ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar#define MEM_TO_SHADOW(mem) (((mem) >> SHADOW_SCALE) + (SHADOW_OFFSET))
972d3ba4f5a923a90c3fc290ddfba5e36c2d0a9b46Chris Lattner#define SHADOW_TO_MEM(shadow) (((shadow) - SHADOW_OFFSET) << SHADOW_SCALE)
988f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar
99847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar#define kLowMemBeg      0
1007f9fc3f7ce076645cb6aefc99c64d9446caf13d6Chris Lattner#define kLowMemEnd      (SHADOW_OFFSET ? SHADOW_OFFSET - 1 : 0)
101847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar
102847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar#define kLowShadowBeg   SHADOW_OFFSET
103847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar#define kLowShadowEnd   MEM_TO_SHADOW(kLowMemEnd)
104847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar
105847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar#define kHighMemBeg     (MEM_TO_SHADOW(kHighMemEnd) + 1)
106847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar
107847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar#define kHighShadowBeg  MEM_TO_SHADOW(kHighMemBeg)
108847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar#define kHighShadowEnd  MEM_TO_SHADOW(kHighMemEnd)
109847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar
110847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar# define kMidShadowBeg MEM_TO_SHADOW(kMidMemBeg)
111847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar# define kMidShadowEnd MEM_TO_SHADOW(kMidMemEnd)
112b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar
113b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar// With the zero shadow base we can not actually map pages starting from 0.
114b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar// This constant is somewhat arbitrary.
115b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar#define kZeroBaseShadowStart (1 << 18)
1162dd17a15ddc0184790d790b6128d79ffddae4964Chad Rosier
1172dd17a15ddc0184790d790b6128d79ffddae4964Chad Rosier#define kShadowGapBeg   (kLowShadowEnd ? kLowShadowEnd + 1 \
1182dd17a15ddc0184790d790b6128d79ffddae4964Chad Rosier                                       : kZeroBaseShadowStart)
1192dd17a15ddc0184790d790b6128d79ffddae4964Chad Rosier#define kShadowGapEnd   ((kMidMemBeg ? kMidShadowBeg : kHighShadowBeg) - 1)
1202dd17a15ddc0184790d790b6128d79ffddae4964Chad Rosier
1212dd17a15ddc0184790d790b6128d79ffddae4964Chad Rosier#define kShadowGap2Beg (kMidMemBeg ? kMidShadowEnd + 1 : 0)
1220648262df75d97b464c2be0ed867da3615659785Daniel Dunbar#define kShadowGap2End (kMidMemBeg ? kMidMemBeg - 1 : 0)
1230648262df75d97b464c2be0ed867da3615659785Daniel Dunbar
1240648262df75d97b464c2be0ed867da3615659785Daniel Dunbar#define kShadowGap3Beg (kMidMemBeg ? kMidMemEnd + 1 : 0)
1250648262df75d97b464c2be0ed867da3615659785Daniel Dunbar#define kShadowGap3End (kMidMemBeg ? kHighShadowBeg - 1 : 0)
1260648262df75d97b464c2be0ed867da3615659785Daniel Dunbar
1271fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier#define DO_ASAN_MAPPING_PROFILE 0  // Set to 1 to profile the functions below.
1281fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier
1291fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier#if DO_ASAN_MAPPING_PROFILE
1301fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier# define PROFILE_ASAN_MAPPING() AsanMappingProfile[__LINE__]++;
1311fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier#else
1321fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier# define PROFILE_ASAN_MAPPING()
1331fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier#endif
13459f9b26bcb59bfb4d66c6ea129172795dcd1cb6bEric Christopher
1351fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier// If 1, all shadow boundaries are constants.
1361fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier// Don't set to 1 other than for testing.
1371fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier#define ASAN_FIXED_MAPPING 0
1381fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier
1391fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosiernamespace __asan {
14059f9b26bcb59bfb4d66c6ea129172795dcd1cb6bEric Christopher
1411fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosierextern uptr AsanMappingProfile[];
1421fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier
1431fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier#if ASAN_FIXED_MAPPING
144582b395ea4d5dfe353e2132a470d39efe2f84a54Fariborz Jahanian// Fixed mapping for 64-bit Linux. Mostly used for performance comparison
14530660a898545416f0fea2d717f16f75640001e38Ted Kremenek// with non-fixed mapping. As of r175253 (Feb 2013) the performance
1461fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier// difference between fixed and non-fixed mapping is below the noise level.
14753cb2b47596b0ca893a449fa81e0912ded658759Chad Rosierstatic uptr kHighMemEnd = 0x7fffffffffffULL;
1481fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosierstatic uptr kMidMemBeg =    0x3000000000ULL;
1491fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosierstatic uptr kMidMemEnd =    0x4fffffffffULL;
1501fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier#else
1511fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosierextern uptr kHighMemEnd, kMidMemBeg, kMidMemEnd;  // Initialized in __asan_init.
1521fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier#endif
1531fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier
1541fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosierstatic inline bool AddrIsInLowMem(uptr a) {
1551fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier  PROFILE_ASAN_MAPPING();
1561fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier  return a < kLowMemEnd;
1571fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier}
1581fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier
1591fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosierstatic inline bool AddrIsInLowShadow(uptr a) {
1601fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier  PROFILE_ASAN_MAPPING();
1611fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier  return a >= kLowShadowBeg && a <= kLowShadowEnd;
1621fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier}
1631fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier
1641fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosierstatic inline bool AddrIsInHighMem(uptr a) {
1651fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier  PROFILE_ASAN_MAPPING();
166279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar  return a >= kHighMemBeg && a <= kHighMemEnd;
167279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar}
168279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar
169e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbarstatic inline bool AddrIsInMidMem(uptr a) {
170279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar  PROFILE_ASAN_MAPPING();
171f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar  return kMidMemBeg && a >= kMidMemBeg && a <= kMidMemEnd;
172f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar}
173f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar
174f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbarstatic inline bool AddrIsInMem(uptr a) {
175f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar  PROFILE_ASAN_MAPPING();
176f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar  return AddrIsInLowMem(a) || AddrIsInMidMem(a) || AddrIsInHighMem(a);
177eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar}
178eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar
179eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbarstatic inline uptr MemToShadow(uptr p) {
180eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar  PROFILE_ASAN_MAPPING();
181eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar  CHECK(AddrIsInMem(p));
182eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar  return MEM_TO_SHADOW(p);
183f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar}
184f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar
185f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbarstatic inline bool AddrIsInHighShadow(uptr a) {
186f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar  PROFILE_ASAN_MAPPING();
187f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar  return a >= kHighShadowBeg && a <= kHighMemEnd;
1885f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner}
189f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar
190f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbarstatic inline bool AddrIsInMidShadow(uptr a) {
191f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar  PROFILE_ASAN_MAPPING();
192f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar  return kMidMemBeg && a >= kMidShadowBeg && a <= kMidMemEnd;
193f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar}
194f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar
195eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbarstatic inline bool AddrIsInShadow(uptr a) {
196eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar  PROFILE_ASAN_MAPPING();
197eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar  return AddrIsInLowShadow(a) || AddrIsInMidShadow(a) || AddrIsInHighShadow(a);
198eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar}
199eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar
2005f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic inline bool AddrIsInShadowGap(uptr a) {
2015f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  PROFILE_ASAN_MAPPING();
202212df32d955c34dbb8b976bc0316e8eb83ac579eDaniel Dunbar  if (kMidMemBeg) {
2035f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    if (a <= kShadowGapEnd)
204212df32d955c34dbb8b976bc0316e8eb83ac579eDaniel Dunbar      return SHADOW_OFFSET == 0 || a >= kShadowGapBeg;
205212df32d955c34dbb8b976bc0316e8eb83ac579eDaniel Dunbar    return (a >= kShadowGap2Beg && a <= kShadowGap2End) ||
206212df32d955c34dbb8b976bc0316e8eb83ac579eDaniel Dunbar           (a >= kShadowGap3Beg && a <= kShadowGap3End);
207eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar  }
208eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar  // In zero-based shadow mode we treat addresses near zero as addresses
209eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar  // in shadow gap as well.
210eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar  if (SHADOW_OFFSET == 0)
211eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar    return a <= kShadowGapEnd;
2127433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  return a >= kShadowGapBeg && a <= kShadowGapEnd;
2137433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen}
2145f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner
215e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbarstatic inline bool AddrIsAlignedByGranularity(uptr a) {
2167433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  PROFILE_ASAN_MAPPING();
2177433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  return (a & (SHADOW_GRANULARITY - 1)) == 0;
218e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar}
219e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar
220e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbarstatic inline bool AddressIsPoisoned(uptr a) {
221e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar  PROFILE_ASAN_MAPPING();
2227433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  const uptr kAccessSize = 1;
2237433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  u8 *shadow_address = (u8*)MEM_TO_SHADOW(a);
2247433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  s8 shadow_value = *shadow_address;
2257433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  if (shadow_value) {
2267433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen    u8 last_accessed_byte = (a & (SHADOW_GRANULARITY - 1))
2277433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen                                 + kAccessSize - 1;
2287433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen    return (last_accessed_byte >= shadow_value);
229e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar  }
230e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar  return false;
231279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar}
232f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar
233279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar// Must be after all calls to PROFILE_ASAN_MAPPING().
234a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbarstatic const uptr kAsanMappingProfileSize = __LINE__;
235a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar
236a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar}  // namespace __asan
237a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar
238a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar#endif  // ASAN_MAPPING_H
239a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar