diff --git a/sys/arch/arm/include/lock.h b/sys/arch/arm/include/lock.h
index ba612d5..8e0e2f3 100644
--- a/src/sys/arch/arm/include/lock.h
+++ b/src/sys/arch/arm/include/lock.h
@@ -105,8 +105,18 @@ static __inline unsigned char
 __swp(unsigned char __val, __cpu_simple_lock_t *__ptr)
 {
 	uint32_t __val32;
+#ifdef _ARM_ARCH_6
 	__asm volatile("swpb	%0, %1, [%2]"
 	    : "=&r" (__val32) : "r" (__val), "r" (__ptr) : "memory");
+#else
+	__asm volatile(" 1:                  \n"
+	               "  ldrexb %0, [%2]    \n"
+	               "  strexb r0, %1, [%2]\n"
+	               "  teqeq  r0, #0      \n"
+	               "  bne 1b             \n"
+	               : "=&r" (__val32) : "r" (__val), "r" (__ptr)
+	               : "memory", "r0");
+#endif
 	return __val32;
 }
 #else
