This code (duplicated below, from gc_locks.h) is a little bit troublesome. I&#39;m not sure what the best way to resolve is, but I figured I&#39;d raise the issue anyways.<div><br></div><div>On most architectures, building for an old CPU then running on a newer one is safe. For example, running code compiled for i386 on a modern intel cpu generally turns out ok. </div>
<div><br></div><div>With mono+arm this is not the case. If I use gcc to build for arm with no -march/etc flags, gcc builds for armv5. If I run this mono on an SMP armv7a machine, I get deadlocks and terribleness, because test+set is broken. The comments seems to suggest that someone anticipated this issue, but never followed up.</div>
<div><br></div><div>Any ideas how we can make this experience better? If it&#39;s truly not possible to write a single code path that is suitable for both CPUs when building for armv5, maybe code built for armv5 should force mono into a single cpu or assert at boot if run on an SMP arm machine.</div>
<div><br></div><div>-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------<br><div><br>
</div><div><div>        inline static int GC_test_and_set(volatile unsigned int *addr) {#if defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7__)</div><div>          int ret, tmp;</div><div>          __asm__ __volatile__ (</div>
<div>                                 &quot;1:\n&quot;                                 &quot;ldrex %0, [%3]\n&quot;</div><div>                                 &quot;strex %1, %2, [%3]\n&quot; </div><div>                                 &quot;teq %1, #0\n&quot;</div>
<div>                                 &quot;bne 1b\n&quot;</div><div>                                 : &quot;=&amp;r&quot; (ret), &quot;=&amp;r&quot; (tmp)</div><div>                                 : &quot;r&quot; (1), &quot;r&quot; (addr)</div>
<div>                                 : &quot;memory&quot;, &quot;cc&quot;);</div><div>          return ret;</div><div>#else</div><div>          int oldval;</div><div>          /* SWP on ARM is very similar to XCHG on x86.  Doesn&#39;t lock the</div>
<div>           * bus because there are no SMP ARM machines.  If/when there are,</div><div>           * this code will likely need to be updated. */</div><div>          /* See linuxthreads/sysdeps/arm/pt-machine.h in glibc-2.1 */</div>
<div>          __asm__ __volatile__(&quot;swp %0, %1, [%2]&quot;</div><div>                             : &quot;=&amp;r&quot;(oldval)</div><div>                             : &quot;r&quot;(1), &quot;r&quot;(addr)</div><div>
                             : &quot;memory&quot;);</div><div>          return oldval;</div><div>#endif</div><div>        }</div></div></div>