Commit | Line | Data |
---|---|---|
79e1dd05 AV |
1 | /* |
2 | * This program is free software; you can redistribute it and/or | |
3 | * modify it under the terms of the GNU General Public License | |
4 | * as published by the Free Software Foundation; version 2 | |
5 | * of the License. | |
6 | * | |
7 | */ | |
8 | ||
9 | #include <linux/linkage.h> | |
79e1dd05 | 10 | |
79e1dd05 AV |
11 | .text |
12 | ||
13 | /* | |
14 | * Inputs: | |
15 | * %esi : memory location to compare | |
16 | * %eax : low 32 bits of old value | |
17 | * %edx : high 32 bits of old value | |
18 | * %ebx : low 32 bits of new value | |
19 | * %ecx : high 32 bits of new value | |
20 | */ | |
21 | ENTRY(cmpxchg8b_emu) | |
79e1dd05 AV |
22 | |
23 | # | |
24 | # Emulate 'cmpxchg8b (%esi)' on UP except we don't | |
25 | # set the whole ZF thing (caller will just compare | |
26 | # eax:edx with the expected value) | |
27 | # | |
131484c8 | 28 | pushfl |
79e1dd05 AV |
29 | cli |
30 | ||
31 | cmpl (%esi), %eax | |
5f1d919a | 32 | jne .Lnot_same |
79e1dd05 | 33 | cmpl 4(%esi), %edx |
5f1d919a | 34 | jne .Lhalf_same |
79e1dd05 AV |
35 | |
36 | movl %ebx, (%esi) | |
37 | movl %ecx, 4(%esi) | |
38 | ||
131484c8 | 39 | popfl |
79e1dd05 AV |
40 | ret |
41 | ||
5f1d919a | 42 | .Lnot_same: |
79e1dd05 | 43 | movl (%esi), %eax |
5f1d919a | 44 | .Lhalf_same: |
79e1dd05 AV |
45 | movl 4(%esi), %edx |
46 | ||
131484c8 | 47 | popfl |
79e1dd05 AV |
48 | ret |
49 | ||
79e1dd05 | 50 | ENDPROC(cmpxchg8b_emu) |