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:
parent
5586cf61e1
commit
013a91b39c
@ -13,6 +13,7 @@
|
|||||||
|
|
||||||
#include <asm/cputable.h>
|
#include <asm/cputable.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
|
#include <linux/pkeys.h>
|
||||||
#include <asm/cpu_has_feature.h>
|
#include <asm/cpu_has_feature.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -22,7 +23,11 @@
|
|||||||
static inline unsigned long arch_calc_vm_prot_bits(unsigned long prot,
|
static inline unsigned long arch_calc_vm_prot_bits(unsigned long prot,
|
||||||
unsigned long pkey)
|
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)
|
#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 | \
|
#define ARCH_VM_PKEY_FLAGS (VM_PKEY_BIT0 | VM_PKEY_BIT1 | VM_PKEY_BIT2 | \
|
||||||
VM_PKEY_BIT3 | VM_PKEY_BIT4)
|
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 arch_max_pkey() pkeys_total
|
||||||
|
|
||||||
#define pkey_alloc_mask(pkey) (0x1 << pkey)
|
#define pkey_alloc_mask(pkey) (0x1 << pkey)
|
||||||
|
@ -34,6 +34,14 @@ int pkey_initialize(void)
|
|||||||
BUILD_BUG_ON(PKEY_DISABLE_EXECUTE &
|
BUILD_BUG_ON(PKEY_DISABLE_EXECUTE &
|
||||||
(PKEY_DISABLE_ACCESS | PKEY_DISABLE_WRITE));
|
(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
|
* Disable the pkey system till everything is in place. A subsequent
|
||||||
* patch will enable it.
|
* patch will enable it.
|
||||||
|
Loading…
Reference in New Issue
Block a user