|
@@ -874,35 +874,31 @@ static inline pte_t pte_mkhuge(pte_t pte)
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
-static inline void __ptep_ipte(unsigned long address, pte_t *ptep)
|
|
|
-{
|
|
|
- unsigned long pto = (unsigned long) ptep;
|
|
|
-
|
|
|
- /* Invalidation + global TLB flush for the pte */
|
|
|
- asm volatile(
|
|
|
- " ipte %2,%3"
|
|
|
- : "=m" (*ptep) : "m" (*ptep), "a" (pto), "a" (address));
|
|
|
-}
|
|
|
+#define IPTE_GLOBAL 0
|
|
|
+#define IPTE_LOCAL 1
|
|
|
|
|
|
-static inline void __ptep_ipte_local(unsigned long address, pte_t *ptep)
|
|
|
+static inline void __ptep_ipte(unsigned long address, pte_t *ptep, int local)
|
|
|
{
|
|
|
unsigned long pto = (unsigned long) ptep;
|
|
|
|
|
|
- /* Invalidation + local TLB flush for the pte */
|
|
|
+ /* Invalidation + TLB flush for the pte */
|
|
|
asm volatile(
|
|
|
- " .insn rrf,0xb2210000,%2,%3,0,1"
|
|
|
- : "=m" (*ptep) : "m" (*ptep), "a" (pto), "a" (address));
|
|
|
+ " .insn rrf,0xb2210000,%[r1],%[r2],0,%[m4]"
|
|
|
+ : "+m" (*ptep) : [r1] "a" (pto), [r2] "a" (address),
|
|
|
+ [m4] "i" (local));
|
|
|
}
|
|
|
|
|
|
-static inline void __ptep_ipte_range(unsigned long address, int nr, pte_t *ptep)
|
|
|
+static inline void __ptep_ipte_range(unsigned long address, int nr,
|
|
|
+ pte_t *ptep, int local)
|
|
|
{
|
|
|
unsigned long pto = (unsigned long) ptep;
|
|
|
|
|
|
- /* Invalidate a range of ptes + global TLB flush of the ptes */
|
|
|
+ /* Invalidate a range of ptes + TLB flush of the ptes */
|
|
|
do {
|
|
|
asm volatile(
|
|
|
- " .insn rrf,0xb2210000,%2,%0,%1,0"
|
|
|
- : "+a" (address), "+a" (nr) : "a" (pto) : "memory");
|
|
|
+ " .insn rrf,0xb2210000,%[r1],%[r2],%[r3],%[m4]"
|
|
|
+ : [r2] "+a" (address), [r3] "+a" (nr)
|
|
|
+ : [r1] "a" (pto), [m4] "i" (local) : "memory");
|
|
|
} while (nr != 255);
|
|
|
}
|
|
|
|