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 */ 25ENTRY(cmpxchg8b_emu) 26CFI_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# 33cmpxchg8b_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 56CFI_ENDPROC 57ENDPROC(cmpxchg8b_emu) 58