root/arch/microblaze/include/asm/cmpxchg.h

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

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. __xchg

   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 #ifndef _ASM_MICROBLAZE_CMPXCHG_H
   3 #define _ASM_MICROBLAZE_CMPXCHG_H
   4 
   5 #include <linux/irqflags.h>
   6 
   7 void __bad_xchg(volatile void *ptr, int size);
   8 
   9 static inline unsigned long __xchg(unsigned long x, volatile void *ptr,
  10                                                                 int size)
  11 {
  12         unsigned long ret;
  13         unsigned long flags;
  14 
  15         switch (size) {
  16         case 1:
  17                 local_irq_save(flags);
  18                 ret = *(volatile unsigned char *)ptr;
  19                 *(volatile unsigned char *)ptr = x;
  20                 local_irq_restore(flags);
  21                 break;
  22 
  23         case 4:
  24                 local_irq_save(flags);
  25                 ret = *(volatile unsigned long *)ptr;
  26                 *(volatile unsigned long *)ptr = x;
  27                 local_irq_restore(flags);
  28                 break;
  29         default:
  30                 __bad_xchg(ptr, size), ret = 0;
  31                 break;
  32         }
  33 
  34         return ret;
  35 }
  36 
  37 #define xchg(ptr, x) \
  38         ((__typeof__(*(ptr))) __xchg((unsigned long)(x), (ptr), sizeof(*(ptr))))
  39 
  40 #include <asm-generic/cmpxchg.h>
  41 #include <asm-generic/cmpxchg-local.h>
  42 
  43 #endif /* _ASM_MICROBLAZE_CMPXCHG_H */

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