10b8c3946SPaolo Bonzini #include "ioram.h" 20b8c3946SPaolo Bonzini #include "vm.h" 30b8c3946SPaolo Bonzini #include "libcflat.h" 40b8c3946SPaolo Bonzini #include "desc.h" 50b8c3946SPaolo Bonzini #include "types.h" 60b8c3946SPaolo Bonzini #include "processor.h" 70b8c3946SPaolo Bonzini 80b8c3946SPaolo Bonzini static void test_cmpxchg8b(u32 *mem) 90b8c3946SPaolo Bonzini { 100b8c3946SPaolo Bonzini mem[1] = 2; 110b8c3946SPaolo Bonzini mem[0] = 1; 120b8c3946SPaolo Bonzini asm("push %%ebx\n" 130b8c3946SPaolo Bonzini "mov %[ebx_val], %%ebx\n" 140b8c3946SPaolo Bonzini "lock cmpxchg8b (%0)\n" 150b8c3946SPaolo Bonzini "pop %%ebx" : : "D" (mem), 160b8c3946SPaolo Bonzini "d" (2), "a" (1), "c" (4), [ebx_val] "i" (3) : "memory"); 17*a299895bSThomas Huth report(mem[0] == 3 && mem[1] == 4, "cmpxchg8b"); 180b8c3946SPaolo Bonzini } 190b8c3946SPaolo Bonzini 20b29804b8SThomas Huth int main(void) 210b8c3946SPaolo Bonzini { 220b8c3946SPaolo Bonzini setup_vm(); 230b8c3946SPaolo Bonzini setup_idt(); 240b8c3946SPaolo Bonzini 250b8c3946SPaolo Bonzini test_cmpxchg8b(phys_to_virt(read_cr3()) + 4088); 260b8c3946SPaolo Bonzini return report_summary(); 270b8c3946SPaolo Bonzini } 28