|
@@ -302,16 +302,30 @@ static inline pte_t pte_mkspecial(pte_t pte)
|
|
|
|
|
|
extern pteval_t __supported_pte_mask;
|
|
extern pteval_t __supported_pte_mask;
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * Mask out unsupported bits in a present pgprot. Non-present pgprots
|
|
|
|
+ * can use those bits for other purposes, so leave them be.
|
|
|
|
+ */
|
|
|
|
+static inline pgprotval_t massage_pgprot(pgprot_t pgprot)
|
|
|
|
+{
|
|
|
|
+ pgprotval_t protval = pgprot_val(pgprot);
|
|
|
|
+
|
|
|
|
+ if (protval & _PAGE_PRESENT)
|
|
|
|
+ protval &= __supported_pte_mask;
|
|
|
|
+
|
|
|
|
+ return protval;
|
|
|
|
+}
|
|
|
|
+
|
|
static inline pte_t pfn_pte(unsigned long page_nr, pgprot_t pgprot)
|
|
static inline pte_t pfn_pte(unsigned long page_nr, pgprot_t pgprot)
|
|
{
|
|
{
|
|
- return __pte((((phys_addr_t)page_nr << PAGE_SHIFT) |
|
|
|
|
- pgprot_val(pgprot)) & __supported_pte_mask);
|
|
|
|
|
|
+ return __pte(((phys_addr_t)page_nr << PAGE_SHIFT) |
|
|
|
|
+ massage_pgprot(pgprot));
|
|
}
|
|
}
|
|
|
|
|
|
static inline pmd_t pfn_pmd(unsigned long page_nr, pgprot_t pgprot)
|
|
static inline pmd_t pfn_pmd(unsigned long page_nr, pgprot_t pgprot)
|
|
{
|
|
{
|
|
- return __pmd((((phys_addr_t)page_nr << PAGE_SHIFT) |
|
|
|
|
- pgprot_val(pgprot)) & __supported_pte_mask);
|
|
|
|
|
|
+ return __pmd(((phys_addr_t)page_nr << PAGE_SHIFT) |
|
|
|
|
+ massage_pgprot(pgprot));
|
|
}
|
|
}
|
|
|
|
|
|
static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
|
|
static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
|
|
@@ -323,7 +337,7 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
|
|
* the newprot (if present):
|
|
* the newprot (if present):
|
|
*/
|
|
*/
|
|
val &= _PAGE_CHG_MASK;
|
|
val &= _PAGE_CHG_MASK;
|
|
- val |= pgprot_val(newprot) & (~_PAGE_CHG_MASK) & __supported_pte_mask;
|
|
|
|
|
|
+ val |= massage_pgprot(newprot) & ~_PAGE_CHG_MASK;
|
|
|
|
|
|
return __pte(val);
|
|
return __pte(val);
|
|
}
|
|
}
|
|
@@ -339,7 +353,7 @@ static inline pgprot_t pgprot_modify(pgprot_t oldprot, pgprot_t newprot)
|
|
|
|
|
|
#define pte_pgprot(x) __pgprot(pte_flags(x) & PTE_FLAGS_MASK)
|
|
#define pte_pgprot(x) __pgprot(pte_flags(x) & PTE_FLAGS_MASK)
|
|
|
|
|
|
-#define canon_pgprot(p) __pgprot(pgprot_val(p) & __supported_pte_mask)
|
|
|
|
|
|
+#define canon_pgprot(p) __pgprot(massage_pgprot(p))
|
|
|
|
|
|
static inline int is_new_memtype_allowed(unsigned long flags,
|
|
static inline int is_new_memtype_allowed(unsigned long flags,
|
|
unsigned long new_flags)
|
|
unsigned long new_flags)
|