SE: Ignore FUTEX_PRIVATE_FLAG of sys_futex
authorLluc Alvarez <lluc.alvarez@bsc.es>
Fri, 21 Sep 2012 08:51:18 +0000 (04:51 -0400)
committerLluc Alvarez <lluc.alvarez@bsc.es>
Fri, 21 Sep 2012 08:51:18 +0000 (04:51 -0400)
This patch ignores the FUTEX_PRIVATE_FLAG of the sys_futex system call
in SE mode.

With this patch, when sys_futex with the options FUTEX_WAIT_PRIVATE or
FUTEX_WAKE_PRIVATE is emulated, the FUTEX_PRIVATE_FLAG is ignored and
so their behaviours are the regular FUTEX_WAIT and FUTEX_WAKE.

Emulating FUTEX_WAIT_PRIVATE and FUTEX_WAKE_PRIVATE as if they were
non-private is safe from a functional point of view. The
FUTEX_PRIVATE_FLAG does not change the semantics of the futex, it's
just a mechanism to improve performance under certain circunstances
that can be ignored in SE mode.

src/kern/linux/linux.hh
src/sim/syscall_emul.hh

index 1d52ff32386b023c9b1a4a4636fbbcbd10137fb4..1fcd80444143636e634acffcff72921d19b8b717 100644 (file)
@@ -225,6 +225,7 @@ class Linux : public OperatingSystem
     static const unsigned TGT_FUTEX_WAKE  = 1;
     static const unsigned TGT_EAGAIN      = 11;
     static const unsigned TGT_EWOULDBLOCK = TGT_EAGAIN;
+    static const unsigned TGT_FUTEX_PRIVATE_FLAG = 128;
 
 };  // class Linux
 
index aec1598388b3613ae51bdeebf6265fc94533cc98..e98e771d50cd19ec14248a9e0a26711bc914706f 100644 (file)
@@ -359,6 +359,7 @@ futexFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
     DPRINTF(SyscallVerbose, "In sys_futex: Address=%llx, op=%d, val=%d\n",
             uaddr, op, val);
 
+    op &= ~OS::TGT_FUTEX_PRIVATE_FLAG;
 
     if (op == OS::TGT_FUTEX_WAIT) {
         if (timeout != 0) {
@@ -410,7 +411,7 @@ futexFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
                                 "thread contexts\n", wokenUp);
         return wokenUp;
     } else {
-        warn("sys_futex: op %d is not implemented, just returning...");
+        warn("sys_futex: op %d is not implemented, just returning...", op);
         return 0;
     }