futex-irq.h 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. #ifndef __ASM_SH_FUTEX_IRQ_H
  2. #define __ASM_SH_FUTEX_IRQ_H
  3. #include <asm/system.h>
  4. static inline int atomic_futex_op_xchg_set(int oparg, u32 __user *uaddr,
  5. int *oldval)
  6. {
  7. unsigned long flags;
  8. int ret;
  9. local_irq_save(flags);
  10. ret = get_user(*oldval, uaddr);
  11. if (!ret)
  12. ret = put_user(oparg, uaddr);
  13. local_irq_restore(flags);
  14. return ret;
  15. }
  16. static inline int atomic_futex_op_xchg_add(int oparg, u32 __user *uaddr,
  17. int *oldval)
  18. {
  19. unsigned long flags;
  20. int ret;
  21. local_irq_save(flags);
  22. ret = get_user(*oldval, uaddr);
  23. if (!ret)
  24. ret = put_user(*oldval + oparg, uaddr);
  25. local_irq_restore(flags);
  26. return ret;
  27. }
  28. static inline int atomic_futex_op_xchg_or(int oparg, u32 __user *uaddr,
  29. int *oldval)
  30. {
  31. unsigned long flags;
  32. int ret;
  33. local_irq_save(flags);
  34. ret = get_user(*oldval, uaddr);
  35. if (!ret)
  36. ret = put_user(*oldval | oparg, uaddr);
  37. local_irq_restore(flags);
  38. return ret;
  39. }
  40. static inline int atomic_futex_op_xchg_and(int oparg, u32 __user *uaddr,
  41. int *oldval)
  42. {
  43. unsigned long flags;
  44. int ret;
  45. local_irq_save(flags);
  46. ret = get_user(*oldval, uaddr);
  47. if (!ret)
  48. ret = put_user(*oldval & oparg, uaddr);
  49. local_irq_restore(flags);
  50. return ret;
  51. }
  52. static inline int atomic_futex_op_xchg_xor(int oparg, u32 __user *uaddr,
  53. int *oldval)
  54. {
  55. unsigned long flags;
  56. int ret;
  57. local_irq_save(flags);
  58. ret = get_user(*oldval, uaddr);
  59. if (!ret)
  60. ret = put_user(*oldval ^ oparg, uaddr);
  61. local_irq_restore(flags);
  62. return ret;
  63. }
  64. static inline int atomic_futex_op_cmpxchg_inatomic(u32 *uval,
  65. u32 __user *uaddr,
  66. u32 oldval, u32 newval)
  67. {
  68. unsigned long flags;
  69. int ret;
  70. u32 prev = 0;
  71. local_irq_save(flags);
  72. ret = get_user(prev, uaddr);
  73. if (!ret && oldval == prev)
  74. ret = put_user(newval, uaddr);
  75. local_irq_restore(flags);
  76. *uval = prev;
  77. return ret;
  78. }
  79. #endif /* __ASM_SH_FUTEX_IRQ_H */