Index: soft/giet_vm/giet_libs/spin_lock.c
===================================================================
--- soft/giet_vm/giet_libs/spin_lock.c	(revision 265)
+++ soft/giet_vm/giet_libs/spin_lock.c	(revision 266)
@@ -30,29 +30,30 @@
 void lock_acquire(giet_lock_t * lock) {
     unsigned int * plock = &lock->value;
+    unsigned int delay = giet_rand();
+
+    if (delay == 0) delay++;
 
     asm volatile (
-            "move $16, %0                   \n"
-            "giet_lock_try :                \n"
-            "ll   $2,    0($16)             \n" /* $2 <= lock current value */
-            "bnez $2,    giet_lock_delay    \n" /* retry if lock already taken */
-            "li   $3,    1                  \n" /* $3 <= argument for sc */
-            "sc   $3,    0($16)             \n" /* try to get lock */
-            "bnez $3,    giet_lock_ok       \n" /* exit if atomic */
+            "giet_lock_try:              \n"
+            "ll   $2,    0(%0)           \n" /* $2 <= _ioc_lock current value */
+            "bnez $2,    giet_lock_delay \n" /* delay if _ioc_lock already taken */
+            "li   $3,    1               \n" /* $3 <= argument for sc */
+            "sc   $3,    0(%0)           \n" /* try to set _ioc_lock */
+            "bnez $3,    giet_lock_ok    \n" /* exit if atomic */
 
-            "giet_lock_delay:               \n"
-            "jal  giet_rand                 \n" /* giet_rand() system call */
-            "nop                            \n"
-            "andi $4,    $2,    0xFF        \n" /* $4 <= delay < 256 cycles */
+            "giet_lock_delay:            \n"
+            "move $4,    %1              \n" /* $4 <= delay */
 
-            "giet_lock_loop:                \n"
-            "addi $4,    $4,  -1            \n" /* $4 <= $4 - 1 */
-            "beqz $4,    giet_lock_loop     \n" /* test end delay */
-            "nop                            \n"
-            "j           giet_lock_try      \n" /* retry */
-            "nop                            \n"
-            "giet_lock_ok:                  \n"
+            "giet_lock_loop:             \n"
+            "addi $4,    $4,    -1       \n" /* $4 <= $4 - 1 */
+            "bnez $4,    giet_lock_loop  \n" /* test end delay */
+            "nop                         \n"
+            "j           giet_lock_try   \n" /* retry */
+            "nop                         \n"
+
+            "giet_lock_ok:               \n"
             :
-            :"r"(plock)
-            :"$2", "$3", "$4", "$16");
+            :"r"(plock), "r"(delay)
+            :"$2", "$3", "$4");
 }
 
@@ -62,5 +63,8 @@
 //////////////////////////////////////////////////////////////////////////////
 void lock_release(giet_lock_t * lock) {
-    lock->value = 0;
+    unsigned int * plock = &lock->value;
+
+    asm volatile ( "sync\n" ); // necessary because of the TSAR consistency model 
+    *plock = 0;
 }
 
