• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include "tests/asm.h"
2 #include <stdio.h>
3 
4 /* This test only checks register/register cmpxchg */
5 
6 typedef unsigned long long int ULong;
7 typedef unsigned int UInt;
8 
9 ULong m64;
10 
11 ULong rax;
12 ULong rbx;
13 ULong rcx;
14 ULong rdx;
15 ULong rax_out;
16 ULong rbx_out;
17 ULong rcx_out;
18 
main(void)19 int main ( void )
20 {
21 
22    /* 8-bit */
23 
24    rdx  = 0x11111111; rax = 0x22222222;
25    rcx  = 0x33333333; rbx = 0x44444444;
26 
27    printf("cmpxchg %%bl,%%cl  (al=%llx bl=%llx cl=%llx)\n",
28 	  rax&0xff,rbx&0xff,rcx&0xff);
29 
30    asm("\n"
31     "\tpush %rax\n"
32     "\tpush %rbx\n"
33     "\tpush %rcx\n"
34     "\tpush %rdx\n"
35     "\txor %rax, %rax\n" // get eflags in a known state
36     "\tmov " VG_SYM(rax) ",%rax\n"
37     "\tmov " VG_SYM(rbx) ",%rbx\n"
38     "\tmov " VG_SYM(rcx) ",%rcx\n"
39     "\tmov " VG_SYM(rdx) ",%rdx\n"
40     "\tcmpxchg %bl,%cl \n"
41     "\tmov %rax," VG_SYM(rax_out) "\n"
42     "\tmov %rbx," VG_SYM(rbx_out) "\n"
43     "\tmov %rcx," VG_SYM(rcx_out) "\n"
44     "\tpop %rdx\n"
45     "\tpop %rcx\n"
46     "\tpop %rbx\n"
47     "\tpop %rax\n"
48     );
49 
50    printf("  al!=cl so al should equal cl (Result al=%llx bl=%llx cl=%llx)\n",
51 	  rax_out&0xff,rbx_out&0xff,rcx_out&0xff);
52 
53 
54 
55    rdx  = 0x99999999; rax = 0x77777777;
56    rcx  = 0x55555555; rbx = 0x55555555;
57 
58    printf("cmpxchg %%bl,%%cl  (al=%llx bl=%llx cl=%llx)\n",
59 	  rax&0xff,rbx&0xff,rcx&0xff);
60 
61    asm("\n"
62     "\tpush %rax\n"
63     "\tpush %rbx\n"
64     "\tpush %rcx\n"
65     "\tpush %rdx\n"
66     "\txor %rax, %rax\n" // get eflags in a known state
67     "\tmov " VG_SYM(rax) ",%rax\n"
68     "\tmov " VG_SYM(rbx) ",%rbx\n"
69     "\tmov " VG_SYM(rcx) ",%rcx\n"
70     "\tmov " VG_SYM(rdx) ",%rdx\n"
71     "\tcmpxchg %bl,%cl \n"
72     "\tmov %rax," VG_SYM(rax_out) "\n"
73     "\tmov %rbx," VG_SYM(rbx_out) "\n"
74     "\tmov %rcx," VG_SYM(rcx_out) "\n"
75     "\tpop %rdx\n"
76     "\tpop %rcx\n"
77     "\tpop %rbx\n"
78     "\tpop %rax\n"
79     );
80 
81    printf("  al==cl so cl should equal bl (Result al=%llx bl=%llx cl=%llx)\n",
82 	  rax_out&0xff,rbx_out&0xff,rcx_out&0xff);
83 
84    /* 16-bit */
85 
86    rdx  = 0x11111111; rax = 0x22222222;
87    rcx  = 0x33333333; rbx = 0x44444444;
88 
89    printf("cmpxchg %%bx,%%cx  (ax=%llx bx=%llx cx=%llx)\n",
90 	  rax&0xffff,rbx&0xffff,rcx&0xffff);
91 
92    asm("\n"
93     "\tpush %rax\n"
94     "\tpush %rbx\n"
95     "\tpush %rcx\n"
96     "\tpush %rdx\n"
97     "\txor %rax, %rax\n" // get eflags in a known state
98     "\tmov " VG_SYM(rax) ",%rax\n"
99     "\tmov " VG_SYM(rbx) ",%rbx\n"
100     "\tmov " VG_SYM(rcx) ",%rcx\n"
101     "\tmov " VG_SYM(rdx) ",%rdx\n"
102     "\tcmpxchg %bx,%cx \n"
103     "\tmov %rax," VG_SYM(rax_out) "\n"
104     "\tmov %rbx," VG_SYM(rbx_out) "\n"
105     "\tmov %rcx," VG_SYM(rcx_out) "\n"
106     "\tpop %rdx\n"
107     "\tpop %rcx\n"
108     "\tpop %rbx\n"
109     "\tpop %rax\n"
110     );
111 
112    printf("  ax!=cx so ax should equal cx (Result ax=%llx bx=%llx cx=%llx)\n",
113 	  rax_out&0xffff,rbx_out&0xffff,rcx_out&0xffff);
114 
115 
116 
117    rdx  = 0x99999999; rax = 0x77777777;
118    rcx  = 0x55555555; rbx = 0x55555555;
119 
120    printf("cmpxchg %%bx,%%cx  (ax=%llx bx=%llx cx=%llx)\n",
121 	  rax&0xffff,rbx&0xffff,rcx&0xffff);
122 
123    asm("\n"
124     "\tpush %rax\n"
125     "\tpush %rbx\n"
126     "\tpush %rcx\n"
127     "\tpush %rdx\n"
128     "\txor %rax, %rax\n" // get eflags in a known state
129     "\tmov " VG_SYM(rax) ",%rax\n"
130     "\tmov " VG_SYM(rbx) ",%rbx\n"
131     "\tmov " VG_SYM(rcx) ",%rcx\n"
132     "\tmov " VG_SYM(rdx) ",%rdx\n"
133     "\tcmpxchg %bx,%cx \n"
134     "\tmov %rax," VG_SYM(rax_out) "\n"
135     "\tmov %rbx," VG_SYM(rbx_out) "\n"
136     "\tmov %rcx," VG_SYM(rcx_out) "\n"
137     "\tpop %rdx\n"
138     "\tpop %rcx\n"
139     "\tpop %rbx\n"
140     "\tpop %rax\n"
141     );
142 
143    printf("  ax==cx so cx should equal bx (Result ax=%llx bx=%llx cx=%llx)\n",
144 	  rax_out&0xffff,rbx_out&0xffff,rcx_out&0xffff);
145 
146 
147    /* 32-bit */
148 
149    rdx  = 0x11111111; rax = 0x22222222;
150    rcx  = 0x33333333; rbx = 0x44444444;
151 
152    printf("cmpxchg %%ebx,%%ecx  (eax=%llx ebx=%llx ecx=%llx)\n",
153 	  rax&0xffffffff,rbx&0xffffffff,rcx&0xffffffff);
154 
155    asm("\n"
156     "\tpush %rax\n"
157     "\tpush %rbx\n"
158     "\tpush %rcx\n"
159     "\tpush %rdx\n"
160     "\txor %rax, %rax\n" // get eflags in a known state
161     "\tmov " VG_SYM(rax) ",%rax\n"
162     "\tmov " VG_SYM(rbx) ",%rbx\n"
163     "\tmov " VG_SYM(rcx) ",%rcx\n"
164     "\tmov " VG_SYM(rdx) ",%rdx\n"
165     "\tcmpxchg %ebx,%ecx \n"
166     "\tmov %rax," VG_SYM(rax_out) "\n"
167     "\tmov %rbx," VG_SYM(rbx_out) "\n"
168     "\tmov %rcx," VG_SYM(rcx_out) "\n"
169     "\tpop %rdx\n"
170     "\tpop %rcx\n"
171     "\tpop %rbx\n"
172     "\tpop %rax\n"
173     );
174 
175    printf("  eax!=ecx so eax should equal ecx (Result eax=%llx ebx=%llx ecx=%llx)\n",
176 	  rax_out&0xffffffff,rbx_out&0xffffffff,rcx_out&0xffffffff);
177 
178 
179 
180    rdx  = 0x99999999; rax = 0x77777777;
181    rcx  = 0x55555555; rbx = 0x55555555;
182 
183    printf("cmpxchg %%ebx,%%ecx  (eax=%llx ebx=%llx ecx=%llx)\n",
184 	  rax&0xffffffff,rbx&0xffffffff,rcx&0xffffffff);
185 
186    asm("\n"
187     "\tpush %rax\n"
188     "\tpush %rbx\n"
189     "\tpush %rcx\n"
190     "\tpush %rdx\n"
191     "\txor %rax, %rax\n" // get eflags in a known state
192     "\tmov " VG_SYM(rax) ",%rax\n"
193     "\tmov " VG_SYM(rbx) ",%rbx\n"
194     "\tmov " VG_SYM(rcx) ",%rcx\n"
195     "\tmov " VG_SYM(rdx) ",%rdx\n"
196     "\tcmpxchg %ebx,%ecx \n"
197     "\tmov %rax," VG_SYM(rax_out) "\n"
198     "\tmov %rbx," VG_SYM(rbx_out) "\n"
199     "\tmov %rcx," VG_SYM(rcx_out) "\n"
200     "\tpop %rdx\n"
201     "\tpop %rcx\n"
202     "\tpop %rbx\n"
203     "\tpop %rax\n"
204     );
205 
206    printf("  eax==ecx so ecx should equal ebx (Result eax=%llx ebx=%llx ecx=%llx)\n",
207 	  rax_out&0xffffffff,rbx_out&0xffffffff,rcx_out&0xffffffff);
208 
209 
210    /* 64-bit */
211 
212    rdx  = 0x111111111; rax = 0x222222222;
213    rcx  = 0x333333333; rbx = 0x444444444;
214 
215    printf("cmpxchg %%rbx,%%rcx  (rax=%llx rbx=%llx rcx=%llx)\n",
216 	  rax,rbx,rcx);
217 
218    asm("\n"
219     "\tpush %rax\n"
220     "\tpush %rbx\n"
221     "\tpush %rcx\n"
222     "\tpush %rdx\n"
223     "\txor %rax, %rax\n" // get eflags in a known state
224     "\tmov " VG_SYM(rax) ",%rax\n"
225     "\tmov " VG_SYM(rbx) ",%rbx\n"
226     "\tmov " VG_SYM(rcx) ",%rcx\n"
227     "\tmov " VG_SYM(rdx) ",%rdx\n"
228     "\tcmpxchg %rbx,%rcx \n"
229     "\tmov %rax," VG_SYM(rax_out) "\n"
230     "\tmov %rbx," VG_SYM(rbx_out) "\n"
231     "\tmov %rcx," VG_SYM(rcx_out) "\n"
232     "\tpop %rdx\n"
233     "\tpop %rcx\n"
234     "\tpop %rbx\n"
235     "\tpop %rax\n"
236     );
237 
238    printf("  rax!=rcx so rax should equal rcx (Result rax=%llx rbx=%llx rcx=%llx)\n",
239 	  rax_out,rbx_out,rcx_out);
240 
241 
242 
243    rdx  = 0x999999999; rax = 0x777777777;
244    rcx  = 0x555555555; rbx = 0x555555555;
245 
246    printf("cmpxchg %%rbx,%%rcx  (rax=%llx rbx=%llx rcx=%llx)\n",
247 	  rax,rbx,rcx);
248 
249    asm("\n"
250     "\tpush %rax\n"
251     "\tpush %rbx\n"
252     "\tpush %rcx\n"
253     "\tpush %rdx\n"
254     "\txor %rax, %rax\n" // get eflags in a known state
255     "\tmov " VG_SYM(rax) ",%rax\n"
256     "\tmov " VG_SYM(rbx) ",%rbx\n"
257     "\tmov " VG_SYM(rcx) ",%rcx\n"
258     "\tmov " VG_SYM(rdx) ",%rdx\n"
259     "\tcmpxchg %rbx,%rcx \n"
260     "\tmov %rax," VG_SYM(rax_out) "\n"
261     "\tmov %rbx," VG_SYM(rbx_out) "\n"
262     "\tmov %rcx," VG_SYM(rcx_out) "\n"
263     "\tpop %rdx\n"
264     "\tpop %rcx\n"
265     "\tpop %rbx\n"
266     "\tpop %rax\n"
267     );
268 
269    printf("  rax==rcx so ecx should equal rbx (Result rax=%llx rbx=%llx rcx=%llx)\n",
270 	  rax_out,rbx_out,rcx_out);
271 
272    return 0;
273 }
274