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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/include/asm-arm/proc-armv/locks.h
  3.  *
  4.  *  Copyright (C) 2000 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.  *  Interrupt safe locking assembler. 
  11.  */
  12. #ifndef __ASM_PROC_LOCKS_H
  13. #define __ASM_PROC_LOCKS_H
  14. #define __down_op(ptr,fail)
  15. ({
  16. __asm__ __volatile__(
  17. "@ down_opn"
  18. " mrs ip, cpsrn"
  19. " orr lr, ip, #128n"
  20. " msr cpsr_c, lrn"
  21. " ldr lr, [%0]n"
  22. " subs lr, lr, %1n"
  23. " str lr, [%0]n"
  24. " msr cpsr_c, ipn"
  25. " movmi ip, %0n"
  26. " blmi " SYMBOL_NAME_STR(fail)
  27. :
  28. : "r" (ptr), "I" (1)
  29. : "ip", "lr", "cc");
  30. })
  31. #define __down_op_ret(ptr,fail)
  32. ({
  33. unsigned int ret;
  34. __asm__ __volatile__(
  35. "@ down_op_retn"
  36. " mrs ip, cpsrn"
  37. " orr lr, ip, #128n"
  38. " msr cpsr_c, lrn"
  39. " ldr lr, [%1]n"
  40. " subs lr, lr, %2n"
  41. " str lr, [%1]n"
  42. " msr cpsr_c, ipn"
  43. " movmi ip, %1n"
  44. " movpl ip, #0n"
  45. " blmi " SYMBOL_NAME_STR(fail) "n"
  46. " mov %0, ip"
  47. : "=&r" (ret)
  48. : "r" (ptr), "I" (1)
  49. : "ip", "lr", "cc");
  50. ret;
  51. })
  52. #define __up_op(ptr,wake)
  53. ({
  54. __asm__ __volatile__(
  55. "@ up_opn"
  56. " mrs ip, cpsrn"
  57. " orr lr, ip, #128n"
  58. " msr cpsr_c, lrn"
  59. " ldr lr, [%0]n"
  60. " adds lr, lr, %1n"
  61. " str lr, [%0]n"
  62. " msr cpsr_c, ipn"
  63. " movle ip, %0n"
  64. " blle " SYMBOL_NAME_STR(wake)
  65. :
  66. : "r" (ptr), "I" (1)
  67. : "ip", "lr", "cc");
  68. })
  69. /*
  70.  * The value 0x01000000 supports up to 128 processors and
  71.  * lots of processes.  BIAS must be chosen such that sub'ing
  72.  * BIAS once per CPU will result in the long remaining
  73.  * negative.
  74.  */
  75. #define RW_LOCK_BIAS      0x01000000
  76. #define RW_LOCK_BIAS_STR "0x01000000"
  77. #define __down_op_write(ptr,fail)
  78. ({
  79. __asm__ __volatile__(
  80. "@ down_op_writen"
  81. " mrs ip, cpsrn"
  82. " orr lr, ip, #128n"
  83. " msr cpsr_c, lrn"
  84. " ldr lr, [%0]n"
  85. " subs lr, lr, %1n"
  86. " str lr, [%0]n"
  87. " msr cpsr_c, ipn"
  88. " movne ip, %0n"
  89. " blne " SYMBOL_NAME_STR(fail)
  90. :
  91. : "r" (ptr), "I" (RW_LOCK_BIAS)
  92. : "ip", "lr", "cc");
  93. })
  94. #define __up_op_write(ptr,wake)
  95. ({
  96. __asm__ __volatile__(
  97. "@ up_op_readn"
  98. " mrs ip, cpsrn"
  99. " orr lr, ip, #128n"
  100. " msr cpsr_c, lrn"
  101. " ldr lr, [%0]n"
  102. " adds lr, lr, %1n"
  103. " str lr, [%0]n"
  104. " msr cpsr_c, ipn"
  105. " movcs ip, %0n"
  106. " blcs " SYMBOL_NAME_STR(wake)
  107. :
  108. : "r" (ptr), "I" (RW_LOCK_BIAS)
  109. : "ip", "lr", "cc");
  110. })
  111. #define __down_op_read(ptr,fail)
  112. __down_op(ptr, fail)
  113. #define __up_op_read(ptr,wake)
  114. ({
  115. __asm__ __volatile__(
  116. "@ up_op_readn"
  117. " mrs ip, cpsrn"
  118. " orr lr, ip, #128n"
  119. " msr cpsr_c, lrn"
  120. " ldr lr, [%0]n"
  121. " adds lr, lr, %1n"
  122. " str lr, [%0]n"
  123. " msr cpsr_c, ipn"
  124. " moveq ip, %0n"
  125. " bleq " SYMBOL_NAME_STR(wake)
  126. :
  127. : "r" (ptr), "I" (1)
  128. : "ip", "lr", "cc");
  129. })
  130. #endif