ARM: Add missing spinlock code
diff --git a/spinlock_arm.h b/spinlock_arm.h
new file mode 100644
index 0000000..6f6803e
--- /dev/null
+++ b/spinlock_arm.h
@@ -0,0 +1,70 @@
+/*
+ m5threads, a pthread library for the M5 simulator
+ Copyright (C) 2009, Stanford University
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+
+#ifndef __SPINLOCK_ARM_H__
+#define __SPINLOCK_ARM_H__
+
+static __inline__ void spin_lock (volatile int* lock) {
+ unsigned long tmp;
+
+ __asm__ __volatile__(
+"1: ldrex %0, [%1]\n"
+" cmp %0, #0\n"
+" strexeq %0, %2, [%1]\n"
+" cmpeq %0, #0\n"
+" bne 1b\n"
+" dmb\n"
+ : "=&r" (tmp)
+ : "r" (lock), "r" (1)
+ : "cc");
+
+}
+
+static __inline__ void spin_unlock (volatile int* lock) {
+
+
+ __asm__ __volatile__(
+" dmb\n"
+" str %1, [%0]\n"
+ :
+ : "r" (lock), "r" (0)
+ : "cc");
+}
+
+
+static __inline__ int trylock (volatile int* lock) {
+ unsigned long tmp;
+
+ __asm__ __volatile__(
+" ldrex %0, [%1]\n"
+" cmp %0, #0\n"
+" strexeq %0, %2, [%1]\n"
+" eor %0, %0, #1\n"
+" bne fail\n"
+" dmb\n"
+"fail: nop\n"
+ : "=&r" (tmp)
+ : "r" (lock), "r" (1)
+ : "cc", "memory");
+
+ return tmp;
+}
+
+#endif // __SPINLOCK_ARM_H__