Commit b3c03fe1 authored by Joey Gouly's avatar Joey Gouly Committed by Will Deacon
Browse files

arm64: convert protection key into vm_flags and pgprot values



Modify arch_calc_vm_prot_bits() and vm_get_page_prot() such that the pkey
value is set in the vm_flags and then into the pgprot value.

Signed-off-by: default avatarJoey Gouly <joey.gouly@arm.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Will Deacon <will@kernel.org>
Link: https://lore.kernel.org/r/20240822151113.1479789-15-joey.gouly@arm.com


Signed-off-by: default avatarWill Deacon <will@kernel.org>
parent b66db4f3
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -7,7 +7,7 @@
#include <uapi/asm/mman.h>

static inline unsigned long arch_calc_vm_prot_bits(unsigned long prot,
	unsigned long pkey __always_unused)
	unsigned long pkey)
{
	unsigned long ret = 0;

@@ -17,6 +17,14 @@ static inline unsigned long arch_calc_vm_prot_bits(unsigned long prot,
	if (system_supports_mte() && (prot & PROT_MTE))
		ret |= VM_MTE;

#ifdef CONFIG_ARCH_HAS_PKEYS
	if (system_supports_poe()) {
		ret |= pkey & BIT(0) ? VM_PKEY_BIT0 : 0;
		ret |= pkey & BIT(1) ? VM_PKEY_BIT1 : 0;
		ret |= pkey & BIT(2) ? VM_PKEY_BIT2 : 0;
	}
#endif

	return ret;
}
#define arch_calc_vm_prot_bits(prot, pkey) arch_calc_vm_prot_bits(prot, pkey)
+11 −0
Original line number Diff line number Diff line
@@ -102,6 +102,17 @@ pgprot_t vm_get_page_prot(unsigned long vm_flags)
	if (vm_flags & VM_MTE)
		prot |= PTE_ATTRINDX(MT_NORMAL_TAGGED);

#ifdef CONFIG_ARCH_HAS_PKEYS
	if (system_supports_poe()) {
		if (vm_flags & VM_PKEY_BIT0)
			prot |= PTE_PO_IDX_0;
		if (vm_flags & VM_PKEY_BIT1)
			prot |= PTE_PO_IDX_1;
		if (vm_flags & VM_PKEY_BIT2)
			prot |= PTE_PO_IDX_2;
	}
#endif

	return __pgprot(prot);
}
EXPORT_SYMBOL(vm_get_page_prot);