]> rtime.felk.cvut.cz Git - l4.git/blobdiff - kernel/fiasco/src/lib/libk/atomic.cpp
update
[l4.git] / kernel / fiasco / src / lib / libk / atomic.cpp
index 1fd90c140e936f5c48d35afa1bb0d89eb7ec7945..1f4681cee0e164b93a6b7851bb5455418f5a1b0c 100644 (file)
@@ -58,6 +58,21 @@ atomic_change(T *ptr, T mask, T bits)
 //---------------------------------------------------------------------------
 IMPLEMENTATION [ia32,ux]:
 
+inline
+void
+atomic_mp_and(Mword *l, Mword value)
+{
+  asm volatile ("lock; andl %1, %2" : "=m"(*l) : "ir"(value), "m"(*l));
+}
+
+inline
+void
+atomic_mp_or(Mword *l, Mword value)
+{
+  asm volatile ("lock; orl %1, %2" : "=m"(*l) : "ir"(value), "m"(*l));
+}
+
+
 inline
 void
 atomic_mp_add(Mword *l, Mword value)
@@ -168,6 +183,24 @@ IMPLEMENTATION[(ppc32 && !mp) || (arm && !armv6plus)]:
 
 #include "processor.h"
 
+inline NEEDS["processor.h"]
+void
+atomic_mp_and(Mword *l, Mword value)
+{
+  Proc::Status s = Proc::cli_save();
+  *l &= value;
+  Proc::sti_restore(s);
+}
+
+inline NEEDS["processor.h"]
+void
+atomic_mp_or(Mword *l, Mword value)
+{
+  Proc::Status s = Proc::cli_save();
+  *l |= value;
+  Proc::sti_restore(s);
+}
+
 inline NEEDS["processor.h"]
 void
 atomic_mp_add(Mword *l, Mword value)
@@ -177,7 +210,6 @@ atomic_mp_add(Mword *l, Mword value)
   Proc::sti_restore(s);
 }
 
-
 //---------------------------------------------------------------------------
 IMPLEMENTATION[arm && armv6plus]:
 
@@ -199,6 +231,42 @@ atomic_mp_add(Mword *l, Mword value)
       : "cc");
 }
 
+inline
+void
+atomic_mp_and(Mword *l, Mword value)
+{
+  Mword tmp, ret;
+
+  asm volatile (
+      "1:                                 \n"
+      "ldrex   %[v], [%[mem]]             \n"
+      "and     %[v], %[v], %[andval]     \n"
+      "strex   %[ret], %[v], [%[mem]]     \n"
+      "teq     %[ret], #0                 \n"
+      "bne     1b                         \n"
+      : [v] "=&r" (tmp), [ret] "=&r" (ret), "+m" (*l)
+      :  [mem] "r" (l), [andval] "r" (value)
+      : "cc");
+}
+
+inline
+void
+atomic_mp_or(Mword *l, Mword value)
+{
+  Mword tmp, ret;
+
+  asm volatile (
+      "1:                                 \n"
+      "ldrex   %[v], [%[mem]]             \n"
+      "orr     %[v], %[v], %[orval]     \n"
+      "strex   %[ret], %[v], [%[mem]]     \n"
+      "teq     %[ret], #0                 \n"
+      "bne     1b                         \n"
+      : [v] "=&r" (tmp), [ret] "=&r" (ret), "+m" (*l)
+      :  [mem] "r" (l), [orval] "r" (value)
+      : "cc");
+}
+
 
 inline
 bool