| /* SPDX-License-Identifier: GPL-2.0 */ |
| #ifndef __ASM_SKEY_H |
| #define __ASM_SKEY_H |
| |
| #include <asm/rwonce.h> |
| |
| struct skey_region { |
| unsigned long start; |
| unsigned long end; |
| }; |
| |
| #define SKEY_REGION(_start, _end) \ |
| stringify_in_c(.section .skey_region,"a";) \ |
| stringify_in_c(.balign 8;) \ |
| stringify_in_c(.quad (_start);) \ |
| stringify_in_c(.quad (_end);) \ |
| stringify_in_c(.previous) |
| |
| extern int skey_regions_initialized; |
| extern struct skey_region __skey_region_start[]; |
| extern struct skey_region __skey_region_end[]; |
| |
| void __skey_regions_initialize(void); |
| |
| static inline void skey_regions_initialize(void) |
| { |
| if (READ_ONCE(skey_regions_initialized)) |
| return; |
| __skey_regions_initialize(); |
| } |
| |
| #endif /* __ASM_SKEY_H */ |