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

atomic-irq.h (1687B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifndef __ASM_SH_ATOMIC_IRQ_H
      3#define __ASM_SH_ATOMIC_IRQ_H
      4
      5#include <linux/irqflags.h>
      6
      7/*
      8 * To get proper branch prediction for the main line, we must branch
      9 * forward to code at the end of this object's .text section, then
     10 * branch back to restart the operation.
     11 */
     12
     13#define ATOMIC_OP(op, c_op)						\
     14static inline void arch_atomic_##op(int i, atomic_t *v)			\
     15{									\
     16	unsigned long flags;						\
     17									\
     18	raw_local_irq_save(flags);					\
     19	v->counter c_op i;						\
     20	raw_local_irq_restore(flags);					\
     21}
     22
     23#define ATOMIC_OP_RETURN(op, c_op)					\
     24static inline int arch_atomic_##op##_return(int i, atomic_t *v)		\
     25{									\
     26	unsigned long temp, flags;					\
     27									\
     28	raw_local_irq_save(flags);					\
     29	temp = v->counter;						\
     30	temp c_op i;							\
     31	v->counter = temp;						\
     32	raw_local_irq_restore(flags);					\
     33									\
     34	return temp;							\
     35}
     36
     37#define ATOMIC_FETCH_OP(op, c_op)					\
     38static inline int arch_atomic_fetch_##op(int i, atomic_t *v)		\
     39{									\
     40	unsigned long temp, flags;					\
     41									\
     42	raw_local_irq_save(flags);					\
     43	temp = v->counter;						\
     44	v->counter c_op i;						\
     45	raw_local_irq_restore(flags);					\
     46									\
     47	return temp;							\
     48}
     49
     50#define ATOMIC_OPS(op, c_op)						\
     51	ATOMIC_OP(op, c_op)						\
     52	ATOMIC_OP_RETURN(op, c_op)					\
     53	ATOMIC_FETCH_OP(op, c_op)
     54
     55ATOMIC_OPS(add, +=)
     56ATOMIC_OPS(sub, -=)
     57
     58#undef ATOMIC_OPS
     59#define ATOMIC_OPS(op, c_op)						\
     60	ATOMIC_OP(op, c_op)						\
     61	ATOMIC_FETCH_OP(op, c_op)
     62
     63ATOMIC_OPS(and, &=)
     64ATOMIC_OPS(or, |=)
     65ATOMIC_OPS(xor, ^=)
     66
     67#undef ATOMIC_OPS
     68#undef ATOMIC_FETCH_OP
     69#undef ATOMIC_OP_RETURN
     70#undef ATOMIC_OP
     71
     72#endif /* __ASM_SH_ATOMIC_IRQ_H */