Skip to content
This repository was archived by the owner on Jan 23, 2023. It is now read-only.

Commit 060dc1d

Browse files
sdmacleajkotas
authored andcommitted
[Arm64/Unix] Enable FEATURE_USE_SOFTWARE_WRITE_WATCH_FOR_GC_HEAP (#11375)
* [Arm64/Unix] Enable FEATURE_USE_SOFTWARE_WRITE_WATCH_FOR_GC_HEAP * [Arm64/Unix] Enable FEATURE_MANUALLY_MANAGED_CARD_BUNDLES
1 parent 30a0932 commit 060dc1d

File tree

4 files changed

+49
-3
lines changed

4 files changed

+49
-3
lines changed

clrdefinitions.cmake

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,10 +177,10 @@ if(CLR_CMAKE_PLATFORM_UNIX_AMD64)
177177
add_definitions(-DFEATURE_UNIX_AMD64_STRUCT_PASSING)
178178
endif (CLR_CMAKE_PLATFORM_UNIX_AMD64)
179179
add_definitions(-DFEATURE_USE_ASM_GC_WRITE_BARRIERS)
180-
if(CLR_CMAKE_PLATFORM_ARCH_AMD64 AND NOT WIN32)
180+
if((CLR_CMAKE_PLATFORM_ARCH_AMD64 OR CLR_CMAKE_PLATFORM_ARCH_ARM64) AND NOT WIN32)
181181
add_definitions(-DFEATURE_MANUALLY_MANAGED_CARD_BUNDLES)
182182
add_definitions(-DFEATURE_USE_SOFTWARE_WRITE_WATCH_FOR_GC_HEAP)
183-
endif(CLR_CMAKE_PLATFORM_ARCH_AMD64 AND NOT WIN32)
183+
endif((CLR_CMAKE_PLATFORM_ARCH_AMD64 OR CLR_CMAKE_PLATFORM_ARCH_ARM64) AND NOT WIN32)
184184
if(WIN32)
185185
add_definitions(-DFEATURE_VERSIONING_LOG)
186186
endif(WIN32)

src/jit/target.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1573,7 +1573,7 @@ typedef unsigned short regPairNoSmall; // arm: need 12 bits
15731573

15741574
#define RBM_CALLEE_SAVED (RBM_INT_CALLEE_SAVED | RBM_FLT_CALLEE_SAVED)
15751575
#define RBM_CALLEE_TRASH (RBM_INT_CALLEE_TRASH | RBM_FLT_CALLEE_TRASH)
1576-
#define RBM_CALLEE_TRASH_NOGC (RBM_R12|RBM_R13|RBM_R14|RBM_R15)
1576+
#define RBM_CALLEE_TRASH_NOGC (RBM_R12|RBM_R13|RBM_R14|RBM_R15|RBM_IP1)
15771577
#define REG_DEFAULT_HELPER_CALL_TARGET REG_R12
15781578

15791579
#define RBM_ALLINT (RBM_INT_CALLEE_SAVED | RBM_INT_CALLEE_TRASH)

src/vm/arm64/asmhelpers.S

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ LEAF_END ThePreStubPatch, _TEXT
217217
// x13 : incremented by 8
218218
// x14 : incremented by 8
219219
// x15 : trashed
220+
// x17 : trashed (ip1) if FEATURE_USE_SOFTWARE_WRITE_WATCH_FOR_GC_HEAP
220221
//
221222
WRITE_BARRIER_ENTRY JIT_ByRefWriteBarrier
222223

@@ -236,6 +237,7 @@ WRITE_BARRIER_END JIT_ByRefWriteBarrier
236237
// x12 : trashed
237238
// x14 : incremented by 8
238239
// x15 : trashed
240+
// x17 : trashed (ip1) if FEATURE_USE_SOFTWARE_WRITE_WATCH_FOR_GC_HEAP
239241
//
240242
WRITE_BARRIER_ENTRY JIT_CheckedWriteBarrier
241243
PREPARE_EXTERNAL_VAR g_lowest_address, x12
@@ -262,6 +264,7 @@ WRITE_BARRIER_END JIT_CheckedWriteBarrier
262264
// x12 : trashed
263265
// x14 : incremented by 8
264266
// x15 : trashed
267+
// x17 : trashed (ip1) if FEATURE_USE_SOFTWARE_WRITE_WATCH_FOR_GC_HEAP
265268
//
266269
WRITE_BARRIER_ENTRY JIT_WriteBarrier
267270
dmb ST
@@ -310,6 +313,21 @@ LOCAL_LABEL(shadowupdateend):
310313
ldp x12, x13, [sp],#16
311314
#endif
312315

316+
#ifdef FEATURE_USE_SOFTWARE_WRITE_WATCH_FOR_GC_HEAP
317+
// Update the write watch table if necessary
318+
PREPARE_EXTERNAL_VAR g_sw_ww_enabled_for_gc_heap, x12
319+
ldrb w12, [x12]
320+
cbz x12, LOCAL_LABEL(CheckCardTable)
321+
PREPARE_EXTERNAL_VAR g_sw_ww_table, x12
322+
ldr x12, [x12]
323+
add x12, x12, x14, lsr #0xc // SoftwareWriteWatch::AddressToTableByteIndexShift
324+
ldrb w17, [x12]
325+
cbnz x17, LOCAL_LABEL(CheckCardTable)
326+
mov w17, #0xFF
327+
strb w17, [x12]
328+
#endif
329+
330+
LOCAL_LABEL(CheckCardTable):
313331
// Branch to Exit if the reference is not in the Gen0 heap
314332
//
315333
PREPARE_EXTERNAL_VAR g_ephemeral_low, x12
@@ -333,6 +351,21 @@ LOCAL_LABEL(shadowupdateend):
333351
LOCAL_LABEL(UpdateCardTable):
334352
mov x12, 0xFF
335353
strb w12, [x15]
354+
355+
#ifdef FEATURE_MANUALLY_MANAGED_CARD_BUNDLES
356+
// Check if we need to update the card table
357+
PREPARE_EXTERNAL_VAR g_card_bundle_table, x12
358+
ldr x12, [x12]
359+
add x15, x12, x14, lsr #21
360+
ldrb w12, [x15]
361+
cmp x12, 0xFF
362+
beq LOCAL_LABEL(Exit)
363+
364+
LOCAL_LABEL(UpdateCardBundle):
365+
mov x12, 0xFF
366+
strb w12, [x15]
367+
#endif
368+
336369
LOCAL_LABEL(Exit):
337370
add x14, x14, 8
338371
ret lr

src/vm/arm64/stubs.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1317,6 +1317,19 @@ void StompWriteBarrierResize(bool isRuntimeSuspended, bool bReqUpperBoundsCheck)
13171317
return;
13181318
}
13191319

1320+
#ifdef FEATURE_USE_SOFTWARE_WRITE_WATCH_FOR_GC_HEAP
1321+
void SwitchToWriteWatchBarrier(bool isRuntimeSuspended)
1322+
{
1323+
return;
1324+
}
1325+
1326+
void SwitchToNonWriteWatchBarrier(bool isRuntimeSuspended)
1327+
{
1328+
return;
1329+
}
1330+
#endif // FEATURE_USE_SOFTWARE_WRITE_WATCH_FOR_GC_HEAP
1331+
1332+
13201333
#ifdef DACCESS_COMPILE
13211334
BOOL GetAnyThunkTarget (T_CONTEXT *pctx, TADDR *pTarget, TADDR *pTargetMethodDesc)
13221335
{

0 commit comments

Comments
 (0)