cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

cmpxchg8b_emu.S (751B)


      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 */
     16SYM_FUNC_START(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
     45SYM_FUNC_END(cmpxchg8b_emu)
     46EXPORT_SYMBOL(cmpxchg8b_emu)