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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/include/asm-arm/proc-armo/locks.h
  3.  *
  4.  *  Copyright (C) 2000 Russell King
  5.  *  Fixes for 26 bit machines, (C) 2000 Dave Gilbert
  6.  *
  7.  * This program is free software; you can redistribute it and/or modify
  8.  * it under the terms of the GNU General Public License version 2 as
  9.  * published by the Free Software Foundation.
  10.  *
  11.  *  Interrupt safe locking assembler. 
  12.  */
  13. #ifndef __ASM_PROC_LOCKS_H
  14. #define __ASM_PROC_LOCKS_H
  15. /* Decrements by 1, fails if value < 0 */
  16. #define __down_op(ptr,fail)
  17. ({
  18. __asm__ __volatile__ (
  19. "@ atomic down operationn"
  20. " mov ip, pcn"
  21. " orr lr, ip, #0x08000000n"
  22. " teqp lr, #0n"
  23. " ldr lr, [%0]n"
  24. " and ip, ip, #0x0c000003n"
  25. " subs lr, lr, #1n"
  26. " str lr, [%0]n"
  27. " orrmi ip, ip, #0x80000000 @ set Nn" 
  28. " teqp ip, #0n"
  29. " movmi ip, %0n"
  30. " blmi " SYMBOL_NAME_STR(fail)
  31. :
  32. : "r" (ptr)
  33. : "ip", "lr", "cc");
  34. })
  35. #define __down_op_ret(ptr,fail)
  36. ({
  37. unsigned int result;
  38. __asm__ __volatile__ (
  39. " @ down_op_retn"
  40. " mov ip, pcn"
  41. " orr lr, ip, #0x08000000n"
  42. " teqp lr, #0n"
  43. " ldr lr, [%1]n"
  44. " and ip, ip, #0x0c000003n"
  45. " subs lr, lr, #1n"
  46. " str lr, [%1]n"
  47. " orrmi ip, ip, #0x80000000 @ set Nn" 
  48. " teqp ip, #0n"
  49. " movmi ip, %1n"
  50. " movpl ip, #0n"
  51. " blmi " SYMBOL_NAME_STR(fail) "n"
  52. " mov %0, ip"
  53. : "=&r" (result)
  54. : "r" (ptr)
  55. : "ip", "lr", "cc");
  56. result;
  57. })
  58. #define __up_op(ptr,wake)
  59. ({
  60. __asm__ __volatile__ (
  61. "@ up_opn"
  62. " mov ip, pcn"
  63. " orr lr, ip, #0x08000000n"
  64. " teqp lr, #0n"
  65. " ldr lr, [%0]n"
  66. " and ip, ip, #0x0c000003n"
  67. " adds lr, lr, #1n"
  68. " str lr, [%0]n"
  69. " orrle ip, ip, #0x80000000 @ set N - should this be mi ??? DAG ! n" 
  70. " teqp ip, #0n"
  71. " movmi ip, %0n"
  72. " blmi " SYMBOL_NAME_STR(wake)
  73. :
  74. : "r" (ptr)
  75. : "ip", "lr", "cc");
  76. })
  77. /*
  78.  * The value 0x01000000 supports up to 128 processors and
  79.  * lots of processes.  BIAS must be chosen such that sub'ing
  80.  * BIAS once per CPU will result in the long remaining
  81.  * negative.
  82.  */
  83. #define RW_LOCK_BIAS      0x01000000
  84. #define RW_LOCK_BIAS_STR "0x01000000"
  85. /* Decrements by RW_LOCK_BIAS rather than 1, fails if value != 0 */
  86. #define __down_op_write(ptr,fail)
  87. ({
  88. __asm__ __volatile__(
  89. "@ down_op_writen"
  90. " mov ip, pcn"
  91. " orr lr, ip, #0x08000000n"
  92. " teqp lr, #0n"
  93. " and ip, ip, #0x0c000003n"
  94. " ldr lr, [%0]n"
  95. " subs lr, lr, %1n"
  96. " str lr, [%0]n"
  97. " orreq ip, ip, #0x40000000 @ set Z n"
  98. " teqp ip, #0n"
  99. " movne ip, %0n"
  100. " blne " SYMBOL_NAME_STR(fail)
  101. :
  102. : "r" (ptr), "I" (RW_LOCK_BIAS)
  103. : "ip", "lr", "cc");
  104. })
  105. /* Increments by RW_LOCK_BIAS, wakes if value >= 0 */
  106. #define __up_op_write(ptr,wake)
  107. ({
  108. __asm__ __volatile__(
  109. "@ up_op_readn"
  110. " mov ip, pcn"
  111. " orr lr, ip, #0x08000000n"
  112. " teqp lr, #0n"
  113. " ldr lr, [%0]n"
  114. " and ip, ip, #0x0c000003n"
  115. " adds lr, lr, %1n"
  116. " str lr, [%0]n"
  117. " orrcs ip, ip, #0x20000000 @ set Cn" 
  118. " teqp ip, #0n"
  119. " movcs ip, %0n"
  120. " blcs " SYMBOL_NAME_STR(wake)
  121. :
  122. : "r" (ptr), "I" (RW_LOCK_BIAS)
  123. : "ip", "lr", "cc");
  124. })
  125. #define __down_op_read(ptr,fail)
  126. __down_op(ptr, fail)
  127. #define __up_op_read(ptr,wake)
  128. ({
  129. __asm__ __volatile__(
  130. "@ up_op_readn"
  131. " mov ip, pcn"
  132. " orr lr, ip, #0x08000000n"
  133. " teqp lr, #0n"
  134. " ldr lr, [%0]n"
  135. " and ip, ip, #0x0c000003n"
  136. " adds lr, lr, %1n"
  137. " str lr, [%0]n"
  138. " orreq ip, ip, #0x40000000 @ Set Z n" 
  139. " teqp ip, #0n"
  140. " moveq ip, %0n"
  141. " bleq " SYMBOL_NAME_STR(wake)
  142. :
  143. : "r" (ptr), "I" (1)
  144. : "ip", "lr", "cc");
  145. })
  146. #endif