system.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:7k
源码类别:

Linux/Unix编程

开发平台:

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 <linux/kernel.h>
  21. #include <asm/addrspace.h>
  22. #include <asm/ptrace.h>
  23. __asm__ (
  24. ".macrot__stint"
  25. ".settpushnt"
  26. ".settreordernt"
  27. ".settnoatnt"
  28. "mfc0t$1,$12nt"
  29. "orit$1,0x1fnt"
  30. "xorit$1,0x1ent"
  31. "mtc0t$1,$12nt"
  32. ".settpopnt"
  33. ".endm");
  34. extern __inline__ void
  35. __sti(void)
  36. {
  37. __asm__ __volatile__(
  38. "__sti"
  39. : /* no outputs */
  40. : /* no inputs */
  41. : "memory");
  42. }
  43. /*
  44.  * For cli() we have to insert nops to make sure that the new value
  45.  * has actually arrived in the status register before the end of this
  46.  * macro.
  47.  * R4000/R4400 need three nops, the R4600 two nops and the R10000 needs
  48.  * no nops at all.
  49.  */
  50. __asm__ (
  51. ".macrot__clint"
  52. ".settpushnt"
  53. ".settnoatnt"
  54. "mfc0t$1,$12nt"
  55. "orit$1,1nt"
  56. "xorit$1,1nt"
  57. ".settnoreordernt"
  58. "mtc0t$1,$12nt"
  59. "sllt$0, $0, 1ttt# nopnt"
  60. "sllt$0, $0, 1ttt# nopnt"
  61. "sllt$0, $0, 1ttt# nopnt"
  62. ".settpopnt"
  63. ".endm");
  64. extern __inline__ void
  65. __cli(void)
  66. {
  67. __asm__ __volatile__(
  68. "__cli"
  69. : /* no outputs */
  70. : /* no inputs */
  71. : "memory");
  72. }
  73. __asm__ (
  74. ".macrot__save_flags flagsnt"
  75. ".settpushnt"
  76. ".settreordernt"
  77. "mfc0t\flags, $12nt"
  78. ".settpopnt"
  79. ".endm");
  80. #define __save_flags(x)
  81. __asm__ __volatile__(
  82. "__save_flags %0"
  83. : "=r" (x))
  84. __asm__ (
  85. ".macrot__save_and_cli resultnt"
  86. ".settpushnt"
  87. ".settreordernt"
  88. ".settnoatnt"
  89. "mfc0t\result, $12nt"
  90. "orit$1, \result, 1nt"
  91. "xorit$1, 1nt"
  92. ".settnoreordernt"
  93. "mtc0t$1, $12nt"
  94. "sllt$0, $0, 1ttt# nopnt"
  95. "sllt$0, $0, 1ttt# nopnt"
  96. "sllt$0, $0, 1ttt# nopnt"
  97. ".settpopnt"
  98. ".endm");
  99. #define __save_and_cli(x)
  100. __asm__ __volatile__(
  101. "__save_and_clit%0"
  102. : "=r" (x)
  103. : /* no inputs */
  104. : "memory")
  105. __asm__(".macrot__restore_flags flagsnt"
  106. ".settnoreordernt"
  107. ".settnoatnt"
  108. "mfc0t$1, $12nt"
  109. "andit\flags, 1nt"
  110. "orit$1, 1nt"
  111. "xorit$1, 1nt"
  112. "ort\flags, $1nt"
  113. "mtc0t\flags, $12nt"
  114. "sllt$0, $0, 1ttt# nopnt"
  115. "sllt$0, $0, 1ttt# nopnt"
  116. "sllt$0, $0, 1ttt# nopnt"
  117. ".settatnt"
  118. ".settreordernt"
  119. ".endm");
  120. #define __restore_flags(flags)
  121. do {
  122. unsigned long __tmp1;
  123. __asm__ __volatile__(
  124. "__restore_flagst%0"
  125. : "=r" (__tmp1)
  126. : "0" (flags)
  127. : "memory");
  128. } while(0)
  129. #ifdef CONFIG_SMP
  130. extern void __global_sti(void);
  131. extern void __global_cli(void);
  132. extern unsigned long __global_save_flags(void);
  133. extern void __global_restore_flags(unsigned long);
  134. #  define sti() __global_sti()
  135. #  define cli() __global_cli()
  136. #  define save_flags(x) do { x = __global_save_flags(); } while (0)
  137. #  define restore_flags(x) __global_restore_flags(x)
  138. #  define save_and_cli(x) do { save_flags(x); cli(); } while(0)
  139. #else /* Single processor */
  140. #  define sti() __sti()
  141. #  define cli() __cli()
  142. #  define save_flags(x) __save_flags(x)
  143. #  define save_and_cli(x) __save_and_cli(x)
  144. #  define restore_flags(x) __restore_flags(x)
  145. #endif /* SMP */
  146. /* For spinlocks etc */
  147. #define local_irq_save(x) __save_and_cli(x)
  148. #define local_irq_restore(x) __restore_flags(x)
  149. #define local_irq_disable() __cli()
  150. #define local_irq_enable() __sti()
  151. #ifdef CONFIG_CPU_HAS_SYNC
  152. #define __sync()
  153. __asm__ __volatile__(
  154. ".set pushnt"
  155. ".set noreordernt"
  156. ".set mips2nt"
  157. "syncnt"
  158. ".set pop"
  159. : /* no output */
  160. : /* no input */
  161. : "memory")
  162. #else
  163. #define __sync() do { } while(0)
  164. #endif
  165. #define __fast_iob()
  166. __asm__ __volatile__(
  167. ".set pushnt"
  168. ".set noreordernt"
  169. "lw $0,%0nt"
  170. "nopnt"
  171. ".set pop"
  172. : /* no output */
  173. : "m" (*(int *)KSEG1)
  174. : "memory")
  175. #define fast_wmb() __sync()
  176. #define fast_rmb() __sync()
  177. #define fast_mb() __sync()
  178. #define fast_iob()
  179. do {
  180. __sync();
  181. __fast_iob();
  182. } while (0)
  183. #ifdef CONFIG_CPU_HAS_WB
  184. #include <asm/wbflush.h>
  185. #define wmb() fast_wmb()
  186. #define rmb() fast_rmb()
  187. #define mb() wbflush();
  188. #define iob() wbflush();
  189. #else /* !CONFIG_CPU_HAS_WB */
  190. #define wmb() fast_wmb()
  191. #define rmb() fast_rmb()
  192. #define mb() fast_mb()
  193. #define iob() fast_iob()
  194. #endif /* !CONFIG_CPU_HAS_WB */
  195. #ifdef CONFIG_SMP
  196. #define smp_mb() mb()
  197. #define smp_rmb() rmb()
  198. #define smp_wmb() wmb()
  199. #else
  200. #define smp_mb() barrier()
  201. #define smp_rmb() barrier()
  202. #define smp_wmb() barrier()
  203. #endif
  204. #define set_mb(var, value) 
  205. do { var = value; mb(); } while (0)
  206. #define set_wmb(var, value) 
  207. do { var = value; wmb(); } while (0)
  208. #ifndef __ASSEMBLY__
  209. /*
  210.  * switch_to(n) should switch tasks to task nr n, first
  211.  * checking that n isn't the current task, in which case it does nothing.
  212.  */
  213. extern asmlinkage void *resume(void *last, void *next);
  214. #endif /* !__ASSEMBLY__ */
  215. #define prepare_to_switch() do { } while(0)
  216. struct task_struct;
  217. extern asmlinkage void lazy_fpu_switch(void *);
  218. extern asmlinkage void init_fpu(void);
  219. extern asmlinkage void save_fp(struct task_struct *);
  220. extern asmlinkage void restore_fp(struct task_struct *);
  221. #define switch_to(prev,next,last) 
  222. do { 
  223. (last) = resume(prev, next); 
  224. } while(0)
  225. /*
  226.  * For 32 and 64 bit operands we can take advantage of ll and sc.
  227.  * FIXME: This doesn't work for R3000 machines.
  228.  */
  229. extern __inline__ unsigned long xchg_u32(volatile int * m, unsigned long val)
  230. {
  231. #ifdef CONFIG_CPU_HAS_LLSC
  232. unsigned long dummy;
  233. __asm__ __volatile__(
  234. ".settpushtttt# xchg_u32nt"
  235. ".settnoreordernt"
  236. ".settnomacront"
  237. "llt%0, %3n"
  238. "1:tmovet%2, %z4nt"
  239. "sct%2, %1nt"
  240. "beqzlt%2, 1bnt"
  241. " llt%0, %3nt"
  242. "syncnt"
  243. ".settpop"
  244. : "=&r" (val), "=m" (*m), "=&r" (dummy)
  245. : "R" (*m), "Jr" (val)
  246. : "memory");
  247. return val;
  248. #else
  249. unsigned long flags, retval;
  250. save_flags(flags);
  251. cli();
  252. retval = *m;
  253. *m = val;
  254. restore_flags(flags); /* implies memory barrier  */
  255. return retval;
  256. #endif /* Processor-dependent optimization */
  257. }
  258. #define xchg(ptr,x) ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(ptr),sizeof(*(ptr))))
  259. #define tas(ptr) (xchg((ptr),1))
  260. static __inline__ unsigned long
  261. __xchg(unsigned long x, volatile void * ptr, int size)
  262. {
  263. switch (size) {
  264. case 4:
  265. return xchg_u32(ptr, x);
  266. }
  267. return x;
  268. }
  269. extern void *set_except_vector(int n, void *addr);
  270. extern void __die(const char *, struct pt_regs *, const char *file,
  271. const char *func, unsigned long line) __attribute__((noreturn));
  272. extern void __die_if_kernel(const char *, struct pt_regs *, const char *file,
  273. const char *func, unsigned long line);
  274. #define die(msg, regs)
  275. __die(msg, regs, __FILE__ ":", __FUNCTION__, __LINE__)
  276. #define die_if_kernel(msg, regs)
  277. __die_if_kernel(msg, regs, __FILE__ ":", __FUNCTION__, __LINE__)
  278. #endif /* _ASM_SYSTEM_H */