futex-irq.h 1.8 KB

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