xref: /openbmc/linux/arch/x86/lib/cmpxchg8b_emu.S (revision 2612e3bbc0386368a850140a6c9b990cd496a5ec)
1b886d83cSThomas Gleixner/* SPDX-License-Identifier: GPL-2.0-only */
279e1dd05SArjan van de Ven
379e1dd05SArjan van de Ven#include <linux/linkage.h>
4784d5699SAl Viro#include <asm/export.h>
5*6d12c8d3SPeter Zijlstra#include <asm/percpu.h>
6*6d12c8d3SPeter Zijlstra#include <asm/processor-flags.h>
779e1dd05SArjan van de Ven
879e1dd05SArjan van de Ven.text
979e1dd05SArjan van de Ven
10*6d12c8d3SPeter Zijlstra#ifndef CONFIG_X86_CMPXCHG64
11*6d12c8d3SPeter Zijlstra
1279e1dd05SArjan van de Ven/*
13*6d12c8d3SPeter Zijlstra * Emulate 'cmpxchg8b (%esi)' on UP
14*6d12c8d3SPeter Zijlstra *
1579e1dd05SArjan van de Ven * Inputs:
1679e1dd05SArjan van de Ven * %esi : memory location to compare
1779e1dd05SArjan van de Ven * %eax : low 32 bits of old value
1879e1dd05SArjan van de Ven * %edx : high 32 bits of old value
1979e1dd05SArjan van de Ven * %ebx : low 32 bits of new value
2079e1dd05SArjan van de Ven * %ecx : high 32 bits of new value
2179e1dd05SArjan van de Ven */
226dcc5627SJiri SlabySYM_FUNC_START(cmpxchg8b_emu)
2379e1dd05SArjan van de Ven
24131484c8SIngo Molnar	pushfl
2579e1dd05SArjan van de Ven	cli
2679e1dd05SArjan van de Ven
27*6d12c8d3SPeter Zijlstra	cmpl	0(%esi), %eax
285f1d919aSJan Beulich	jne	.Lnot_same
2979e1dd05SArjan van de Ven	cmpl	4(%esi), %edx
30*6d12c8d3SPeter Zijlstra	jne	.Lnot_same
3179e1dd05SArjan van de Ven
32*6d12c8d3SPeter Zijlstra	movl	%ebx, 0(%esi)
3379e1dd05SArjan van de Ven	movl	%ecx, 4(%esi)
3479e1dd05SArjan van de Ven
35*6d12c8d3SPeter Zijlstra	orl	$X86_EFLAGS_ZF, (%esp)
36*6d12c8d3SPeter Zijlstra
37131484c8SIngo Molnar	popfl
38f94909ceSPeter Zijlstra	RET
3979e1dd05SArjan van de Ven
405f1d919aSJan Beulich.Lnot_same:
41*6d12c8d3SPeter Zijlstra	movl	0(%esi), %eax
4279e1dd05SArjan van de Ven	movl	4(%esi), %edx
4379e1dd05SArjan van de Ven
44*6d12c8d3SPeter Zijlstra	andl	$(~X86_EFLAGS_ZF), (%esp)
45*6d12c8d3SPeter Zijlstra
46131484c8SIngo Molnar	popfl
47f94909ceSPeter Zijlstra	RET
4879e1dd05SArjan van de Ven
496dcc5627SJiri SlabySYM_FUNC_END(cmpxchg8b_emu)
50784d5699SAl ViroEXPORT_SYMBOL(cmpxchg8b_emu)
51*6d12c8d3SPeter Zijlstra
52*6d12c8d3SPeter Zijlstra#endif
53*6d12c8d3SPeter Zijlstra
54*6d12c8d3SPeter Zijlstra#ifndef CONFIG_UML
55*6d12c8d3SPeter Zijlstra
56*6d12c8d3SPeter ZijlstraSYM_FUNC_START(this_cpu_cmpxchg8b_emu)
57*6d12c8d3SPeter Zijlstra
58*6d12c8d3SPeter Zijlstra	pushfl
59*6d12c8d3SPeter Zijlstra	cli
60*6d12c8d3SPeter Zijlstra
61*6d12c8d3SPeter Zijlstra	cmpl	PER_CPU_VAR(0(%esi)), %eax
62*6d12c8d3SPeter Zijlstra	jne	.Lnot_same2
63*6d12c8d3SPeter Zijlstra	cmpl	PER_CPU_VAR(4(%esi)), %edx
64*6d12c8d3SPeter Zijlstra	jne	.Lnot_same2
65*6d12c8d3SPeter Zijlstra
66*6d12c8d3SPeter Zijlstra	movl	%ebx, PER_CPU_VAR(0(%esi))
67*6d12c8d3SPeter Zijlstra	movl	%ecx, PER_CPU_VAR(4(%esi))
68*6d12c8d3SPeter Zijlstra
69*6d12c8d3SPeter Zijlstra	orl	$X86_EFLAGS_ZF, (%esp)
70*6d12c8d3SPeter Zijlstra
71*6d12c8d3SPeter Zijlstra	popfl
72*6d12c8d3SPeter Zijlstra	RET
73*6d12c8d3SPeter Zijlstra
74*6d12c8d3SPeter Zijlstra.Lnot_same2:
75*6d12c8d3SPeter Zijlstra	movl	PER_CPU_VAR(0(%esi)), %eax
76*6d12c8d3SPeter Zijlstra	movl	PER_CPU_VAR(4(%esi)), %edx
77*6d12c8d3SPeter Zijlstra
78*6d12c8d3SPeter Zijlstra	andl	$(~X86_EFLAGS_ZF), (%esp)
79*6d12c8d3SPeter Zijlstra
80*6d12c8d3SPeter Zijlstra	popfl
81*6d12c8d3SPeter Zijlstra	RET
82*6d12c8d3SPeter Zijlstra
83*6d12c8d3SPeter ZijlstraSYM_FUNC_END(this_cpu_cmpxchg8b_emu)
84*6d12c8d3SPeter Zijlstra
85*6d12c8d3SPeter Zijlstra#endif
86