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

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef __PARISC_SYSTEM_H
  2. #define __PARISC_SYSTEM_H
  3. #include <linux/config.h>
  4. #include <asm/psw.h>
  5. /* The program status word as bitfields.  */
  6. struct pa_psw {
  7. unsigned int y:1;
  8. unsigned int z:1;
  9. unsigned int rv:2;
  10. unsigned int w:1;
  11. unsigned int e:1;
  12. unsigned int s:1;
  13. unsigned int t:1;
  14. unsigned int h:1;
  15. unsigned int l:1;
  16. unsigned int n:1;
  17. unsigned int x:1;
  18. unsigned int b:1;
  19. unsigned int c:1;
  20. unsigned int v:1;
  21. unsigned int m:1;
  22. unsigned int cb:8;
  23. unsigned int o:1;
  24. unsigned int g:1;
  25. unsigned int f:1;
  26. unsigned int r:1;
  27. unsigned int q:1;
  28. unsigned int p:1;
  29. unsigned int d:1;
  30. unsigned int i:1;
  31. };
  32. #ifdef __LP64__
  33. #define pa_psw(task) ((struct pa_psw *) ((char *) (task) + TASK_PT_PSW + 4))
  34. #else
  35. #define pa_psw(task) ((struct pa_psw *) ((char *) (task) + TASK_PT_PSW))
  36. #endif
  37. struct task_struct;
  38. extern struct task_struct *_switch_to(struct task_struct *, struct task_struct *);
  39. #define prepare_to_switch() do { } while(0)
  40. #define switch_to(prev, next, last) do {
  41. (last) = _switch_to(prev, next);
  42. } while(0)
  43. /* interrupt control */
  44. #define __save_flags(x) __asm__ __volatile__("ssm 0, %0" : "=r" (x) : : "memory")
  45. #define __restore_flags(x) __asm__ __volatile__("mtsm %0" : : "r" (x) : "memory")
  46. #define __cli() __asm__ __volatile__("rsm %0,%%r0n" : : "i" (PSW_I) : "memory" )
  47. #define __sti() __asm__ __volatile__("ssm %0,%%r0n" : : "i" (PSW_I) : "memory" )
  48. #define local_irq_save(x) 
  49. __asm__ __volatile__("rsm %1,%0" : "=r" (x) :"i" (PSW_I) : "memory" )
  50. #define local_irq_set(x) 
  51. __asm__ __volatile__("ssm %1,%0" : "=r" (x) :"i" (PSW_I) : "memory" )
  52. #define local_irq_restore(x) 
  53. __asm__ __volatile__("mtsm %0" : : "r" (x) : "memory" )
  54. #define local_irq_disable() __cli()
  55. #define local_irq_enable()  __sti()
  56. #ifdef CONFIG_SMP
  57. extern void __global_cli(void);
  58. extern void __global_sti(void);
  59. extern unsigned long __global_save_flags(void);
  60. extern void __global_restore_flags(unsigned long);
  61. #define cli() __global_cli()
  62. #define sti() __global_sti()
  63. #define save_flags(x) ((x)=__global_save_flags())
  64. #define restore_flags(x) __global_restore_flags(x)
  65.  
  66. #else
  67. #define cli() __cli()
  68. #define sti() __sti()
  69. #define save_flags(x) __save_flags(x)
  70. #define restore_flags(x) __restore_flags(x)
  71. #endif
  72. #define mfctl(reg) ({
  73. unsigned long cr;
  74. __asm__ __volatile__(
  75. "mfctl " #reg ",%0" :
  76.  "=r" (cr)
  77. );
  78. cr;
  79. })
  80. #define mtctl(gr, cr) 
  81. __asm__ __volatile__("mtctl %0,%1" 
  82. : /* no outputs */ 
  83. : "r" (gr), "i" (cr))
  84. /* these are here to de-mystefy the calling code, and to provide hooks */
  85. /* which I needed for debugging EIEM problems -PB */
  86. #define get_eiem() mfctl(15)
  87. static inline void set_eiem(unsigned long val)
  88. {
  89. mtctl(val, 15);
  90. }
  91. #define mfsp(reg) ({
  92. unsigned long cr;
  93. __asm__ __volatile__(
  94. "mfsp " #reg ",%0" :
  95.  "=r" (cr)
  96. );
  97. cr;
  98. })
  99. #define mtsp(gr, cr) 
  100. __asm__ __volatile__("mtsp %0,%1" 
  101. : /* no outputs */ 
  102. : "r" (gr), "i" (cr))
  103. /*
  104. ** This is simply the barrier() macro from linux/kernel.h but when serial.c
  105. ** uses tqueue.h uses smp_mb() defined using barrier(), linux/kernel.h
  106. ** hasn't yet been included yet so it fails, thus repeating the macro here.
  107. **
  108. ** PA-RISC architecture allows for weakly ordered memory accesses although
  109. ** none of the processors use it. There is a strong ordered bit that is
  110. ** set in the O-bit of the page directory entry. Operating systems that
  111. ** can not tolerate out of order accesses should set this bit when mapping
  112. ** pages. The O-bit of the PSW should also be set to 1 (I don't believe any
  113. ** of the processor implemented the PSW O-bit). The PCX-W ERS states that
  114. ** the TLB O-bit is not implemented so the page directory does not need to
  115. ** have the O-bit set when mapping pages (section 3.1). This section also
  116. ** states that the PSW Y, Z, G, and O bits are not implemented.
  117. ** So it looks like nothing needs to be done for parisc-linux (yet).
  118. ** (thanks to chada for the above comment -ggg)
  119. **
  120. ** The __asm__ op below simple prevents gcc/ld from reordering
  121. ** instructions across the mb() "call".
  122. */
  123. #define mb() __asm__ __volatile__("":::"memory"); /* barrier() */
  124. #define rmb() mb()
  125. #define wmb() mb()
  126. #define smp_mb() mb()
  127. #define smp_wmb() mb()
  128. #define set_mb(var, value) do { var = value; mb(); } while (0)
  129. /* LDCW, the only atomic read-write operation PA-RISC has. *sigh*.  */
  130. #define __ldcw(a) ({ 
  131. unsigned __ret; 
  132. __asm__ __volatile__("ldcw 0(%1),%0" : "=r" (__ret) : "r" (a)); 
  133. __ret; 
  134. })
  135. #ifdef CONFIG_SMP
  136. /*
  137.  * Your basic SMP spinlocks, allowing only a single CPU anywhere
  138.  */
  139. typedef struct {
  140. volatile unsigned int __attribute__((aligned(16))) lock;
  141. } spinlock_t;
  142. #endif
  143. #endif