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> | |
10 | #include <asm/alternative-asm.h> | |
11 | #include <asm/frame.h> | |
12 | #include <asm/dwarf2.h> | |
13 | ||
14 | ||
15 | .text | |
16 | ||
17 | /* | |
18 | * Inputs: | |
19 | * %esi : memory location to compare | |
20 | * %eax : low 32 bits of old value | |
21 | * %edx : high 32 bits of old value | |
22 | * %ebx : low 32 bits of new value | |
23 | * %ecx : high 32 bits of new value | |
24 | */ | |
25 | ENTRY(cmpxchg8b_emu) | |
26 | CFI_STARTPROC | |
27 | ||
28 | # | |
29 | # Emulate 'cmpxchg8b (%esi)' on UP except we don't | |
30 | # set the whole ZF thing (caller will just compare | |
31 | # eax:edx with the expected value) | |
32 | # | |
33 | cmpxchg8b_emu: | |
34 | pushfl | |
35 | cli | |
36 | ||
37 | cmpl (%esi), %eax | |
38 | jne not_same | |
39 | cmpl 4(%esi), %edx | |
40 | jne half_same | |
41 | ||
42 | movl %ebx, (%esi) | |
43 | movl %ecx, 4(%esi) | |
44 | ||
45 | popfl | |
46 | ret | |
47 | ||
48 | not_same: | |
49 | movl (%esi), %eax | |
50 | half_same: | |
51 | movl 4(%esi), %edx | |
52 | ||
53 | popfl | |
54 | ret | |
55 | ||
56 | CFI_ENDPROC | |
57 | ENDPROC(cmpxchg8b_emu) |