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

嵌入式Linux

开发平台:

Unix_Linux

  1. #ifndef __ASM_SH_SYSTEM_H
  2. #define __ASM_SH_SYSTEM_H
  3. /*
  4.  * Copyright (C) 1999, 2000  Niibe Yutaka  &  Kaz Kojima
  5.  */
  6. #include <linux/config.h>
  7. #include <linux/kernel.h>
  8. /*
  9.  * switch_to() should switch tasks to task nr n, first
  10.  */
  11. typedef struct {
  12. unsigned long seg;
  13. } mm_segment_t;
  14. #ifdef CONFIG_SMP
  15. #error no SMP SuperH
  16. #else
  17. #define prepare_to_switch() do { } while(0)
  18. #define switch_to(prev,next,last) do { 
  19.  register struct task_struct *__last; 
  20.  register unsigned long *__ts1 __asm__ ("r1") = &prev->thread.sp; 
  21.  register unsigned long *__ts2 __asm__ ("r2") = &prev->thread.pc; 
  22.  register unsigned long *__ts4 __asm__ ("r4") = (unsigned long *)prev; 
  23.  register unsigned long *__ts5 __asm__ ("r5") = (unsigned long *)next; 
  24.  register unsigned long *__ts6 __asm__ ("r6") = &next->thread.sp; 
  25.  register unsigned long __ts7 __asm__ ("r7") = next->thread.pc; 
  26.  __asm__ __volatile__ (".balign 4nt" 
  27.        "stc.l gbr, @-r15nt" 
  28.        "sts.l pr, @-r15nt" 
  29.        "mov.l r8, @-r15nt" 
  30.        "mov.l r9, @-r15nt" 
  31.        "mov.l r10, @-r15nt" 
  32.        "mov.l r11, @-r15nt" 
  33.        "mov.l r12, @-r15nt" 
  34.        "mov.l r13, @-r15nt" 
  35.        "mov.l r14, @-r15nt" 
  36.        "mov.l r15, @r1 ! save SPnt" 
  37.        "mov.l @r6, r15 ! change to new stacknt" 
  38.        "mov.l %0, @-r15 ! push R0 onto new stacknt" 
  39.        "mova 1f, %0nt" 
  40.        "mov.l %0, @r2 ! save PCnt" 
  41.        "mov.l 2f, %0nt" 
  42.        "jmp @%0 ! call __switch_tont" 
  43.        " lds r7, pr !  with return to new PCnt" 
  44.        ".balign 4n"
  45.        "2:nt" 
  46.        ".long " "__switch_ton" 
  47.        "1:nt" 
  48.        "mov.l @r15+, %0 ! pop R0 from new stacknt" 
  49.        "mov.l @r15+, r14nt" 
  50.        "mov.l @r15+, r13nt" 
  51.        "mov.l @r15+, r12nt" 
  52.        "mov.l @r15+, r11nt" 
  53.        "mov.l @r15+, r10nt" 
  54.        "mov.l @r15+, r9nt" 
  55.        "mov.l @r15+, r8nt" 
  56.        "lds.l @r15+, prnt" 
  57.        "ldc.l @r15+, gbrnt" 
  58.        :"=&z" (__last) 
  59.        :"0" (prev), 
  60. "r" (__ts1), "r" (__ts2), 
  61. "r" (__ts4), "r" (__ts5), "r" (__ts6), "r" (__ts7) 
  62.        :"r3", "t"); 
  63.   last = __last; 
  64. } while (0)
  65. #endif
  66. #define nop() __asm__ __volatile__ ("nop")
  67. #define xchg(ptr,x) ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(ptr),sizeof(*(ptr))))
  68. static __inline__ unsigned long tas(volatile int *m)
  69. { /* #define tas(ptr) (xchg((ptr),1)) */
  70. unsigned long retval;
  71. __asm__ __volatile__ ("tas.b @%1nt"
  72.       "movt %0"
  73.       : "=r" (retval): "r" (m): "t", "memory");
  74. return retval;
  75. }
  76. extern void __xchg_called_with_bad_pointer(void);
  77. #define mb() __asm__ __volatile__ ("": : :"memory")
  78. #define rmb() mb()
  79. #define wmb() __asm__ __volatile__ ("": : :"memory")
  80. #ifdef CONFIG_SMP
  81. #define smp_mb() mb()
  82. #define smp_rmb() rmb()
  83. #define smp_wmb() wmb()
  84. #else
  85. #define smp_mb() barrier()
  86. #define smp_rmb() barrier()
  87. #define smp_wmb() barrier()
  88. #endif
  89. #define set_mb(var, value) do { xchg(&var, value); } while (0)
  90. #define set_wmb(var, value) do { var = value; wmb(); } while (0)
  91. /* Interrupt Control */
  92. static __inline__ void __sti(void)
  93. {
  94. unsigned long __dummy0, __dummy1;
  95. __asm__ __volatile__("stc sr, %0nt"
  96.      "and %1, %0nt"
  97.      "stc r6_bank, %1nt"
  98.      "or %1, %0nt"
  99.      "ldc %0, sr"
  100.      : "=&r" (__dummy0), "=r" (__dummy1)
  101.      : "1" (~0x000000f0)
  102.      : "memory");
  103. }
  104. static __inline__ void __cli(void)
  105. {
  106. unsigned long __dummy;
  107. __asm__ __volatile__("stc sr, %0nt"
  108.      "or #0xf0, %0nt"
  109.      "ldc %0, sr"
  110.      : "=&z" (__dummy)
  111.      : /* no inputs */
  112.      : "memory");
  113. }
  114. #define __save_flags(x) 
  115. __asm__("stc sr, %0; and #0xf0, %0" : "=&z" (x) :/**/: "memory" )
  116. static __inline__ unsigned long __save_and_cli(void)
  117. {
  118. unsigned long flags, __dummy;
  119. __asm__ __volatile__("stc sr, %1nt"
  120.      "mov %1, %0nt"
  121.      "or #0xf0, %0nt"
  122.      "ldc %0, srnt"
  123.      "mov %1, %0nt"
  124.      "and #0xf0, %0"
  125.      : "=&z" (flags), "=&r" (__dummy)
  126.      :/**/
  127.      : "memory" );
  128. return flags;
  129. }
  130. #ifdef DEBUG_CLI_STI
  131. static __inline__ void  __restore_flags(unsigned long x)
  132. {
  133. if ((x & 0x000000f0) != 0x000000f0)
  134. __sti();
  135. else {
  136. unsigned long flags;
  137. __save_flags(flags);
  138. if (flags == 0) {
  139. extern void dump_stack(void);
  140. printk(KERN_ERR "BUG!n");
  141. dump_stack();
  142. __cli();
  143. }
  144. }
  145. }
  146. #else
  147. #define __restore_flags(x) do { 
  148. if ((x & 0x000000f0) != 0x000000f0)
  149. __sti();
  150. } while (0)
  151. #endif
  152. #define really_restore_flags(x) do { 
  153. if ((x & 0x000000f0) != 0x000000f0)
  154. __sti();
  155. else
  156. __cli();
  157. } while (0)
  158. /*
  159.  * Jump to P2 area.
  160.  * When handling TLB or caches, we need to do it from P2 area.
  161.  */
  162. #define jump_to_P2()
  163. do {
  164. unsigned long __dummy;
  165. __asm__ __volatile__(
  166. "mov.l 1f, %0nt"
  167. "or %1, %0nt"
  168. "jmp @%0nt"
  169. " nopnt" 
  170. ".balign 4n"
  171. "1: .long 2fn"
  172. "2:"
  173. : "=&r" (__dummy)
  174. : "r" (0x20000000));
  175. } while (0)
  176. /*
  177.  * Back to P1 area.
  178.  */
  179. #define back_to_P1()
  180. do {
  181. unsigned long __dummy;
  182. __asm__ __volatile__(
  183. "nop;nop;nop;nop;nop;nop;nopnt"
  184. "mov.l 1f, %0nt"
  185. "jmp @%0nt"
  186. " nopnt"
  187. ".balign 4n"
  188. "1: .long 2fn"
  189. "2:"
  190. : "=&r" (__dummy));
  191. } while (0)
  192. /* For spinlocks etc */
  193. #define local_irq_save(x) x = __save_and_cli()
  194. #define local_irq_restore(x) __restore_flags(x)
  195. #define local_irq_disable() __cli()
  196. #define local_irq_enable() __sti()
  197. #ifdef CONFIG_SMP
  198. extern void __global_cli(void);
  199. extern void __global_sti(void);
  200. extern unsigned long __global_save_flags(void);
  201. extern void __global_restore_flags(unsigned long);
  202. #define cli() __global_cli()
  203. #define sti() __global_sti()
  204. #define save_flags(x) ((x)=__global_save_flags())
  205. #define restore_flags(x) __global_restore_flags(x)
  206. #else
  207. #define cli() __cli()
  208. #define sti() __sti()
  209. #define save_flags(x) __save_flags(x)
  210. #define save_and_cli(x) x = __save_and_cli()
  211. #define restore_flags(x) __restore_flags(x)
  212. #endif
  213. static __inline__ unsigned long xchg_u32(volatile int * m, unsigned long val)
  214. {
  215. unsigned long flags, retval;
  216. save_and_cli(flags);
  217. retval = *m;
  218. *m = val;
  219. restore_flags(flags);
  220. return retval;
  221. }
  222. static __inline__ unsigned long xchg_u8(volatile unsigned char * m, unsigned long val)
  223. {
  224. unsigned long flags, retval;
  225. save_and_cli(flags);
  226. retval = *m;
  227. *m = val & 0xff;
  228. restore_flags(flags);
  229. return retval;
  230. }
  231. static __inline__ unsigned long __xchg(unsigned long x, volatile void * ptr, int size)
  232. {
  233. switch (size) {
  234. case 4:
  235. return xchg_u32(ptr, x);
  236. break;
  237. case 1:
  238. return xchg_u8(ptr, x);
  239. break;
  240. }
  241. __xchg_called_with_bad_pointer();
  242. return x;
  243. }
  244. /* XXX
  245.  * disable hlt during certain critical i/o operations
  246.  */
  247. #define HAVE_DISABLE_HLT
  248. void disable_hlt(void);
  249. void enable_hlt(void);
  250. #endif