system.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:6k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * This file is subject to the terms and conditions of the GNU General Public
  3.  * License.  See the file "COPYING" in the main directory of this archive
  4.  * for more details.
  5.  *
  6.  * Copyright (C) 1994 - 1999 by Ralf Baechle
  7.  * Copyright (C) 1996 by Paul M. Antoine
  8.  * Copyright (C) 1994 - 1999 by Ralf Baechle
  9.  *
  10.  * Changed set_except_vector declaration to allow return of previous
  11.  * vector address value - necessary for "borrowing" vectors. 
  12.  *
  13.  * Kevin D. Kissell, kevink@mips.org and Carsten Langgaard, carstenl@mips.com
  14.  * Copyright (C) 2000 MIPS Technologies, Inc.
  15.  */
  16. #ifndef _ASM_SYSTEM_H
  17. #define _ASM_SYSTEM_H
  18. #include <linux/config.h>
  19. #include <asm/sgidefs.h>
  20. #include <asm/ptrace.h>
  21. #include <linux/kernel.h>
  22. extern __inline__ void
  23. __sti(void)
  24. {
  25. __asm__ __volatile__(
  26. ".settpushnt"
  27. ".settreordernt"
  28. ".settnoatnt"
  29. "mfc0t$1,$12nt"
  30. "orit$1,0x1fnt"
  31. "xorit$1,0x1ent"
  32. "mtc0t$1,$12nt"
  33. ".settpopnt"
  34. : /* no outputs */
  35. : /* no inputs */
  36. : "$1", "memory");
  37. }
  38. /*
  39.  * For cli() we have to insert nops to make shure that the new value
  40.  * has actually arrived in the status register before the end of this
  41.  * macro.
  42.  * R4000/R4400 need three nops, the R4600 two nops and the R10000 needs
  43.  * no nops at all.
  44.  */
  45. extern __inline__ void
  46. __cli(void)
  47. {
  48. __asm__ __volatile__(
  49. ".settpushnt"
  50. ".settreordernt"
  51. ".settnoatnt"
  52. "mfc0t$1,$12nt"
  53. "orit$1,1nt"
  54. "xorit$1,1nt"
  55. ".settnoreordernt"
  56. "mtc0t$1,$12nt"
  57. "nopnt"
  58. "nopnt"
  59. "nopnt"
  60. ".settpopnt"
  61. : /* no outputs */
  62. : /* no inputs */
  63. : "$1", "memory");
  64. }
  65. #define __save_flags(x)
  66. __asm__ __volatile__(
  67. ".settpushnt"
  68. ".settreordernt"
  69. "mfc0t%0,$12nt"
  70. ".settpopnt"
  71. : "=r" (x))
  72. #define __save_and_cli(x)
  73. __asm__ __volatile__(
  74. ".settpushnt"
  75. ".settreordernt"
  76. ".settnoatnt"
  77. "mfc0t%0,$12nt"
  78. "orit$1,%0,1nt"
  79. "xorit$1,1nt"
  80. ".settnoreordernt"
  81. "mtc0t$1,$12nt"
  82. "nopnt"
  83. "nopnt"
  84. "nopnt"
  85. ".settpopnt"
  86. : "=r" (x)
  87. : /* no inputs */
  88. : "$1", "memory")
  89. #define __restore_flags(flags)
  90. do {
  91. unsigned long __tmp1;
  92. __asm__ __volatile__(
  93. ".settnoreorderttt# __restore_flagsnt"
  94. ".settnoatnt"
  95. "mfc0t$1, $12nt"
  96. "andit%0, 1nt"
  97. "orit$1, 1nt"
  98. "xorit$1, 1nt"
  99. "ort%0, $1nt"
  100. "mtc0t%0, $12nt"
  101. "nopnt"
  102. "nopnt"
  103. "nopnt"
  104. ".settatnt"
  105. ".settreorder"
  106. : "=r" (__tmp1)
  107. : "0" (flags)
  108. : "$1", "memory");
  109. } while(0)
  110. #ifdef CONFIG_SMP
  111. extern void __global_sti(void);
  112. extern void __global_cli(void);
  113. extern unsigned long __global_save_flags(void);
  114. extern void __global_restore_flags(unsigned long);
  115. #  define sti() __global_sti()
  116. #  define cli() __global_cli() 
  117. #  define save_flags(x) do { x = __global_save_flags(); } while (0)
  118. #  define restore_flags(x) __global_restore_flags(x)
  119. #  define save_and_cli(x) do { save_flags(x); cli(); } while(0)
  120. #else /* Single processor */
  121. #  define sti() __sti()
  122. #  define cli() __cli()
  123. #  define save_flags(x) __save_flags(x)
  124. #  define save_and_cli(x) __save_and_cli(x)
  125. #  define restore_flags(x) __restore_flags(x)
  126. #endif /* SMP */
  127. /* For spinlocks etc */
  128. #define local_irq_save(x) __save_and_cli(x);
  129. #define local_irq_restore(x) __restore_flags(x);
  130. #define local_irq_disable() __cli();
  131. #define local_irq_enable() __sti();
  132. /*
  133.  * These are probably defined overly paranoid ...
  134.  */
  135. #ifdef CONFIG_CPU_HAS_WB
  136. #include <asm/wbflush.h>
  137. #define rmb() do { } while(0)
  138. #define wmb() wbflush()
  139. #define mb() wbflush()
  140. #else /* CONFIG_CPU_HAS_WB  */
  141. #define mb()
  142. __asm__ __volatile__(
  143. "# prevent instructions being moved aroundnt"
  144. ".settnoreordernt"
  145. "# 8 nops to fool the R4400 pipelinent"
  146. "nop;nop;nop;nop;nop;nop;nop;nopnt"
  147. ".settreorder"
  148. : /* no output */
  149. : /* no input */
  150. : "memory")
  151. #define rmb() mb()
  152. #define wmb() mb()
  153. #endif /* CONFIG_CPU_HAS_WB  */
  154. #ifdef CONFIG_SMP
  155. #define smp_mb() mb()
  156. #define smp_rmb() rmb()
  157. #define smp_wmb() wmb()
  158. #else
  159. #define smp_mb() barrier()
  160. #define smp_rmb() barrier()
  161. #define smp_wmb() barrier()
  162. #endif
  163. #define set_mb(var, value) 
  164. do { var = value; mb(); } while (0)
  165. #define set_wmb(var, value) 
  166. do { var = value; wmb(); } while (0)
  167. #if !defined (_LANGUAGE_ASSEMBLY)
  168. /*
  169.  * switch_to(n) should switch tasks to task nr n, first
  170.  * checking that n isn't the current task, in which case it does nothing.
  171.  */
  172. extern asmlinkage void *resume(void *last, void *next);
  173. #endif /* !defined (_LANGUAGE_ASSEMBLY) */
  174. #define prepare_to_switch() do { } while(0)
  175. #define switch_to(prev,next,last) 
  176. do { 
  177. (last) = resume(prev, next); 
  178. } while(0)
  179. /*
  180.  * For 32 and 64 bit operands we can take advantage of ll and sc.
  181.  * FIXME: This doesn't work for R3000 machines.
  182.  */
  183. extern __inline__ unsigned long xchg_u32(volatile int * m, unsigned long val)
  184. {
  185. #ifdef CONFIG_CPU_HAS_LLSC
  186. unsigned long dummy;
  187. __asm__ __volatile__(
  188. ".settnoreorderttt# xchg_u32nt"
  189. ".settnoatnt"
  190. "llt%0, %3n"
  191. "1:tmovet$1, %2nt"
  192. "sct$1, %1nt"
  193. "beqzlt$1, 1bnt"
  194. " llt%0, %3nt"
  195. ".settatnt"
  196. ".settreorder"
  197. : "=r" (val), "=o" (*m), "=r" (dummy)
  198. : "o" (*m), "2" (val)
  199. : "memory");
  200. return val;
  201. #else
  202. unsigned long flags, retval;
  203. save_flags(flags);
  204. cli();
  205. retval = *m;
  206. *m = val;
  207. restore_flags(flags);
  208. return retval;
  209. #endif /* Processor-dependent optimization */
  210. }
  211. #define xchg(ptr,x) ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(ptr),sizeof(*(ptr))))
  212. #define tas(ptr) (xchg((ptr),1))
  213. static __inline__ unsigned long
  214. __xchg(unsigned long x, volatile void * ptr, int size)
  215. {
  216. switch (size) {
  217. case 4:
  218. return xchg_u32(ptr, x);
  219. }
  220. return x;
  221. }
  222. extern void *set_except_vector(int n, void *addr);
  223. extern void __die(const char *, struct pt_regs *, const char *where,
  224. unsigned long line) __attribute__((noreturn));
  225. extern void __die_if_kernel(const char *, struct pt_regs *, const char *where,
  226. unsigned long line);
  227. #define die(msg, regs)
  228. __die(msg, regs, __FILE__ ":"__FUNCTION__, __LINE__)
  229. #define die_if_kernel(msg, regs)
  230. __die_if_kernel(msg, regs, __FILE__ ":"__FUNCTION__, __LINE__)
  231. #endif /* _ASM_SYSTEM_H */