summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorDavid S. Miller <davem@nuts.ninka.net>2003-11-04 01:10:45 -0800
committerDavid S. Miller <davem@nuts.ninka.net>2003-11-04 01:10:45 -0800
commitdd6c83a6e2e833ff56d737619086c32131e554fc (patch)
tree7d1286f5b6dbbe5a423eb198094dbcab6930f040 /include
parent48916012c50a4b606a698579a0f3baf230bf3e4e (diff)
[SPARC64]: Preserve cache/side-effect PTE bits in pte_modify().
Bug noticed by Russell King.
Diffstat (limited to 'include')
-rw-r--r--include/asm-sparc64/pgtable.h14
1 files changed, 7 insertions, 7 deletions
diff --git a/include/asm-sparc64/pgtable.h b/include/asm-sparc64/pgtable.h
index 0b25d0b53783..289046945682 100644
--- a/include/asm-sparc64/pgtable.h
+++ b/include/asm-sparc64/pgtable.h
@@ -156,7 +156,7 @@
#define __ACCESS_BITS (_PAGE_ACCESSED | _PAGE_READ | _PAGE_R)
#define __PRIV_BITS _PAGE_P
-#define PAGE_NONE __pgprot (_PAGE_PRESENT | _PAGE_ACCESSED)
+#define PAGE_NONE __pgprot (_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_CACHE)
/* Don't set the TTE _PAGE_W bit here, else the dirty bit never gets set. */
#define PAGE_SHARED __pgprot (_PAGE_PRESENT | _PAGE_VALID | _PAGE_CACHE | \
@@ -171,12 +171,8 @@
#define PAGE_KERNEL __pgprot (_PAGE_PRESENT | _PAGE_VALID | _PAGE_CACHE | \
__PRIV_BITS | __ACCESS_BITS | __DIRTY_BITS)
-#define PAGE_INVALID __pgprot (0)
-
#define _PFN_MASK _PAGE_PADDR
-#define _PAGE_CHG_MASK (_PFN_MASK | _PAGE_MODIFIED | _PAGE_ACCESSED | _PAGE_PRESENT | _PAGE_SZBITS)
-
#define pg_iobits (_PAGE_VALID | _PAGE_PRESENT | __DIRTY_BITS | __ACCESS_BITS | _PAGE_E)
#define __P000 PAGE_NONE
@@ -224,9 +220,13 @@ extern struct page *mem_map_zero;
static inline pte_t pte_modify(pte_t orig_pte, pgprot_t new_prot)
{
pte_t __pte;
+ const unsigned long preserve_mask = (_PFN_MASK |
+ _PAGE_MODIFIED | _PAGE_ACCESSED |
+ _PAGE_CACHE | _PAGE_E |
+ _PAGE_PRESENT | _PAGE_SZBITS);
- pte_val(__pte) = (pte_val(orig_pte) & _PAGE_CHG_MASK) |
- pgprot_val(new_prot);
+ pte_val(__pte) = (pte_val(orig_pte) & preserve_mask) |
+ (pgprot_val(new_prot) & ~preserve_mask);
return __pte;
}