linux/arch/csky/kernel/atomic.S
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
   3
   4#include <linux/linkage.h>
   5#include <abi/entry.h>
   6
   7.text
   8
   9/*
  10 * int csky_cmpxchg(int oldval, int newval, int *ptr)
  11 *
  12 * If *ptr != oldval && return 1,
  13 * else *ptr = newval return 0.
  14 */
  15ENTRY(csky_cmpxchg)
  16        USPTOKSP
  17        mfcr    a3, epc
  18        addi    a3, TRAP0_SIZE
  19
  20        subi    sp, 16
  21        stw     a3, (sp, 0)
  22        mfcr    a3, epsr
  23        stw     a3, (sp, 4)
  24        mfcr    a3, usp
  25        stw     a3, (sp, 8)
  26
  27        psrset  ee
  28#ifdef CONFIG_CPU_HAS_LDSTEX
  291:
  30        ldex    a3, (a2)
  31        cmpne   a0, a3
  32        bt16    2f
  33        mov     a3, a1
  34        stex    a3, (a2)
  35        bez     a3, 1b
  362:
  37        sync.is
  38#else
  391:
  40        ldw     a3, (a2)
  41        cmpne   a0, a3
  42        bt16    3f
  432:
  44        stw     a1, (a2)
  453:
  46#endif
  47        mvc     a0
  48        ldw     a3, (sp, 0)
  49        mtcr    a3, epc
  50        ldw     a3, (sp, 4)
  51        mtcr    a3, epsr
  52        ldw     a3, (sp, 8)
  53        mtcr    a3, usp
  54        addi    sp, 16
  55        KSPTOUSP
  56        rte
  57END(csky_cmpxchg)
  58
  59#ifndef CONFIG_CPU_HAS_LDSTEX
  60/*
  61 * Called from tlbmodified exception
  62 */
  63ENTRY(csky_cmpxchg_fixup)
  64        mfcr    a0, epc
  65        lrw     a1, 2b
  66        cmpne   a1, a0
  67        bt      1f
  68        subi    a1, (2b - 1b)
  69        stw     a1, (sp, LSAVE_PC)
  701:
  71        rts
  72END(csky_cmpxchg_fixup)
  73#endif
  74