Index: /soft/giet_vm/giet_common/kernel_locks.c
===================================================================
--- /soft/giet_vm/giet_common/kernel_locks.c	(revision 631)
+++ /soft/giet_vm/giet_common/kernel_locks.c	(revision 632)
@@ -26,5 +26,5 @@
         "ll   $12,   0($10)            \n"   /* $12 <= *ptr              */
         "addu $13,   $11,    $12       \n"   /* $13 <= *ptr + increment  */
-        "sc   $13,   0($10)            \n"   /* M[ptr] <= new            */ 
+        "sc   $13,   0($10)            \n"   /* *ptr <= $12              */ 
         "beqz $13,   1234b             \n"   /* retry if failure         */
         "move %0,    $12               \n"   /* value <= *ptr if success */
@@ -34,4 +34,40 @@
 
     return value;
+}
+
+////////////////////////////////////
+void _atomic_or( unsigned int* ptr,
+                 unsigned int  mask )
+{
+    asm volatile (
+        "1789:                         \n"
+        "move $10,   %0                \n"   /* $10 <= ptr               */
+        "move $11,   %1                \n"   /* $11 <= mask              */
+        "ll   $12,   0($10)            \n"   /* $12 <= *ptr              */
+        "or   $12,   $11,    $12       \n"   /* $12 <= *ptr | mask       */
+        "sc   $12,   0($10)            \n"   /* *ptr <= $12              */ 
+        "beqz $12,   1789b             \n"   /* retry if failure         */
+        "nop                           \n"  
+        :
+        : "r" (ptr), "r" (mask)
+        : "$10", "$11", "$12", "memory" );
+}
+
+////////////////////////////////////
+void _atomic_and( unsigned int* ptr,
+                  unsigned int  mask )
+{
+    asm volatile (
+        "1945:                         \n"
+        "move $10,   %0                \n"   /* $10 <= ptr               */
+        "move $11,   %1                \n"   /* $11 <= mask              */
+        "ll   $12,   0($10)            \n"   /* $12 <= *ptr              */
+        "and  $12,   $11,    $12       \n"   /* $13 <= *ptr & mask       */
+        "sc   $12,   0($10)            \n"   /* *ptr <= new              */ 
+        "beqz $12,   1945b             \n"   /* retry if failure         */
+        "nop                           \n"  
+        :
+        : "r" (ptr), "r" (mask)
+        : "$10", "$11", "$12", "memory" );
 }
 
Index: /soft/giet_vm/giet_common/kernel_locks.h
===================================================================
--- /soft/giet_vm/giet_common/kernel_locks.h	(revision 631)
+++ /soft/giet_vm/giet_common/kernel_locks.h	(revision 632)
@@ -13,4 +13,18 @@
 
 #include "hard_config.h"
+
+
+//////////////////////////////////////////////////////////////////////////////
+//      Atomic access functions using LL/SC instructions
+//////////////////////////////////////////////////////////////////////////////
+
+extern unsigned int _atomic_increment( unsigned int* ptr,
+                                       int  increment );
+
+extern void _atomic_or( unsigned int* ptr,
+                        unsigned int  mask );
+
+extern void _atomic_and( unsigned int* ptr,
+                         unsigned int  mask );
 
 //////////////////////////////////////////////////////////////////////////////
@@ -38,7 +52,4 @@
     unsigned int padding[14];    // for 64 bytes alignment
 } spin_lock_t;
-
-extern unsigned int _atomic_increment( unsigned int* ptr,
-                                       int  increment );
 
 extern void _spin_lock_init( spin_lock_t* lock );
