These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / arch / x86 / lib / cmpxchg8b_emu.S
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
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)
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 #
28         pushfl
29         cli
30
31         cmpl  (%esi), %eax
32         jne .Lnot_same
33         cmpl 4(%esi), %edx
34         jne .Lhalf_same
35
36         movl %ebx,  (%esi)
37         movl %ecx, 4(%esi)
38
39         popfl
40         ret
41
42 .Lnot_same:
43         movl  (%esi), %eax
44 .Lhalf_same:
45         movl 4(%esi), %edx
46
47         popfl
48         ret
49
50 ENDPROC(cmpxchg8b_emu)