[mono][jit] Add some barriers to the delegate invoke code. (#83673)
authorZoltan Varga <vargaz@gmail.com>
Tue, 21 Mar 2023 19:06:30 +0000 (15:06 -0400)
committerGitHub <noreply@github.com>
Tue, 21 Mar 2023 19:06:30 +0000 (15:06 -0400)
Re: https://github.com/dotnet/runtime/issues/81123.

src/mono/mono/mini/mini-arm64.c
src/mono/mono/mini/mini-trampolines.c

index 55c26e0..47c6e86 100644 (file)
@@ -170,14 +170,16 @@ get_delegate_invoke_impl (gboolean has_target, gboolean param_count, guint32 *co
        MINI_BEGIN_CODEGEN ();
 
        if (has_target) {
-               start = code = mono_global_codeman_reserve (12);
+               int size = 16;
+               start = code = mono_global_codeman_reserve (size);
 
                /* Replace the this argument with the target */
+               arm_dmb (code, ARM_DMB_ISHLD);
                arm_ldrx (code, ARMREG_IP0, ARMREG_R0, MONO_STRUCT_OFFSET (MonoDelegate, method_ptr));
                arm_ldrx (code, ARMREG_R0, ARMREG_R0, MONO_STRUCT_OFFSET (MonoDelegate, target));
                code = mono_arm_emit_brx (code, ARMREG_IP0);
 
-               g_assert ((code - start) <= 12);
+               g_assert ((code - start) <= size);
        } else {
                int size, i;
 
index ebb2187..d4506c3 100644 (file)
@@ -1122,6 +1122,8 @@ mono_delegate_trampoline (host_mgreg_t *regs, guint8 *code, gpointer *arg, guint
                code = (guint8 *)mini_add_method_trampoline (m, code, mono_method_needs_static_rgctx_invoke (m, FALSE), FALSE);
        }
 
+       mono_memory_barrier ();
+
        delegate->invoke_impl = mono_get_addr_from_ftnptr (code);
        if (enable_caching && !callvirt && tramp_info->method) {
                tramp_info->method_ptr = delegate->method_ptr;