%PDF- <> %âãÏÓ endobj 2 0 obj <> endobj 3 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 28 0 R 29 0 R] /MediaBox[ 0 0 595.5 842.25] /Contents 4 0 R/Group<>/Tabs/S>> endobj ºaâÚÎΞ-ÌE1ÍØÄ÷{òò2ÿ ÛÖ^ÔÀá TÎ{¦?§®¥kuµùÕ5sLOšuY>endobj 2 0 obj<>endobj 2 0 obj<>endobj 2 0 obj<>endobj 2 0 obj<> endobj 2 0 obj<>endobj 2 0 obj<>es 3 0 R>> endobj 2 0 obj<> ox[ 0.000000 0.000000 609.600000 935.600000]/Fi endobj 3 0 obj<> endobj 7 1 obj<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]>>/Subtype/Form>> stream
/* SPDX-License-Identifier: GPL-2.0 */ #ifndef _ASM_POWERPC_KUP_H_ #define _ASM_POWERPC_KUP_H_ #define KUAP_READ 1 #define KUAP_WRITE 2 #define KUAP_READ_WRITE (KUAP_READ | KUAP_WRITE) #ifdef CONFIG_PPC_BOOK3S_64 #include <asm/book3s/64/kup-radix.h> #endif #ifdef CONFIG_PPC_8xx #include <asm/nohash/32/kup-8xx.h> #endif #ifdef CONFIG_PPC_BOOK3S_32 #include <asm/book3s/32/kup.h> #endif #ifdef __ASSEMBLY__ #ifndef CONFIG_PPC_KUAP .macro kuap_save_and_lock sp, thread, gpr1, gpr2, gpr3 .endm .macro kuap_restore sp, current, gpr1, gpr2, gpr3 .endm .macro kuap_restore_amr gpr .endm .macro kuap_check current, gpr .endm .macro kuap_check_amr gpr1, gpr2 .endm #endif #else /* !__ASSEMBLY__ */ #include <asm/pgtable.h> void setup_kup(void); #ifdef CONFIG_PPC_KUEP void setup_kuep(bool disabled); #else static inline void setup_kuep(bool disabled) { } #endif /* CONFIG_PPC_KUEP */ #ifdef CONFIG_PPC_KUAP void setup_kuap(bool disabled); #else static inline void setup_kuap(bool disabled) { } static inline bool bad_kuap_fault(struct pt_regs *regs, unsigned long address, bool is_write) { return false; } static inline void kuap_check_amr(void) { } /* * book3s/64/kup-radix.h defines these functions for the !KUAP case to flush * the L1D cache after user accesses. Only include the empty stubs for other * platforms. */ #ifndef CONFIG_PPC_BOOK3S_64 static inline void allow_user_access(void __user *to, const void __user *from, unsigned long size, unsigned long dir) { } static inline void prevent_user_access(void __user *to, const void __user *from, unsigned long size, unsigned long dir) { } #endif /* CONFIG_PPC_BOOK3S_64 */ #endif /* CONFIG_PPC_KUAP */ static inline void allow_read_from_user(const void __user *from, unsigned long size) { allow_user_access(NULL, from, size, KUAP_READ); } static inline void allow_write_to_user(void __user *to, unsigned long size) { allow_user_access(to, NULL, size, KUAP_WRITE); } static inline void allow_read_write_user(void __user *to, const void __user *from, unsigned long size) { allow_user_access(to, from, size, KUAP_READ_WRITE); } static inline void prevent_read_from_user(const void __user *from, unsigned long size) { prevent_user_access(NULL, from, size, KUAP_READ); } static inline void prevent_write_to_user(void __user *to, unsigned long size) { prevent_user_access(to, NULL, size, KUAP_WRITE); } static inline void prevent_read_write_user(void __user *to, const void __user *from, unsigned long size) { prevent_user_access(to, from, size, KUAP_READ_WRITE); } #endif /* !__ASSEMBLY__ */ #endif /* _ASM_POWERPC_KUAP_H_ */