l1_pgentry_t ol1e,
l1_pgentry_t nl1e)
{
+#ifndef PTE_UPDATE_WITH_CMPXCHG
+ return !__copy_to_user(pl1e, &nl1e, sizeof(nl1e));
+#else
intpte_t o = l1e_get_intpte(ol1e);
intpte_t n = l1e_get_intpte(nl1e);
return 0;
}
return 1;
+#endif
}
return 1;
}
+#ifndef PTE_UPDATE_WITH_CMPXCHG
+#define UPDATE_ENTRY(_t,_p,_o,_n) ({ (*(_p) = (_n)); 1; })
+#else
#define UPDATE_ENTRY(_t,_p,_o,_n) ({ \
intpte_t __o = cmpxchg((intpte_t *)(_p), \
_t ## e_get_intpte(_o), \
(_t ## e_get_intpte(_n)), \
(__o)); \
(__o == _t ## e_get_intpte(_o)); })
+#endif
/* Update the L2 entry at pl2e to new value nl2e. pl2e is within frame pfn. */
static int mod_l2_entry(l2_pgentry_t *pl2e,
goto failed;
}
- if ( __copy_from_user(&ol1e, (l1_pgentry_t *)va, sizeof(ol1e)) ||
- !update_l1e(va, ol1e, _nl1e) )
+ ol1e = *(l1_pgentry_t *)va;
+ if ( !update_l1e(va, ol1e, _nl1e) )
{
+#ifndef PTE_UPDATE_WITH_CMPXCHG
+ BUG();
+#else
put_page_type(page);
rc = GNTST_general_error;
goto failed;
+#endif
}
put_page_from_l1e(ol1e, d);
if ( unlikely(__copy_from_user(&ol1e, pl1e, sizeof(ol1e)) != 0) ||
!update_l1e(pl1e, ol1e, _nl1e) )
+ {
+#ifndef PTE_UPDATE_WITH_CMPXCHG
+ BUG();
+#else
return GNTST_general_error;
+#endif
+ }
put_page_from_l1e(ol1e, d);