| Arjan van de Ven | 79e1dd0 | 2009-09-30 17:07:54 +0200 | [diff] [blame] | 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 | #include <asm/alternative-asm.h> | 
|  | 11 | #include <asm/frame.h> | 
|  | 12 | #include <asm/dwarf2.h> | 
|  | 13 |  | 
|  | 14 |  | 
|  | 15 | .text | 
|  | 16 |  | 
|  | 17 | /* | 
|  | 18 | * Inputs: | 
|  | 19 | * %esi : memory location to compare | 
|  | 20 | * %eax : low 32 bits of old value | 
|  | 21 | * %edx : high 32 bits of old value | 
|  | 22 | * %ebx : low 32 bits of new value | 
|  | 23 | * %ecx : high 32 bits of new value | 
|  | 24 | */ | 
|  | 25 | ENTRY(cmpxchg8b_emu) | 
|  | 26 | CFI_STARTPROC | 
|  | 27 |  | 
|  | 28 | # | 
|  | 29 | # Emulate 'cmpxchg8b (%esi)' on UP except we don't | 
|  | 30 | # set the whole ZF thing (caller will just compare | 
|  | 31 | # eax:edx with the expected value) | 
|  | 32 | # | 
|  | 33 | cmpxchg8b_emu: | 
|  | 34 | pushfl | 
|  | 35 | cli | 
|  | 36 |  | 
|  | 37 | cmpl  (%esi), %eax | 
|  | 38 | jne not_same | 
|  | 39 | cmpl 4(%esi), %edx | 
|  | 40 | jne half_same | 
|  | 41 |  | 
|  | 42 | movl %ebx,  (%esi) | 
|  | 43 | movl %ecx, 4(%esi) | 
|  | 44 |  | 
|  | 45 | popfl | 
|  | 46 | ret | 
|  | 47 |  | 
|  | 48 | not_same: | 
|  | 49 | movl  (%esi), %eax | 
|  | 50 | half_same: | 
|  | 51 | movl 4(%esi), %edx | 
|  | 52 |  | 
|  | 53 | popfl | 
|  | 54 | ret | 
|  | 55 |  | 
|  | 56 | CFI_ENDPROC | 
|  | 57 | ENDPROC(cmpxchg8b_emu) |