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: Christophe Leroy <christophe.leroy@csgroup.eu> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/1cbf94e26e6d6e2e028fd687588a7e6622d454a6.1634627931.git.christophe.leroy@csgroup.eu
This commit is contained in:
committed by
Michael Ellerman
parent
047a6fd401
commit
42e03bc524
@@ -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
|
|||||||
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)
|
|||||||
__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)
|
|||||||
|
|
||||||
__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,
|
|||||||
|
|
||||||
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);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
Reference in New Issue
Block a user