#include union pt_entry { uint64_t pte_q; uint32_t pte_l[2]; }; typedef union pt_entry pt_entry_t; static __inline pt_entry_t pte_load(pt_entry_t *ptep) { pt_entry_t pte; __asm("cmpxchg8b %1" : "=A" (pte) : "m" (*ptep), "a" (0), "d" (0), "b" (0), "c" (0)); return (pte); } static __inline pt_entry_t pte_load_store(pt_entry_t *ptep, pt_entry_t pte) { pt_entry_t r; r = *ptep; __asm("1:\n" "\tcmpxchg8b %1\n" "\tjnz 1b" : "+A" (r) : "m" (*ptep), "b" (pte.pte_l[0]), "c" (pte.pte_l[1])); return (r); } #define pte_clear(ptep) pte_load_store((ptep), (pt_entry_t)0ULL) #define pte_load_clear(ptep) pte_load_store((ptep), (pt_entry_t)0ULL) #define pte_store(ptep, pte) pte_load_store((ptep), pte) int main(void) { pt_entry_t m, v; m.pte_q = 1; v = pte_store(&m, (pt_entry_t)2ULL); printf("m=%lld v=%lld\n", m.pte_q, v.pte_q); }