Commit 42e03bc5 authored by Christophe Leroy's avatar Christophe Leroy Committed by Michael Ellerman

powerpc/kuap: Prepare for supporting KUAP on BOOK3E/64

Also call kuap_lock() and kuap_save_and_lock() from
interrupt functions with CONFIG_PPC64.

For book3s/64 we keep them empty as it is done in assembly.

Also do the locked assert when switching task unless it is
book3s/64.
Signed-off-by: default avatarChristophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/1cbf94e26e6d6e2e028fd687588a7e6622d454a6.1634627931.git.christophe.leroy@csgroup.eu
parent 047a6fd4
...@@ -298,6 +298,15 @@ static inline unsigned long __kuap_get_and_assert_locked(void) ...@@ -298,6 +298,15 @@ static inline unsigned long __kuap_get_and_assert_locked(void)
return amr; return amr;
} }
/* Do nothing, book3s/64 does that in ASM */
static inline void __kuap_lock(void)
{
}
static inline void __kuap_save_and_lock(struct pt_regs *regs)
{
}
/* /*
* We support individually allowing read or write, but we don't support nesting * We support individually allowing read or write, but we don't support nesting
* because that would require an expensive read/modify write of the AMR. * because that would require an expensive read/modify write of the AMR.
......
...@@ -154,12 +154,14 @@ static inline void interrupt_enter_prepare(struct pt_regs *regs, struct interrup ...@@ -154,12 +154,14 @@ static inline void interrupt_enter_prepare(struct pt_regs *regs, struct interrup
local_paca->irq_happened |= PACA_IRQ_HARD_DIS; local_paca->irq_happened |= PACA_IRQ_HARD_DIS;
if (user_mode(regs)) { if (user_mode(regs)) {
kuap_lock();
CT_WARN_ON(ct_state() != CONTEXT_USER); CT_WARN_ON(ct_state() != CONTEXT_USER);
user_exit_irqoff(); user_exit_irqoff();
account_cpu_user_entry(); account_cpu_user_entry();
account_stolen_time(); account_stolen_time();
} else { } else {
kuap_save_and_lock(regs);
/* /*
* CT_WARN_ON comes here via program_check_exception, * CT_WARN_ON comes here via program_check_exception,
* so avoid recursion. * so avoid recursion.
......
...@@ -91,7 +91,6 @@ static __always_inline void kuap_assert_locked(void) ...@@ -91,7 +91,6 @@ static __always_inline void kuap_assert_locked(void)
__kuap_get_and_assert_locked(); __kuap_get_and_assert_locked();
} }
#ifdef CONFIG_PPC32
static __always_inline void kuap_lock(void) static __always_inline void kuap_lock(void)
{ {
if (kuap_is_disabled()) if (kuap_is_disabled())
...@@ -107,7 +106,6 @@ static __always_inline void kuap_save_and_lock(struct pt_regs *regs) ...@@ -107,7 +106,6 @@ static __always_inline void kuap_save_and_lock(struct pt_regs *regs)
__kuap_save_and_lock(regs); __kuap_save_and_lock(regs);
} }
#endif
static __always_inline void kuap_kernel_restore(struct pt_regs *regs, unsigned long amr) static __always_inline void kuap_kernel_restore(struct pt_regs *regs, unsigned long amr)
{ {
......
...@@ -1315,9 +1315,9 @@ struct task_struct *__switch_to(struct task_struct *prev, ...@@ -1315,9 +1315,9 @@ struct task_struct *__switch_to(struct task_struct *prev,
set_return_regs_changed(); /* _switch changes stack (and regs) */ set_return_regs_changed(); /* _switch changes stack (and regs) */
#ifdef CONFIG_PPC32 if (!IS_ENABLED(CONFIG_PPC_BOOK3S_64))
kuap_assert_locked(); kuap_assert_locked();
#endif
last = _switch(old_thread, new_thread); last = _switch(old_thread, new_thread);
/* /*
......
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