xref: /linux/arch/s390/include/asm/skey.h (revision bc46b7cbc58c4cb562b6a45a1fbc7b8e7b23df58)
1*ee417a84SHeiko Carstens /* SPDX-License-Identifier: GPL-2.0 */
2*ee417a84SHeiko Carstens #ifndef __ASM_SKEY_H
3*ee417a84SHeiko Carstens #define __ASM_SKEY_H
4*ee417a84SHeiko Carstens 
5*ee417a84SHeiko Carstens #include <asm/rwonce.h>
6*ee417a84SHeiko Carstens 
7*ee417a84SHeiko Carstens struct skey_region {
8*ee417a84SHeiko Carstens 	unsigned long start;
9*ee417a84SHeiko Carstens 	unsigned long end;
10*ee417a84SHeiko Carstens };
11*ee417a84SHeiko Carstens 
12*ee417a84SHeiko Carstens #define SKEY_REGION(_start, _end)			\
13*ee417a84SHeiko Carstens 	stringify_in_c(.section .skey_region,"a";)	\
14*ee417a84SHeiko Carstens 	stringify_in_c(.balign 8;)			\
15*ee417a84SHeiko Carstens 	stringify_in_c(.quad (_start);)			\
16*ee417a84SHeiko Carstens 	stringify_in_c(.quad (_end);)			\
17*ee417a84SHeiko Carstens 	stringify_in_c(.previous)
18*ee417a84SHeiko Carstens 
19*ee417a84SHeiko Carstens extern int skey_regions_initialized;
20*ee417a84SHeiko Carstens extern struct skey_region __skey_region_start[];
21*ee417a84SHeiko Carstens extern struct skey_region __skey_region_end[];
22*ee417a84SHeiko Carstens 
23*ee417a84SHeiko Carstens void __skey_regions_initialize(void);
24*ee417a84SHeiko Carstens 
skey_regions_initialize(void)25*ee417a84SHeiko Carstens static inline void skey_regions_initialize(void)
26*ee417a84SHeiko Carstens {
27*ee417a84SHeiko Carstens 	if (READ_ONCE(skey_regions_initialized))
28*ee417a84SHeiko Carstens 		return;
29*ee417a84SHeiko Carstens 	__skey_regions_initialize();
30*ee417a84SHeiko Carstens }
31*ee417a84SHeiko Carstens 
32*ee417a84SHeiko Carstens #endif /* __ASM_SKEY_H */
33