xref: /kvm-unit-tests/x86/cmpxchg8b.c (revision a299895b7abb54e7ba6bb4108f202acbb484ac65)
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