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

Commit a0da4bc1 authored by Christophe Leroy's avatar Christophe Leroy Committed by Michael Ellerman
Browse files

powerpc/mm: Allow platforms to redefine some helpers



The 40xx defines _PAGE_HWWRITE while others don't.
The 8xx defines _PAGE_RO instead of _PAGE_RW.
The 8xx defines _PAGE_PRIVILEGED instead of _PAGE_USER.
The 8xx defines _PAGE_HUGE and _PAGE_NA while others don't.

Lets those platforms redefine pte_write(), pte_wrprotect() and
pte_mkwrite() and get _PAGE_RO and _PAGE_HWWRITE off the common
helpers.

Lets the 8xx redefine pte_user(), pte_mkprivileged() and pte_mkuser()
and get rid of _PAGE_PRIVILEGED and _PAGE_USER default values.

Lets the 8xx redefine pte_mkhuge() and get rid of
_PAGE_HUGE default value.

Reviewed-by: default avatarAneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
Signed-off-by: default avatarChristophe Leroy <christophe.leroy@c-s.fr>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 6c5d2d3f
Loading
Loading
Loading
Loading
+6 −10
Original line number Diff line number Diff line
@@ -136,14 +136,12 @@ extern int icache_44x_need_flush;
#define pte_clear(mm, addr, ptep) \
	do { pte_update(ptep, ~0, 0); } while (0)

#ifndef pte_mkwrite
static inline pte_t pte_mkwrite(pte_t pte)
{
	pte_basic_t ptev;

	ptev = pte_val(pte) & ~_PAGE_RO;
	ptev |= _PAGE_RW;
	return __pte(ptev);
	return __pte(pte_val(pte) | _PAGE_RW);
}
#endif

static inline pte_t pte_mkdirty(pte_t pte)
{
@@ -155,14 +153,12 @@ static inline pte_t pte_mkyoung(pte_t pte)
	return __pte(pte_val(pte) | _PAGE_ACCESSED);
}

#ifndef pte_wrprotect
static inline pte_t pte_wrprotect(pte_t pte)
{
	pte_basic_t ptev;

	ptev = pte_val(pte) & ~(_PAGE_RW | _PAGE_HWWRITE);
	ptev |= _PAGE_RO;
	return __pte(ptev);
	return __pte(pte_val(pte) & ~_PAGE_RW);
}
#endif

static inline pte_t pte_mkexec(pte_t pte)
{
+16 −0
Original line number Diff line number Diff line
@@ -87,5 +87,21 @@
#define PAGE_READONLY	__pgprot(_PAGE_BASE | _PAGE_USER)
#define PAGE_READONLY_X	__pgprot(_PAGE_BASE | _PAGE_USER | _PAGE_EXEC)

#ifndef __ASSEMBLY__
static inline pte_t pte_wrprotect(pte_t pte)
{
	return __pte(pte_val(pte) & ~(_PAGE_RW | _PAGE_HWWRITE));
}

#define pte_wrprotect pte_wrprotect

static inline pte_t pte_mkclean(pte_t pte)
{
	return __pte(pte_val(pte) & ~(_PAGE_DIRTY | _PAGE_HWWRITE));
}

#define pte_mkclean pte_mkclean
#endif

#endif /* __KERNEL__ */
#endif /*  _ASM_POWERPC_NOHASH_32_PTE_40x_H */
+51 −0
Original line number Diff line number Diff line
@@ -87,5 +87,56 @@
#define PAGE_READONLY	__pgprot(_PAGE_BASE | _PAGE_RO)
#define PAGE_READONLY_X	__pgprot(_PAGE_BASE | _PAGE_RO | _PAGE_EXEC)

#ifndef __ASSEMBLY__
static inline pte_t pte_wrprotect(pte_t pte)
{
	return __pte(pte_val(pte) | _PAGE_RO);
}

#define pte_wrprotect pte_wrprotect

static inline int pte_write(pte_t pte)
{
	return !(pte_val(pte) & _PAGE_RO);
}

#define pte_write pte_write

static inline pte_t pte_mkwrite(pte_t pte)
{
	return __pte(pte_val(pte) & ~_PAGE_RO);
}

#define pte_mkwrite pte_mkwrite

static inline bool pte_user(pte_t pte)
{
	return !(pte_val(pte) & _PAGE_PRIVILEGED);
}

#define pte_user pte_user

static inline pte_t pte_mkprivileged(pte_t pte)
{
	return __pte(pte_val(pte) | _PAGE_PRIVILEGED);
}

#define pte_mkprivileged pte_mkprivileged

static inline pte_t pte_mkuser(pte_t pte)
{
	return __pte(pte_val(pte) & ~_PAGE_PRIVILEGED);
}

#define pte_mkuser pte_mkuser

static inline pte_t pte_mkhuge(pte_t pte)
{
	return __pte(pte_val(pte) | _PAGE_HUGE);
}

#define pte_mkhuge pte_mkhuge
#endif

#endif /* __KERNEL__ */
#endif /*  _ASM_POWERPC_NOHASH_32_PTE_8xx_H */
+0 −4
Original line number Diff line number Diff line
@@ -90,11 +90,7 @@
 */
#include <asm/nohash/pte-book3e.h>

#define _PAGE_HWWRITE	0
#define _PAGE_SAO	0
#define _PAGE_RO 0
#define _PAGE_NA 0
#define _PAGE_HUGE 0

#define PTE_RPN_MASK	(~((1UL << PTE_RPN_SHIFT) - 1))

+18 −6
Original line number Diff line number Diff line
@@ -39,10 +39,12 @@
#ifndef __ASSEMBLY__

/* Generic accessors to PTE bits */
#ifndef pte_write
static inline int pte_write(pte_t pte)
{
	return (pte_val(pte) & (_PAGE_RW | _PAGE_RO)) != _PAGE_RO;
	return pte_val(pte) & _PAGE_RW;
}
#endif
static inline int pte_read(pte_t pte)		{ return 1; }
static inline int pte_dirty(pte_t pte)		{ return pte_val(pte) & _PAGE_DIRTY; }
static inline int pte_special(pte_t pte)	{ return pte_val(pte) & _PAGE_SPECIAL; }
@@ -84,10 +86,12 @@ static inline bool pte_hw_valid(pte_t pte)
 * and PTE_64BIT, PAGE_KERNEL_X contains _PAGE_BAP_SR which is also in
 * _PAGE_USER.  Need to explicitly match _PAGE_BAP_UR bit in that case too.
 */
#ifndef pte_user
static inline bool pte_user(pte_t pte)
{
	return (pte_val(pte) & (_PAGE_USER | _PAGE_PRIVILEGED)) == _PAGE_USER;
	return (pte_val(pte) & _PAGE_USER) == _PAGE_USER;
}
#endif

/*
 * We only find page table entry in the last level
@@ -127,10 +131,12 @@ static inline pte_t pte_exprotect(pte_t pte)
	return __pte(pte_val(pte) & ~_PAGE_EXEC);
}

#ifndef pte_mkclean
static inline pte_t pte_mkclean(pte_t pte)
{
	return __pte(pte_val(pte) & ~(_PAGE_DIRTY | _PAGE_HWWRITE));
	return __pte(pte_val(pte) & ~_PAGE_DIRTY);
}
#endif

static inline pte_t pte_mkold(pte_t pte)
{
@@ -147,20 +153,26 @@ static inline pte_t pte_mkspecial(pte_t pte)
	return __pte(pte_val(pte) | _PAGE_SPECIAL);
}

#ifndef pte_mkhuge
static inline pte_t pte_mkhuge(pte_t pte)
{
	return __pte(pte_val(pte) | _PAGE_HUGE);
	return __pte(pte_val(pte));
}
#endif

#ifndef pte_mkprivileged
static inline pte_t pte_mkprivileged(pte_t pte)
{
	return __pte((pte_val(pte) & ~_PAGE_USER) | _PAGE_PRIVILEGED);
	return __pte(pte_val(pte) & ~_PAGE_USER);
}
#endif

#ifndef pte_mkuser
static inline pte_t pte_mkuser(pte_t pte)
{
	return __pte((pte_val(pte) & ~_PAGE_PRIVILEGED) | _PAGE_USER);
	return __pte(pte_val(pte) | _PAGE_USER);
}
#endif

static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
{
Loading