/* SPDX-License-Identifier: GPL-2.0-or-later WITH Linux-syscall-note */
/* SPDX-FileCopyrightText: 2015-2022 Mathieu Desnoyers <mathieu.desnoyers@efficios.com> */
+#ifndef _RSEQ_ABI_H
+#define _RSEQ_ABI_H
/*
* rseq/rseq-abi.h
* Restartable sequences system call API
*/
-#ifndef _RSEQ_ABI_H
-#define _RSEQ_ABI_H
-
#include <linux/types.h>
#include <asm/byteorder.h>
enum rseq_abi_cpu_id_state {
- RSEQ_ABI_CPU_ID_UNINITIALIZED = -1,
+ RSEQ_ABI_CPU_ID_UNINITIALIZED = -1,
RSEQ_ABI_CPU_ID_REGISTRATION_FAILED = -2,
};
} __attribute__((aligned(4 * sizeof(__u64))));
/*
- * struct rseq_abi is aligned on 4 * 8 bytes to ensure it is always
+ * struct rseq is aligned on 4 * 8 bytes to ensure it is always
* contained within a single cache-line.
*
- * A single struct rseq_abi per thread is allowed.
+ * A single struct rseq per thread is allowed.
*/
struct rseq_abi {
/*
* Read by user-space with single-copy atomicity semantics. This
* field should only be read by the thread which registered this
* data structure. Aligned on 32-bit. Values
- * RSEQ_CPU_ID_UNINITIALIZED and RSEQ_CPU_ID_REGISTRATION_FAILED
+ * RSEQ_ABI_CPU_ID_UNINITIALIZED and RSEQ_ABI_CPU_ID_REGISTRATION_FAILED
* have a special semantic: the former means "rseq uninitialized",
* and latter means "rseq initialization failed". This value is
* meant to be read within rseq critical sections and compared
* Restartable sequences rseq_cs field.
*
* Contains NULL when no critical section is active for the current
- * thread, or holds a pointer to the currently active struct rseq_cs.
+ * thread, or holds a pointer to the currently active struct rseq_abi_cs.
*
* Updated by user-space, which sets the address of the currently
* active rseq_cs at the beginning of assembly instruction sequence
* instruction sequence block, as well as when the kernel detects that
* it is preempting or delivering a signal outside of the range
* targeted by the rseq_cs. Also needs to be set to NULL by user-space
- * before reclaiming memory that contains the targeted struct rseq_cs.
+ * before reclaiming memory that contains the targeted struct rseq_abi_cs.
*
* Read and set by the kernel. Set by user-space with single-copy
* atomicity semantics. This field should only be updated by the
* thread which registered this data structure. Aligned on 64-bit.
+ *
+ * 32-bit architectures should update the low order bits of the
+ * rseq_cs field, leaving the high order bits initialized to 0.
*/
- union {
- __u64 ptr64;
-
- /*
- * The "arch" field provides architecture accessor for
- * the ptr field based on architecture pointer size and
- * endianness.
- */
- struct {
-#ifdef __LP64__
- __u64 ptr;
-#elif defined(__BYTE_ORDER) ? (__BYTE_ORDER == __BIG_ENDIAN) : defined(__BIG_ENDIAN)
- __u32 padding; /* Initialized to zero. */
- __u32 ptr;
-#else
- __u32 ptr;
- __u32 padding; /* Initialized to zero. */
-#endif
- } arch;
- } rseq_cs;
+ __u64 rseq_cs;
/*
* Restartable sequences flags field.
* this thread.
*/
__u32 flags;
+
+ /*
+ * Restartable sequences node_id field. Updated by the kernel. Read by
+ * user-space with single-copy atomicity semantics. This field should
+ * only be read by the thread which registered this data structure.
+ * Aligned on 32-bit. Contains the current NUMA node ID.
+ */
+ __u32 node_id;
+
+ /*
+ * Restartable sequences mm_cid field. Updated by the kernel. Read by
+ * user-space with single-copy atomicity semantics. This field should
+ * only be read by the thread which registered this data structure.
+ * Aligned on 32-bit. Contains the current thread's concurrency ID
+ * (allocated uniquely within a memory map).
+ */
+ __u32 mm_cid;
+
+ /*
+ * Flexible array member at end of structure, after last feature field.
+ */
+ char end[];
} __attribute__((aligned(4 * sizeof(__u64))));
/*