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