Commit 26e04120 authored by Christophe Leroy's avatar Christophe Leroy Committed by Michael Ellerman

powerpc/kuap: Use MMU_FTR_KUAP on all and refactor disabling kuap

All but book3s/64 use a static branch key for disabling kuap.
book3s/64 uses an mmu feature.

Refactor all targets to use MMU_FTR_KUAP like book3s/64.

For PPC32 that implies updating mmu features fixups once KUAP
has been initialised.
Signed-off-by: default avatarChristophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://msgid.link/6b3d7c977bad73378ea368bc6818e9c94ea95ab0.1689091022.git.christophe.leroy@csgroup.eu
parent 4589a2b7
...@@ -9,10 +9,6 @@ ...@@ -9,10 +9,6 @@
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
#include <linux/jump_label.h>
extern struct static_key_false disable_kuap_key;
#ifdef CONFIG_PPC_KUAP #ifdef CONFIG_PPC_KUAP
#include <linux/sched.h> #include <linux/sched.h>
...@@ -20,11 +16,6 @@ extern struct static_key_false disable_kuap_key; ...@@ -20,11 +16,6 @@ extern struct static_key_false disable_kuap_key;
#define KUAP_NONE (~0UL) #define KUAP_NONE (~0UL)
#define KUAP_ALL (~1UL) #define KUAP_ALL (~1UL)
static __always_inline bool kuap_is_disabled(void)
{
return static_branch_unlikely(&disable_kuap_key);
}
static inline void kuap_lock_one(unsigned long addr) static inline void kuap_lock_one(unsigned long addr)
{ {
mtsr(mfsr(addr) | SR_KS, addr); mtsr(mfsr(addr) | SR_KS, addr);
......
...@@ -230,11 +230,6 @@ static inline u64 current_thread_iamr(void) ...@@ -230,11 +230,6 @@ static inline u64 current_thread_iamr(void)
#ifdef CONFIG_PPC_KUAP #ifdef CONFIG_PPC_KUAP
static __always_inline bool kuap_is_disabled(void)
{
return !mmu_has_feature(MMU_FTR_KUAP);
}
static inline void kuap_user_restore(struct pt_regs *regs) static inline void kuap_user_restore(struct pt_regs *regs)
{ {
bool restore_amr = false, restore_iamr = false; bool restore_amr = false, restore_iamr = false;
......
...@@ -6,6 +6,12 @@ ...@@ -6,6 +6,12 @@
#define KUAP_WRITE 2 #define KUAP_WRITE 2
#define KUAP_READ_WRITE (KUAP_READ | KUAP_WRITE) #define KUAP_READ_WRITE (KUAP_READ | KUAP_WRITE)
#ifndef __ASSEMBLY__
#include <linux/types.h>
static __always_inline bool kuap_is_disabled(void);
#endif
#ifdef CONFIG_PPC_BOOK3S_64 #ifdef CONFIG_PPC_BOOK3S_64
#include <asm/book3s/64/kup.h> #include <asm/book3s/64/kup.h>
#endif #endif
...@@ -41,6 +47,11 @@ void setup_kuep(bool disabled); ...@@ -41,6 +47,11 @@ void setup_kuep(bool disabled);
#ifdef CONFIG_PPC_KUAP #ifdef CONFIG_PPC_KUAP
void setup_kuap(bool disabled); void setup_kuap(bool disabled);
static __always_inline bool kuap_is_disabled(void)
{
return !mmu_has_feature(MMU_FTR_KUAP);
}
#else #else
static inline void setup_kuap(bool disabled) { } static inline void setup_kuap(bool disabled) { }
......
...@@ -9,17 +9,8 @@ ...@@ -9,17 +9,8 @@
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
#include <linux/jump_label.h>
#include <asm/reg.h> #include <asm/reg.h>
extern struct static_key_false disable_kuap_key;
static __always_inline bool kuap_is_disabled(void)
{
return static_branch_unlikely(&disable_kuap_key);
}
static inline void __kuap_save_and_lock(struct pt_regs *regs) static inline void __kuap_save_and_lock(struct pt_regs *regs)
{ {
regs->kuap = mfspr(SPRN_MD_AP); regs->kuap = mfspr(SPRN_MD_AP);
......
...@@ -13,18 +13,10 @@ ...@@ -13,18 +13,10 @@
#else #else
#include <linux/jump_label.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <asm/reg.h> #include <asm/reg.h>
extern struct static_key_false disable_kuap_key;
static __always_inline bool kuap_is_disabled(void)
{
return static_branch_unlikely(&disable_kuap_key);
}
static inline void __kuap_lock(void) static inline void __kuap_lock(void)
{ {
mtspr(SPRN_PID, 0); mtspr(SPRN_PID, 0);
......
...@@ -75,6 +75,10 @@ static struct cpu_spec * __init setup_cpu_spec(unsigned long offset, ...@@ -75,6 +75,10 @@ static struct cpu_spec * __init setup_cpu_spec(unsigned long offset,
t->cpu_features |= old.cpu_features & CPU_FTR_PMAO_BUG; t->cpu_features |= old.cpu_features & CPU_FTR_PMAO_BUG;
} }
/* Set kuap ON at startup, will be disabled later if cmdline has 'nosmap' */
if (IS_ENABLED(CONFIG_PPC_KUAP) && IS_ENABLED(CONFIG_PPC32))
t->mmu_features |= MMU_FTR_KUAP;
*PTRRELOC(&cur_cpu_spec) = &the_cpu_spec; *PTRRELOC(&cur_cpu_spec) = &the_cpu_spec;
/* /*
......
...@@ -3,9 +3,6 @@ ...@@ -3,9 +3,6 @@
#include <asm/kup.h> #include <asm/kup.h>
#include <asm/smp.h> #include <asm/smp.h>
struct static_key_false disable_kuap_key;
EXPORT_SYMBOL(disable_kuap_key);
void kuap_lock_all_ool(void) void kuap_lock_all_ool(void)
{ {
kuap_lock_all(); kuap_lock_all();
...@@ -30,7 +27,7 @@ void setup_kuap(bool disabled) ...@@ -30,7 +27,7 @@ void setup_kuap(bool disabled)
return; return;
if (disabled) if (disabled)
static_branch_enable(&disable_kuap_key); cur_cpu_spec->mmu_features &= ~MMU_FTR_KUAP;
else else
pr_info("Activating Kernel Userspace Access Protection\n"); pr_info("Activating Kernel Userspace Access Protection\n");
} }
...@@ -126,6 +126,8 @@ void __init MMU_init(void) ...@@ -126,6 +126,8 @@ void __init MMU_init(void)
setup_kup(); setup_kup();
update_mmu_feature_fixups(MMU_FTR_KUAP);
/* Shortly after that, the entire linear mapping will be available */ /* Shortly after that, the entire linear mapping will be available */
memblock_set_current_limit(lowmem_end_addr); memblock_set_current_limit(lowmem_end_addr);
} }
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
#include <linux/export.h> #include <linux/export.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/jump_label.h>
#include <linux/printk.h> #include <linux/printk.h>
#include <linux/smp.h> #include <linux/smp.h>
...@@ -13,16 +12,13 @@ ...@@ -13,16 +12,13 @@
#include <asm/smp.h> #include <asm/smp.h>
#ifdef CONFIG_PPC_KUAP #ifdef CONFIG_PPC_KUAP
struct static_key_false disable_kuap_key;
EXPORT_SYMBOL(disable_kuap_key);
void setup_kuap(bool disabled) void setup_kuap(bool disabled)
{ {
if (disabled) { if (disabled) {
if (IS_ENABLED(CONFIG_40x)) if (IS_ENABLED(CONFIG_40x))
disable_kuep = true; disable_kuep = true;
if (smp_processor_id() == boot_cpuid) if (smp_processor_id() == boot_cpuid)
static_branch_enable(&disable_kuap_key); cur_cpu_spec->mmu_features &= ~MMU_FTR_KUAP;
return; return;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment