cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

kup-8xx.h (1762B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifndef _ASM_POWERPC_KUP_8XX_H_
      3#define _ASM_POWERPC_KUP_8XX_H_
      4
      5#include <asm/bug.h>
      6#include <asm/mmu.h>
      7
      8#ifdef CONFIG_PPC_KUAP
      9
     10#ifndef __ASSEMBLY__
     11
     12#include <linux/jump_label.h>
     13
     14#include <asm/reg.h>
     15
     16extern struct static_key_false disable_kuap_key;
     17
     18static __always_inline bool kuap_is_disabled(void)
     19{
     20	return static_branch_unlikely(&disable_kuap_key);
     21}
     22
     23static inline void __kuap_lock(void)
     24{
     25}
     26
     27static inline void __kuap_save_and_lock(struct pt_regs *regs)
     28{
     29	regs->kuap = mfspr(SPRN_MD_AP);
     30	mtspr(SPRN_MD_AP, MD_APG_KUAP);
     31}
     32
     33static inline void kuap_user_restore(struct pt_regs *regs)
     34{
     35}
     36
     37static inline void __kuap_kernel_restore(struct pt_regs *regs, unsigned long kuap)
     38{
     39	mtspr(SPRN_MD_AP, regs->kuap);
     40}
     41
     42static inline unsigned long __kuap_get_and_assert_locked(void)
     43{
     44	unsigned long kuap;
     45
     46	kuap = mfspr(SPRN_MD_AP);
     47
     48	if (IS_ENABLED(CONFIG_PPC_KUAP_DEBUG))
     49		WARN_ON_ONCE(kuap >> 16 != MD_APG_KUAP >> 16);
     50
     51	return kuap;
     52}
     53
     54static inline void __allow_user_access(void __user *to, const void __user *from,
     55				       unsigned long size, unsigned long dir)
     56{
     57	mtspr(SPRN_MD_AP, MD_APG_INIT);
     58}
     59
     60static inline void __prevent_user_access(unsigned long dir)
     61{
     62	mtspr(SPRN_MD_AP, MD_APG_KUAP);
     63}
     64
     65static inline unsigned long __prevent_user_access_return(void)
     66{
     67	unsigned long flags;
     68
     69	flags = mfspr(SPRN_MD_AP);
     70
     71	mtspr(SPRN_MD_AP, MD_APG_KUAP);
     72
     73	return flags;
     74}
     75
     76static inline void __restore_user_access(unsigned long flags)
     77{
     78	mtspr(SPRN_MD_AP, flags);
     79}
     80
     81static inline bool
     82__bad_kuap_fault(struct pt_regs *regs, unsigned long address, bool is_write)
     83{
     84	return !((regs->kuap ^ MD_APG_KUAP) & 0xff000000);
     85}
     86
     87#endif /* !__ASSEMBLY__ */
     88
     89#endif /* CONFIG_PPC_KUAP */
     90
     91#endif /* _ASM_POWERPC_KUP_8XX_H_ */