dl-trampoline.S 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430
  1. /* PLT trampolines. SH version.
  2. Copyright (C) 2005-2019 Free Software Foundation, Inc.
  3. This file is part of the GNU C Library.
  4. The GNU C Library is free software; you can redistribute it and/or
  5. modify it under the terms of the GNU Lesser General Public
  6. License as published by the Free Software Foundation; either
  7. version 2.1 of the License, or (at your option) any later version.
  8. The GNU C Library is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  11. Lesser General Public License for more details.
  12. You should have received a copy of the GNU Lesser General Public
  13. License along with the GNU C Library; if not, see
  14. <http://www.gnu.org/licenses/>. */
  15. #include <sysdep.h>
  16. .text
  17. .globl _dl_runtime_resolve
  18. .type _dl_runtime_resolve, @function
  19. cfi_startproc
  20. .align 5
  21. _dl_runtime_resolve:
  22. mov.l r2,@-r15
  23. cfi_adjust_cfa_offset (4)
  24. mov.l r3,@-r15
  25. cfi_adjust_cfa_offset (4)
  26. mov.l r4,@-r15
  27. cfi_adjust_cfa_offset (4)
  28. mov.l r5,@-r15
  29. cfi_adjust_cfa_offset (4)
  30. mov.l r6,@-r15
  31. cfi_adjust_cfa_offset (4)
  32. mov.l r7,@-r15
  33. cfi_adjust_cfa_offset (4)
  34. mov.l r12,@-r15
  35. cfi_adjust_cfa_offset (4)
  36. sts.l macl,@-r15
  37. cfi_adjust_cfa_offset (4)
  38. sts.l mach,@-r15
  39. cfi_adjust_cfa_offset (4)
  40. movt r3 ! Save T flag.
  41. mov.l r3,@-r15
  42. cfi_adjust_cfa_offset (4)
  43. #ifdef HAVE_FPU
  44. sts.l fpscr,@-r15
  45. cfi_adjust_cfa_offset (4)
  46. mov #8,r3
  47. swap.w r3,r3
  48. lds r3,fpscr
  49. fmov.s fr11,@-r15
  50. cfi_adjust_cfa_offset (4)
  51. fmov.s fr10,@-r15
  52. cfi_adjust_cfa_offset (4)
  53. fmov.s fr9,@-r15
  54. cfi_adjust_cfa_offset (4)
  55. fmov.s fr8,@-r15
  56. cfi_adjust_cfa_offset (4)
  57. fmov.s fr7,@-r15
  58. cfi_adjust_cfa_offset (4)
  59. fmov.s fr6,@-r15
  60. cfi_adjust_cfa_offset (4)
  61. fmov.s fr5,@-r15
  62. cfi_adjust_cfa_offset (4)
  63. fmov.s fr4,@-r15
  64. cfi_adjust_cfa_offset (4)
  65. #endif
  66. sts.l pr,@-r15
  67. cfi_adjust_cfa_offset (4)
  68. tst r0,r0
  69. bt 1f
  70. mov r0,r2
  71. 1:
  72. mov r0,r4 ! PLT type
  73. mov r2,r5 ! link map address
  74. #ifdef SHARED
  75. mov.l 2f,r2
  76. mova 2f,r0
  77. add r0,r2 ! Get GOT address in r2
  78. mov.l 3f,r0
  79. add r2,r0
  80. #else
  81. mov.l 3f,r0
  82. #endif
  83. jsr @r0 ! Call resolver.
  84. mov r1,r6 ! reloc offset
  85. lds.l @r15+,pr ! Get register content back.
  86. cfi_adjust_cfa_offset (-4)
  87. #ifdef HAVE_FPU
  88. fmov.s @r15+,fr4
  89. cfi_adjust_cfa_offset (-4)
  90. fmov.s @r15+,fr5
  91. cfi_adjust_cfa_offset (-4)
  92. fmov.s @r15+,fr6
  93. cfi_adjust_cfa_offset (-4)
  94. fmov.s @r15+,fr7
  95. cfi_adjust_cfa_offset (-4)
  96. fmov.s @r15+,fr8
  97. cfi_adjust_cfa_offset (-4)
  98. fmov.s @r15+,fr9
  99. cfi_adjust_cfa_offset (-4)
  100. fmov.s @r15+,fr10
  101. cfi_adjust_cfa_offset (-4)
  102. fmov.s @r15+,fr11
  103. cfi_adjust_cfa_offset (-4)
  104. lds.l @r15+,fpscr
  105. cfi_adjust_cfa_offset (-4)
  106. #endif
  107. mov.l @r15+,r3
  108. cfi_adjust_cfa_offset (-4)
  109. shal r3 ! Lode T flag.
  110. lds.l @r15+,mach
  111. cfi_adjust_cfa_offset (-4)
  112. lds.l @r15+,macl
  113. cfi_adjust_cfa_offset (-4)
  114. mov.l @r15+,r12
  115. cfi_adjust_cfa_offset (-4)
  116. mov.l @r15+,r7
  117. cfi_adjust_cfa_offset (-4)
  118. mov.l @r15+,r6
  119. cfi_adjust_cfa_offset (-4)
  120. mov.l @r15+,r5
  121. cfi_adjust_cfa_offset (-4)
  122. mov.l @r15+,r4
  123. cfi_adjust_cfa_offset (-4)
  124. mov.l @r15+,r3
  125. cfi_adjust_cfa_offset (-4)
  126. jmp @r0 ! Jump to function address.
  127. mov.l @r15+,r2
  128. cfi_adjust_cfa_offset (-4)
  129. .align 2
  130. #ifdef SHARED
  131. 2: .long _GLOBAL_OFFSET_TABLE_
  132. 3: .long _dl_fixup@GOTOFF
  133. #else
  134. 3: .long _dl_fixup
  135. #endif
  136. cfi_endproc
  137. .size _dl_runtime_resolve, .-_dl_runtime_resolve
  138. .globl _dl_runtime_profile
  139. .type _dl_runtime_profile,@function
  140. cfi_startproc
  141. .align 5
  142. _dl_runtime_profile:
  143. mov.l r12,@-r15
  144. cfi_adjust_cfa_offset (4)
  145. #ifdef HAVE_FPU
  146. sts.l fpscr,@-r15
  147. cfi_adjust_cfa_offset (4)
  148. mov #8,r12
  149. swap.w r12,r12
  150. lds r12,fpscr
  151. fmov.s fr11,@-r15
  152. cfi_adjust_cfa_offset (4)
  153. fmov.s fr10,@-r15
  154. cfi_adjust_cfa_offset (4)
  155. fmov.s fr9,@-r15
  156. cfi_adjust_cfa_offset (4)
  157. fmov.s fr8,@-r15
  158. cfi_adjust_cfa_offset (4)
  159. fmov.s fr7,@-r15
  160. cfi_adjust_cfa_offset (4)
  161. fmov.s fr6,@-r15
  162. cfi_adjust_cfa_offset (4)
  163. fmov.s fr5,@-r15
  164. cfi_adjust_cfa_offset (4)
  165. fmov.s fr4,@-r15
  166. cfi_adjust_cfa_offset (4)
  167. #else
  168. add #-36,r15
  169. cfi_adjust_cfa_offset (36)
  170. #endif
  171. mov.l r7,@-r15
  172. cfi_adjust_cfa_offset (4)
  173. mov.l r6,@-r15
  174. cfi_adjust_cfa_offset (4)
  175. mov.l r5,@-r15
  176. cfi_adjust_cfa_offset (4)
  177. mov.l r4,@-r15
  178. cfi_adjust_cfa_offset (4)
  179. mov.l r3,@-r15
  180. cfi_adjust_cfa_offset (4)
  181. mov.l r2,@-r15
  182. cfi_adjust_cfa_offset (4)
  183. sts.l macl,@-r15
  184. cfi_adjust_cfa_offset (4)
  185. sts.l mach,@-r15
  186. cfi_adjust_cfa_offset (4)
  187. movt r3 ! Save T flag.
  188. mov.l r3,@-r15
  189. cfi_adjust_cfa_offset (4)
  190. sts.l pr,@-r15
  191. cfi_adjust_cfa_offset (4)
  192. tst r0,r0
  193. bt 1f
  194. mov r0,r2
  195. 1:
  196. mov r0,r4 ! PLT type
  197. mov r2,r5 ! link map address
  198. sts pr,r7 ! return address
  199. add #-24,r15
  200. cfi_adjust_cfa_offset (24)
  201. mov #40,r0
  202. add r15,r0
  203. mov.l r0,@r15 ! Address of the register structure
  204. mov #-1,r0
  205. mov.l r0,@(8,r15)
  206. mov #8,r0
  207. add r15,r0
  208. mov.l r0,@(4,r15)
  209. mov.l r5,@(12,r15)
  210. mov.l r1,@(16,r15)
  211. #ifdef SHARED
  212. mov.l 2f,r12
  213. mova 2f,r0
  214. add r0,r12 ! Get GOT address in r12
  215. mov.l 3f,r0
  216. add r12,r0
  217. #else
  218. mov.l 3f,r0
  219. #endif
  220. jsr @r0 ! Call resolver.
  221. mov r1,r6 ! reloc offset
  222. mov.l @(8,r15),r1
  223. cmp/pz r1
  224. bt 4f
  225. add #24,r15
  226. cfi_adjust_cfa_offset (-24)
  227. lds.l @r15+,pr ! Get register content back.
  228. cfi_adjust_cfa_offset (-4)
  229. mov.l @r15+,r3
  230. cfi_adjust_cfa_offset (-4)
  231. shal r3 ! Lode T flag.
  232. lds.l @r15+,mach
  233. cfi_adjust_cfa_offset (-4)
  234. lds.l @r15+,macl
  235. cfi_adjust_cfa_offset (-4)
  236. mov.l @r15+,r2
  237. cfi_adjust_cfa_offset (-4)
  238. mov.l @r15+,r3
  239. cfi_adjust_cfa_offset (-4)
  240. mov.l @r15+,r4
  241. cfi_adjust_cfa_offset (-4)
  242. mov.l @r15+,r5
  243. cfi_adjust_cfa_offset (-4)
  244. mov.l @r15+,r6
  245. cfi_adjust_cfa_offset (-4)
  246. mov.l @r15+,r7
  247. cfi_adjust_cfa_offset (-4)
  248. #ifdef HAVE_FPU
  249. fmov.s @r15+,fr4
  250. cfi_adjust_cfa_offset (-4)
  251. fmov.s @r15+,fr5
  252. cfi_adjust_cfa_offset (-4)
  253. fmov.s @r15+,fr6
  254. cfi_adjust_cfa_offset (-4)
  255. fmov.s @r15+,fr7
  256. cfi_adjust_cfa_offset (-4)
  257. fmov.s @r15+,fr8
  258. cfi_adjust_cfa_offset (-4)
  259. fmov.s @r15+,fr9
  260. cfi_adjust_cfa_offset (-4)
  261. fmov.s @r15+,fr10
  262. cfi_adjust_cfa_offset (-4)
  263. fmov.s @r15+,fr11
  264. cfi_adjust_cfa_offset (-4)
  265. lds.l @r15+,fpscr
  266. cfi_adjust_cfa_offset (-4)
  267. #else
  268. add #36,r15
  269. cfi_adjust_cfa_offset (-36)
  270. #endif
  271. jmp @r0 ! Jump to function address.
  272. mov.l @r15+,r12
  273. cfi_adjust_cfa_offset (-4)
  274. .align 2
  275. #ifdef SHARED
  276. 2: .long _GLOBAL_OFFSET_TABLE_
  277. 3: .long _dl_profile_fixup@GOTOFF
  278. #else
  279. 3: .long _dl_profile_fixup
  280. #endif
  281. cfi_adjust_cfa_offset (104)
  282. 4:
  283. mov #104,r3
  284. add r15,r3 ! Original stack
  285. mov.l r8,@(20,r15)
  286. cfi_rel_offset (r8, 20)
  287. mov r15,r8
  288. sub r1,r15
  289. shlr2 r15
  290. shll2 r15
  291. mov r15,r4
  292. shlr2 r1
  293. tst r1,r1
  294. 5:
  295. bt/s 6f
  296. dt r1
  297. mov.l @r3+,r2
  298. mov.l r2,@r4
  299. bra 5b
  300. add #4,r4
  301. 6:
  302. mov.l @r8,r12
  303. mov.l @r12+,r2
  304. mov.l @r12+,r3
  305. mov.l @r12+,r4
  306. mov.l @r12+,r5
  307. mov.l @r12+,r6
  308. mov.l @r12+,r7
  309. #ifdef HAVE_FPU
  310. fmov.s @r12+,fr4
  311. fmov.s @r12+,fr5
  312. fmov.s @r12+,fr6
  313. fmov.s @r12+,fr7
  314. fmov.s @r12+,fr8
  315. fmov.s @r12+,fr9
  316. fmov.s @r12+,fr10
  317. fmov.s @r12+,fr11
  318. lds.l @r12+,fpscr
  319. #else
  320. add #36,r2
  321. #endif
  322. jsr @r0 ! Call function.
  323. nop
  324. mov r8,r15
  325. mov.l @(12,r15),r4 ! link map address
  326. mov.l @(16,r15),r5 ! reloc offset
  327. mov.l @r15,r6 ! input registers
  328. #ifdef HAVE_FPU
  329. mov #16,r8
  330. add r15,r8
  331. fmov.s fr1,@-r8
  332. fmov.s fr0,@-r8
  333. #else
  334. mov #8,r8
  335. add r15,r8
  336. #endif
  337. mov.l r1,@-r8
  338. mov.l r0,@-r8
  339. mov.l @(20,r15),r8
  340. cfi_restore (r8)
  341. #ifdef SHARED
  342. mov.l 7f,r12
  343. mova 7f,r0
  344. add r0,r12 ! Get GOT address in r12
  345. mov.l 8f,r0
  346. add r12,r0
  347. #else
  348. mov.l 8f,r0
  349. #endif
  350. jsr @r0
  351. mov r15,r7 ! output registers
  352. mov.l @r15+,r0
  353. cfi_adjust_cfa_offset (-4)
  354. mov.l @r15+,r1
  355. cfi_adjust_cfa_offset (-4)
  356. #ifdef HAVE_FPU
  357. fmov.s @r15+,fr0
  358. cfi_adjust_cfa_offset (-4)
  359. fmov.s @r15+,fr1
  360. cfi_adjust_cfa_offset (-4)
  361. add #8,r15
  362. cfi_adjust_cfa_offset (-8)
  363. #else
  364. add #16,r15
  365. cfi_adjust_cfa_offset (-16)
  366. #endif
  367. lds.l @r15+,pr ! Get register content back.
  368. cfi_adjust_cfa_offset (-4)
  369. mov.l @r15+,r3
  370. cfi_adjust_cfa_offset (-4)
  371. shal r3 ! Lode T flag.
  372. lds.l @r15+,mach
  373. cfi_adjust_cfa_offset (-4)
  374. lds.l @r15+,macl
  375. cfi_adjust_cfa_offset (-4)
  376. mov.l @r15+,r2
  377. cfi_adjust_cfa_offset (-4)
  378. mov.l @r15+,r3
  379. cfi_adjust_cfa_offset (-4)
  380. mov.l @r15+,r4
  381. cfi_adjust_cfa_offset (-4)
  382. mov.l @r15+,r5
  383. cfi_adjust_cfa_offset (-4)
  384. mov.l @r15+,r6
  385. cfi_adjust_cfa_offset (-4)
  386. mov.l @r15+,r7
  387. cfi_adjust_cfa_offset (-4)
  388. #ifdef HAVE_FPU
  389. fmov.s @r15+,fr4
  390. cfi_adjust_cfa_offset (-4)
  391. fmov.s @r15+,fr5
  392. cfi_adjust_cfa_offset (-4)
  393. fmov.s @r15+,fr6
  394. cfi_adjust_cfa_offset (-4)
  395. fmov.s @r15+,fr7
  396. cfi_adjust_cfa_offset (-4)
  397. fmov.s @r15+,fr8
  398. cfi_adjust_cfa_offset (-4)
  399. fmov.s @r15+,fr9
  400. cfi_adjust_cfa_offset (-4)
  401. fmov.s @r15+,fr10
  402. cfi_adjust_cfa_offset (-4)
  403. fmov.s @r15+,fr11
  404. cfi_adjust_cfa_offset (-4)
  405. lds.l @r15+,fpscr
  406. cfi_adjust_cfa_offset (-4)
  407. #else
  408. add #36,r15
  409. cfi_adjust_cfa_offset (-36)
  410. #endif
  411. rts ! Jump to function address.
  412. mov.l @r15+,r12
  413. cfi_adjust_cfa_offset (-4)
  414. cfi_endproc
  415. .align 2
  416. #ifdef SHARED
  417. 7: .long _GLOBAL_OFFSET_TABLE_
  418. 8: .long _dl_call_pltexit@GOTOFF
  419. #else
  420. 8: .long _dl_call_pltexit
  421. #endif
  422. .size _dl_runtime_profile, .-_dl_runtime_profile