xref: /llvm-project/compiler-rt/lib/hwasan/hwasan_mapping.h (revision 189c55251849076e17ddab590c1302f4af0e60f8)
1d03fb0e3SAlex Shlyapnikov //===-- hwasan_mapping.h ----------------------------------------*- C++ -*-===//
2d03fb0e3SAlex Shlyapnikov //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6d03fb0e3SAlex Shlyapnikov //
7d03fb0e3SAlex Shlyapnikov //===----------------------------------------------------------------------===//
8d03fb0e3SAlex Shlyapnikov ///
9d03fb0e3SAlex Shlyapnikov /// \file
10d03fb0e3SAlex Shlyapnikov /// This file is a part of HWAddressSanitizer and defines memory mapping.
11d03fb0e3SAlex Shlyapnikov ///
12d03fb0e3SAlex Shlyapnikov //===----------------------------------------------------------------------===//
13d03fb0e3SAlex Shlyapnikov 
14d03fb0e3SAlex Shlyapnikov #ifndef HWASAN_MAPPING_H
15d03fb0e3SAlex Shlyapnikov #define HWASAN_MAPPING_H
16d03fb0e3SAlex Shlyapnikov 
17d03fb0e3SAlex Shlyapnikov #include "sanitizer_common/sanitizer_internal_defs.h"
181e449886SKostya Serebryany #include "hwasan_interface_internal.h"
19d03fb0e3SAlex Shlyapnikov 
20a050a8daSKostya Serebryany // Typical mapping on Linux/x86_64:
21a050a8daSKostya Serebryany // with dynamic shadow mapped at [0x770d59f40000, 0x7f0d59f40000]:
22d03fb0e3SAlex Shlyapnikov // || [0x7f0d59f40000, 0x7fffffffffff] || HighMem    ||
23d03fb0e3SAlex Shlyapnikov // || [0x7efe2f934000, 0x7f0d59f3ffff] || HighShadow ||
24d03fb0e3SAlex Shlyapnikov // || [0x7e7e2f934000, 0x7efe2f933fff] || ShadowGap  ||
25d03fb0e3SAlex Shlyapnikov // || [0x770d59f40000, 0x7e7e2f933fff] || LowShadow  ||
26d03fb0e3SAlex Shlyapnikov // || [0x000000000000, 0x770d59f3ffff] || LowMem     ||
27d03fb0e3SAlex Shlyapnikov 
28a050a8daSKostya Serebryany // Typical mapping on Android/AArch64
29a050a8daSKostya Serebryany // with dynamic shadow mapped: [0x007477480000, 0x007c77480000]:
30d03fb0e3SAlex Shlyapnikov // || [0x007c77480000, 0x007fffffffff] || HighMem    ||
31d03fb0e3SAlex Shlyapnikov // || [0x007c3ebc8000, 0x007c7747ffff] || HighShadow ||
32d03fb0e3SAlex Shlyapnikov // || [0x007bbebc8000, 0x007c3ebc7fff] || ShadowGap  ||
33d03fb0e3SAlex Shlyapnikov // || [0x007477480000, 0x007bbebc7fff] || LowShadow  ||
34d03fb0e3SAlex Shlyapnikov // || [0x000000000000, 0x00747747ffff] || LowMem     ||
35d03fb0e3SAlex Shlyapnikov 
36d03fb0e3SAlex Shlyapnikov // Reasonable values are 4 (for 1/16th shadow) and 6 (for 1/64th).
371e449886SKostya Serebryany constexpr uptr kShadowScale = 4;
381e449886SKostya Serebryany constexpr uptr kShadowAlignment = 1ULL << kShadowScale;
39d03fb0e3SAlex Shlyapnikov 
40d03fb0e3SAlex Shlyapnikov namespace __hwasan {
41d03fb0e3SAlex Shlyapnikov 
425d2be1a1STeresa Johnson extern uptr kLowMemStart;
435d2be1a1STeresa Johnson extern uptr kLowMemEnd;
445d2be1a1STeresa Johnson extern uptr kLowShadowEnd;
455d2be1a1STeresa Johnson extern uptr kLowShadowStart;
465d2be1a1STeresa Johnson extern uptr kHighShadowStart;
475d2be1a1STeresa Johnson extern uptr kHighShadowEnd;
485d2be1a1STeresa Johnson extern uptr kHighMemStart;
495d2be1a1STeresa Johnson extern uptr kHighMemEnd;
505d2be1a1STeresa Johnson 
GetShadowOffset()51fc006b3eSLeonard Chan inline uptr GetShadowOffset() {
52fc006b3eSLeonard Chan   return SANITIZER_FUCHSIA ? 0 : __hwasan_shadow_memory_dynamic_address;
53fc006b3eSLeonard Chan }
MemToShadow(uptr untagged_addr)541e449886SKostya Serebryany inline uptr MemToShadow(uptr untagged_addr) {
55fc006b3eSLeonard Chan   return (untagged_addr >> kShadowScale) + GetShadowOffset();
561e449886SKostya Serebryany }
ShadowToMem(uptr shadow_addr)571e449886SKostya Serebryany inline uptr ShadowToMem(uptr shadow_addr) {
58fc006b3eSLeonard Chan   return (shadow_addr - GetShadowOffset()) << kShadowScale;
591e449886SKostya Serebryany }
MemToShadowSize(uptr size)601e449886SKostya Serebryany inline uptr MemToShadowSize(uptr size) {
611e449886SKostya Serebryany   return size >> kShadowScale;
621e449886SKostya Serebryany }
631e449886SKostya Serebryany 
64d03fb0e3SAlex Shlyapnikov bool MemIsApp(uptr p);
65d03fb0e3SAlex Shlyapnikov 
MemIsShadow(uptr p)66a0b1f3aaSFlorian Mayer inline bool MemIsShadow(uptr p) {
67a0b1f3aaSFlorian Mayer   return (kLowShadowStart <= p && p <= kLowShadowEnd) ||
68a0b1f3aaSFlorian Mayer          (kHighShadowStart <= p && p <= kHighShadowEnd);
69a0b1f3aaSFlorian Mayer }
70a0b1f3aaSFlorian Mayer 
71*189c5525SLeonard Chan uptr GetAliasRegionStart();
72*189c5525SLeonard Chan 
73d03fb0e3SAlex Shlyapnikov }  // namespace __hwasan
74d03fb0e3SAlex Shlyapnikov 
75d03fb0e3SAlex Shlyapnikov #endif  // HWASAN_MAPPING_H
76