Loading Documentation/admin-guide/kernel-parameters.txt +7 −0 Original line number Diff line number Diff line Loading @@ -2858,6 +2858,8 @@ mds=off [X86] tsx_async_abort=off [X86] kvm.nx_huge_pages=off [X86] no_entry_flush [PPC] no_uaccess_flush [PPC] Exceptions: This does not have any effect on Loading Loading @@ -3186,6 +3188,8 @@ noefi Disable EFI runtime services support. no_entry_flush [PPC] Don't flush the L1-D cache when entering the kernel. noexec [IA-64] noexec [X86] Loading Loading @@ -3235,6 +3239,9 @@ nospec_store_bypass_disable [HW] Disable all mitigations for the Speculative Store Bypass vulnerability no_uaccess_flush [PPC] Don't flush the L1-D cache after accessing user data. noxsave [BUGS=X86] Disables x86 extended register state save and restore using xsave. The kernel will fallback to enabling legacy floating-point and sse state. Loading arch/powerpc/Makefile +0 −1 Original line number Diff line number Diff line Loading @@ -248,7 +248,6 @@ KBUILD_CFLAGS += $(call cc-option,-mno-string) cpu-as-$(CONFIG_40x) += -Wa,-m405 cpu-as-$(CONFIG_44x) += -Wa,-m440 cpu-as-$(CONFIG_ALTIVEC) += $(call as-option,-Wa$(comma)-maltivec) cpu-as-$(CONFIG_E200) += -Wa,-me200 cpu-as-$(CONFIG_E500) += -Wa,-me500 # When using '-many -mpower4' gas will first try and find a matching power4 Loading arch/powerpc/include/asm/book3s/64/kup-radix.h +44 −24 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ #endif .endm #ifdef CONFIG_PPC_KUAP .macro kuap_check_amr gpr1, gpr2 #ifdef CONFIG_PPC_KUAP_DEBUG BEGIN_MMU_FTR_SECTION_NESTED(67) Loading @@ -38,6 +39,7 @@ END_MMU_FTR_SECTION_NESTED_IFSET(MMU_FTR_RADIX_KUAP, 67) #endif .endm #endif .macro kuap_save_amr_and_lock gpr1, gpr2, use_cr, msr_pr_cr #ifdef CONFIG_PPC_KUAP Loading @@ -61,6 +63,10 @@ #else /* !__ASSEMBLY__ */ #include <linux/jump_label.h> DECLARE_STATIC_KEY_FALSE(uaccess_flush_key); #ifdef CONFIG_PPC_KUAP #include <asm/mmu.h> Loading Loading @@ -103,8 +109,16 @@ static inline void kuap_check_amr(void) static inline unsigned long get_kuap(void) { /* * We return AMR_KUAP_BLOCKED when we don't support KUAP because * prevent_user_access_return needs to return AMR_KUAP_BLOCKED to * cause restore_user_access to do a flush. * * This has no effect in terms of actually blocking things on hash, * so it doesn't break anything. */ if (!early_mmu_has_feature(MMU_FTR_RADIX_KUAP)) return 0; return AMR_KUAP_BLOCKED; return mfspr(SPRN_AMR); } Loading @@ -123,6 +137,29 @@ static inline void set_kuap(unsigned long value) isync(); } static inline bool bad_kuap_fault(struct pt_regs *regs, unsigned long address, bool is_write) { return WARN(mmu_has_feature(MMU_FTR_RADIX_KUAP) && (regs->kuap & (is_write ? AMR_KUAP_BLOCK_WRITE : AMR_KUAP_BLOCK_READ)), "Bug: %s fault blocked by AMR!", is_write ? "Write" : "Read"); } #else /* CONFIG_PPC_KUAP */ static inline void kuap_restore_amr(struct pt_regs *regs, unsigned long amr) { } static inline unsigned long kuap_get_and_check_amr(void) { return 0UL; } static inline unsigned long get_kuap(void) { return AMR_KUAP_BLOCKED; } static inline void set_kuap(unsigned long value) { } #endif /* !CONFIG_PPC_KUAP */ static __always_inline void allow_user_access(void __user *to, const void __user *from, unsigned long size, unsigned long dir) { Loading @@ -142,6 +179,8 @@ static inline void prevent_user_access(void __user *to, const void __user *from, unsigned long size, unsigned long dir) { set_kuap(AMR_KUAP_BLOCKED); if (static_branch_unlikely(&uaccess_flush_key)) do_uaccess_flush(); } static inline unsigned long prevent_user_access_return(void) Loading @@ -149,6 +188,8 @@ static inline unsigned long prevent_user_access_return(void) unsigned long flags = get_kuap(); set_kuap(AMR_KUAP_BLOCKED); if (static_branch_unlikely(&uaccess_flush_key)) do_uaccess_flush(); return flags; } Loading @@ -156,30 +197,9 @@ static inline unsigned long prevent_user_access_return(void) static inline void restore_user_access(unsigned long flags) { set_kuap(flags); if (static_branch_unlikely(&uaccess_flush_key) && flags == AMR_KUAP_BLOCKED) do_uaccess_flush(); } static inline bool bad_kuap_fault(struct pt_regs *regs, unsigned long address, bool is_write) { return WARN(mmu_has_feature(MMU_FTR_RADIX_KUAP) && (regs->kuap & (is_write ? AMR_KUAP_BLOCK_WRITE : AMR_KUAP_BLOCK_READ)), "Bug: %s fault blocked by AMR!", is_write ? "Write" : "Read"); } #else /* CONFIG_PPC_KUAP */ static inline void kuap_restore_amr(struct pt_regs *regs, unsigned long amr) { } static inline void kuap_check_amr(void) { } static inline unsigned long kuap_get_and_check_amr(void) { return 0; } #endif /* CONFIG_PPC_KUAP */ #endif /* __ASSEMBLY__ */ #endif /* _ASM_POWERPC_BOOK3S_64_KUP_RADIX_H */ arch/powerpc/include/asm/exception-64s.h +11 −1 Original line number Diff line number Diff line Loading @@ -57,11 +57,18 @@ nop; \ nop #define ENTRY_FLUSH_SLOT \ ENTRY_FLUSH_FIXUP_SECTION; \ nop; \ nop; \ nop; /* * r10 must be free to use, r13 must be paca */ #define INTERRUPT_TO_KERNEL \ STF_ENTRY_BARRIER_SLOT STF_ENTRY_BARRIER_SLOT; \ ENTRY_FLUSH_SLOT /* * Macros for annotating the expected destination of (h)rfid Loading Loading @@ -137,6 +144,9 @@ RFSCV; \ b rfscv_flush_fallback #else /* __ASSEMBLY__ */ /* Prototype for function defined in exceptions-64s.S */ void do_uaccess_flush(void); #endif /* __ASSEMBLY__ */ #endif /* _ASM_POWERPC_EXCEPTION_H */ arch/powerpc/include/asm/feature-fixups.h +19 −0 Original line number Diff line number Diff line Loading @@ -205,6 +205,22 @@ label##3: \ FTR_ENTRY_OFFSET 955b-956b; \ .popsection; #define UACCESS_FLUSH_FIXUP_SECTION \ 959: \ .pushsection __uaccess_flush_fixup,"a"; \ .align 2; \ 960: \ FTR_ENTRY_OFFSET 959b-960b; \ .popsection; #define ENTRY_FLUSH_FIXUP_SECTION \ 957: \ .pushsection __entry_flush_fixup,"a"; \ .align 2; \ 958: \ FTR_ENTRY_OFFSET 957b-958b; \ .popsection; #define RFI_FLUSH_FIXUP_SECTION \ 951: \ .pushsection __rfi_flush_fixup,"a"; \ Loading Loading @@ -237,8 +253,11 @@ label##3: \ #include <linux/types.h> extern long stf_barrier_fallback; extern long entry_flush_fallback; extern long __start___stf_entry_barrier_fixup, __stop___stf_entry_barrier_fixup; extern long __start___stf_exit_barrier_fixup, __stop___stf_exit_barrier_fixup; extern long __start___uaccess_flush_fixup, __stop___uaccess_flush_fixup; extern long __start___entry_flush_fixup, __stop___entry_flush_fixup; extern long __start___rfi_flush_fixup, __stop___rfi_flush_fixup; extern long __start___barrier_nospec_fixup, __stop___barrier_nospec_fixup; extern long __start__btb_flush_fixup, __stop__btb_flush_fixup; Loading Loading
Documentation/admin-guide/kernel-parameters.txt +7 −0 Original line number Diff line number Diff line Loading @@ -2858,6 +2858,8 @@ mds=off [X86] tsx_async_abort=off [X86] kvm.nx_huge_pages=off [X86] no_entry_flush [PPC] no_uaccess_flush [PPC] Exceptions: This does not have any effect on Loading Loading @@ -3186,6 +3188,8 @@ noefi Disable EFI runtime services support. no_entry_flush [PPC] Don't flush the L1-D cache when entering the kernel. noexec [IA-64] noexec [X86] Loading Loading @@ -3235,6 +3239,9 @@ nospec_store_bypass_disable [HW] Disable all mitigations for the Speculative Store Bypass vulnerability no_uaccess_flush [PPC] Don't flush the L1-D cache after accessing user data. noxsave [BUGS=X86] Disables x86 extended register state save and restore using xsave. The kernel will fallback to enabling legacy floating-point and sse state. Loading
arch/powerpc/Makefile +0 −1 Original line number Diff line number Diff line Loading @@ -248,7 +248,6 @@ KBUILD_CFLAGS += $(call cc-option,-mno-string) cpu-as-$(CONFIG_40x) += -Wa,-m405 cpu-as-$(CONFIG_44x) += -Wa,-m440 cpu-as-$(CONFIG_ALTIVEC) += $(call as-option,-Wa$(comma)-maltivec) cpu-as-$(CONFIG_E200) += -Wa,-me200 cpu-as-$(CONFIG_E500) += -Wa,-me500 # When using '-many -mpower4' gas will first try and find a matching power4 Loading
arch/powerpc/include/asm/book3s/64/kup-radix.h +44 −24 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ #endif .endm #ifdef CONFIG_PPC_KUAP .macro kuap_check_amr gpr1, gpr2 #ifdef CONFIG_PPC_KUAP_DEBUG BEGIN_MMU_FTR_SECTION_NESTED(67) Loading @@ -38,6 +39,7 @@ END_MMU_FTR_SECTION_NESTED_IFSET(MMU_FTR_RADIX_KUAP, 67) #endif .endm #endif .macro kuap_save_amr_and_lock gpr1, gpr2, use_cr, msr_pr_cr #ifdef CONFIG_PPC_KUAP Loading @@ -61,6 +63,10 @@ #else /* !__ASSEMBLY__ */ #include <linux/jump_label.h> DECLARE_STATIC_KEY_FALSE(uaccess_flush_key); #ifdef CONFIG_PPC_KUAP #include <asm/mmu.h> Loading Loading @@ -103,8 +109,16 @@ static inline void kuap_check_amr(void) static inline unsigned long get_kuap(void) { /* * We return AMR_KUAP_BLOCKED when we don't support KUAP because * prevent_user_access_return needs to return AMR_KUAP_BLOCKED to * cause restore_user_access to do a flush. * * This has no effect in terms of actually blocking things on hash, * so it doesn't break anything. */ if (!early_mmu_has_feature(MMU_FTR_RADIX_KUAP)) return 0; return AMR_KUAP_BLOCKED; return mfspr(SPRN_AMR); } Loading @@ -123,6 +137,29 @@ static inline void set_kuap(unsigned long value) isync(); } static inline bool bad_kuap_fault(struct pt_regs *regs, unsigned long address, bool is_write) { return WARN(mmu_has_feature(MMU_FTR_RADIX_KUAP) && (regs->kuap & (is_write ? AMR_KUAP_BLOCK_WRITE : AMR_KUAP_BLOCK_READ)), "Bug: %s fault blocked by AMR!", is_write ? "Write" : "Read"); } #else /* CONFIG_PPC_KUAP */ static inline void kuap_restore_amr(struct pt_regs *regs, unsigned long amr) { } static inline unsigned long kuap_get_and_check_amr(void) { return 0UL; } static inline unsigned long get_kuap(void) { return AMR_KUAP_BLOCKED; } static inline void set_kuap(unsigned long value) { } #endif /* !CONFIG_PPC_KUAP */ static __always_inline void allow_user_access(void __user *to, const void __user *from, unsigned long size, unsigned long dir) { Loading @@ -142,6 +179,8 @@ static inline void prevent_user_access(void __user *to, const void __user *from, unsigned long size, unsigned long dir) { set_kuap(AMR_KUAP_BLOCKED); if (static_branch_unlikely(&uaccess_flush_key)) do_uaccess_flush(); } static inline unsigned long prevent_user_access_return(void) Loading @@ -149,6 +188,8 @@ static inline unsigned long prevent_user_access_return(void) unsigned long flags = get_kuap(); set_kuap(AMR_KUAP_BLOCKED); if (static_branch_unlikely(&uaccess_flush_key)) do_uaccess_flush(); return flags; } Loading @@ -156,30 +197,9 @@ static inline unsigned long prevent_user_access_return(void) static inline void restore_user_access(unsigned long flags) { set_kuap(flags); if (static_branch_unlikely(&uaccess_flush_key) && flags == AMR_KUAP_BLOCKED) do_uaccess_flush(); } static inline bool bad_kuap_fault(struct pt_regs *regs, unsigned long address, bool is_write) { return WARN(mmu_has_feature(MMU_FTR_RADIX_KUAP) && (regs->kuap & (is_write ? AMR_KUAP_BLOCK_WRITE : AMR_KUAP_BLOCK_READ)), "Bug: %s fault blocked by AMR!", is_write ? "Write" : "Read"); } #else /* CONFIG_PPC_KUAP */ static inline void kuap_restore_amr(struct pt_regs *regs, unsigned long amr) { } static inline void kuap_check_amr(void) { } static inline unsigned long kuap_get_and_check_amr(void) { return 0; } #endif /* CONFIG_PPC_KUAP */ #endif /* __ASSEMBLY__ */ #endif /* _ASM_POWERPC_BOOK3S_64_KUP_RADIX_H */
arch/powerpc/include/asm/exception-64s.h +11 −1 Original line number Diff line number Diff line Loading @@ -57,11 +57,18 @@ nop; \ nop #define ENTRY_FLUSH_SLOT \ ENTRY_FLUSH_FIXUP_SECTION; \ nop; \ nop; \ nop; /* * r10 must be free to use, r13 must be paca */ #define INTERRUPT_TO_KERNEL \ STF_ENTRY_BARRIER_SLOT STF_ENTRY_BARRIER_SLOT; \ ENTRY_FLUSH_SLOT /* * Macros for annotating the expected destination of (h)rfid Loading Loading @@ -137,6 +144,9 @@ RFSCV; \ b rfscv_flush_fallback #else /* __ASSEMBLY__ */ /* Prototype for function defined in exceptions-64s.S */ void do_uaccess_flush(void); #endif /* __ASSEMBLY__ */ #endif /* _ASM_POWERPC_EXCEPTION_H */
arch/powerpc/include/asm/feature-fixups.h +19 −0 Original line number Diff line number Diff line Loading @@ -205,6 +205,22 @@ label##3: \ FTR_ENTRY_OFFSET 955b-956b; \ .popsection; #define UACCESS_FLUSH_FIXUP_SECTION \ 959: \ .pushsection __uaccess_flush_fixup,"a"; \ .align 2; \ 960: \ FTR_ENTRY_OFFSET 959b-960b; \ .popsection; #define ENTRY_FLUSH_FIXUP_SECTION \ 957: \ .pushsection __entry_flush_fixup,"a"; \ .align 2; \ 958: \ FTR_ENTRY_OFFSET 957b-958b; \ .popsection; #define RFI_FLUSH_FIXUP_SECTION \ 951: \ .pushsection __rfi_flush_fixup,"a"; \ Loading Loading @@ -237,8 +253,11 @@ label##3: \ #include <linux/types.h> extern long stf_barrier_fallback; extern long entry_flush_fallback; extern long __start___stf_entry_barrier_fixup, __stop___stf_entry_barrier_fixup; extern long __start___stf_exit_barrier_fixup, __stop___stf_exit_barrier_fixup; extern long __start___uaccess_flush_fixup, __stop___uaccess_flush_fixup; extern long __start___entry_flush_fixup, __stop___entry_flush_fixup; extern long __start___rfi_flush_fixup, __stop___rfi_flush_fixup; extern long __start___barrier_nospec_fixup, __stop___barrier_nospec_fixup; extern long __start__btb_flush_fixup, __stop__btb_flush_fixup; Loading