From 1ca95453989bc63aad4243786c649714cc715604 Mon Sep 17 00:00:00 2001 From: David Wrighton Date: Fri, 27 Sep 2024 12:21:49 -0700 Subject: [PATCH] Backport of Fix statics issue with barriers (#108311) * Fix statics issue with barriers * Add barriers for RiscV and Loongson --- src/coreclr/vm/arm64/asmhelpers.S | 6 ++++-- src/coreclr/vm/arm64/asmhelpers.asm | 6 ++++-- src/coreclr/vm/loongarch64/asmhelpers.S | 2 ++ src/coreclr/vm/methodtable.h | 8 ++++---- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/coreclr/vm/arm64/asmhelpers.S b/src/coreclr/vm/arm64/asmhelpers.S index 48c91e65a098de..e60401f6be5858 100644 --- a/src/coreclr/vm/arm64/asmhelpers.S +++ b/src/coreclr/vm/arm64/asmhelpers.S @@ -669,7 +669,8 @@ DynamicHelper DynamicHelperFrameFlags_ObjectArg | DynamicHelperFrameFlags_Object LEAF_ENTRY JIT_GetDynamicNonGCStaticBase_SingleAppDomain, _TEXT // If class is not initialized, bail to C++ helper - ldr x1, [x0, #OFFSETOF__DynamicStaticsInfo__m_pNonGCStatics] + add x1, x0, #OFFSETOF__DynamicStaticsInfo__m_pNonGCStatics + ldar x1, [x1] tbnz x1, #0, LOCAL_LABEL(JIT_GetDynamicNonGCStaticBase_SingleAppDomain_CallHelper) mov x0, x1 ret lr @@ -684,7 +685,8 @@ LEAF_END JIT_GetDynamicNonGCStaticBase_SingleAppDomain, _TEXT LEAF_ENTRY JIT_GetDynamicGCStaticBase_SingleAppDomain, _TEXT // If class is not initialized, bail to C++ helper - ldr x1, [x0, #OFFSETOF__DynamicStaticsInfo__m_pGCStatics] + add x1, x0, #OFFSETOF__DynamicStaticsInfo__m_pGCStatics + ldar x1, [x1] tbnz x1, #0, LOCAL_LABEL(JIT_GetDynamicGCStaticBase_SingleAppDomain_CallHelper) mov x0, x1 ret lr diff --git a/src/coreclr/vm/arm64/asmhelpers.asm b/src/coreclr/vm/arm64/asmhelpers.asm index b602b2cf9fc94e..d2ca15fcbf67eb 100644 --- a/src/coreclr/vm/arm64/asmhelpers.asm +++ b/src/coreclr/vm/arm64/asmhelpers.asm @@ -1029,7 +1029,8 @@ Fail LEAF_ENTRY JIT_GetDynamicNonGCStaticBase_SingleAppDomain ; If class is not initialized, bail to C++ helper - ldr x1, [x0, #OFFSETOF__DynamicStaticsInfo__m_pNonGCStatics] + add x1, x0, #OFFSETOF__DynamicStaticsInfo__m_pNonGCStatics + ldar x1, [x1] tbnz x1, #0, CallHelper1 mov x0, x1 ret lr @@ -1043,7 +1044,8 @@ CallHelper1 LEAF_ENTRY JIT_GetDynamicGCStaticBase_SingleAppDomain ; If class is not initialized, bail to C++ helper - ldr x1, [x0, #OFFSETOF__DynamicStaticsInfo__m_pGCStatics] + add x1, x0, #OFFSETOF__DynamicStaticsInfo__m_pGCStatics + ldar x1, [x1] tbnz x1, #0, CallHelper2 mov x0, x1 ret lr diff --git a/src/coreclr/vm/loongarch64/asmhelpers.S b/src/coreclr/vm/loongarch64/asmhelpers.S index 99889eee097c00..98fb2760a7bebb 100644 --- a/src/coreclr/vm/loongarch64/asmhelpers.S +++ b/src/coreclr/vm/loongarch64/asmhelpers.S @@ -950,6 +950,7 @@ LEAF_END setFPReturn, _TEXT LEAF_ENTRY JIT_GetDynamicNonGCStaticBase_SingleAppDomain, _TEXT // If class is not initialized, bail to C++ helper ld.d $a1, $a0, OFFSETOF__DynamicStaticsInfo__m_pNonGCStatics + dbar 0 bnez $a1, LOCAL_LABEL(JIT_GetDynamicNonGCStaticBase_SingleAppDomain_CallHelper) ori $a0, $a1, 0 jirl $r0, $ra, 0 @@ -965,6 +966,7 @@ LEAF_END JIT_GetDynamicNonGCStaticBase_SingleAppDomain, _TEXT LEAF_ENTRY JIT_GetDynamicGCStaticBase_SingleAppDomain, _TEXT // If class is not initialized, bail to C++ helper ld.d $a1, $a0, OFFSETOF__DynamicStaticsInfo__m_pGCStatics + dbar 0 bnez $a1, LOCAL_LABEL(JIT_GetDynamicGCStaticBase_SingleAppDomain_CallHelper) ori $a0, $a1, 0 jirl $r0, $ra, 0 diff --git a/src/coreclr/vm/methodtable.h b/src/coreclr/vm/methodtable.h index 79334cb03201fd..bc9496c672e54c 100644 --- a/src/coreclr/vm/methodtable.h +++ b/src/coreclr/vm/methodtable.h @@ -598,12 +598,12 @@ struct DynamicStaticsInfo TADDR m_pGCStatics; // Always access through helper methods to properly handle the ISCLASSNOTINITED bit TADDR m_pNonGCStatics; // Always access through helper methods to properly handle the ISCLASSNOTINITED bit PTR_MethodTable m_pMethodTable; - PTR_OBJECTREF GetGCStaticsPointer() { TADDR staticsVal = VolatileLoadWithoutBarrier(&m_pGCStatics); return dac_cast(staticsVal & STATICSPOINTERMASK); } - PTR_BYTE GetNonGCStaticsPointer() { TADDR staticsVal = VolatileLoadWithoutBarrier(&m_pNonGCStatics); return dac_cast(staticsVal & STATICSPOINTERMASK); } + PTR_OBJECTREF GetGCStaticsPointer() { TADDR staticsVal = VolatileLoad(&m_pGCStatics); return dac_cast(staticsVal & STATICSPOINTERMASK); } + PTR_BYTE GetNonGCStaticsPointer() { TADDR staticsVal = VolatileLoad(&m_pNonGCStatics); return dac_cast(staticsVal & STATICSPOINTERMASK); } PTR_OBJECTREF GetGCStaticsPointerAssumeIsInited() { TADDR staticsVal = m_pGCStatics; _ASSERTE(staticsVal != 0); _ASSERTE((staticsVal & (ISCLASSNOTINITEDMASK)) == 0); return dac_cast(staticsVal); } PTR_BYTE GetNonGCStaticsPointerAssumeIsInited() { TADDR staticsVal = m_pNonGCStatics; _ASSERTE(staticsVal != 0); _ASSERTE((staticsVal & (ISCLASSNOTINITEDMASK)) == 0); return dac_cast(staticsVal); } - bool GetIsInitedAndGCStaticsPointerIfInited(PTR_OBJECTREF *ptrResult) { TADDR staticsVal = VolatileLoadWithoutBarrier(&m_pGCStatics); *ptrResult = dac_cast(staticsVal); return !(staticsVal & ISCLASSNOTINITED); } - bool GetIsInitedAndNonGCStaticsPointerIfInited(PTR_BYTE *ptrResult) { TADDR staticsVal = VolatileLoadWithoutBarrier(&m_pNonGCStatics); *ptrResult = dac_cast(staticsVal); return !(staticsVal & ISCLASSNOTINITED); } + bool GetIsInitedAndGCStaticsPointerIfInited(PTR_OBJECTREF *ptrResult) { TADDR staticsVal = VolatileLoad(&m_pGCStatics); *ptrResult = dac_cast(staticsVal); return !(staticsVal & ISCLASSNOTINITED); } + bool GetIsInitedAndNonGCStaticsPointerIfInited(PTR_BYTE *ptrResult) { TADDR staticsVal = VolatileLoad(&m_pNonGCStatics); *ptrResult = dac_cast(staticsVal); return !(staticsVal & ISCLASSNOTINITED); } // This function sets the pointer portion of a statics pointer. It returns false if the statics value was already set. bool InterlockedUpdateStaticsPointer(bool isGC, TADDR newVal, bool isClassInitedByUpdatingStaticPointer)