Skip to content

Commit a1094cd

Browse files
authored
Merge pull request #1638 from zhaomaosu/asan-shadow-scale-4
[DeviceSanitizer] Change ASan shadow scale from 3 to 4
2 parents 2a31795 + 6fb77c9 commit a1094cd

File tree

5 files changed

+30
-61
lines changed

5 files changed

+30
-61
lines changed

source/loader/layers/sanitizer/asan_interceptor.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,16 @@ namespace ur_sanitizer_layer {
2323
namespace {
2424

2525
uptr MemToShadow_CPU(uptr USM_SHADOW_BASE, uptr UPtr) {
26-
return USM_SHADOW_BASE + (UPtr >> 3);
26+
return USM_SHADOW_BASE + (UPtr >> ASAN_SHADOW_SCALE);
2727
}
2828

2929
uptr MemToShadow_PVC(uptr USM_SHADOW_BASE, uptr UPtr) {
3030
if (UPtr & 0xFF00000000000000ULL) { // Device USM
31-
return USM_SHADOW_BASE + 0x200000000000ULL +
32-
((UPtr & 0xFFFFFFFFFFFFULL) >> 3);
31+
return USM_SHADOW_BASE + 0x80000000000ULL +
32+
((UPtr & 0xFFFFFFFFFFFFULL) >> ASAN_SHADOW_SCALE);
3333
} else { // Only consider 47bit VA
34-
return USM_SHADOW_BASE + ((UPtr & 0x7FFFFFFFFFFFULL) >> 3);
34+
return USM_SHADOW_BASE +
35+
((UPtr & 0x7FFFFFFFFFFFULL) >> ASAN_SHADOW_SCALE);
3536
}
3637
}
3738

source/loader/layers/sanitizer/asan_libdevice.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ struct LaunchInfo {
7979
LocalArgsInfo *LocalArgs = nullptr; // ordered by ArgIndex
8080
};
8181

82-
constexpr unsigned ASAN_SHADOW_SCALE = 3;
82+
constexpr unsigned ASAN_SHADOW_SCALE = 4;
8383
constexpr unsigned ASAN_SHADOW_GRANULARITY = 1ULL << ASAN_SHADOW_SCALE;
8484

8585
// These magic values are written to shadow for better error

source/loader/layers/sanitizer/asan_shadow_setup.cpp

Lines changed: 19 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -17,67 +17,44 @@ namespace ur_sanitizer_layer {
1717

1818
namespace cpu {
1919

20-
// Based on "compiler-rt/lib/asan/asan_mapping.h"
21-
// Typical shadow mapping on Linux/x86_64 with SHADOW_OFFSET == 0x00007fff8000:
22-
constexpr uptr LOW_SHADOW_BEGIN = 0x00007fff8000ULL;
23-
constexpr uptr LOW_SHADOW_END = 0x00008fff6fffULL;
24-
constexpr uptr SHADOW_GAP_BEGIN = 0x00008fff7000ULL;
25-
constexpr uptr SHADOW_GAP_END = 0x02008fff6fffULL;
26-
constexpr uptr HIGH_SHADOW_BEGIN = 0x02008fff7000ULL;
27-
constexpr uptr HIGH_SHADOW_END = 0x10007fff7fffULL;
28-
constexpr uptr LOW_SHADOW_SIZE = LOW_SHADOW_END - LOW_SHADOW_BEGIN;
29-
constexpr uptr SHADOW_GAP_SIZE = SHADOW_GAP_END - SHADOW_GAP_BEGIN;
30-
constexpr uptr HIGH_SHADOW_SIZE = HIGH_SHADOW_END - HIGH_SHADOW_BEGIN;
31-
32-
bool IsShadowMemInited;
20+
constexpr size_t SHADOW_SIZE = 0x80000000000ULL;
21+
uptr SHADOW_BEGIN;
22+
uptr SHADOW_END;
23+
24+
bool IsShadowMemInited = false;
3325

3426
ur_result_t SetupShadowMemory(uptr &ShadowBegin, uptr &ShadowEnd) {
3527
static ur_result_t Result = []() {
36-
if (!MmapFixedNoReserve(LOW_SHADOW_BEGIN, LOW_SHADOW_SIZE)) {
37-
return UR_RESULT_ERROR_OUT_OF_HOST_MEMORY;
38-
}
39-
if (!MmapFixedNoReserve(HIGH_SHADOW_BEGIN, HIGH_SHADOW_SIZE)) {
40-
return UR_RESULT_ERROR_OUT_OF_HOST_MEMORY;
41-
}
42-
if (!MmapFixedNoAccess(SHADOW_GAP_BEGIN, SHADOW_GAP_SIZE)) {
28+
SHADOW_BEGIN = MmapNoReserve(0, SHADOW_SIZE);
29+
if (SHADOW_BEGIN == 0) {
4330
return UR_RESULT_ERROR_OUT_OF_HOST_MEMORY;
4431
}
32+
SHADOW_END = SHADOW_BEGIN + SHADOW_SIZE;
4533
IsShadowMemInited = true;
4634
return UR_RESULT_SUCCESS;
4735
}();
48-
ShadowBegin = LOW_SHADOW_BEGIN;
49-
ShadowEnd = HIGH_SHADOW_END;
36+
ShadowBegin = SHADOW_BEGIN;
37+
ShadowEnd = SHADOW_END;
5038
return Result;
5139
}
5240

5341
ur_result_t DestroyShadowMemory() {
54-
static ur_result_t Result = []() {
55-
if (!IsShadowMemInited) {
56-
return UR_RESULT_SUCCESS;
57-
}
58-
if (!Munmap(LOW_SHADOW_BEGIN, LOW_SHADOW_SIZE)) {
59-
return UR_RESULT_ERROR_UNKNOWN;
60-
}
61-
if (!Munmap(HIGH_SHADOW_BEGIN, HIGH_SHADOW_SIZE)) {
62-
return UR_RESULT_ERROR_UNKNOWN;
63-
}
64-
if (!Munmap(SHADOW_GAP_BEGIN, SHADOW_GAP_SIZE)) {
65-
return UR_RESULT_ERROR_UNKNOWN;
66-
}
42+
if (!IsShadowMemInited) {
6743
return UR_RESULT_SUCCESS;
68-
}();
69-
return Result;
44+
}
45+
if (!Munmap(SHADOW_BEGIN, SHADOW_SIZE)) {
46+
return UR_RESULT_ERROR_UNKNOWN;
47+
}
48+
return UR_RESULT_SUCCESS;
7049
}
7150

7251
} // namespace cpu
7352

7453
namespace pvc {
7554

76-
/// SHADOW MEMORY MAPPING (PVC, with CPU 47bit)
77-
/// Host/Shared USM : 0x0 ~ 0x0fff_ffff_ffff
78-
/// ? : 0x1000_0000_0000 ~ 0x1fff_ffff_ffff
79-
/// Device USM : 0x2000_0000_0000 ~ 0x3fff_ffff_ffff
80-
constexpr size_t SHADOW_SIZE = 1ULL << 46;
55+
/// Host/Shared USM : 0x0 ~ 0x07ff_ffff_ffff
56+
/// Device USM : 0x0800_0000_0000 ~ 0x17ff_ffff_ffff
57+
constexpr size_t SHADOW_SIZE = 0x180000000000ULL;
8158

8259
uptr LOW_SHADOW_BEGIN;
8360
uptr HIGH_SHADOW_END;

source/loader/layers/sanitizer/common.hpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,8 +140,7 @@ enum class DeviceType : uint64_t { UNKNOWN = 0, CPU, GPU_PVC, GPU_DG2 };
140140

141141
bool IsInASanContext();
142142

143-
bool MmapFixedNoReserve(uptr Addr, uptr Size);
144-
bool MmapFixedNoAccess(uptr Addr, uptr Size);
143+
uptr MmapNoReserve(uptr Addr, uptr Size);
145144
bool Munmap(uptr Addr, uptr Size);
146145

147146
void *GetMemFunctionPointer(const char *);

source/loader/layers/sanitizer/linux/sanitizer_utils.cpp

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,20 +27,12 @@ namespace ur_sanitizer_layer {
2727

2828
bool IsInASanContext() { return (void *)__asan_init != nullptr; }
2929

30-
bool MmapFixedNoReserve(uptr Addr, uptr Size) {
30+
uptr MmapNoReserve(uptr Addr, uptr Size) {
3131
Size = RoundUpTo(Size, EXEC_PAGESIZE);
3232
Addr = RoundDownTo(Addr, EXEC_PAGESIZE);
33-
void *P =
34-
mmap((void *)Addr, Size, PROT_READ | PROT_WRITE,
35-
MAP_PRIVATE | MAP_FIXED | MAP_NORESERVE | MAP_ANONYMOUS, -1, 0);
36-
return Addr == (uptr)P;
37-
}
38-
39-
bool MmapFixedNoAccess(uptr Addr, uptr Size) {
40-
void *P =
41-
mmap((void *)Addr, Size, PROT_NONE,
42-
MAP_PRIVATE | MAP_FIXED | MAP_NORESERVE | MAP_ANONYMOUS, -1, 0);
43-
return Addr == (uptr)P;
33+
void *P = mmap((void *)Addr, Size, PROT_READ | PROT_WRITE,
34+
MAP_PRIVATE | MAP_NORESERVE | MAP_ANONYMOUS, -1, 0);
35+
return (uptr)P;
4436
}
4537

4638
bool Munmap(uptr Addr, uptr Size) { return munmap((void *)Addr, Size) == 0; }

0 commit comments

Comments
 (0)