armv4cpuid.S 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. #include "arm_arch.h"
  2. .text
  3. .code 32
  4. .align 5
  5. .global OPENSSL_atomic_add
  6. .type OPENSSL_atomic_add,%function
  7. OPENSSL_atomic_add:
  8. #if __ARM_ARCH__>=6
  9. .Ladd: ldrex r2,[r0]
  10. add r3,r2,r1
  11. strex r2,r3,[r0]
  12. cmp r2,#0
  13. bne .Ladd
  14. mov r0,r3
  15. bx lr
  16. #else
  17. stmdb sp!,{r4-r6,lr}
  18. ldr r2,.Lspinlock
  19. adr r3,.Lspinlock
  20. mov r4,r0
  21. mov r5,r1
  22. add r6,r3,r2 @ &spinlock
  23. b .+8
  24. .Lspin: bl sched_yield
  25. mov r0,#-1
  26. swp r0,r0,[r6]
  27. cmp r0,#0
  28. bne .Lspin
  29. ldr r2,[r4]
  30. add r2,r2,r5
  31. str r2,[r4]
  32. str r0,[r6] @ release spinlock
  33. ldmia sp!,{r4-r6,lr}
  34. tst lr,#1
  35. moveq pc,lr
  36. .word 0xe12fff1e @ bx lr
  37. #endif
  38. .size OPENSSL_atomic_add,.-OPENSSL_atomic_add
  39. .global OPENSSL_cleanse
  40. .type OPENSSL_cleanse,%function
  41. OPENSSL_cleanse:
  42. eor ip,ip,ip
  43. cmp r1,#7
  44. subhs r1,r1,#4
  45. bhs .Lot
  46. cmp r1,#0
  47. beq .Lcleanse_done
  48. .Little:
  49. strb ip,[r0],#1
  50. subs r1,r1,#1
  51. bhi .Little
  52. b .Lcleanse_done
  53. .Lot: tst r0,#3
  54. beq .Laligned
  55. strb ip,[r0],#1
  56. sub r1,r1,#1
  57. b .Lot
  58. .Laligned:
  59. str ip,[r0],#4
  60. subs r1,r1,#4
  61. bhs .Laligned
  62. adds r1,r1,#4
  63. bne .Little
  64. .Lcleanse_done:
  65. #if __ARM_ARCH__>=5
  66. bx lr
  67. #else
  68. tst lr,#1
  69. moveq pc,lr
  70. .word 0xe12fff1e @ bx lr
  71. #endif
  72. .size OPENSSL_cleanse,.-OPENSSL_cleanse
  73. #if __ARM_MAX_ARCH__>=7
  74. .arch armv7-a
  75. .fpu neon
  76. .align 5
  77. .global _armv7_neon_probe
  78. .type _armv7_neon_probe,%function
  79. _armv7_neon_probe:
  80. vorr q0,q0,q0
  81. bx lr
  82. .size _armv7_neon_probe,.-_armv7_neon_probe
  83. .global _armv7_tick
  84. .type _armv7_tick,%function
  85. _armv7_tick:
  86. mrrc p15,1,r0,r1,c14 @ CNTVCT
  87. bx lr
  88. .size _armv7_tick,.-_armv7_tick
  89. .global _armv8_aes_probe
  90. .type _armv8_aes_probe,%function
  91. _armv8_aes_probe:
  92. .byte 0x00,0x03,0xb0,0xf3 @ aese.8 q0,q0
  93. bx lr
  94. .size _armv8_aes_probe,.-_armv8_aes_probe
  95. .global _armv8_sha1_probe
  96. .type _armv8_sha1_probe,%function
  97. _armv8_sha1_probe:
  98. .byte 0x40,0x0c,0x00,0xf2 @ sha1c.32 q0,q0,q0
  99. bx lr
  100. .size _armv8_sha1_probe,.-_armv8_sha1_probe
  101. .global _armv8_sha256_probe
  102. .type _armv8_sha256_probe,%function
  103. _armv8_sha256_probe:
  104. .byte 0x40,0x0c,0x00,0xf3 @ sha256h.32 q0,q0,q0
  105. bx lr
  106. .size _armv8_sha256_probe,.-_armv8_sha256_probe
  107. .global _armv8_pmull_probe
  108. .type _armv8_pmull_probe,%function
  109. _armv8_pmull_probe:
  110. .byte 0x00,0x0e,0xa0,0xf2 @ vmull.p64 q0,d0,d0
  111. bx lr
  112. .size _armv8_pmull_probe,.-_armv8_pmull_probe
  113. #endif
  114. .global OPENSSL_wipe_cpu
  115. .type OPENSSL_wipe_cpu,%function
  116. OPENSSL_wipe_cpu:
  117. #if __ARM_MAX_ARCH__>=7
  118. ldr r0,.LOPENSSL_armcap
  119. adr r1,.LOPENSSL_armcap
  120. ldr r0,[r1,r0]
  121. #endif
  122. eor r2,r2,r2
  123. eor r3,r3,r3
  124. eor ip,ip,ip
  125. #if __ARM_MAX_ARCH__>=7
  126. tst r0,#1
  127. beq .Lwipe_done
  128. veor q0, q0, q0
  129. veor q1, q1, q1
  130. veor q2, q2, q2
  131. veor q3, q3, q3
  132. veor q8, q8, q8
  133. veor q9, q9, q9
  134. veor q10, q10, q10
  135. veor q11, q11, q11
  136. veor q12, q12, q12
  137. veor q13, q13, q13
  138. veor q14, q14, q14
  139. veor q15, q15, q15
  140. .Lwipe_done:
  141. #endif
  142. mov r0,sp
  143. #if __ARM_ARCH__>=5
  144. bx lr
  145. #else
  146. tst lr,#1
  147. moveq pc,lr
  148. .word 0xe12fff1e @ bx lr
  149. #endif
  150. .size OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu
  151. .global OPENSSL_instrument_bus
  152. .type OPENSSL_instrument_bus,%function
  153. OPENSSL_instrument_bus:
  154. eor r0,r0,r0
  155. #if __ARM_ARCH__>=5
  156. bx lr
  157. #else
  158. tst lr,#1
  159. moveq pc,lr
  160. .word 0xe12fff1e @ bx lr
  161. #endif
  162. .size OPENSSL_instrument_bus,.-OPENSSL_instrument_bus
  163. .global OPENSSL_instrument_bus2
  164. .type OPENSSL_instrument_bus2,%function
  165. OPENSSL_instrument_bus2:
  166. eor r0,r0,r0
  167. #if __ARM_ARCH__>=5
  168. bx lr
  169. #else
  170. tst lr,#1
  171. moveq pc,lr
  172. .word 0xe12fff1e @ bx lr
  173. #endif
  174. .size OPENSSL_instrument_bus2,.-OPENSSL_instrument_bus2
  175. .align 5
  176. #if __ARM_MAX_ARCH__>=7
  177. .LOPENSSL_armcap:
  178. .word OPENSSL_armcap_P-.LOPENSSL_armcap
  179. #endif
  180. #if __ARM_ARCH__>=6
  181. .align 5
  182. #else
  183. .Lspinlock:
  184. .word atomic_add_spinlock-.Lspinlock
  185. .align 5
  186. .data
  187. .align 2
  188. atomic_add_spinlock:
  189. .word 0
  190. #endif
  191. .comm OPENSSL_armcap_P,4,4
  192. .hidden OPENSSL_armcap_P