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

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef __ASM_CRIS_SYSTEM_H
  2. #define __ASM_CRIS_SYSTEM_H
  3. #include <linux/config.h>
  4. #include <asm/segment.h>
  5. /* the switch_to macro calls resume, an asm function in entry.S which does the actual
  6.  * task switching.
  7.  */
  8. extern struct task_struct *resume(struct task_struct *prev, struct task_struct *next, int);
  9. #define prepare_to_switch()     do { } while(0)
  10. #define switch_to(prev,next,last) last = resume(prev,next, 
  11.  (int)&((struct task_struct *)0)->thread)
  12. /* read the CPU version register */
  13. static inline unsigned long rdvr(void) { 
  14. unsigned char vr;
  15. __asm__ volatile ("move $vr,%0" : "=rm" (vr));
  16. return vr;
  17. }
  18. /* read/write the user-mode stackpointer */
  19. static inline unsigned long rdusp(void) {
  20. unsigned long usp;
  21. __asm__ __volatile__("move $usp,%0" : "=rm" (usp));
  22. return usp;
  23. }
  24. #define wrusp(usp) 
  25. __asm__ __volatile__("move %0,$usp" : /* no outputs */ : "rm" (usp))
  26. /* read the current stackpointer */
  27. static inline unsigned long rdsp(void) {
  28. unsigned long sp;
  29. __asm__ __volatile__("move.d $sp,%0" : "=rm" (sp));
  30. return sp;
  31. }
  32. static inline unsigned long _get_base(char * addr)
  33. {
  34.   return 0;
  35. }
  36. #define nop() __asm__ __volatile__ ("nop");
  37. #define xchg(ptr,x) ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(ptr),sizeof(*(ptr))))
  38. #define tas(ptr) (xchg((ptr),1))
  39. struct __xchg_dummy { unsigned long a[100]; };
  40. #define __xg(x) ((struct __xchg_dummy *)(x))
  41. #if 0
  42. /* use these and an oscilloscope to see the fraction of time we're running with IRQ's disabled */
  43. /* it assumes the LED's are on port 0x90000000 of course. */
  44. #define sti() __asm__ __volatile__ ( "eintpush $r0ntmoveq 0,$r0ntmove.d $r0,[0x90000000]ntpop $r0" );
  45. #define cli() __asm__ __volatile__ ( "dintpush $r0ntmove.d 0x40000,$r0ntmove.d $r0,[0x90000000]ntpop $r0");
  46. #define save_flags(x) __asm__ __volatile__ ("move $ccr,%0" : "=rm" (x) : : "memory");
  47. #define restore_flags(x) __asm__ __volatile__ ("move %0,$ccrntbtstq 5,%0ntbpl 1fntnopntpush $r0ntmoveq 0,$r0ntmove.d $r0,[0x90000000]ntpop $r0n1:n" : : "r" (x) : "memory");
  48. #else
  49. #define __cli() __asm__ __volatile__ ( "di" : : :"memory");
  50. #define __sti() __asm__ __volatile__ ( "ei" : : :"memory");
  51. #define __save_flags(x) __asm__ __volatile__ ("move $ccr,%0" : "=rm" (x) : : "memory");
  52. #define __restore_flags(x) __asm__ __volatile__ ("move %0,$ccr" : : "rm" (x) : "memory");
  53. /* For spinlocks etc */
  54. #define local_irq_save(x) __asm__ __volatile__ ("move $ccr,%0ntdi" : "=rm" (x) : : "memory"); 
  55. #define local_irq_restore(x) restore_flags(x)
  56. #define local_irq_disable()  cli()
  57. #define local_irq_enable()   sti()
  58. #endif
  59. #define cli() __cli()
  60. #define sti() __sti()
  61. #define save_flags(x) __save_flags(x)
  62. #define restore_flags(x) __restore_flags(x)
  63. #define save_and_cli(x) do { __save_flags(x); cli(); } while(0)
  64. static inline unsigned long __xchg(unsigned long x, void * ptr, int size)
  65. {
  66.   /* since Etrax doesn't have any atomic xchg instructions, we need to disable
  67.      irq's (if enabled) and do it with move.d's */
  68. #if 0
  69.   unsigned int flags;
  70.   save_flags(flags); /* save flags, including irq enable bit */
  71.   cli();             /* shut off irq's */
  72.   switch (size) {
  73.   case 1:
  74.     __asm__ __volatile__ (
  75.        "move.b %0,r0nt"
  76.        "move.b %1,%0nt"
  77.        "move.b r0,%1nt"
  78.        : "=r" (x)
  79.        : "m" (*__xg(ptr)), "r" (x)
  80.        : "memory","r0");    
  81.     break;
  82.   case 2:
  83.     __asm__ __volatile__ (
  84.        "move.w %0,r0nt"
  85.        "move.w %1,%0nt"
  86.        "move.w r0,%1nt"
  87.        : "=r" (x)
  88.        : "m" (*__xg(ptr)), "r" (x)
  89.        : "memory","r0");
  90.     break;
  91.   case 4:
  92.     __asm__ __volatile__ (
  93.        "move.d %0,r0nt"
  94.        "move.d %1,%0nt"
  95.        "move.d r0,%1nt"
  96.        : "=r" (x)
  97.        : "m" (*__xg(ptr)), "r" (x)
  98.        : "memory","r0");
  99.     break;
  100.   }
  101.   restore_flags(flags); /* restore irq enable bit */
  102.   return x;
  103. #else
  104.   unsigned long flags,temp;
  105.   save_flags(flags); /* save flags, including irq enable bit */
  106.   cli();             /* shut off irq's */
  107.   switch (size) {
  108.   case 1:
  109.     *((unsigned char *)&temp) = x;
  110.     x = *(unsigned char *)ptr;
  111.     *(unsigned char *)ptr = *((unsigned char *)&temp);
  112.     break;
  113.   case 2:
  114.     *((unsigned short *)&temp) = x;
  115.     x = *(unsigned short *)ptr;
  116.     *(unsigned short *)ptr = *((unsigned short *)&temp);
  117.     break;
  118.   case 4:
  119.     temp = x;
  120.     x = *(unsigned long *)ptr;
  121.     *(unsigned long *)ptr = temp;
  122.     break;
  123.   }
  124.   restore_flags(flags); /* restore irq enable bit */
  125.   return x;
  126. #endif
  127. }
  128. #define mb() __asm__ __volatile__ ("" : : : "memory")
  129. #define rmb() mb()
  130. #define wmb() mb()
  131. #ifdef CONFIG_SMP
  132. #define smp_mb()        mb()
  133. #define smp_rmb()       rmb()
  134. #define smp_wmb()       wmb()
  135. #else
  136. #define smp_mb()        barrier()
  137. #define smp_rmb()       barrier()
  138. #define smp_wmb()       barrier()
  139. #endif
  140. #define iret()
  141. /*
  142.  * disable hlt during certain critical i/o operations
  143.  */
  144. #define HAVE_DISABLE_HLT
  145. void disable_hlt(void);
  146. void enable_hlt(void);
  147. #endif