Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at v5.5-rc2 43 lines 919 B view raw
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 7void __bad_xchg(volatile void *ptr, int size); 8 9static 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 */