The Ubuntu ARM gcc defaults to building in Thumb mode. The swp/swpb instructions only exist in ARM mode.
In any case, swp is deprecated for more recent ARM architectures (ARMv6 and above), and on ARMv7 MP it will UNDEF and have to be emulated in the kernel. So the testandset implementation should probably be replaced with something involving ldrex/strex for cores that support it, or by using the gcc sync primitives (needs a gcc 4.4.1 or better, I think). This Ubuntu bug: https://bugs.launchpad.net/ubuntu/+source/qemu- kvm/+bug/514252 has a patch which checks for the gcc primitives in configure and uses them if they exist -- you might like to try that. Or if we believe the comment at the top of qemu-lock.h that "most of this code should be redundant" we could do the cleanup to get rid of it completely :-) -- Build errors on TEGRA2(ubuntu), testandset() https://bugs.launchpad.net/bugs/670776 You received this bug notification because you are a member of qemu- devel-ml, which is subscribed to QEMU. Status in QEMU: New Bug description: Build errors on TEGRA2(ubuntu) /tmp/ccqt9Y5t.s: Assembler messages: /tmp/ccqt9Y5t.s:1899: Error: selected processor does not support Thumb mode 'swp r4, r4, [r2]' /tmp/ccqt9Y5t.s:1974: Error: selected processor does not support Thumb mode 'swp r5, r5, [ip]' make[1]: *** [exec.o Error 1 qemu-lock.h #elif defined(__arm__) static inline int testandset (int *spinlock) { register unsigned int ret; __asm__ __volatile__("swp %0, %1, [%2]" : "=r"(ret) : "0"(1), "r"(spinlock)); return ret; }