barrier.h 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Copyright IBM Corp. 1999, 2009
  4. *
  5. * Author(s): Martin Schwidefsky <[email protected]>
  6. */
  7. #ifndef __ASM_BARRIER_H
  8. #define __ASM_BARRIER_H
  9. /*
  10. * Force strict CPU ordering.
  11. * And yes, this is required on UP too when we're talking
  12. * to devices.
  13. */
  14. #ifdef CONFIG_HAVE_MARCH_Z196_FEATURES
  15. /* Fast-BCR without checkpoint synchronization */
  16. #define __ASM_BCR_SERIALIZE "bcr 14,0\n"
  17. #else
  18. #define __ASM_BCR_SERIALIZE "bcr 15,0\n"
  19. #endif
  20. static __always_inline void bcr_serialize(void)
  21. {
  22. asm volatile(__ASM_BCR_SERIALIZE : : : "memory");
  23. }
  24. #define __mb() bcr_serialize()
  25. #define __rmb() barrier()
  26. #define __wmb() barrier()
  27. #define __dma_rmb() __mb()
  28. #define __dma_wmb() __mb()
  29. #define __smp_mb() __mb()
  30. #define __smp_rmb() __rmb()
  31. #define __smp_wmb() __wmb()
  32. #define __smp_store_release(p, v) \
  33. do { \
  34. compiletime_assert_atomic_type(*p); \
  35. barrier(); \
  36. WRITE_ONCE(*p, v); \
  37. } while (0)
  38. #define __smp_load_acquire(p) \
  39. ({ \
  40. typeof(*p) ___p1 = READ_ONCE(*p); \
  41. compiletime_assert_atomic_type(*p); \
  42. barrier(); \
  43. ___p1; \
  44. })
  45. #define __smp_mb__before_atomic() barrier()
  46. #define __smp_mb__after_atomic() barrier()
  47. /**
  48. * array_index_mask_nospec - generate a mask for array_idx() that is
  49. * ~0UL when the bounds check succeeds and 0 otherwise
  50. * @index: array element index
  51. * @size: number of elements in array
  52. */
  53. #define array_index_mask_nospec array_index_mask_nospec
  54. static inline unsigned long array_index_mask_nospec(unsigned long index,
  55. unsigned long size)
  56. {
  57. unsigned long mask;
  58. if (__builtin_constant_p(size) && size > 0) {
  59. asm(" clgr %2,%1\n"
  60. " slbgr %0,%0\n"
  61. :"=d" (mask) : "d" (size-1), "d" (index) :"cc");
  62. return mask;
  63. }
  64. asm(" clgr %1,%2\n"
  65. " slbgr %0,%0\n"
  66. :"=d" (mask) : "d" (size), "d" (index) :"cc");
  67. return ~mask;
  68. }
  69. #include <asm-generic/barrier.h>
  70. #endif /* __ASM_BARRIER_H */