Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 087003e9 authored by Ram Pai's avatar Ram Pai Committed by Michael Ellerman
Browse files

powerpc: introduce get_mm_addr_key() helper



get_mm_addr_key() helper returns the pkey associated with
an address corresponding to a given mm_struct.

Signed-off-by: default avatarRam Pai <linuxram@us.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent e6c2a479
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -260,6 +260,15 @@ static inline bool early_radix_enabled(void)
}
#endif

#ifdef CONFIG_PPC_MEM_KEYS
extern u16 get_mm_addr_key(struct mm_struct *mm, unsigned long address);
#else
static inline u16 get_mm_addr_key(struct mm_struct *mm, unsigned long address)
{
	return 0;
}
#endif /* CONFIG_PPC_MEM_KEYS */

#endif /* !__ASSEMBLY__ */

/* The kernel use the constants below to index in the page sizes array.
+24 −0
Original line number Diff line number Diff line
@@ -1581,6 +1581,30 @@ void hash_preload(struct mm_struct *mm, unsigned long ea,
	local_irq_restore(flags);
}

#ifdef CONFIG_PPC_MEM_KEYS
/*
 * Return the protection key associated with the given address and the
 * mm_struct.
 */
u16 get_mm_addr_key(struct mm_struct *mm, unsigned long address)
{
	pte_t *ptep;
	u16 pkey = 0;
	unsigned long flags;

	if (!mm || !mm->pgd)
		return 0;

	local_irq_save(flags);
	ptep = find_linux_pte(mm->pgd, address, NULL, NULL);
	if (ptep)
		pkey = pte_to_pkey_bits(pte_val(READ_ONCE(*ptep)));
	local_irq_restore(flags);

	return pkey;
}
#endif /* CONFIG_PPC_MEM_KEYS */

#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
static inline void tm_flush_hash_page(int local)
{