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.
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
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) {
"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;
}