diff options
author | Tom <tomut@yahoo.com> | 2020-12-21 23:21:58 -0700 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-01-17 20:30:31 +0100 |
commit | 1d621ab1725d1eba0fafef4575aef72682cd57ad (patch) | |
tree | b30a1d63d09e70722fe04a45c6e96522d3a295bc /Userland/Libraries/LibC/serenity.h | |
parent | 7581b64705ed3c5b3711c956504f278c2ea3899e (diff) | |
download | serenity-1d621ab1725d1eba0fafef4575aef72682cd57ad.zip |
Kernel: Some futex improvements
This adds support for FUTEX_WAKE_OP, FUTEX_WAIT_BITSET, FUTEX_WAKE_BITSET,
FUTEX_REQUEUE, and FUTEX_CMP_REQUEUE, as well well as global and private
futex and absolute/relative timeouts against the appropriate clock. This
also changes the implementation so that kernel resources are only used when
a thread is blocked on a futex.
Global futexes are implemented as offsets in VMObjects, so that different
processes can share a futex against the same VMObject despite potentially
being mapped at different virtual addresses.
Diffstat (limited to 'Userland/Libraries/LibC/serenity.h')
-rw-r--r-- | Userland/Libraries/LibC/serenity.h | 40 |
1 files changed, 39 insertions, 1 deletions
diff --git a/Userland/Libraries/LibC/serenity.h b/Userland/Libraries/LibC/serenity.h index 42a726119e..7aa4f97a6c 100644 --- a/Userland/Libraries/LibC/serenity.h +++ b/Userland/Libraries/LibC/serenity.h @@ -45,10 +45,48 @@ int profiling_disable(pid_t); #define THREAD_PRIORITY_HIGH 50 #define THREAD_PRIORITY_MAX 99 +#define _FUTEX_OP_SHIFT_OP 28 +#define _FUTEX_OP_MASK_OP 0xf +#define _FUTEX_OP_SHIFT_CMP 24 +#define _FUTEX_OP_MASK_CMP 0xf +#define _FUTEX_OP_SHIFT_OP_ARG 12 +#define _FUTEX_OP_MASK_OP_ARG 0xfff +#define _FUTEX_OP_SHIFT_CMP_ARG 0 +#define _FUTEX_OP_MASK_CMP_ARG 0xfff + +#define FUTEX_OP(op, op_arg, cmp, cmp_arg) \ + ((((op)&_FUTEX_OP_MASK_OP) << _FUTEX_OP_SHIFT_OP) | (((cmp)&_FUTEX_OP_MASK_CMP) << _FUTEX_OP_SHIFT_CMP) | (((op_arg)&_FUTEX_OP_MASK_OP_ARG) << _FUTEX_OP_SHIFT_OP_ARG) | (((cmp_arg)&_FUTEX_OP_MASK_CMP_ARG) << _FUTEX_OP_SHIFT_CMP_ARG)) + +#define FUTEX_OP_SET 0 +#define FUTEX_OP_ADD 1 +#define FUTEX_OP_OR 2 +#define FUTEX_OP_ANDN 3 +#define FUTEX_OP_XOR 4 +#define FUTEX_OP_ARG_SHIFT 8 + +#define FUTEX_OP_CMP_EQ 0 +#define FUTEX_OP_CMP_NE 1 +#define FUTEX_OP_CMP_LT 2 +#define FUTEX_OP_CMP_LE 3 +#define FUTEX_OP_CMP_GT 4 +#define FUTEX_OP_CMP_GE 5 + #define FUTEX_WAIT 1 #define FUTEX_WAKE 2 -int futex(int32_t* userspace_address, int futex_op, int32_t value, const struct timespec* timeout); +#define FUTEX_REQUEUE 3 +#define FUTEX_CMP_REQUEUE 4 +#define FUTEX_WAKE_OP 5 +#define FUTEX_WAIT_BITSET 9 +#define FUTEX_WAKE_BITSET 10 + +#define FUTEX_PRIVATE_FLAG (1 << 7) +#define FUTEX_CLOCK_REALTIME (1 << 8) +#define FUTEX_CMD_MASK ~(FUTEX_PRIVATE_FLAG | FUTEX_CLOCK_REALTIME) + +#define FUTEX_BITSET_MATCH_ANY 0xffffffff + +int futex(uint32_t* userspace_address, int futex_op, uint32_t value, const struct timespec* timeout, uint32_t* userspace_address2, uint32_t value3); #define PURGE_ALL_VOLATILE 0x1 #define PURGE_ALL_CLEAN_INODE 0x2 |