]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - arch/powerpc/include/asm/pgtable-ppc32.h
Merge branch 'akpm' (patches from Andrew)
[karo-tx-linux.git] / arch / powerpc / include / asm / pgtable-ppc32.h
index e48e3292e7135cd83f241a0b7fa20402ed9ad48b..14bdcbd3167021e1f797bd27813ea59044093836 100644 (file)
@@ -178,12 +178,11 @@ static inline unsigned long pte_update(pte_t *p,
        andc    %1,%0,%5\n\
        or      %1,%1,%6\n\
        /* 0x200 == Extended encoding, bit 22 */ \
-       /* Bit 22 has to be 1 if neither _PAGE_USER nor _PAGE_RW are set */ \
-       rlwimi  %1,%1,32-2,0x200\n /* get _PAGE_USER */ \
-       rlwinm  %3,%1,32-1,0x200\n /* get _PAGE_RW */ \
-       or      %1,%3,%1\n\
-       xori    %1,%1,0x200\n"
-"      stwcx.  %1,0,%4\n\
+       /* Bit 22 has to be 1 when _PAGE_USER is unset and _PAGE_RO is set */ \
+       rlwimi  %1,%1,32-1,0x200\n /* get _PAGE_RO */ \
+       rlwinm  %3,%1,32-2,0x200\n /* get _PAGE_USER */ \
+       andc    %1,%1,%3\n\
+       stwcx.  %1,0,%4\n\
        bne-    1b"
        : "=&r" (old), "=&r" (tmp), "=m" (*p), "=&r" (tmp2)
        : "r" (p), "r" (clr), "r" (set), "m" (*p)
@@ -275,7 +274,7 @@ static inline pte_t ptep_get_and_clear(struct mm_struct *mm, unsigned long addr,
 static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr,
                                      pte_t *ptep)
 {
-       pte_update(ptep, (_PAGE_RW | _PAGE_HWWRITE), 0);
+       pte_update(ptep, (_PAGE_RW | _PAGE_HWWRITE), _PAGE_RO);
 }
 static inline void huge_ptep_set_wrprotect(struct mm_struct *mm,
                                           unsigned long addr, pte_t *ptep)
@@ -286,9 +285,11 @@ static inline void huge_ptep_set_wrprotect(struct mm_struct *mm,
 
 static inline void __ptep_set_access_flags(pte_t *ptep, pte_t entry)
 {
-       unsigned long bits = pte_val(entry) &
+       unsigned long set = pte_val(entry) &
                (_PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_RW | _PAGE_EXEC);
-       pte_update(ptep, 0, bits);
+       unsigned long clr = ~pte_val(entry) & _PAGE_RO;
+
+       pte_update(ptep, clr, set);
 }
 
 #define __HAVE_ARCH_PTE_SAME
@@ -346,10 +347,14 @@ static inline void __ptep_set_access_flags(pte_t *ptep, pte_t entry)
 #define pte_to_pgoff(pte)      (pte_val(pte) >> 3)
 #define pgoff_to_pte(off)      ((pte_t) { ((off) << 3) | _PAGE_FILE })
 
+#ifndef CONFIG_PPC_4K_PAGES
+void pgtable_cache_init(void);
+#else
 /*
  * No page table caches to initialise
  */
 #define pgtable_cache_init()   do { } while (0)
+#endif
 
 extern int get_pteptr(struct mm_struct *mm, unsigned long addr, pte_t **ptep,
                      pmd_t **pmdp);