xref: /kvm-unit-tests/x86/cmpxchg8b.c (revision cd5f2fb4ad641c51fe0f1a85264dc3f6ede6e131)
10b8c3946SPaolo Bonzini #include "ioram.h"
20b8c3946SPaolo Bonzini #include "vm.h"
30b8c3946SPaolo Bonzini #include "libcflat.h"
40b8c3946SPaolo Bonzini #include "desc.h"
50b8c3946SPaolo Bonzini #include "processor.h"
60b8c3946SPaolo Bonzini 
test_cmpxchg8b(u32 * mem)70b8c3946SPaolo Bonzini static void test_cmpxchg8b(u32 *mem)
80b8c3946SPaolo Bonzini {
90b8c3946SPaolo Bonzini     mem[1] = 2;
100b8c3946SPaolo Bonzini     mem[0] = 1;
110b8c3946SPaolo Bonzini     asm("push %%ebx\n"
120b8c3946SPaolo Bonzini         "mov %[ebx_val], %%ebx\n"
130b8c3946SPaolo Bonzini         "lock cmpxchg8b (%0)\n"
140b8c3946SPaolo Bonzini         "pop %%ebx" : : "D" (mem),
150b8c3946SPaolo Bonzini         "d" (2), "a" (1), "c" (4), [ebx_val] "i" (3) : "memory");
16*a299895bSThomas Huth     report(mem[0] == 3 && mem[1] == 4, "cmpxchg8b");
170b8c3946SPaolo Bonzini }
180b8c3946SPaolo Bonzini 
main(void)19b29804b8SThomas Huth int main(void)
200b8c3946SPaolo Bonzini {
210b8c3946SPaolo Bonzini 	setup_vm();
220b8c3946SPaolo Bonzini 
230b8c3946SPaolo Bonzini 	test_cmpxchg8b(phys_to_virt(read_cr3()) + 4088);
240b8c3946SPaolo Bonzini 	return report_summary();
250b8c3946SPaolo Bonzini }
26