]> git.hungrycats.org Git - linux/commitdiff
[SPARC64]: Preserve cache/side-effect PTE bits in pte_modify().
authorDavid S. Miller <davem@nuts.ninka.net>
Tue, 4 Nov 2003 09:10:45 +0000 (01:10 -0800)
committerDavid S. Miller <davem@nuts.ninka.net>
Tue, 4 Nov 2003 09:10:45 +0000 (01:10 -0800)
Bug noticed by Russell King.

include/asm-sparc64/pgtable.h

index 0b25d0b53783deb26efb2b6584722f6965faa709..2890469456829d2c5f03e4f7a76555a8e2f3d6b8 100644 (file)
 #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 | \
 #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;
 }