system.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. /*
  2. * include/asm-microblaze/system.h -- Low-level interrupt/thread ops
  3. *
  4. * Copyright (C) 2003 John Williams (jwilliams@itee.uq.edu.au)
  5. * based upon microblaze version
  6. * Copyright (C) 2001 NEC Corporation
  7. * Copyright (C) 2001 Miles Bader <miles@gnu.org>
  8. *
  9. * This file is subject to the terms and conditions of the GNU General
  10. * Public License. See the file COPYING in the main directory of this
  11. * archive for more details.
  12. *
  13. * Written by Miles Bader <miles@gnu.org>
  14. * Microblaze port by John Williams
  15. * Microblaze port by John Williams
  16. */
  17. #ifndef __MICROBLAZE_SYSTEM_H__
  18. #define __MICROBLAZE_SYSTEM_H__
  19. #if 0
  20. #include <linux/linkage.h>
  21. #endif
  22. #include <asm/ptrace.h>
  23. #define prepare_to_switch() do { } while (0)
  24. /*
  25. * switch_to(n) should switch tasks to task ptr, first checking that
  26. * ptr isn't the current task, in which case it does nothing.
  27. */
  28. struct thread_struct;
  29. extern void *switch_thread (struct thread_struct *last,
  30. struct thread_struct *next);
  31. #define switch_to(prev,next,last) do { \
  32. if (prev != next) { \
  33. (last) = switch_thread (&prev->thread, &next->thread); \
  34. } \
  35. } while (0)
  36. /* Enable/disable interrupts. */
  37. #define __sti() \
  38. { \
  39. register unsigned tmp; \
  40. __asm__ __volatile__ (" \
  41. mfs %0, rmsr; \
  42. ori %0, %0, 2; \
  43. mts rmsr, %0" \
  44. : "=r" (tmp) \
  45. : \
  46. : "memory"); \
  47. }
  48. #define __cli() \
  49. { \
  50. register unsigned tmp; \
  51. __asm__ __volatile__ (" \
  52. mfs %0, rmsr; \
  53. andi %0, %0, ~2; \
  54. mts rmsr, %0" \
  55. : "=r" (tmp) \
  56. : \
  57. : "memory"); \
  58. }
  59. #define __save_flags(flags) \
  60. __asm__ __volatile__ ("mfs %0, rmsr" : "=r" (flags))
  61. #define __restore_flags(flags) \
  62. __asm__ __volatile__ ("mts rmsr, %0" :: "r" (flags))
  63. #define __save_flags_cli(flags) \
  64. { \
  65. register unsigned tmp; \
  66. __asm__ __volatile__ (" \
  67. mfs %0, rmsr; \
  68. andi %1, %0, ~2; \
  69. mts rmsr, %1;" \
  70. : "=r" (flags), "=r" (tmp) \
  71. : \
  72. : "memory"); \
  73. }
  74. #define __save_flags_sti(flags) \
  75. { \
  76. register unsigned tmp; \
  77. __asm__ __volatile__ (" \
  78. mfs %0, rmsr; \
  79. ori %1, %0, 2; \
  80. mts rmsr, %1;" \
  81. : "=r" (flags) ,"=r" (tmp) \
  82. : \
  83. : "memory"); \
  84. }
  85. /* For spinlocks etc */
  86. #define local_irq_save(flags) __save_flags_cli (flags)
  87. #define local_irq_set(flags) __save_flags_sti (flags)
  88. #define local_irq_restore(flags) __restore_flags (flags)
  89. #define local_irq_disable() __cli ()
  90. #define local_irq_enable() __sti ()
  91. #define cli() __cli ()
  92. #define sti() __sti ()
  93. #define save_flags(flags) __save_flags (flags)
  94. #define restore_flags(flags) __restore_flags (flags)
  95. #define save_flags_cli(flags) __save_flags_cli (flags)
  96. /*
  97. * Force strict CPU ordering.
  98. * Not really required on microblaze...
  99. */
  100. #define nop() __asm__ __volatile__ ("nop")
  101. #define mb() __asm__ __volatile__ ("nop" ::: "memory")
  102. #define rmb() mb ()
  103. #define wmb() mb ()
  104. #define set_mb(var, value) do { var = value; mb(); } while (0)
  105. #define set_wmb(var, value) do { var = value; wmb (); } while (0)
  106. #ifdef CONFIG_SMP
  107. #define smp_mb() mb ()
  108. #define smp_rmb() rmb ()
  109. #define smp_wmb() wmb ()
  110. #else
  111. #define smp_mb() barrier ()
  112. #define smp_rmb() barrier ()
  113. #define smp_wmb() barrier ()
  114. #endif
  115. #define xchg(ptr, with) \
  116. ((__typeof__ (*(ptr)))__xchg ((unsigned long)(with), (ptr), sizeof (*(ptr))))
  117. #define tas(ptr) (xchg ((ptr), 1))
  118. static inline unsigned long __xchg(unsigned long with,
  119. __volatile__ void *ptr, int size)
  120. {
  121. unsigned long tmp, flags;
  122. save_flags_cli (flags);
  123. switch (size) {
  124. case 1:
  125. tmp = *(unsigned char *)ptr;
  126. *(unsigned char *)ptr = with;
  127. break;
  128. case 2:
  129. tmp = *(unsigned short *)ptr;
  130. *(unsigned short *)ptr = with;
  131. break;
  132. case 4:
  133. tmp = *(unsigned long *)ptr;
  134. *(unsigned long *)ptr = with;
  135. break;
  136. }
  137. restore_flags (flags);
  138. return tmp;
  139. }
  140. #endif /* __MICROBLAZE_SYSTEM_H__ */