return 0;
 }
 
+static inline void csp(unsigned int *ptr, unsigned int old, unsigned int new)
+{
+       register unsigned long reg2 asm("2") = old;
+       register unsigned long reg3 asm("3") = new;
+       unsigned long address = (unsigned long)ptr | 1;
+
+       asm volatile(
+               "       csp     %0,%3"
+               : "+d" (reg2), "+m" (*ptr)
+               : "d" (reg3), "d" (address)
+               : "cc");
+}
+
 /*
  * pgd/pmd/pte query functions
  */
 
 static inline void __pmdp_csp(pmd_t *pmdp)
 {
-       register unsigned long reg2 asm("2") = pmd_val(*pmdp);
-       register unsigned long reg3 asm("3") = pmd_val(*pmdp) |
-                                              _SEGMENT_ENTRY_INVALID;
-       register unsigned long reg4 asm("4") = ((unsigned long) pmdp) + 5;
-
-       asm volatile(
-               "       csp %1,%3"
-               : "=m" (*pmdp)
-               : "d" (reg2), "d" (reg3), "d" (reg4), "m" (*pmdp) : "cc");
+       csp((unsigned int *)pmdp + 1, pmd_val(*pmdp),
+           pmd_val(*pmdp) | _SEGMENT_ENTRY_INVALID);
 }
 
 static inline void __pmdp_idte(unsigned long address, pmd_t *pmdp)
 
 #include <linux/sched.h>
 #include <asm/processor.h>
 #include <asm/pgalloc.h>
+#include <asm/pgtable.h>
 
 /*
  * Flush all TLB entries on the local CPU.
  */
 static inline void __tlb_flush_global(void)
 {
-       register unsigned long reg2 asm("2");
-       register unsigned long reg3 asm("3");
-       register unsigned long reg4 asm("4");
-       long dummy;
-
-       dummy = 0;
-       reg2 = reg3 = 0;
-       reg4 = ((unsigned long) &dummy) + 1;
-       asm volatile(
-               "       csp     %0,%2"
-               : : "d" (reg2), "d" (reg3), "d" (reg4), "m" (dummy) : "cc" );
+       unsigned int dummy = 0;
+
+       csp(&dummy, 0, 0);
 }
 
 /*