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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/include/asm-arm/proc-armv/system.h
  3.  *
  4.  *  Copyright (C) 1996 Russell King
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License version 2 as
  8.  * published by the Free Software Foundation.
  9.  */
  10. #ifndef __ASM_PROC_SYSTEM_H
  11. #define __ASM_PROC_SYSTEM_H
  12. #include <linux/config.h>
  13. #define set_cr(x)
  14. __asm__ __volatile__(
  15. "mcr p15, 0, %0, c1, c0 @ set CR"
  16. : : "r" (x))
  17. #define CR_M (1 << 0) /* MMU enable */
  18. #define CR_A (1 << 1) /* Alignment abort enable */
  19. #define CR_C (1 << 2) /* Dcache enable */
  20. #define CR_W (1 << 3) /* Write buffer enable */
  21. #define CR_P (1 << 4) /* 32-bit exception handler */
  22. #define CR_D (1 << 5) /* 32-bit data address range */
  23. #define CR_L (1 << 6) /* Implementation defined */
  24. #define CD_B (1 << 7) /* Big endian */
  25. #define CR_S (1 << 8) /* System MMU protection */
  26. #define CD_R (1 << 9) /* ROM MMU protection */
  27. #define CR_F (1 << 10) /* Implementation defined */
  28. #define CR_Z (1 << 11) /* Implementation defined */
  29. #define CR_I (1 << 12) /* Icache enable */
  30. #define CR_V (1 << 13) /* Vectors relocated to 0xffff0000 */
  31. #define CR_RR (1 << 14) /* Round Robin cache replacement */
  32. extern unsigned long cr_no_alignment; /* defined in entry-armv.S */
  33. extern unsigned long cr_alignment; /* defined in entry-armv.S */
  34. #ifdef __ARM_ARCH_4__
  35. #define vectors_base() ((cr_alignment & CR_V) ? 0xffff0000 : 0)
  36. #else
  37. #define vectors_base() (0)
  38. #endif
  39. /*
  40.  * A couple of speedups for the ARM
  41.  */
  42. /*
  43.  * Save the current interrupt enable state & disable IRQs
  44.  */
  45. #define __save_flags_cli(x)
  46. ({
  47. unsigned long temp;
  48. __asm__ __volatile__(
  49. "mrs %0, cpsr @ save_flags_clin"
  50. " orr %1, %0, #128n"
  51. " msr cpsr_c, %1"
  52. : "=r" (x), "=r" (temp)
  53. :
  54. : "memory");
  55. })
  56. /*
  57.  * Enable IRQs
  58.  */
  59. #define __sti()
  60. ({
  61. unsigned long temp;
  62. __asm__ __volatile__(
  63. "mrs %0, cpsr @ stin"
  64. " bic %0, %0, #128n"
  65. " msr cpsr_c, %0"
  66. : "=r" (temp)
  67. :
  68. : "memory");
  69. })
  70. /*
  71.  * Disable IRQs
  72.  */
  73. #define __cli()
  74. ({
  75. unsigned long temp;
  76. __asm__ __volatile__(
  77. "mrs %0, cpsr @ clin"
  78. " orr %0, %0, #128n"
  79. " msr cpsr_c, %0"
  80. : "=r" (temp)
  81. :
  82. : "memory");
  83. })
  84. /*
  85.  * Enable FIQs
  86.  */
  87. #define __stf()
  88. ({
  89. unsigned long temp;
  90. __asm__ __volatile__(
  91. "mrs %0, cpsr @ stfn"
  92. " bic %0, %0, #64n"
  93. " msr cpsr_c, %0"
  94. : "=r" (temp)
  95. :
  96. : "memory");
  97. })
  98. /*
  99.  * Disable FIQs
  100.  */
  101. #define __clf()
  102. ({
  103. unsigned long temp;
  104. __asm__ __volatile__(
  105. "mrs %0, cpsr @ clfn"
  106. " orr %0, %0, #64n"
  107. " msr cpsr_c, %0"
  108. : "=r" (temp)
  109. :
  110. : "memory");
  111. })
  112. /*
  113.  * save current IRQ & FIQ state
  114.  */
  115. #define __save_flags(x)
  116. __asm__ __volatile__(
  117. "mrs %0, cpsr @ save_flagsn"
  118.   : "=r" (x)
  119.   :
  120.   : "memory")
  121. /*
  122.  * restore saved IRQ & FIQ state
  123.  */
  124. #define __restore_flags(x)
  125. __asm__ __volatile__(
  126. "msr cpsr_c, %0 @ restore_flagsn"
  127. :
  128. : "r" (x)
  129. : "memory")
  130. #if defined(CONFIG_CPU_SA1100) || defined(CONFIG_CPU_SA110)
  131. /*
  132.  * On the StrongARM, "swp" is terminally broken since it bypasses the
  133.  * cache totally.  This means that the cache becomes inconsistent, and,
  134.  * since we use normal loads/stores as well, this is really bad.
  135.  * Typically, this causes oopsen in filp_close, but could have other,
  136.  * more disasterous effects.  There are two work-arounds:
  137.  *  1. Disable interrupts and emulate the atomic swap
  138.  *  2. Clean the cache, perform atomic swap, flush the cache
  139.  *
  140.  * We choose (1) since its the "easiest" to achieve here and is not
  141.  * dependent on the processor type.
  142.  */
  143. #define swp_is_buggy
  144. #endif
  145. static inline unsigned long __xchg(unsigned long x, volatile void *ptr, int size)
  146. {
  147. extern void __bad_xchg(volatile void *, int);
  148. unsigned long ret;
  149. #ifdef swp_is_buggy
  150. unsigned long flags;
  151. #endif
  152. switch (size) {
  153. #ifdef swp_is_buggy
  154. case 1:
  155. __save_flags_cli(flags);
  156. ret = *(volatile unsigned char *)ptr;
  157. *(volatile unsigned char *)ptr = x;
  158. __restore_flags(flags);
  159. break;
  160. case 4:
  161. __save_flags_cli(flags);
  162. ret = *(volatile unsigned long *)ptr;
  163. *(volatile unsigned long *)ptr = x;
  164. __restore_flags(flags);
  165. break;
  166. #else
  167. case 1: __asm__ __volatile__ ("swpb %0, %1, [%2]"
  168. : "=r" (ret)
  169. : "r" (x), "r" (ptr)
  170. : "memory");
  171. break;
  172. case 4: __asm__ __volatile__ ("swp %0, %1, [%2]"
  173. : "=r" (ret)
  174. : "r" (x), "r" (ptr)
  175. : "memory");
  176. break;
  177. #endif
  178. default: __bad_xchg(ptr, size);
  179. }
  180. return ret;
  181. }
  182. #endif