armv4cpuid.S 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. #include "arm_arch.h"
  2. .text
  3. #if defined(__thumb2__) && !defined(__APPLE__)
  4. .syntax unified
  5. .thumb
  6. #else
  7. .code 32
  8. #undef __thumb2__
  9. #endif
  10. .align 5
  11. .globl OPENSSL_atomic_add
  12. .type OPENSSL_atomic_add,%function
  13. OPENSSL_atomic_add:
  14. #if __ARM_ARCH__>=6
  15. .Ladd: ldrex r2,[r0]
  16. add r3,r2,r1
  17. strex r2,r3,[r0]
  18. cmp r2,#0
  19. bne .Ladd
  20. mov r0,r3
  21. bx lr
  22. #else
  23. stmdb sp!,{r4,r5,r6,lr}
  24. ldr r2,.Lspinlock
  25. adr r3,.Lspinlock
  26. mov r4,r0
  27. mov r5,r1
  28. add r6,r3,r2 @ &spinlock
  29. b .+8
  30. .Lspin: bl sched_yield
  31. mov r0,#-1
  32. swp r0,r0,[r6]
  33. cmp r0,#0
  34. bne .Lspin
  35. ldr r2,[r4]
  36. add r2,r2,r5
  37. str r2,[r4]
  38. str r0,[r6] @ release spinlock
  39. ldmia sp!,{r4,r5,r6,lr}
  40. tst lr,#1
  41. moveq pc,lr
  42. .word 0xe12fff1e @ bx lr
  43. #endif
  44. .size OPENSSL_atomic_add,.-OPENSSL_atomic_add
  45. .globl OPENSSL_cleanse
  46. .type OPENSSL_cleanse,%function
  47. OPENSSL_cleanse:
  48. eor ip,ip,ip
  49. cmp r1,#7
  50. #ifdef __thumb2__
  51. itt hs
  52. #endif
  53. subhs r1,r1,#4
  54. bhs .Lot
  55. cmp r1,#0
  56. beq .Lcleanse_done
  57. .Little:
  58. strb ip,[r0],#1
  59. subs r1,r1,#1
  60. bhi .Little
  61. b .Lcleanse_done
  62. .Lot: tst r0,#3
  63. beq .Laligned
  64. strb ip,[r0],#1
  65. sub r1,r1,#1
  66. b .Lot
  67. .Laligned:
  68. str ip,[r0],#4
  69. subs r1,r1,#4
  70. bhs .Laligned
  71. adds r1,r1,#4
  72. bne .Little
  73. .Lcleanse_done:
  74. #if __ARM_ARCH__>=5
  75. bx lr
  76. #else
  77. tst lr,#1
  78. moveq pc,lr
  79. .word 0xe12fff1e @ bx lr
  80. #endif
  81. .size OPENSSL_cleanse,.-OPENSSL_cleanse
  82. .globl CRYPTO_memcmp
  83. .type CRYPTO_memcmp,%function
  84. .align 4
  85. CRYPTO_memcmp:
  86. eor ip,ip,ip
  87. cmp r2,#0
  88. beq .Lno_data
  89. stmdb sp!,{r4,r5}
  90. .Loop_cmp:
  91. ldrb r4,[r0],#1
  92. ldrb r5,[r1],#1
  93. eor r4,r4,r5
  94. orr ip,ip,r4
  95. subs r2,r2,#1
  96. bne .Loop_cmp
  97. ldmia sp!,{r4,r5}
  98. .Lno_data:
  99. rsb r0,ip,#0
  100. mov r0,r0,lsr#31
  101. #if __ARM_ARCH__>=5
  102. bx lr
  103. #else
  104. tst lr,#1
  105. moveq pc,lr
  106. .word 0xe12fff1e @ bx lr
  107. #endif
  108. .size CRYPTO_memcmp,.-CRYPTO_memcmp
  109. #if __ARM_MAX_ARCH__>=7
  110. .arch armv7-a
  111. .fpu neon
  112. .align 5
  113. .globl _armv7_neon_probe
  114. .type _armv7_neon_probe,%function
  115. _armv7_neon_probe:
  116. vorr q0,q0,q0
  117. bx lr
  118. .size _armv7_neon_probe,.-_armv7_neon_probe
  119. .globl _armv7_tick
  120. .type _armv7_tick,%function
  121. _armv7_tick:
  122. #ifdef __APPLE__
  123. mrrc p15,0,r0,r1,c14 @ CNTPCT
  124. #else
  125. mrrc p15,1,r0,r1,c14 @ CNTVCT
  126. #endif
  127. bx lr
  128. .size _armv7_tick,.-_armv7_tick
  129. .globl _armv8_aes_probe
  130. .type _armv8_aes_probe,%function
  131. _armv8_aes_probe:
  132. #if defined(__thumb2__) && !defined(__APPLE__)
  133. .byte 0xb0,0xff,0x00,0x03 @ aese.8 q0,q0
  134. #else
  135. .byte 0x00,0x03,0xb0,0xf3 @ aese.8 q0,q0
  136. #endif
  137. bx lr
  138. .size _armv8_aes_probe,.-_armv8_aes_probe
  139. .globl _armv8_sha1_probe
  140. .type _armv8_sha1_probe,%function
  141. _armv8_sha1_probe:
  142. #if defined(__thumb2__) && !defined(__APPLE__)
  143. .byte 0x00,0xef,0x40,0x0c @ sha1c.32 q0,q0,q0
  144. #else
  145. .byte 0x40,0x0c,0x00,0xf2 @ sha1c.32 q0,q0,q0
  146. #endif
  147. bx lr
  148. .size _armv8_sha1_probe,.-_armv8_sha1_probe
  149. .globl _armv8_sha256_probe
  150. .type _armv8_sha256_probe,%function
  151. _armv8_sha256_probe:
  152. #if defined(__thumb2__) && !defined(__APPLE__)
  153. .byte 0x00,0xff,0x40,0x0c @ sha256h.32 q0,q0,q0
  154. #else
  155. .byte 0x40,0x0c,0x00,0xf3 @ sha256h.32 q0,q0,q0
  156. #endif
  157. bx lr
  158. .size _armv8_sha256_probe,.-_armv8_sha256_probe
  159. .globl _armv8_pmull_probe
  160. .type _armv8_pmull_probe,%function
  161. _armv8_pmull_probe:
  162. #if defined(__thumb2__) && !defined(__APPLE__)
  163. .byte 0xa0,0xef,0x00,0x0e @ vmull.p64 q0,d0,d0
  164. #else
  165. .byte 0x00,0x0e,0xa0,0xf2 @ vmull.p64 q0,d0,d0
  166. #endif
  167. bx lr
  168. .size _armv8_pmull_probe,.-_armv8_pmull_probe
  169. #endif
  170. .globl OPENSSL_wipe_cpu
  171. .type OPENSSL_wipe_cpu,%function
  172. OPENSSL_wipe_cpu:
  173. #if __ARM_MAX_ARCH__>=7
  174. ldr r0,.LOPENSSL_armcap
  175. adr r1,.LOPENSSL_armcap
  176. ldr r0,[r1,r0]
  177. #ifdef __APPLE__
  178. ldr r0,[r0]
  179. #endif
  180. #endif
  181. eor r2,r2,r2
  182. eor r3,r3,r3
  183. eor ip,ip,ip
  184. #if __ARM_MAX_ARCH__>=7
  185. tst r0,#1
  186. beq .Lwipe_done
  187. veor q0, q0, q0
  188. veor q1, q1, q1
  189. veor q2, q2, q2
  190. veor q3, q3, q3
  191. veor q8, q8, q8
  192. veor q9, q9, q9
  193. veor q10, q10, q10
  194. veor q11, q11, q11
  195. veor q12, q12, q12
  196. veor q13, q13, q13
  197. veor q14, q14, q14
  198. veor q15, q15, q15
  199. .Lwipe_done:
  200. #endif
  201. mov r0,sp
  202. #if __ARM_ARCH__>=5
  203. bx lr
  204. #else
  205. tst lr,#1
  206. moveq pc,lr
  207. .word 0xe12fff1e @ bx lr
  208. #endif
  209. .size OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu
  210. .globl OPENSSL_instrument_bus
  211. .type OPENSSL_instrument_bus,%function
  212. OPENSSL_instrument_bus:
  213. eor r0,r0,r0
  214. #if __ARM_ARCH__>=5
  215. bx lr
  216. #else
  217. tst lr,#1
  218. moveq pc,lr
  219. .word 0xe12fff1e @ bx lr
  220. #endif
  221. .size OPENSSL_instrument_bus,.-OPENSSL_instrument_bus
  222. .globl OPENSSL_instrument_bus2
  223. .type OPENSSL_instrument_bus2,%function
  224. OPENSSL_instrument_bus2:
  225. eor r0,r0,r0
  226. #if __ARM_ARCH__>=5
  227. bx lr
  228. #else
  229. tst lr,#1
  230. moveq pc,lr
  231. .word 0xe12fff1e @ bx lr
  232. #endif
  233. .size OPENSSL_instrument_bus2,.-OPENSSL_instrument_bus2
  234. .align 5
  235. #if __ARM_MAX_ARCH__>=7
  236. .LOPENSSL_armcap:
  237. .word OPENSSL_armcap_P-.
  238. #endif
  239. #if __ARM_ARCH__>=6
  240. .align 5
  241. #else
  242. .Lspinlock:
  243. .word atomic_add_spinlock-.Lspinlock
  244. .align 5
  245. .data
  246. .align 2
  247. atomic_add_spinlock:
  248. .word 0
  249. #endif
  250. .comm OPENSSL_armcap_P,4,4
  251. .hidden OPENSSL_armcap_P