xref: /openbmc/linux/arch/s390/include/asm/rwonce.h (revision 434b2660)
1*434b2660SHeiko Carstens /* SPDX-License-Identifier: GPL-2.0 */
2*434b2660SHeiko Carstens 
3*434b2660SHeiko Carstens #ifndef __ASM_S390_RWONCE_H
4*434b2660SHeiko Carstens #define __ASM_S390_RWONCE_H
5*434b2660SHeiko Carstens 
6*434b2660SHeiko Carstens #include <linux/compiler_types.h>
7*434b2660SHeiko Carstens 
8*434b2660SHeiko Carstens /*
9*434b2660SHeiko Carstens  * Use READ_ONCE_ALIGNED_128() for 128-bit block concurrent (atomic) read
10*434b2660SHeiko Carstens  * accesses. Note that x must be 128-bit aligned, otherwise a specification
11*434b2660SHeiko Carstens  * exception is generated.
12*434b2660SHeiko Carstens  */
13*434b2660SHeiko Carstens #define READ_ONCE_ALIGNED_128(x)			\
14*434b2660SHeiko Carstens ({							\
15*434b2660SHeiko Carstens 	union {						\
16*434b2660SHeiko Carstens 		typeof(x) __x;				\
17*434b2660SHeiko Carstens 		__uint128_t val;			\
18*434b2660SHeiko Carstens 	} __u;						\
19*434b2660SHeiko Carstens 							\
20*434b2660SHeiko Carstens 	BUILD_BUG_ON(sizeof(x) != 16);			\
21*434b2660SHeiko Carstens 	asm volatile(					\
22*434b2660SHeiko Carstens 		"	lpq	%[val],%[_x]\n"		\
23*434b2660SHeiko Carstens 		: [val] "=d" (__u.val)			\
24*434b2660SHeiko Carstens 		: [_x] "QS" (x)				\
25*434b2660SHeiko Carstens 		: "memory");				\
26*434b2660SHeiko Carstens 	__u.__x;					\
27*434b2660SHeiko Carstens })
28*434b2660SHeiko Carstens 
29*434b2660SHeiko Carstens #include <asm-generic/rwonce.h>
30*434b2660SHeiko Carstens 
31*434b2660SHeiko Carstens #endif	/* __ASM_S390_RWONCE_H */
32