@@ -197,8 +197,24 @@ static void DoResetImpl(uptr epoch) {
197
197
}
198
198
199
199
DPrintf (" Resetting shadow...\n " );
200
- if (!MmapFixedSuperNoReserve (ShadowBeg (), ShadowEnd () - ShadowBeg (),
201
- " shadow" )) {
200
+ auto shadow_begin = ShadowBeg ();
201
+ auto shadow_end = ShadowEnd ();
202
+ #if SANITIZER_GO
203
+ CHECK_NE (0 , ctx->mapped_shadow_begin );
204
+ shadow_begin = ctx->mapped_shadow_begin ;
205
+ shadow_end = ctx->mapped_shadow_end ;
206
+ VPrintf (2 , " shadow_begin-shadow_end: (0x%zx-0x%zx)\n " ,
207
+ shadow_begin, shadow_end);
208
+ #endif
209
+
210
+ #if SANITIZER_WINDOWS
211
+ auto resetFailed =
212
+ !ZeroMmapFixedRegion (shadow_begin, shadow_end - shadow_begin);
213
+ #else
214
+ auto resetFailed =
215
+ !MmapFixedSuperNoReserve (shadow_begin, shadow_end-shadow_begin, " shadow" );
216
+ #endif
217
+ if (resetFailed) {
202
218
Printf (" failed to reset shadow memory\n " );
203
219
Die ();
204
220
}
@@ -557,18 +573,50 @@ void UnmapShadow(ThreadState *thr, uptr addr, uptr size) {
557
573
#endif
558
574
559
575
void MapShadow (uptr addr, uptr size) {
576
+ // Ensure thead registry lock held, so as to synchronize
577
+ // with DoReset, which also access the mapped_shadow_* ctxt fields.
578
+ ThreadRegistryLock lock0 (&ctx->thread_registry );
579
+ static bool data_mapped = false ;
580
+
581
+ #if !SANITIZER_GO
560
582
// Global data is not 64K aligned, but there are no adjacent mappings,
561
583
// so we can get away with unaligned mapping.
562
584
// CHECK_EQ(addr, addr & ~((64 << 10) - 1)); // windows wants 64K alignment
563
585
const uptr kPageSize = GetPageSizeCached ();
564
586
uptr shadow_begin = RoundDownTo ((uptr)MemToShadow (addr), kPageSize );
565
587
uptr shadow_end = RoundUpTo ((uptr)MemToShadow (addr + size), kPageSize );
566
- if (!MmapFixedSuperNoReserve (shadow_begin, shadow_end - shadow_begin,
567
- " shadow" ))
588
+ if (!MmapFixedNoReserve (shadow_begin, shadow_end - shadow_begin, " shadow" ))
568
589
Die ();
590
+ #else
591
+ uptr shadow_begin = RoundDownTo ((uptr)MemToShadow (addr), (64 << 10 ));
592
+ uptr shadow_end = RoundUpTo ((uptr)MemToShadow (addr + size), (64 << 10 ));
593
+ VPrintf (2 , " MapShadow for (0x%zx-0x%zx), begin/end: (0x%zx-0x%zx)\n " ,
594
+ addr, addr + size, shadow_begin, shadow_end);
595
+
596
+ if (!data_mapped) {
597
+ // First call maps data+bss.
598
+ if (!MmapFixedSuperNoReserve (shadow_begin, shadow_end - shadow_begin, " shadow" ))
599
+ Die ();
600
+ } else {
601
+ VPrintf (2 , " ctx->mapped_shadow_{begin,end} = (0x%zx-0x%zx)\n " ,
602
+ ctx->mapped_shadow_begin , ctx->mapped_shadow_end );
603
+ // Second and subsequent calls map heap.
604
+ if (shadow_end <= ctx->mapped_shadow_end )
605
+ return ;
606
+ if (ctx->mapped_shadow_begin < shadow_begin)
607
+ ctx->mapped_shadow_begin = shadow_begin;
608
+ if (shadow_begin < ctx->mapped_shadow_end )
609
+ shadow_begin = ctx->mapped_shadow_end ;
610
+ VPrintf (2 , " MapShadow begin/end = (0x%zx-0x%zx)\n " ,
611
+ shadow_begin, shadow_end);
612
+ if (!MmapFixedSuperNoReserve (shadow_begin, shadow_end - shadow_begin,
613
+ " shadow" ))
614
+ Die ();
615
+ ctx->mapped_shadow_end = shadow_end;
616
+ }
617
+ #endif
569
618
570
619
// Meta shadow is 2:1, so tread carefully.
571
- static bool data_mapped = false ;
572
620
static uptr mapped_meta_end = 0 ;
573
621
uptr meta_begin = (uptr)MemToMeta (addr);
574
622
uptr meta_end = (uptr)MemToMeta (addr + size);
@@ -585,8 +633,7 @@ void MapShadow(uptr addr, uptr size) {
585
633
// Windows wants 64K alignment.
586
634
meta_begin = RoundDownTo (meta_begin, 64 << 10 );
587
635
meta_end = RoundUpTo (meta_end, 64 << 10 );
588
- if (meta_end <= mapped_meta_end)
589
- return ;
636
+ CHECK_GT (meta_end, mapped_meta_end);
590
637
if (meta_begin < mapped_meta_end)
591
638
meta_begin = mapped_meta_end;
592
639
if (!MmapFixedSuperNoReserve (meta_begin, meta_end - meta_begin,
0 commit comments