powerpc: ability to associate pkey to a vma
arch-independent code expects the arch to map a pkey into the vma's protection bit setting. The patch provides that ability. Signed-off-by: Ram Pai <linuxram@us.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:
Родитель
5586cf61e1
Коммит
013a91b39c
|
@ -13,6 +13,7 @@
|
|||
|
||||
#include <asm/cputable.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/pkeys.h>
|
||||
#include <asm/cpu_has_feature.h>
|
||||
|
||||
/*
|
||||
|
@ -22,7 +23,11 @@
|
|||
static inline unsigned long arch_calc_vm_prot_bits(unsigned long prot,
|
||||
unsigned long pkey)
|
||||
{
|
||||
return (prot & PROT_SAO) ? VM_SAO : 0;
|
||||
#ifdef CONFIG_PPC_MEM_KEYS
|
||||
return (((prot & PROT_SAO) ? VM_SAO : 0) | pkey_to_vmflag_bits(pkey));
|
||||
#else
|
||||
return ((prot & PROT_SAO) ? VM_SAO : 0);
|
||||
#endif
|
||||
}
|
||||
#define arch_calc_vm_prot_bits(prot, pkey) arch_calc_vm_prot_bits(prot, pkey)
|
||||
|
||||
|
|
|
@ -30,6 +30,17 @@ extern u32 initial_allocation_mask; /* bits set for reserved keys */
|
|||
#define ARCH_VM_PKEY_FLAGS (VM_PKEY_BIT0 | VM_PKEY_BIT1 | VM_PKEY_BIT2 | \
|
||||
VM_PKEY_BIT3 | VM_PKEY_BIT4)
|
||||
|
||||
/* Override any generic PKEY permission defines */
|
||||
#define PKEY_DISABLE_EXECUTE 0x4
|
||||
#define PKEY_ACCESS_MASK (PKEY_DISABLE_ACCESS | \
|
||||
PKEY_DISABLE_WRITE | \
|
||||
PKEY_DISABLE_EXECUTE)
|
||||
|
||||
static inline u64 pkey_to_vmflag_bits(u16 pkey)
|
||||
{
|
||||
return (((u64)pkey << VM_PKEY_SHIFT) & ARCH_VM_PKEY_FLAGS);
|
||||
}
|
||||
|
||||
#define arch_max_pkey() pkeys_total
|
||||
|
||||
#define pkey_alloc_mask(pkey) (0x1 << pkey)
|
||||
|
|
|
@ -34,6 +34,14 @@ int pkey_initialize(void)
|
|||
BUILD_BUG_ON(PKEY_DISABLE_EXECUTE &
|
||||
(PKEY_DISABLE_ACCESS | PKEY_DISABLE_WRITE));
|
||||
|
||||
/*
|
||||
* pkey_to_vmflag_bits() assumes that the pkey bits are contiguous
|
||||
* in the vmaflag. Make sure that is really the case.
|
||||
*/
|
||||
BUILD_BUG_ON(__builtin_clzl(ARCH_VM_PKEY_FLAGS >> VM_PKEY_SHIFT) +
|
||||
__builtin_popcountl(ARCH_VM_PKEY_FLAGS >> VM_PKEY_SHIFT)
|
||||
!= (sizeof(u64) * BITS_PER_BYTE));
|
||||
|
||||
/*
|
||||
* Disable the pkey system till everything is in place. A subsequent
|
||||
* patch will enable it.
|
||||
|
|
Загрузка…
Ссылка в новой задаче