1 #include "tests/asm.h" 2 #include <stdio.h> 3 4 typedef unsigned long long int ULong; 5 typedef unsigned int UInt; 6 7 ULong m64; 8 9 UInt eax; 10 UInt ebx; 11 UInt ecx; 12 UInt edx; 13 UInt zout; 14 15 extern void foo ( void ); 16 asm("\n" 17 VG_SYM(foo) ":\n" 18 "\tpushl %eax\n" 19 "\tpushl %ebx\n" 20 "\tpushl %ecx\n" 21 "\tpushl %edx\n" 22 23 "\txorl %eax, %eax\n" // get eflags in a known state 24 25 "\tmovl " VG_SYM(eax) ",%eax\n" 26 "\tmovl " VG_SYM(ebx) ",%ebx\n" 27 "\tmovl " VG_SYM(ecx) ",%ecx\n" 28 "\tmovl " VG_SYM(edx) ",%edx\n" 29 "\tcmpxchg8b " VG_SYM(m64) "\n" 30 "\tmovl %eax," VG_SYM(eax) "\n" 31 "\tmovl %ebx," VG_SYM(ebx) "\n" 32 "\tmovl %ecx," VG_SYM(ecx) "\n" 33 "\tmovl %edx," VG_SYM(edx) "\n" 34 "\tpushfl\n" 35 "\tpopl %eax\n" 36 "\tmovl %eax," VG_SYM(zout) "\n" 37 38 "\tpopl %edx\n" 39 "\tpopl %ecx\n" 40 "\tpopl %ebx\n" 41 "\tpopl %eax\n" 42 "\tret\n" 43 ); 44 45 int main ( void ) 46 { 47 edx = 0x11111111; eax = 0x22222222; 48 ecx = 0x33333333; ebx = 0x44444444; 49 zout = 0x55555555; 50 m64 = 0x1111111122222222ULL; 51 foo(); 52 printf("0x%x 0x%x 0x%x 0x%x 0x%x 0x%llx\n", 53 eax, ebx, ecx, edx, zout & 0xFFFF, m64 ); 54 55 edx = 0x11111111; eax = 0x22222222; 56 ecx = 0x33333333; ebx = 0x44444444; 57 zout = 0x55555555; 58 m64 = 0x1111111122222222ULL; 59 m64 += 0x1ULL; 60 foo(); 61 printf("0x%x 0x%x 0x%x 0x%x 0x%x 0x%llx\n", 62 eax, ebx, ecx, edx, zout & 0xFFFF, m64 ); 63 64 edx = 0x11111111; eax = 0x22222222; 65 ecx = 0x33333333; ebx = 0x44444444; 66 zout = 0x55555555; 67 m64 = 0x1111111122222222ULL; 68 m64 += 0x100000000ULL; 69 foo(); 70 printf("0x%x 0x%x 0x%x 0x%x 0x%x 0x%llx\n", 71 eax, ebx, ecx, edx, zout & 0xFFFF, m64 ); 72 73 edx = 0x11111111; eax = 0x22222222; 74 ecx = 0x33333333; ebx = 0x44444444; 75 zout = 0x55555555; 76 m64 = 0x6666666677777777ULL; 77 foo(); 78 printf("0x%x 0x%x 0x%x 0x%x 0x%x 0x%llx\n", 79 eax, ebx, ecx, edx, zout & 0xFFFF, m64 ); 80 81 return 0; 82 } 83