Commit 1137573a authored by Ram Pai's avatar Ram Pai Committed by Michael Ellerman

powerpc: implementation for arch_vma_access_permitted()

This patch provides the implementation for
arch_vma_access_permitted(). Returns true if the
requested access is allowed by pkey associated with the
vma.
Signed-off-by: default avatarRam Pai <linuxram@us.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent bca7aacf
...@@ -186,6 +186,10 @@ static inline void arch_bprm_mm_init(struct mm_struct *mm, ...@@ -186,6 +186,10 @@ static inline void arch_bprm_mm_init(struct mm_struct *mm,
{ {
} }
#ifdef CONFIG_PPC_MEM_KEYS
bool arch_vma_access_permitted(struct vm_area_struct *vma, bool write,
bool execute, bool foreign);
#else /* CONFIG_PPC_MEM_KEYS */
static inline bool arch_vma_access_permitted(struct vm_area_struct *vma, static inline bool arch_vma_access_permitted(struct vm_area_struct *vma,
bool write, bool execute, bool foreign) bool write, bool execute, bool foreign)
{ {
...@@ -193,7 +197,6 @@ static inline bool arch_vma_access_permitted(struct vm_area_struct *vma, ...@@ -193,7 +197,6 @@ static inline bool arch_vma_access_permitted(struct vm_area_struct *vma,
return true; return true;
} }
#ifndef CONFIG_PPC_MEM_KEYS
#define pkey_mm_init(mm) #define pkey_mm_init(mm)
#define thread_pkey_regs_save(thread) #define thread_pkey_regs_save(thread)
#define thread_pkey_regs_restore(new_thread, old_thread) #define thread_pkey_regs_restore(new_thread, old_thread)
......
...@@ -386,3 +386,37 @@ bool arch_pte_access_permitted(u64 pte, bool write, bool execute) ...@@ -386,3 +386,37 @@ bool arch_pte_access_permitted(u64 pte, bool write, bool execute)
return pkey_access_permitted(pte_to_pkey_bits(pte), write, execute); return pkey_access_permitted(pte_to_pkey_bits(pte), write, execute);
} }
/*
* We only want to enforce protection keys on the current thread because we
* effectively have no access to AMR/IAMR for other threads or any way to tell
* which AMR/IAMR in a threaded process we could use.
*
* So do not enforce things if the VMA is not from the current mm, or if we are
* in a kernel thread.
*/
static inline bool vma_is_foreign(struct vm_area_struct *vma)
{
if (!current->mm)
return true;
/* if it is not our ->mm, it has to be foreign */
if (current->mm != vma->vm_mm)
return true;
return false;
}
bool arch_vma_access_permitted(struct vm_area_struct *vma, bool write,
bool execute, bool foreign)
{
if (static_branch_likely(&pkey_disabled))
return true;
/*
* Do not enforce our key-permissions on a foreign vma.
*/
if (foreign || vma_is_foreign(vma))
return true;
return pkey_access_permitted(vma_pkey(vma), write, execute);
}
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