atomic_sparc.h 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. /*
  2. * Copyright (C) 2006 iptelorg GmbH
  3. *
  4. * Permission to use, copy, modify, and distribute this software for any
  5. * purpose with or without fee is hereby granted, provided that the above
  6. * copyright notice and this permission notice appear in all copies.
  7. *
  8. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  9. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  10. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  11. * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  12. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  13. * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  14. * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15. */
  16. /**
  17. * @file
  18. * @brief Memory barriers for SPARC32 ( version < v 9))
  19. *
  20. * Memory barriers for SPARC32 ( version < v 9)), see atomic_ops.h for more
  21. * details.
  22. *
  23. * Config defines:
  24. * - NOSMP
  25. * @ingroup atomic
  26. */
  27. /*
  28. * History:
  29. * --------
  30. * 2006-03-28 created by andrei
  31. * 2007-05-29 added membar_depends(), membar_*_atomic_op and
  32. * membar_*_atomic_setget (andrei)
  33. */
  34. #ifndef _atomic_sparc_h
  35. #define _atomic_sparc_h
  36. #define HAVE_ASM_INLINE_MEMBAR
  37. #warning "sparc32 atomic operations support not tested"
  38. #ifdef NOSMP
  39. #define membar() asm volatile ("" : : : "memory") /* gcc do not cache barrier*/
  40. #define membar_read() membar()
  41. #define membar_write() membar()
  42. #define membar_depends() do {} while(0) /* really empty, not even a cc bar. */
  43. /* lock barrriers: empty, not needed for NOSMP; the lock/unlock should already
  44. * contain gcc barriers*/
  45. #define membar_enter_lock() do {} while(0)
  46. #define membar_leave_lock() do {} while(0)
  47. /* membars after or before atomic_ops or atomic_setget -> use these or
  48. * mb_<atomic_op_name>() if you need a memory barrier in one of these
  49. * situations (on some archs where the atomic operations imply memory
  50. * barriers is better to use atomic_op_x(); membar_atomic_op() then
  51. * atomic_op_x(); membar()) */
  52. #define membar_atomic_op() membar()
  53. #define membar_atomic_setget() membar()
  54. #define membar_write_atomic_op() membar_write()
  55. #define membar_write_atomic_setget() membar_write()
  56. #define membar_read_atomic_op() membar_read()
  57. #define membar_read_atomic_setget() membar_read()
  58. #else /* SMP */
  59. #define membar_write() asm volatile ("stbar \n\t" : : : "memory")
  60. #define membar() membar_write()
  61. #define membar_read() asm volatile ("" : : : "memory")
  62. #define membar_depends() do {} while(0) /* really empty, not even a cc bar. */
  63. #define membar_enter_lock() do {} while(0)
  64. #define membar_leave_lock() asm volatile ("stbar \n\t" : : : "memory")
  65. /* membars after or before atomic_ops or atomic_setget -> use these or
  66. * mb_<atomic_op_name>() if you need a memory barrier in one of these
  67. * situations (on some archs where the atomic operations imply memory
  68. * barriers is better to use atomic_op_x(); membar_atomic_op() then
  69. * atomic_op_x(); membar()) */
  70. #define membar_atomic_op() membar()
  71. #define membar_atomic_setget() membar()
  72. #define membar_write_atomic_op() membar_write()
  73. #define membar_write_atomic_setget() membar_write()
  74. #define membar_read_atomic_op() membar_read()
  75. #define membar_read_atomic_setget() membar_read()
  76. #endif /* NOSMP */
  77. #endif