root/arch/x86/lib/cmpxchg8b_emu.S

/* [<][>][^][v][top][bottom][index][help] */
   1 /* SPDX-License-Identifier: GPL-2.0-only */
   2 
   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  */
  16 ENTRY(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 
  45 ENDPROC(cmpxchg8b_emu)
  46 EXPORT_SYMBOL(cmpxchg8b_emu)

/* [<][>][^][v][top][bottom][index][help] */