|
@@ -506,12 +506,12 @@ static inline bool pte_soft_dirty(pte_t pte)
|
|
|
|
|
|
static inline pte_t pte_mksoft_dirty(pte_t pte)
|
|
|
{
|
|
|
- return __pte(pte_val(pte) | _PAGE_SOFT_DIRTY);
|
|
|
+ return __pte_raw(pte_raw(pte) | cpu_to_be64(_PAGE_SOFT_DIRTY));
|
|
|
}
|
|
|
|
|
|
static inline pte_t pte_clear_soft_dirty(pte_t pte)
|
|
|
{
|
|
|
- return __pte(pte_val(pte) & ~_PAGE_SOFT_DIRTY);
|
|
|
+ return __pte_raw(pte_raw(pte) & cpu_to_be64(~_PAGE_SOFT_DIRTY));
|
|
|
}
|
|
|
#endif /* CONFIG_HAVE_ARCH_SOFT_DIRTY */
|
|
|
|
|
@@ -532,7 +532,7 @@ static inline pte_t pte_mk_savedwrite(pte_t pte)
|
|
|
*/
|
|
|
VM_BUG_ON((pte_raw(pte) & cpu_to_be64(_PAGE_PRESENT | _PAGE_RWX | _PAGE_PRIVILEGED)) !=
|
|
|
cpu_to_be64(_PAGE_PRESENT | _PAGE_PRIVILEGED));
|
|
|
- return __pte(pte_val(pte) & ~_PAGE_PRIVILEGED);
|
|
|
+ return __pte_raw(pte_raw(pte) & cpu_to_be64(~_PAGE_PRIVILEGED));
|
|
|
}
|
|
|
|
|
|
#define pte_clear_savedwrite pte_clear_savedwrite
|
|
@@ -542,14 +542,14 @@ static inline pte_t pte_clear_savedwrite(pte_t pte)
|
|
|
* Used by KSM subsystem to make a protnone pte readonly.
|
|
|
*/
|
|
|
VM_BUG_ON(!pte_protnone(pte));
|
|
|
- return __pte(pte_val(pte) | _PAGE_PRIVILEGED);
|
|
|
+ return __pte_raw(pte_raw(pte) | cpu_to_be64(_PAGE_PRIVILEGED));
|
|
|
}
|
|
|
#else
|
|
|
#define pte_clear_savedwrite pte_clear_savedwrite
|
|
|
static inline pte_t pte_clear_savedwrite(pte_t pte)
|
|
|
{
|
|
|
VM_WARN_ON(1);
|
|
|
- return __pte(pte_val(pte) & ~_PAGE_WRITE);
|
|
|
+ return __pte_raw(pte_raw(pte) & cpu_to_be64(~_PAGE_WRITE));
|
|
|
}
|
|
|
#endif /* CONFIG_NUMA_BALANCING */
|
|
|
|
|
@@ -578,25 +578,22 @@ static inline bool arch_pte_access_permitted(u64 pte, bool write, bool execute)
|
|
|
}
|
|
|
#endif /* CONFIG_PPC_MEM_KEYS */
|
|
|
|
|
|
+static inline bool pte_user(pte_t pte)
|
|
|
+{
|
|
|
+ return !(pte_raw(pte) & cpu_to_be64(_PAGE_PRIVILEGED));
|
|
|
+}
|
|
|
+
|
|
|
#define pte_access_permitted pte_access_permitted
|
|
|
static inline bool pte_access_permitted(pte_t pte, bool write)
|
|
|
{
|
|
|
- unsigned long pteval = pte_val(pte);
|
|
|
- /* Also check for pte_user */
|
|
|
- unsigned long clear_pte_bits = _PAGE_PRIVILEGED;
|
|
|
/*
|
|
|
* _PAGE_READ is needed for any access and will be
|
|
|
* cleared for PROT_NONE
|
|
|
*/
|
|
|
- unsigned long need_pte_bits = _PAGE_PRESENT | _PAGE_READ;
|
|
|
-
|
|
|
- if (write)
|
|
|
- need_pte_bits |= _PAGE_WRITE;
|
|
|
-
|
|
|
- if ((pteval & need_pte_bits) != need_pte_bits)
|
|
|
+ if (!pte_present(pte) || !pte_user(pte) || !pte_read(pte))
|
|
|
return false;
|
|
|
|
|
|
- if ((pteval & clear_pte_bits) == clear_pte_bits)
|
|
|
+ if (write && !pte_write(pte))
|
|
|
return false;
|
|
|
|
|
|
return arch_pte_access_permitted(pte_val(pte), write, 0);
|
|
@@ -625,32 +622,32 @@ static inline pte_t pte_wrprotect(pte_t pte)
|
|
|
{
|
|
|
if (unlikely(pte_savedwrite(pte)))
|
|
|
return pte_clear_savedwrite(pte);
|
|
|
- return __pte(pte_val(pte) & ~_PAGE_WRITE);
|
|
|
+ return __pte_raw(pte_raw(pte) & cpu_to_be64(~_PAGE_WRITE));
|
|
|
}
|
|
|
|
|
|
static inline pte_t pte_exprotect(pte_t pte)
|
|
|
{
|
|
|
- return __pte(pte_val(pte) & ~_PAGE_EXEC);
|
|
|
+ return __pte_raw(pte_raw(pte) & cpu_to_be64(~_PAGE_EXEC));
|
|
|
}
|
|
|
|
|
|
static inline pte_t pte_mkclean(pte_t pte)
|
|
|
{
|
|
|
- return __pte(pte_val(pte) & ~_PAGE_DIRTY);
|
|
|
+ return __pte_raw(pte_raw(pte) & cpu_to_be64(~_PAGE_DIRTY));
|
|
|
}
|
|
|
|
|
|
static inline pte_t pte_mkold(pte_t pte)
|
|
|
{
|
|
|
- return __pte(pte_val(pte) & ~_PAGE_ACCESSED);
|
|
|
+ return __pte_raw(pte_raw(pte) & cpu_to_be64(~_PAGE_ACCESSED));
|
|
|
}
|
|
|
|
|
|
static inline pte_t pte_mkexec(pte_t pte)
|
|
|
{
|
|
|
- return __pte(pte_val(pte) | _PAGE_EXEC);
|
|
|
+ return __pte_raw(pte_raw(pte) | cpu_to_be64(_PAGE_EXEC));
|
|
|
}
|
|
|
|
|
|
static inline pte_t pte_mkpte(pte_t pte)
|
|
|
{
|
|
|
- return __pte(pte_val(pte) | _PAGE_PTE);
|
|
|
+ return __pte_raw(pte_raw(pte) | cpu_to_be64(_PAGE_PTE));
|
|
|
}
|
|
|
|
|
|
static inline pte_t pte_mkwrite(pte_t pte)
|
|
@@ -658,22 +655,22 @@ static inline pte_t pte_mkwrite(pte_t pte)
|
|
|
/*
|
|
|
* write implies read, hence set both
|
|
|
*/
|
|
|
- return __pte(pte_val(pte) | _PAGE_RW);
|
|
|
+ return __pte_raw(pte_raw(pte) | cpu_to_be64(_PAGE_RW));
|
|
|
}
|
|
|
|
|
|
static inline pte_t pte_mkdirty(pte_t pte)
|
|
|
{
|
|
|
- return __pte(pte_val(pte) | _PAGE_DIRTY | _PAGE_SOFT_DIRTY);
|
|
|
+ return __pte_raw(pte_raw(pte) | cpu_to_be64(_PAGE_DIRTY | _PAGE_SOFT_DIRTY));
|
|
|
}
|
|
|
|
|
|
static inline pte_t pte_mkyoung(pte_t pte)
|
|
|
{
|
|
|
- return __pte(pte_val(pte) | _PAGE_ACCESSED);
|
|
|
+ return __pte_raw(pte_raw(pte) | cpu_to_be64(_PAGE_ACCESSED));
|
|
|
}
|
|
|
|
|
|
static inline pte_t pte_mkspecial(pte_t pte)
|
|
|
{
|
|
|
- return __pte(pte_val(pte) | _PAGE_SPECIAL);
|
|
|
+ return __pte_raw(pte_raw(pte) | cpu_to_be64(_PAGE_SPECIAL));
|
|
|
}
|
|
|
|
|
|
static inline pte_t pte_mkhuge(pte_t pte)
|
|
@@ -683,17 +680,17 @@ static inline pte_t pte_mkhuge(pte_t pte)
|
|
|
|
|
|
static inline pte_t pte_mkdevmap(pte_t pte)
|
|
|
{
|
|
|
- return __pte(pte_val(pte) | _PAGE_SPECIAL|_PAGE_DEVMAP);
|
|
|
+ return __pte_raw(pte_raw(pte) | cpu_to_be64(_PAGE_SPECIAL | _PAGE_DEVMAP));
|
|
|
}
|
|
|
|
|
|
static inline pte_t pte_mkprivileged(pte_t pte)
|
|
|
{
|
|
|
- return __pte(pte_val(pte) | _PAGE_PRIVILEGED);
|
|
|
+ return __pte_raw(pte_raw(pte) | cpu_to_be64(_PAGE_PRIVILEGED));
|
|
|
}
|
|
|
|
|
|
static inline pte_t pte_mkuser(pte_t pte)
|
|
|
{
|
|
|
- return __pte(pte_val(pte) & ~_PAGE_PRIVILEGED);
|
|
|
+ return __pte_raw(pte_raw(pte) & cpu_to_be64(~_PAGE_PRIVILEGED));
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -712,12 +709,8 @@ static inline int pte_devmap(pte_t pte)
|
|
|
static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
|
|
|
{
|
|
|
/* FIXME!! check whether this need to be a conditional */
|
|
|
- return __pte((pte_val(pte) & _PAGE_CHG_MASK) | pgprot_val(newprot));
|
|
|
-}
|
|
|
-
|
|
|
-static inline bool pte_user(pte_t pte)
|
|
|
-{
|
|
|
- return !(pte_raw(pte) & cpu_to_be64(_PAGE_PRIVILEGED));
|
|
|
+ return __pte_raw((pte_raw(pte) & cpu_to_be64(_PAGE_CHG_MASK)) |
|
|
|
+ cpu_to_be64(pgprot_val(newprot)));
|
|
|
}
|
|
|
|
|
|
/* Encode and de-code a swap entry */
|
|
@@ -760,7 +753,7 @@ static inline bool pte_user(pte_t pte)
|
|
|
#ifdef CONFIG_HAVE_ARCH_SOFT_DIRTY
|
|
|
static inline pte_t pte_swp_mksoft_dirty(pte_t pte)
|
|
|
{
|
|
|
- return __pte(pte_val(pte) | _PAGE_SWP_SOFT_DIRTY);
|
|
|
+ return __pte_raw(pte_raw(pte) | cpu_to_be64(_PAGE_SWP_SOFT_DIRTY));
|
|
|
}
|
|
|
|
|
|
static inline bool pte_swp_soft_dirty(pte_t pte)
|
|
@@ -770,7 +763,7 @@ static inline bool pte_swp_soft_dirty(pte_t pte)
|
|
|
|
|
|
static inline pte_t pte_swp_clear_soft_dirty(pte_t pte)
|
|
|
{
|
|
|
- return __pte(pte_val(pte) & ~_PAGE_SWP_SOFT_DIRTY);
|
|
|
+ return __pte_raw(pte_raw(pte) & cpu_to_be64(~_PAGE_SWP_SOFT_DIRTY));
|
|
|
}
|
|
|
#endif /* CONFIG_HAVE_ARCH_SOFT_DIRTY */
|
|
|
|
|
@@ -859,10 +852,10 @@ static inline pgprot_t pgprot_writecombine(pgprot_t prot)
|
|
|
*/
|
|
|
static inline bool pte_ci(pte_t pte)
|
|
|
{
|
|
|
- unsigned long pte_v = pte_val(pte);
|
|
|
+ __be64 pte_v = pte_raw(pte);
|
|
|
|
|
|
- if (((pte_v & _PAGE_CACHE_CTL) == _PAGE_TOLERANT) ||
|
|
|
- ((pte_v & _PAGE_CACHE_CTL) == _PAGE_NON_IDEMPOTENT))
|
|
|
+ if (((pte_v & cpu_to_be64(_PAGE_CACHE_CTL)) == cpu_to_be64(_PAGE_TOLERANT)) ||
|
|
|
+ ((pte_v & cpu_to_be64(_PAGE_CACHE_CTL)) == cpu_to_be64(_PAGE_NON_IDEMPOTENT)))
|
|
|
return true;
|
|
|
return false;
|
|
|
}
|