blob: 691d80e9748842b1901ac4ee010e3a5d817fe321 [file] [log] [blame]
David Brazdil0f672f62019-12-10 10:32:29 +00001/* SPDX-License-Identifier: GPL-2.0-only */
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002
3#include <linux/linkage.h>
4#include <asm/export.h>
5
6.text
7
8/*
9 * Inputs:
10 * %esi : memory location to compare
11 * %eax : low 32 bits of old value
12 * %edx : high 32 bits of old value
13 * %ebx : low 32 bits of new value
14 * %ecx : high 32 bits of new value
15 */
16ENTRY(cmpxchg8b_emu)
17
18#
19# Emulate 'cmpxchg8b (%esi)' on UP except we don't
20# set the whole ZF thing (caller will just compare
21# eax:edx with the expected value)
22#
23 pushfl
24 cli
25
26 cmpl (%esi), %eax
27 jne .Lnot_same
28 cmpl 4(%esi), %edx
29 jne .Lhalf_same
30
31 movl %ebx, (%esi)
32 movl %ecx, 4(%esi)
33
34 popfl
35 ret
36
37.Lnot_same:
38 movl (%esi), %eax
39.Lhalf_same:
40 movl 4(%esi), %edx
41
42 popfl
43 ret
44
45ENDPROC(cmpxchg8b_emu)
46EXPORT_SYMBOL(cmpxchg8b_emu)