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