x86: Use typeof_member style in RSEQ area access expressions

Update RSEQ access macros to use `(struct rseq_area) {}.member`
in _Static_assert and __typeof expressions, instead of
RSEQ_SELF()->member.  This adopts the typeof_member style, avoiding
reliance on RSEQ_SELF for compile-time expressions.

Signed-off-by: Uros Bizjak <ubizjak@gmail.com>
Reviewed-by: H.J. Lu <hjl.tools@gmail.com>
This commit is contained in:
Uros Bizjak 2025-10-01 11:07:31 +02:00
parent 99518a3a35
commit 3ee23564ce
3 changed files with 28 additions and 28 deletions

View File

@ -19,9 +19,9 @@
/* Read member of the RSEQ area directly. */
#define RSEQ_GETMEM(member) \
({ \
_Static_assert (sizeof (RSEQ_SELF()->member) == 1 \
|| sizeof (RSEQ_SELF()->member) == 4 \
|| sizeof (RSEQ_SELF()->member) == 8, \
_Static_assert (sizeof ((struct rseq_area) {}.member) == 1 \
|| sizeof ((struct rseq_area) {}.member) == 4 \
|| sizeof ((struct rseq_area) {}.member) == 8, \
"size of rseq data"); \
((struct rseq_area __seg_gs *)__rseq_offset)->member; \
})
@ -31,8 +31,8 @@
x86-32. */
#define RSEQ_GETMEM_ONCE(member) \
({ \
_Static_assert (sizeof (RSEQ_SELF()->member) == 1 \
|| sizeof (RSEQ_SELF()->member) == 4, \
_Static_assert (sizeof ((struct rseq_area) {}.member) == 1 \
|| sizeof ((struct rseq_area) {}.member) == 4, \
"size of rseq data"); \
((volatile struct rseq_area __seg_gs *)__rseq_offset)->member; \
})
@ -40,9 +40,9 @@
/* Set member of the RSEQ area directly. */
#define RSEQ_SETMEM(member, value) \
({ \
_Static_assert (sizeof (RSEQ_SELF()->member) == 1 \
|| sizeof (RSEQ_SELF()->member) == 4 \
|| sizeof (RSEQ_SELF()->member) == 8, \
_Static_assert (sizeof ((struct rseq_area) {}.member) == 1 \
|| sizeof ((struct rseq_area) {}.member) == 4 \
|| sizeof ((struct rseq_area) {}.member) == 8, \
"size of rseq data"); \
((struct rseq_area __seg_gs *)__rseq_offset)->member = (value); \
})
@ -52,8 +52,8 @@
x86-32. */
#define RSEQ_SETMEM_ONCE(member, value) \
({ \
_Static_assert (sizeof (RSEQ_SELF()->member) == 1 \
|| sizeof (RSEQ_SELF()->member) == 4, \
_Static_assert (sizeof ((struct rseq_area) {}.member) == 1 \
|| sizeof ((struct rseq_area) {}.member) == 4, \
"size of rseq data"); \
((volatile struct rseq_area __seg_gs *)__rseq_offset)->member = (value); \
})

View File

@ -19,9 +19,9 @@
/* Read member of the RSEQ area directly. */
#define RSEQ_GETMEM(member) \
({ \
_Static_assert (sizeof (RSEQ_SELF()->member) == 1 \
|| sizeof (RSEQ_SELF()->member) == 4 \
|| sizeof (RSEQ_SELF()->member) == 8, \
_Static_assert (sizeof ((struct rseq_area) {}.member) == 1 \
|| sizeof ((struct rseq_area) {}.member) == 4 \
|| sizeof ((struct rseq_area) {}.member) == 8, \
"size of rseq data"); \
((struct rseq_area __seg_fs *)__rseq_offset)->member; \
})
@ -29,9 +29,9 @@
/* Read member of the RSEQ area directly, with single-copy atomicity semantics. */
#define RSEQ_GETMEM_ONCE(member) \
({ \
_Static_assert (sizeof (RSEQ_SELF()->member) == 1 \
|| sizeof (RSEQ_SELF()->member) == 4 \
|| sizeof (RSEQ_SELF()->member) == 8, \
_Static_assert (sizeof ((struct rseq_area) {}.member) == 1 \
|| sizeof ((struct rseq_area) {}.member) == 4 \
|| sizeof ((struct rseq_area) {}.member) == 8, \
"size of rseq data"); \
((volatile struct rseq_area __seg_fs *)__rseq_offset)->member; \
})
@ -39,9 +39,9 @@
/* Set member of the RSEQ area directly. */
#define RSEQ_SETMEM(member, value) \
({ \
_Static_assert (sizeof (RSEQ_SELF()->member) == 1 \
|| sizeof (RSEQ_SELF()->member) == 4 \
|| sizeof (RSEQ_SELF()->member) == 8, \
_Static_assert (sizeof ((struct rseq_area) {}.member) == 1 \
|| sizeof ((struct rseq_area) {}.member) == 4 \
|| sizeof ((struct rseq_area) {}.member) == 8, \
"size of rseq data"); \
((struct rseq_area __seg_fs *)__rseq_offset)->member = (value); \
})
@ -49,9 +49,9 @@
/* Set member of the RSEQ area directly, with single-copy atomicity semantics. */
#define RSEQ_SETMEM_ONCE(member, value) \
({ \
_Static_assert (sizeof (RSEQ_SELF()->member) == 1 \
|| sizeof (RSEQ_SELF()->member) == 4 \
|| sizeof (RSEQ_SELF()->member) == 8, \
_Static_assert (sizeof ((struct rseq_area) {}.member) == 1 \
|| sizeof ((struct rseq_area) {}.member) == 4 \
|| sizeof ((struct rseq_area) {}.member) == 8, \
"size of rseq data"); \
((volatile struct rseq_area __seg_fs *)__rseq_offset)->member = (value); \
})

View File

@ -19,7 +19,7 @@
/* Read member of the RSEQ area directly, with single-copy atomicity semantics. */
#define RSEQ_GETMEM_ONCE(member) \
({ \
__typeof (RSEQ_SELF()->member) __value; \
__typeof ((struct rseq_area) {}.member) __value; \
_Static_assert (sizeof (__value) == 1 \
|| sizeof (__value) == 4 \
|| sizeof (__value) == 8, \
@ -59,18 +59,18 @@
/* Set member of the RSEQ area directly, with single-copy atomicity semantics. */
#define RSEQ_SETMEM_ONCE(member, value) \
({ \
_Static_assert (sizeof (RSEQ_SELF()->member) == 1 \
|| sizeof (RSEQ_SELF()->member) == 4 \
|| sizeof (RSEQ_SELF()->member) == 8, \
_Static_assert (sizeof ((struct rseq_area) {}.member) == 1 \
|| sizeof ((struct rseq_area) {}.member) == 4 \
|| sizeof ((struct rseq_area) {}.member) == 8, \
"size of rseq data"); \
if (sizeof (RSEQ_SELF()->member) == 1) \
if (sizeof ((struct rseq_area) {}.member) == 1) \
asm volatile ("movb %0,%%fs:%c1(%2)" \
: \
: "iq" ((uint8_t) cast_to_integer (value)), \
"i" (offsetof (struct rseq_area, member)), \
"r" ((long long int) __rseq_offset) \
: "memory"); \
else if (sizeof (RSEQ_SELF()->member) == 4) \
else if (sizeof ((struct rseq_area) {}.member) == 4) \
asm volatile ("movl %0,%%fs:%c1(%2)" \
: \
: IMM_MODE ((uint32_t) cast_to_integer (value)), \