|
@@ -170,6 +170,25 @@ static inline unsigned long pte_update(pte_t *p,
|
|
#ifdef PTE_ATOMIC_UPDATES
|
|
#ifdef PTE_ATOMIC_UPDATES
|
|
unsigned long old, tmp;
|
|
unsigned long old, tmp;
|
|
|
|
|
|
|
|
+#ifdef CONFIG_PPC_8xx
|
|
|
|
+ unsigned long tmp2;
|
|
|
|
+
|
|
|
|
+ __asm__ __volatile__("\
|
|
|
|
+1: lwarx %0,0,%4\n\
|
|
|
|
+ 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\
|
|
|
|
+ bne- 1b"
|
|
|
|
+ : "=&r" (old), "=&r" (tmp), "=m" (*p), "=&r" (tmp2)
|
|
|
|
+ : "r" (p), "r" (clr), "r" (set), "m" (*p)
|
|
|
|
+ : "cc" );
|
|
|
|
+#else /* CONFIG_PPC_8xx */
|
|
__asm__ __volatile__("\
|
|
__asm__ __volatile__("\
|
|
1: lwarx %0,0,%3\n\
|
|
1: lwarx %0,0,%3\n\
|
|
andc %1,%0,%4\n\
|
|
andc %1,%0,%4\n\
|
|
@@ -180,6 +199,7 @@ static inline unsigned long pte_update(pte_t *p,
|
|
: "=&r" (old), "=&r" (tmp), "=m" (*p)
|
|
: "=&r" (old), "=&r" (tmp), "=m" (*p)
|
|
: "r" (p), "r" (clr), "r" (set), "m" (*p)
|
|
: "r" (p), "r" (clr), "r" (set), "m" (*p)
|
|
: "cc" );
|
|
: "cc" );
|
|
|
|
+#endif /* CONFIG_PPC_8xx */
|
|
#else /* PTE_ATOMIC_UPDATES */
|
|
#else /* PTE_ATOMIC_UPDATES */
|
|
unsigned long old = pte_val(*p);
|
|
unsigned long old = pte_val(*p);
|
|
*p = __pte((old & ~clr) | set);
|
|
*p = __pte((old & ~clr) | set);
|