xref: /linux/arch/s390/include/asm/asce.h (revision d8cb068359f6210d790828714081d4ccb47014ff)
1*8b72f5a9SHeiko Carstens /* SPDX-License-Identifier: GPL-2.0 */
2*8b72f5a9SHeiko Carstens 
3*8b72f5a9SHeiko Carstens #ifndef _ASM_S390_ASCE_H
4*8b72f5a9SHeiko Carstens #define _ASM_S390_ASCE_H
5*8b72f5a9SHeiko Carstens 
6*8b72f5a9SHeiko Carstens #include <linux/thread_info.h>
7*8b72f5a9SHeiko Carstens #include <linux/irqflags.h>
8*8b72f5a9SHeiko Carstens #include <asm/lowcore.h>
9*8b72f5a9SHeiko Carstens #include <asm/ctlreg.h>
10*8b72f5a9SHeiko Carstens 
11*8b72f5a9SHeiko Carstens static inline bool enable_sacf_uaccess(void)
12*8b72f5a9SHeiko Carstens {
13*8b72f5a9SHeiko Carstens 	unsigned long flags;
14*8b72f5a9SHeiko Carstens 
15*8b72f5a9SHeiko Carstens 	if (test_thread_flag(TIF_ASCE_PRIMARY))
16*8b72f5a9SHeiko Carstens 		return true;
17*8b72f5a9SHeiko Carstens 	local_irq_save(flags);
18*8b72f5a9SHeiko Carstens 	local_ctl_load(1, &get_lowcore()->kernel_asce);
19*8b72f5a9SHeiko Carstens 	set_thread_flag(TIF_ASCE_PRIMARY);
20*8b72f5a9SHeiko Carstens 	local_irq_restore(flags);
21*8b72f5a9SHeiko Carstens 	return false;
22*8b72f5a9SHeiko Carstens }
23*8b72f5a9SHeiko Carstens 
24*8b72f5a9SHeiko Carstens static inline void disable_sacf_uaccess(bool previous)
25*8b72f5a9SHeiko Carstens {
26*8b72f5a9SHeiko Carstens 	unsigned long flags;
27*8b72f5a9SHeiko Carstens 
28*8b72f5a9SHeiko Carstens 	if (previous)
29*8b72f5a9SHeiko Carstens 		return;
30*8b72f5a9SHeiko Carstens 	local_irq_save(flags);
31*8b72f5a9SHeiko Carstens 	local_ctl_load(1, &get_lowcore()->user_asce);
32*8b72f5a9SHeiko Carstens 	clear_thread_flag(TIF_ASCE_PRIMARY);
33*8b72f5a9SHeiko Carstens 	local_irq_restore(flags);
34*8b72f5a9SHeiko Carstens }
35*8b72f5a9SHeiko Carstens 
36*8b72f5a9SHeiko Carstens #endif /* _ASM_S390_ASCE_H */
37