[PATCH 22/25] powerpc: capture the violated protection key on fault
Michael Ellerman
mpe at ellerman.id.au
Wed Oct 25 02:46:55 AEDT 2017
Ram Pai <linuxram at us.ibm.com> writes:
> diff --git a/arch/powerpc/include/asm/paca.h b/arch/powerpc/include/asm/paca.h
> index 04b60af..51c89c1 100644
> --- a/arch/powerpc/include/asm/paca.h
> +++ b/arch/powerpc/include/asm/paca.h
> @@ -97,6 +97,9 @@ struct paca_struct {
> struct dtl_entry *dispatch_log_end;
> #endif /* CONFIG_PPC_STD_MMU_64 */
> u64 dscr_default; /* per-CPU default DSCR */
> +#ifdef CONFIG_PPC64_MEMORY_PROTECTION_KEYS
> + u16 paca_pkey; /* exception causing pkey */
> +#endif /* CONFIG_PPC64_MEMORY_PROTECTION_KEYS */
I can't see any reason why this should be in the paca.
> diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c
> index a16bc43..ad31f6e 100644
> --- a/arch/powerpc/mm/fault.c
> +++ b/arch/powerpc/mm/fault.c
> @@ -153,6 +153,7 @@ static int bad_page_fault_exception(struct pt_regs *regs, unsigned long address,
>
> #ifdef CONFIG_PPC64_MEMORY_PROTECTION_KEYS
> if (si_code & DSISR_KEYFAULT) {
> + get_paca()->paca_pkey = get_pte_pkey(current->mm, address);
You seem to be using the paca as a temporary stash so that you don't
have to pass it to _exception().
But that's not what the paca is for, the paca is for per-cpu data not
per-thread data, and (preferably) only for things that need to be
accessed in low-level code where proper per_cpu() variables don't work.
Updating _exception() to take the key would be a mess, because there are
so many callers who don't care about the key. For now we can probably
just do something ~=:
void _exception_pkey(int signr, struct pt_regs *regs, int code, unsigned long addr, int key)
{
< current body of _exception >
+ pkey bits
}
void _exception(int signr, struct pt_regs *regs, int code, unsigned long addr)
{
_exception_pkey(..., 0);
}
cheers
More information about the Linuxppc-dev
mailing list