| #include "tests/asm.h" |
| #include <stdio.h> |
| |
| typedef unsigned long long int ULong; |
| typedef unsigned int UInt; |
| |
| ULong m64; |
| |
| UInt eax; |
| UInt ebx; |
| UInt ecx; |
| UInt edx; |
| UInt zout; |
| |
| extern void foo ( void ); |
| asm("\n" |
| VG_SYM(foo) ":\n" |
| "\tpushl %eax\n" |
| "\tpushl %ebx\n" |
| "\tpushl %ecx\n" |
| "\tpushl %edx\n" |
| |
| "\txorl %eax, %eax\n" // get eflags in a known state |
| |
| "\tmovl " VG_SYM(eax) ",%eax\n" |
| "\tmovl " VG_SYM(ebx) ",%ebx\n" |
| "\tmovl " VG_SYM(ecx) ",%ecx\n" |
| "\tmovl " VG_SYM(edx) ",%edx\n" |
| "\tcmpxchg8b " VG_SYM(m64) "\n" |
| "\tmovl %eax," VG_SYM(eax) "\n" |
| "\tmovl %ebx," VG_SYM(ebx) "\n" |
| "\tmovl %ecx," VG_SYM(ecx) "\n" |
| "\tmovl %edx," VG_SYM(edx) "\n" |
| "\tpushfl\n" |
| "\tpopl %eax\n" |
| "\tmovl %eax," VG_SYM(zout) "\n" |
| |
| "\tpopl %edx\n" |
| "\tpopl %ecx\n" |
| "\tpopl %ebx\n" |
| "\tpopl %eax\n" |
| "\tret\n" |
| ); |
| |
| int main ( void ) |
| { |
| edx = 0x11111111; eax = 0x22222222; |
| ecx = 0x33333333; ebx = 0x44444444; |
| zout = 0x55555555; |
| m64 = 0x1111111122222222ULL; |
| foo(); |
| printf("0x%x 0x%x 0x%x 0x%x 0x%x 0x%llx\n", |
| eax, ebx, ecx, edx, zout & 0xFFFF, m64 ); |
| |
| edx = 0x11111111; eax = 0x22222222; |
| ecx = 0x33333333; ebx = 0x44444444; |
| zout = 0x55555555; |
| m64 = 0x1111111122222222ULL; |
| m64 += 0x1ULL; |
| foo(); |
| printf("0x%x 0x%x 0x%x 0x%x 0x%x 0x%llx\n", |
| eax, ebx, ecx, edx, zout & 0xFFFF, m64 ); |
| |
| edx = 0x11111111; eax = 0x22222222; |
| ecx = 0x33333333; ebx = 0x44444444; |
| zout = 0x55555555; |
| m64 = 0x1111111122222222ULL; |
| m64 += 0x100000000ULL; |
| foo(); |
| printf("0x%x 0x%x 0x%x 0x%x 0x%x 0x%llx\n", |
| eax, ebx, ecx, edx, zout & 0xFFFF, m64 ); |
| |
| edx = 0x11111111; eax = 0x22222222; |
| ecx = 0x33333333; ebx = 0x44444444; |
| zout = 0x55555555; |
| m64 = 0x6666666677777777ULL; |
| foo(); |
| printf("0x%x 0x%x 0x%x 0x%x 0x%x 0x%llx\n", |
| eax, ebx, ecx, edx, zout & 0xFFFF, m64 ); |
| |
| return 0; |
| } |