diff --git a/Kernel/API/POSIX/futex.h b/Kernel/API/POSIX/futex.h new file mode 100644 index 0000000000..74f030c866 --- /dev/null +++ b/Kernel/API/POSIX/futex.h @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2018-2021, Andreas Kling + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#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(val3) (((val3) >> _FUTEX_OP_SHIFT_OP) & _FUTEX_OP_MASK_OP) +#define _FUTEX_CMP(val3) (((val3) >> _FUTEX_OP_SHIFT_CMP) & _FUTEX_OP_MASK_CMP) +#define _FUTEX_OP_ARG(val3) (((val3) >> _FUTEX_OP_SHIFT_OP_ARG) & _FUTEX_OP_MASK_OP_ARG) +#define _FUTEX_CMP_ARG(val3) (((val3) >> _FUTEX_OP_SHIFT_CMP_ARG) & _FUTEX_OP_MASK_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 + +#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 + +#ifdef __cplusplus +} +#endif diff --git a/Kernel/UnixTypes.h b/Kernel/UnixTypes.h index c8337a82e6..414e08296a 100644 --- a/Kernel/UnixTypes.h +++ b/Kernel/UnixTypes.h @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -90,48 +91,6 @@ enum { #define FD_CLOEXEC 1 -#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(val3) (((val3) >> _FUTEX_OP_SHIFT_OP) & _FUTEX_OP_MASK_OP) -#define _FUTEX_CMP(val3) (((val3) >> _FUTEX_OP_SHIFT_CMP) & _FUTEX_OP_MASK_CMP) -#define _FUTEX_OP_ARG(val3) (((val3) >> _FUTEX_OP_SHIFT_OP_ARG) & _FUTEX_OP_MASK_OP_ARG) -#define _FUTEX_CMP_ARG(val3) (((val3) >> _FUTEX_OP_SHIFT_CMP_ARG) & _FUTEX_OP_MASK_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 -#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 - // Avoid interference with AK/Types.h and LibC/sys/types.h by defining *separate* names: TYPEDEF_DISTINCT_ORDERED_ID(pid_t, ProcessID); TYPEDEF_DISTINCT_ORDERED_ID(pid_t, ThreadID); diff --git a/Userland/Libraries/LibC/serenity.h b/Userland/Libraries/LibC/serenity.h index 3919c911d2..7f81f92f04 100644 --- a/Userland/Libraries/LibC/serenity.h +++ b/Userland/Libraries/LibC/serenity.h @@ -6,6 +6,7 @@ #pragma once +#include #include #include #include @@ -29,47 +30,6 @@ int profiling_free_buffer(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 - -#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); static ALWAYS_INLINE int futex_wait(uint32_t* userspace_address, uint32_t value, const struct timespec* abstime, int clockid)