Skip to content

Commit 5522dd8

Browse files
committed
Unity GC write barrier patch
This is a temporary patch to allow our NULL GC to work with upstream changes. Check the upper bounds in JIT_WriteBarrier_PreGrow64 and JIT_WriteBarrier_WriteWatch_PreGrow64. We must remove this when we return to default coreclr gc.
1 parent c729824 commit 5522dd8

File tree

4 files changed

+97
-0
lines changed

4 files changed

+97
-0
lines changed

src/coreclr/clrdefinitions.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ if(FEATURE_UNITY_EMBEDDING_INTERFACE)
118118
add_definitions(-DFEATURE_UNITY_ASSEMBLY_MEMORY_PATH)
119119
add_definitions(-DFEATURE_UNITY_MODULE_NUM_TYPEDEFS)
120120
add_definitions(-DFEATURE_UNITY_EXPLICIT_LAYOUT_INHERITANCE)
121+
add_definitions(-DFEATURE_UNITY_NULLGC_WRITEBARRIER_PATCH)
121122
endif()
122123
if(FEATURE_GDBJIT)
123124
add_definitions(-DFEATURE_GDBJIT)

src/coreclr/vm/amd64/JitHelpers_FastWriteBarriers.asm

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,17 @@ PATCH_LABEL JIT_WriteBarrier_PreGrow64_Patch_Label_Lower
5656

5757
nop ; padding for alignment of constant
5858

59+
ifdef FEATURE_UNITY_NULLGC_WRITEBARRIER_PATCH
60+
61+
PATCH_LABEL JIT_WriteBarrier_PreGrow64_Patch_Label_Upper
62+
mov r8, 0F0F0F0F0F0F0F0F0h
63+
64+
cmp rdx, r8
65+
jae Exit
66+
67+
nop ; padding for alignment of constant
68+
endif
69+
5970
PATCH_LABEL JIT_WriteBarrier_PreGrow64_Patch_Label_CardTable
6071
mov rax, 0F0F0F0F0F0F0F0F0h
6172

@@ -384,6 +395,18 @@ PATCH_LABEL JIT_WriteBarrier_WriteWatch_PreGrow64_Patch_Label_Lower
384395
; Touch the card table entry, if not already dirty.
385396
shr rcx, 0Bh
386397
NOP_2_BYTE ; padding for alignment of constant
398+
399+
ifdef FEATURE_UNITY_NULLGC_WRITEBARRIER_PATCH
400+
401+
PATCH_LABEL JIT_WriteBarrier_WriteWatch_PreGrow64_Patch_Label_Upper
402+
mov r8, 0F0F0F0F0F0F0F0F0h
403+
404+
cmp rdx, r8
405+
jae Exit
406+
407+
nop ; padding for alignment of constant
408+
endif
409+
387410
PATCH_LABEL JIT_WriteBarrier_WriteWatch_PreGrow64_Patch_Label_CardTable
388411
mov rax, 0F0F0F0F0F0F0F0F0h
389412
cmp byte ptr [rcx + rax], 0FFh

src/coreclr/vm/amd64/jithelpers_fastwritebarriers.S

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,23 @@ PATCH_LABEL JIT_WriteBarrier_PreGrow64_Patch_Label_Lower
3232

3333
nop // padding for alignment of constant
3434

35+
#ifdef FEATURE_UNITY_NULLGC_WRITEBARRIER_PATCH
36+
37+
PATCH_LABEL JIT_WriteBarrier_PreGrow64_Patch_Label_Upper
38+
movabs r8, 0xF0F0F0F0F0F0F0F0
39+
40+
cmp rsi, r8
41+
42+
#ifdef FEATURE_MANUALLY_MANAGED_CARD_BUNDLES
43+
.byte 0x73, 0x4b
44+
#else
45+
.byte 0x73, 0x2b
46+
#endif
47+
// jae Exit_PreGrow64
48+
49+
nop // padding for alignment of constant
50+
#endif
51+
3552
PATCH_LABEL JIT_WriteBarrier_PreGrow64_Patch_Label_CardTable
3653
movabs rax, 0xF0F0F0F0F0F0F0F0
3754

@@ -415,6 +432,24 @@ PATCH_LABEL JIT_WriteBarrier_WriteWatch_PreGrow64_Patch_Label_Lower
415432
// Touch the card table entry, if not already dirty.
416433
shr rdi, 0x0B
417434
NOP_2_BYTE // padding for alignment of constant
435+
436+
#ifdef FEATURE_UNITY_NULLGC_WRITEBARRIER_PATCH
437+
438+
PATCH_LABEL JIT_WriteBarrier_WriteWatch_PreGrow64_Patch_Label_Upper
439+
movabs r10, 0xF0F0F0F0F0F0F0F0
440+
441+
cmp rsi, r10
442+
443+
#ifdef FEATURE_MANUALLY_MANAGED_CARD_BUNDLES
444+
.byte 0x73, 0x3b
445+
#else
446+
.byte 0x73, 0x2b
447+
#endif
448+
// jae Exit_WriteWatch_PreGrow64
449+
450+
nop // padding for alignment of constant
451+
#endif
452+
418453
PATCH_LABEL JIT_WriteBarrier_WriteWatch_PreGrow64_Patch_Label_CardTable
419454
movabs rax, 0xF0F0F0F0F0F0F0F0
420455
cmp byte ptr [rdi + rax], 0xFF

src/coreclr/vm/amd64/jitinterfaceamd64.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ EXTERN_C void JIT_WriteBarrier_End();
2626

2727
EXTERN_C void JIT_WriteBarrier_PreGrow64(Object **dst, Object *ref);
2828
EXTERN_C void JIT_WriteBarrier_PreGrow64_Patch_Label_Lower();
29+
#ifdef FEATURE_UNITY_NULLGC_WRITEBARRIER_PATCH
30+
EXTERN_C void JIT_WriteBarrier_PreGrow64_Patch_Label_Upper();
31+
#endif
2932
EXTERN_C void JIT_WriteBarrier_PreGrow64_Patch_Label_CardTable();
3033
#ifdef FEATURE_MANUALLY_MANAGED_CARD_BUNDLES
3134
EXTERN_C void JIT_WriteBarrier_PreGrow64_Patch_Label_CardBundleTable();
@@ -79,6 +82,9 @@ EXTERN_C void JIT_WriteBarrier_Bit_Region64_End();
7982
EXTERN_C void JIT_WriteBarrier_WriteWatch_PreGrow64(Object **dst, Object *ref);
8083
EXTERN_C void JIT_WriteBarrier_WriteWatch_PreGrow64_Patch_Label_WriteWatchTable();
8184
EXTERN_C void JIT_WriteBarrier_WriteWatch_PreGrow64_Patch_Label_Lower();
85+
#ifdef FEATURE_UNITY_NULLGC_WRITEBARRIER_PATCH
86+
EXTERN_C void JIT_WriteBarrier_WriteWatch_PreGrow64_Patch_Label_Upper();
87+
#endif
8288
EXTERN_C void JIT_WriteBarrier_WriteWatch_PreGrow64_Patch_Label_CardTable();
8389
#ifdef FEATURE_MANUALLY_MANAGED_CARD_BUNDLES
8490
EXTERN_C void JIT_WriteBarrier_WriteWatch_PreGrow64_Patch_Label_CardBundleTable();
@@ -172,9 +178,15 @@ void WriteBarrierManager::Validate()
172178
#endif
173179

174180
pLowerBoundImmediate = CALC_PATCH_LOCATION(JIT_WriteBarrier_PreGrow64, Patch_Label_Lower, 2);
181+
#ifdef FEATURE_UNITY_NULLGC_WRITEBARRIER_PATCH
182+
pUpperBoundImmediate = CALC_PATCH_LOCATION(JIT_WriteBarrier_PreGrow64, Patch_Label_Upper, 2);
183+
#endif
175184
pCardTableImmediate = CALC_PATCH_LOCATION(JIT_WriteBarrier_PreGrow64, Patch_Label_CardTable, 2);
176185

177186
_ASSERTE_ALL_BUILDS((reinterpret_cast<UINT64>(pLowerBoundImmediate) & 0x7) == 0);
187+
#ifdef FEATURE_UNITY_NULLGC_WRITEBARRIER_PATCH
188+
_ASSERTE_ALL_BUILDS((reinterpret_cast<UINT64>(pUpperBoundImmediate) & 0x7) == 0);
189+
#endif
178190
_ASSERTE_ALL_BUILDS((reinterpret_cast<UINT64>(pCardTableImmediate) & 0x7) == 0);
179191

180192
#ifdef FEATURE_MANUALLY_MANAGED_CARD_BUNDLES
@@ -239,10 +251,16 @@ void WriteBarrierManager::Validate()
239251

240252
pWriteWatchTableImmediate = CALC_PATCH_LOCATION(JIT_WriteBarrier_WriteWatch_PreGrow64, Patch_Label_WriteWatchTable, 2);
241253
pLowerBoundImmediate = CALC_PATCH_LOCATION(JIT_WriteBarrier_WriteWatch_PreGrow64, Patch_Label_Lower, 2);
254+
#ifdef FEATURE_UNITY_NULLGC_WRITEBARRIER_PATCH
255+
pUpperBoundImmediate = CALC_PATCH_LOCATION(JIT_WriteBarrier_WriteWatch_PreGrow64, Patch_Label_Upper, 2);
256+
#endif
242257
pCardTableImmediate = CALC_PATCH_LOCATION(JIT_WriteBarrier_WriteWatch_PreGrow64, Patch_Label_CardTable, 2);
243258

244259
_ASSERTE_ALL_BUILDS((reinterpret_cast<UINT64>(pWriteWatchTableImmediate) & 0x7) == 0);
245260
_ASSERTE_ALL_BUILDS((reinterpret_cast<UINT64>(pLowerBoundImmediate) & 0x7) == 0);
261+
#ifdef FEATURE_UNITY_NULLGC_WRITEBARRIER_PATCH
262+
_ASSERTE_ALL_BUILDS((reinterpret_cast<UINT64>(pUpperBoundImmediate) & 0x7) == 0);
263+
#endif
246264
_ASSERTE_ALL_BUILDS((reinterpret_cast<UINT64>(pCardTableImmediate) & 0x7) == 0);
247265

248266
#ifdef FEATURE_MANUALLY_MANAGED_CARD_BUNDLES
@@ -433,11 +451,17 @@ int WriteBarrierManager::ChangeWriteBarrierTo(WriteBarrierType newWriteBarrier,
433451
case WRITE_BARRIER_PREGROW64:
434452
{
435453
m_pLowerBoundImmediate = CALC_PATCH_LOCATION(JIT_WriteBarrier_PreGrow64, Patch_Label_Lower, 2);
454+
#ifdef FEATURE_UNITY_NULLGC_WRITEBARRIER_PATCH
455+
m_pUpperBoundImmediate = CALC_PATCH_LOCATION(JIT_WriteBarrier_PreGrow64, Patch_Label_Upper, 2);
456+
#endif
436457
m_pCardTableImmediate = CALC_PATCH_LOCATION(JIT_WriteBarrier_PreGrow64, Patch_Label_CardTable, 2);
437458

438459
// Make sure that we will be bashing the right places (immediates should be hardcoded to 0x0f0f0f0f0f0f0f0f0).
439460
_ASSERTE_ALL_BUILDS(0xf0f0f0f0f0f0f0f0 == *(UINT64*)m_pLowerBoundImmediate);
440461
_ASSERTE_ALL_BUILDS(0xf0f0f0f0f0f0f0f0 == *(UINT64*)m_pCardTableImmediate);
462+
#ifdef FEATURE_UNITY_NULLGC_WRITEBARRIER_PATCH
463+
_ASSERTE_ALL_BUILDS(0xf0f0f0f0f0f0f0f0 == *(UINT64*)m_pUpperBoundImmediate);
464+
#endif
441465

442466
#ifdef FEATURE_MANUALLY_MANAGED_CARD_BUNDLES
443467
m_pCardBundleTableImmediate = CALC_PATCH_LOCATION(JIT_WriteBarrier_PreGrow64, Patch_Label_CardBundleTable, 2);
@@ -529,11 +553,17 @@ int WriteBarrierManager::ChangeWriteBarrierTo(WriteBarrierType newWriteBarrier,
529553
{
530554
m_pWriteWatchTableImmediate = CALC_PATCH_LOCATION(JIT_WriteBarrier_WriteWatch_PreGrow64, Patch_Label_WriteWatchTable, 2);
531555
m_pLowerBoundImmediate = CALC_PATCH_LOCATION(JIT_WriteBarrier_WriteWatch_PreGrow64, Patch_Label_Lower, 2);
556+
#ifdef FEATURE_UNITY_NULLGC_WRITEBARRIER_PATCH
557+
m_pUpperBoundImmediate = CALC_PATCH_LOCATION(JIT_WriteBarrier_WriteWatch_PreGrow64, Patch_Label_Upper, 2);
558+
#endif
532559
m_pCardTableImmediate = CALC_PATCH_LOCATION(JIT_WriteBarrier_WriteWatch_PreGrow64, Patch_Label_CardTable, 2);
533560

534561
// Make sure that we will be bashing the right places (immediates should be hardcoded to 0x0f0f0f0f0f0f0f0f0).
535562
_ASSERTE_ALL_BUILDS(0xf0f0f0f0f0f0f0f0 == *(UINT64*)m_pWriteWatchTableImmediate);
536563
_ASSERTE_ALL_BUILDS(0xf0f0f0f0f0f0f0f0 == *(UINT64*)m_pLowerBoundImmediate);
564+
#ifdef FEATURE_UNITY_NULLGC_WRITEBARRIER_PATCH
565+
_ASSERTE_ALL_BUILDS(0xf0f0f0f0f0f0f0f0 == *(UINT64*)m_pUpperBoundImmediate);
566+
#endif
537567
_ASSERTE_ALL_BUILDS(0xf0f0f0f0f0f0f0f0 == *(UINT64*)m_pCardTableImmediate);
538568

539569
#ifdef FEATURE_MANUALLY_MANAGED_CARD_BUNDLES
@@ -788,6 +818,12 @@ int WriteBarrierManager::UpdateEphemeralBounds(bool isRuntimeSuspended)
788818
case WRITE_BARRIER_WRITE_WATCH_BYTE_REGIONS64:
789819
case WRITE_BARRIER_WRITE_WATCH_BIT_REGIONS64:
790820
#endif // FEATURE_USE_SOFTWARE_WRITE_WATCH_FOR_GC_HEAP
821+
#ifdef FEATURE_UNITY_NULLGC_WRITEBARRIER_PATCH
822+
case WRITE_BARRIER_PREGROW64:
823+
#ifdef FEATURE_USE_SOFTWARE_WRITE_WATCH_FOR_GC_HEAP
824+
case WRITE_BARRIER_WRITE_WATCH_PREGROW64:
825+
#endif // FEATURE_USE_SOFTWARE_WRITE_WATCH_FOR_GC_HEAP
826+
#endif // FEATURE_UNITY_NULLGC_WRITEBARRIER_PATCH
791827
{
792828
// Change immediate if different from new g_ephermeral_high.
793829
if (*(UINT64*)m_pUpperBoundImmediate != (size_t)g_ephemeral_high)
@@ -797,11 +833,13 @@ int WriteBarrierManager::UpdateEphemeralBounds(bool isRuntimeSuspended)
797833
stompWBCompleteActions |= SWB_ICACHE_FLUSH;
798834
}
799835
}
836+
#ifndef FEATURE_UNITY_NULLGC_WRITEBARRIER_PATCH
800837
FALLTHROUGH;
801838
case WRITE_BARRIER_PREGROW64:
802839
#ifdef FEATURE_USE_SOFTWARE_WRITE_WATCH_FOR_GC_HEAP
803840
case WRITE_BARRIER_WRITE_WATCH_PREGROW64:
804841
#endif // FEATURE_USE_SOFTWARE_WRITE_WATCH_FOR_GC_HEAP
842+
#endif // FEATURE_UNITY_NULLGC_WRITEBARRIER_PATCH
805843
{
806844
// Change immediate if different from new g_ephermeral_low.
807845
if (*(UINT64*)m_pLowerBoundImmediate != (size_t)g_ephemeral_low)

0 commit comments

Comments
 (0)