forked from Minki/linux
powerpc/book3s64/pkeys: Convert pkey_total to num_pkey
num_pkey now represents max number of keys supported such that we return to userspace 0 - num_pkey - 1. Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20200709032946.881753-11-aneesh.kumar@linux.ibm.com
This commit is contained in:
parent
a4678d4b47
commit
c529afd7cb
@ -12,7 +12,7 @@
|
||||
#include <asm/firmware.h>
|
||||
|
||||
DECLARE_STATIC_KEY_FALSE(pkey_disabled);
|
||||
extern int pkeys_total; /* total pkeys as per device tree */
|
||||
extern int num_pkey;
|
||||
extern u32 initial_allocation_mask; /* bits set for the initially allocated keys */
|
||||
extern u32 reserved_allocation_mask; /* bits set for reserved keys */
|
||||
|
||||
@ -44,7 +44,10 @@ static inline int vma_pkey(struct vm_area_struct *vma)
|
||||
return (vma->vm_flags & ARCH_VM_PKEY_FLAGS) >> VM_PKEY_SHIFT;
|
||||
}
|
||||
|
||||
#define arch_max_pkey() pkeys_total
|
||||
static inline int arch_max_pkey(void)
|
||||
{
|
||||
return num_pkey;
|
||||
}
|
||||
|
||||
#define pkey_alloc_mask(pkey) (0x1 << pkey)
|
||||
|
||||
|
@ -13,7 +13,7 @@
|
||||
#include <linux/of_device.h>
|
||||
|
||||
DEFINE_STATIC_KEY_FALSE(pkey_disabled);
|
||||
int pkeys_total; /* Total pkeys as per device tree */
|
||||
int num_pkey; /* Max number of pkeys supported */
|
||||
u32 initial_allocation_mask; /* Bits set for the initially allocated keys */
|
||||
/*
|
||||
* Keys marked in the reservation list cannot be allocated by userspace
|
||||
@ -93,7 +93,7 @@ static int scan_pkey_feature(void)
|
||||
|
||||
static int pkey_initialize(void)
|
||||
{
|
||||
int os_reserved, i;
|
||||
int pkeys_total, i;
|
||||
|
||||
/*
|
||||
* We define PKEY_DISABLE_EXECUTE in addition to the arch-neutral
|
||||
@ -133,12 +133,12 @@ static int pkey_initialize(void)
|
||||
* The OS can manage only 8 pkeys due to its inability to represent them
|
||||
* in the Linux 4K PTE. Mark all other keys reserved.
|
||||
*/
|
||||
os_reserved = pkeys_total - 8;
|
||||
num_pkey = min(8, pkeys_total);
|
||||
#else
|
||||
os_reserved = 0;
|
||||
num_pkey = pkeys_total;
|
||||
#endif
|
||||
|
||||
if (unlikely((pkeys_total - os_reserved) <= execute_only_key)) {
|
||||
if (unlikely(num_pkey <= execute_only_key)) {
|
||||
/*
|
||||
* Insufficient number of keys to support
|
||||
* execute only key. Mark it unavailable.
|
||||
@ -185,10 +185,10 @@ static int pkey_initialize(void)
|
||||
default_uamor &= ~(0x3ul << pkeyshift(1));
|
||||
|
||||
/*
|
||||
* Prevent the usage of OS reserved the keys. Update UAMOR
|
||||
* Prevent the usage of OS reserved keys. Update UAMOR
|
||||
* for those keys.
|
||||
*/
|
||||
for (i = (pkeys_total - os_reserved); i < pkeys_total; i++) {
|
||||
for (i = num_pkey; i < pkeys_total; i++) {
|
||||
reserved_allocation_mask |= (0x1 << i);
|
||||
default_uamor &= ~(0x3ul << pkeyshift(i));
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user