si_dll.inc 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706
  1. {*
  2. * This file is part of the Free Pascal run time library.
  3. * Portions copyright (c) 2005 by Thomas Schatzl,
  4. * member of the Free Pascal development team.
  5. *
  6. * Startup code for normal programs, PowerPC64 version.
  7. *
  8. * See the file COPYING.FPC, included in this distribution,
  9. * for details about the copyright.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  14. *}
  15. {$goto on}
  16. {$ifndef _CALL_ELF or (_CALL_ELF = 1)}
  17. {*
  18. * "ptrgl" glue code for calls via pointer. This function
  19. * sequence loads the data from the function descriptor
  20. * referenced by R11 into the CTR register (function address),
  21. * R2 (GOT/TOC pointer), and R11 (the outer frame pointer).
  22. *
  23. * On entry, R11 must be set to point to the function descriptor.
  24. *
  25. * See also the 64-bit PowerPC ABI specification for more
  26. * information, chapter 3.5.11 (in v1.7).
  27. *}
  28. procedure ptrgl; cdecl; public; assembler; nostackframe;
  29. asm
  30. ld r0, 0(r11)
  31. std r2, 40(r1)
  32. mtctr r0
  33. ld r2, 8(r11)
  34. ld r11, 16(r11)
  35. bctr
  36. end;
  37. {$endif _CALL_ELF}
  38. {*
  39. * Function prolog/epilog helpers, which are part of the 64-bit
  40. * PowerPC ABI.
  41. *
  42. * See also the 64-bit PowerPC ABI specification for more
  43. * information, chapter 3.5.5, "Register saving and restoring
  44. * function" (in v1.7).
  45. *}
  46. {* Each _savegpr0_N routine saves the general registers from rN to r31,
  47. * inclusive. When the routine is called, r1 must point to the start
  48. * of the general register save area. R0 must contain the old LR on
  49. * entry.
  50. *}
  51. label
  52. _savegpr0_15,
  53. _savegpr0_16,
  54. _savegpr0_17,
  55. _savegpr0_18,
  56. _savegpr0_19,
  57. _savegpr0_20,
  58. _savegpr0_21,
  59. _savegpr0_22,
  60. _savegpr0_23,
  61. _savegpr0_24,
  62. _savegpr0_25,
  63. _savegpr0_26,
  64. _savegpr0_27,
  65. _savegpr0_28,
  66. _savegpr0_29,
  67. _savegpr0_30,
  68. _savegpr0_31;
  69. procedure _savegpr0_14; cdecl; public; assembler; nostackframe;
  70. asm
  71. .globl _savegpr0_15
  72. .globl _savegpr0_16
  73. .globl _savegpr0_17
  74. .globl _savegpr0_18
  75. .globl _savegpr0_19
  76. .globl _savegpr0_20
  77. .globl _savegpr0_21
  78. .globl _savegpr0_22
  79. .globl _savegpr0_23
  80. .globl _savegpr0_24
  81. .globl _savegpr0_25
  82. .globl _savegpr0_26
  83. .globl _savegpr0_27
  84. .globl _savegpr0_28
  85. .globl _savegpr0_29
  86. .globl _savegpr0_30
  87. .globl _savegpr0_31
  88. std r14,-144(r1)
  89. _savegpr0_15:
  90. std r15,-136(r1)
  91. _savegpr0_16:
  92. std r16,-128(r1)
  93. _savegpr0_17:
  94. std r17,-120(r1)
  95. _savegpr0_18:
  96. std r18,-112(r1)
  97. _savegpr0_19:
  98. std r19,-104(r1)
  99. _savegpr0_20:
  100. std r20,-96(r1)
  101. _savegpr0_21:
  102. std r21,-88(r1)
  103. _savegpr0_22:
  104. std r22,-80(r1)
  105. _savegpr0_23:
  106. std r23,-72(r1)
  107. _savegpr0_24:
  108. std r24,-64(r1)
  109. _savegpr0_25:
  110. std r25,-56(r1)
  111. _savegpr0_26:
  112. std r26,-48(r1)
  113. _savegpr0_27:
  114. std r27,-40(r1)
  115. _savegpr0_28:
  116. std r28,-32(r1)
  117. _savegpr0_29:
  118. std r29,-24(r1)
  119. _savegpr0_30:
  120. std r30,-16(r1)
  121. _savegpr0_31:
  122. std r31,-8(r1)
  123. std r0, 16(r1)
  124. blr
  125. end;
  126. label
  127. _restgpr0_15,
  128. _restgpr0_16,
  129. _restgpr0_17,
  130. _restgpr0_18,
  131. _restgpr0_19,
  132. _restgpr0_20,
  133. _restgpr0_21,
  134. _restgpr0_22,
  135. _restgpr0_23,
  136. _restgpr0_24,
  137. _restgpr0_25,
  138. _restgpr0_26,
  139. _restgpr0_27,
  140. _restgpr0_28,
  141. _restgpr0_29,
  142. _restgpr0_31;
  143. {* Each _restgpr0_N routine restores the general registers from rN to r31,
  144. * inclusive. When the routine is called, r1 must point to the start
  145. * of the general register save area.
  146. *}
  147. procedure _restgpr0_14; cdecl; public; assembler; nostackframe;
  148. asm
  149. .globl _restgpr0_15
  150. .globl _restgpr0_16
  151. .globl _restgpr0_17
  152. .globl _restgpr0_18
  153. .globl _restgpr0_19
  154. .globl _restgpr0_20
  155. .globl _restgpr0_21
  156. .globl _restgpr0_22
  157. .globl _restgpr0_23
  158. .globl _restgpr0_24
  159. .globl _restgpr0_25
  160. .globl _restgpr0_26
  161. .globl _restgpr0_27
  162. .globl _restgpr0_28
  163. .globl _restgpr0_29
  164. ld r14,-144(r1)
  165. _restgpr0_15:
  166. ld r15,-136(r1)
  167. _restgpr0_16:
  168. ld r16,-128(r1)
  169. _restgpr0_17:
  170. ld r17,-120(r1)
  171. _restgpr0_18:
  172. ld r18,-112(r1)
  173. _restgpr0_19:
  174. ld r19,-104(r1)
  175. _restgpr0_20:
  176. ld r20,-96(r1)
  177. _restgpr0_21:
  178. ld r21,-88(r1)
  179. _restgpr0_22:
  180. ld r22,-80(r1)
  181. _restgpr0_23:
  182. ld r23,-72(r1)
  183. _restgpr0_24:
  184. ld r24,-64(r1)
  185. _restgpr0_25:
  186. ld r25,-56(r1)
  187. _restgpr0_26:
  188. ld r26,-48(r1)
  189. _restgpr0_27:
  190. ld r27,-40(r1)
  191. _restgpr0_28:
  192. ld r28,-32(r1)
  193. _restgpr0_29:
  194. ld r0, 16(r1)
  195. ld r29,-24(r1)
  196. mtlr r0
  197. ld r30,-16(r1)
  198. ld r31,-8(r1)
  199. blr
  200. end;
  201. procedure _restgpr0_30; cdecl; public; assembler; nostackframe;
  202. asm
  203. ld r30,-16(r1)
  204. _restgpr0_31:
  205. ld r0, 16(r1)
  206. ld r31,-8(r1)
  207. mtlr 0
  208. blr
  209. end;
  210. {* Each _savegpr1_N routine saves the general registers from rN to r31,
  211. * inclusive. When the routine is called, r12
  212. * must point to the start of the general register save area.
  213. *}
  214. label
  215. _savegpr1_15,
  216. _savegpr1_16,
  217. _savegpr1_17,
  218. _savegpr1_18,
  219. _savegpr1_19,
  220. _savegpr1_20,
  221. _savegpr1_21,
  222. _savegpr1_22,
  223. _savegpr1_23,
  224. _savegpr1_24,
  225. _savegpr1_25,
  226. _savegpr1_26,
  227. _savegpr1_27,
  228. _savegpr1_28,
  229. _savegpr1_29,
  230. _savegpr1_30,
  231. _savegpr1_31;
  232. procedure _savegpr1_14; cdecl; public; assembler; nostackframe;
  233. asm
  234. .globl _savegpr1_15
  235. .globl _savegpr1_16
  236. .globl _savegpr1_17
  237. .globl _savegpr1_18
  238. .globl _savegpr1_19
  239. .globl _savegpr1_20
  240. .globl _savegpr1_21
  241. .globl _savegpr1_22
  242. .globl _savegpr1_23
  243. .globl _savegpr1_24
  244. .globl _savegpr1_25
  245. .globl _savegpr1_26
  246. .globl _savegpr1_27
  247. .globl _savegpr1_28
  248. .globl _savegpr1_29
  249. .globl _savegpr1_30
  250. .globl _savegpr1_31
  251. std r14,-144(r12)
  252. _savegpr1_15:
  253. std r15,-136(r12)
  254. _savegpr1_16:
  255. std r16,-128(r12)
  256. _savegpr1_17:
  257. std r17,-120(r12)
  258. _savegpr1_18:
  259. std r18,-112(r12)
  260. _savegpr1_19:
  261. std r19,-104(r12)
  262. _savegpr1_20:
  263. std r20,-96(r12)
  264. _savegpr1_21:
  265. std r21,-88(r12)
  266. _savegpr1_22:
  267. std r22,-80(r12)
  268. _savegpr1_23:
  269. std r23,-72(r12)
  270. _savegpr1_24:
  271. std r24,-64(r12)
  272. _savegpr1_25:
  273. std r25,-56(r12)
  274. _savegpr1_26:
  275. std r26,-48(r12)
  276. _savegpr1_27:
  277. std r27,-40(r12)
  278. _savegpr1_28:
  279. std r28,-32(r12)
  280. _savegpr1_29:
  281. std r29,-24(r12)
  282. _savegpr1_30:
  283. std r30,-16(r12)
  284. _savegpr1_31:
  285. std r31,-8(r12)
  286. blr
  287. end;
  288. {* The _restgpr1_N routines restore the general registers from rN to r31.
  289. * When the routine is called, r12 must point to the start of the general
  290. * register save area.
  291. *}
  292. label
  293. _restgpr1_15,
  294. _restgpr1_16,
  295. _restgpr1_17,
  296. _restgpr1_18,
  297. _restgpr1_19,
  298. _restgpr1_20,
  299. _restgpr1_21,
  300. _restgpr1_22,
  301. _restgpr1_23,
  302. _restgpr1_24,
  303. _restgpr1_25,
  304. _restgpr1_26,
  305. _restgpr1_27,
  306. _restgpr1_28,
  307. _restgpr1_29,
  308. _restgpr1_30,
  309. _restgpr1_31;
  310. procedure _restgpr1_14; cdecl; public; assembler; nostackframe;
  311. asm
  312. .globl _restgpr1_15
  313. .globl _restgpr1_16
  314. .globl _restgpr1_17
  315. .globl _restgpr1_18
  316. .globl _restgpr1_19
  317. .globl _restgpr1_20
  318. .globl _restgpr1_21
  319. .globl _restgpr1_22
  320. .globl _restgpr1_23
  321. .globl _restgpr1_24
  322. .globl _restgpr1_25
  323. .globl _restgpr1_26
  324. .globl _restgpr1_27
  325. .globl _restgpr1_28
  326. .globl _restgpr1_29
  327. .globl _restgpr1_30
  328. .globl _restgpr1_31
  329. ld r14,-144(r12)
  330. _restgpr1_15:
  331. ld r15,-136(r12)
  332. _restgpr1_16:
  333. ld r16,-128(r12)
  334. _restgpr1_17:
  335. ld r17,-120(r12)
  336. _restgpr1_18:
  337. ld r18,-112(r12)
  338. _restgpr1_19:
  339. ld r19,-104(r12)
  340. _restgpr1_20:
  341. ld r20,-96(r12)
  342. _restgpr1_21:
  343. ld r21,-88(r12)
  344. _restgpr1_22:
  345. ld r22,-80(r12)
  346. _restgpr1_23:
  347. ld r23,-72(r12)
  348. _restgpr1_24:
  349. ld r24,-64(r12)
  350. _restgpr1_25:
  351. ld r25,-56(r12)
  352. _restgpr1_26:
  353. ld r26,-48(r12)
  354. _restgpr1_27:
  355. ld r27,-40(r12)
  356. _restgpr1_28:
  357. ld r28,-32(r12)
  358. _restgpr1_29:
  359. ld r29,-24(r12)
  360. _restgpr1_30:
  361. ld r30,-16(r12)
  362. _restgpr1_31:
  363. ld r31,-8(r12)
  364. blr
  365. end;
  366. {* Each _savefpr_M routine saves the floating point registers from fM to f31,
  367. * inclusive. When the routine is called, r1 must point to the start of the
  368. * floating point register save area, and r0 must contain the value of LR on
  369. * function entry.
  370. *}
  371. label
  372. _savefpr_15,
  373. _savefpr_16,
  374. _savefpr_17,
  375. _savefpr_18,
  376. _savefpr_19,
  377. _savefpr_20,
  378. _savefpr_21,
  379. _savefpr_22,
  380. _savefpr_23,
  381. _savefpr_24,
  382. _savefpr_25,
  383. _savefpr_26,
  384. _savefpr_27,
  385. _savefpr_28,
  386. _savefpr_29,
  387. _savefpr_30,
  388. _savefpr_31;
  389. procedure _savefpr_14; cdecl; public; assembler; nostackframe;
  390. asm
  391. .globl _savefpr_15
  392. .globl _savefpr_16
  393. .globl _savefpr_17
  394. .globl _savefpr_18
  395. .globl _savefpr_19
  396. .globl _savefpr_20
  397. .globl _savefpr_21
  398. .globl _savefpr_22
  399. .globl _savefpr_23
  400. .globl _savefpr_24
  401. .globl _savefpr_25
  402. .globl _savefpr_26
  403. .globl _savefpr_27
  404. .globl _savefpr_28
  405. .globl _savefpr_29
  406. .globl _savefpr_30
  407. .globl _savefpr_31
  408. stfd r14,-144(r1)
  409. _savefpr_15:
  410. stfd r15,-136(r1)
  411. _savefpr_16:
  412. stfd r16,-128(r1)
  413. _savefpr_17:
  414. stfd r17,-120(r1)
  415. _savefpr_18:
  416. stfd r18,-112(r1)
  417. _savefpr_19:
  418. stfd r19,-104(r1)
  419. _savefpr_20:
  420. stfd r20,-96(r1)
  421. _savefpr_21:
  422. stfd r21,-88(r1)
  423. _savefpr_22:
  424. stfd r22,-80(r1)
  425. _savefpr_23:
  426. stfd r23,-72(r1)
  427. _savefpr_24:
  428. stfd r24,-64(r1)
  429. _savefpr_25:
  430. stfd r25,-56(r1)
  431. _savefpr_26:
  432. stfd r26,-48(r1)
  433. _savefpr_27:
  434. stfd r27,-40(r1)
  435. _savefpr_28:
  436. stfd r28,-32(r1)
  437. _savefpr_29:
  438. stfd r29,-24(r1)
  439. _savefpr_30:
  440. stfd r30,-16(r1)
  441. _savefpr_31:
  442. stfd r31,-8(r1)
  443. std r0, 16(r1)
  444. blr
  445. end;
  446. {* The _restfpr_M routines restore the floating point registers from fM to f31.
  447. * When the routine is called, r1 must point to the start of the floating point
  448. * register save area.
  449. *}
  450. label
  451. _restfpr_15,
  452. _restfpr_16,
  453. _restfpr_17,
  454. _restfpr_18,
  455. _restfpr_19,
  456. _restfpr_20,
  457. _restfpr_21,
  458. _restfpr_22,
  459. _restfpr_23,
  460. _restfpr_24,
  461. _restfpr_25,
  462. _restfpr_26,
  463. _restfpr_27,
  464. _restfpr_28,
  465. _restfpr_29,
  466. _restfpr_31;
  467. procedure _restfpr_14; cdecl; public; assembler; nostackframe;
  468. asm
  469. .globl _restfpr_15
  470. .globl _restfpr_16
  471. .globl _restfpr_17
  472. .globl _restfpr_18
  473. .globl _restfpr_19
  474. .globl _restfpr_20
  475. .globl _restfpr_21
  476. .globl _restfpr_22
  477. .globl _restfpr_23
  478. .globl _restfpr_24
  479. .globl _restfpr_25
  480. .globl _restfpr_26
  481. .globl _restfpr_27
  482. .globl _restfpr_28
  483. .globl _restfpr_29
  484. lfd r14,-144(r1)
  485. _restfpr_15:
  486. lfd r15,-136(r1)
  487. _restfpr_16:
  488. lfd r16,-128(r1)
  489. _restfpr_17:
  490. lfd r17,-120(r1)
  491. _restfpr_18:
  492. lfd r18,-112(r1)
  493. _restfpr_19:
  494. lfd r19,-104(r1)
  495. _restfpr_20:
  496. lfd r20,-96(r1)
  497. _restfpr_21:
  498. lfd r21,-88(r1)
  499. _restfpr_22:
  500. lfd r22,-80(r1)
  501. _restfpr_23:
  502. lfd r23,-72(r1)
  503. _restfpr_24:
  504. lfd r24,-64(r1)
  505. _restfpr_25:
  506. lfd r25,-56(r1)
  507. _restfpr_26:
  508. lfd r26,-48(r1)
  509. _restfpr_27:
  510. lfd r27,-40(r1)
  511. _restfpr_28:
  512. lfd r28,-32(r1)
  513. _restfpr_29:
  514. ld r0, 16(r1)
  515. lfd r29,-24(r1)
  516. mtlr r0
  517. lfd r30,-16(r1)
  518. lfd r31,-8(r1)
  519. blr
  520. end;
  521. procedure _restfpr_30; cdecl; public; assembler; nostackframe;
  522. asm
  523. .globl _restfpr_31
  524. lfd r30,-16(r1)
  525. _restfpr_31:
  526. ld r0, 16(r1)
  527. lfd r31,-8(r1)
  528. mtlr r0
  529. blr
  530. end;
  531. {* Each _savevr_M routine saves the vector registers from vM to v31, inclusive.
  532. * When the routine is called, r0 must point to the word just beyound the end
  533. * of the vector register save area. On return the value of r0 is unchanged
  534. * while r12 may be modified.
  535. *}
  536. {* commented out for now, unused
  537. _savevr_20: addi r12,r0,-192
  538. stvx v20,r12,r0
  539. _savevr_21: addi r12,r0,-176
  540. stvx v21,r12,r0
  541. _savevr_22: addi r12,r0,-160
  542. stvx v22,r12,r0
  543. _savevr_23: addi r12,r0,-144
  544. stvx v23,r12,r0
  545. _savevr_24: addi r12,r0,-128
  546. stvx v24,r12,r0
  547. _savevr_25: addi r12,r0,-112
  548. stvx v25,r12,r0
  549. _savevr_26: addi r12,r0,-96
  550. stvx v26,r12,r0
  551. _savevr_27: addi r12,r0,-80
  552. stvx v27,r12,r0
  553. _savevr_28: addi r12,r0,-64
  554. stvx v28,r12,r0
  555. _savevr_29: addi r12,r0,-48
  556. stvx v29,r12,r0
  557. _savevr_30: addi r12,r0,-32
  558. stvx v30,r12,r0
  559. _savevr_31: addi r12,r0,-16
  560. stvx v31,r12,r0
  561. blr
  562. *}
  563. {* The _restvr_M routines restore the vector registers from vM to v31. When the
  564. * routine is called, r0 must point to the word just beyound the end of the
  565. * vector register save area. On return the value of r0 is unchanged while r12
  566. * may be modified.
  567. *}
  568. {* commented out for now, unused
  569. _restvr_20: addi r12,r0,-192
  570. lvx v20,r12,r0
  571. _restvr_21: addi r12,r0,-176
  572. lvx v21,r12,r0
  573. _restvr_22: addi r12,r0,-160
  574. lvx v22,r12,r0
  575. _restvr_23: addi r12,r0,-144
  576. lvx v23,r12,r0
  577. _restvr_24: addi r12,r0,-128
  578. lvx v24,r12,r0
  579. _restvr_25: addi r12,r0,-112
  580. lvx v25,r12,r0
  581. _restvr_26: addi r12,r0,-96
  582. lvx v26,r12,r0
  583. _restvr_27: addi r12,r0,-80
  584. lvx v27,r12,r0
  585. _restvr_28: addi r12,r0,-64
  586. lvx v28,r12,r0
  587. _restvr_29: addi r12,r0,-48
  588. lvx v29,r12,r0
  589. _restvr_30: addi r12,r0,-32
  590. lvx v30,r12,r0
  591. _restvr_31: addi r12,r0,-16
  592. lvx v31,r12,r0
  593. blr
  594. *}
  595. {******************************************************************************
  596. Process start/halt
  597. ******************************************************************************}
  598. var
  599. TOCSTART: pointer; external name '.TOC.';
  600. procedure save_argc_argv_envp_stkptr_fpcret(argc: longint; argv, envp: ppchar; stkptr: pointer);
  601. begin
  602. operatingsystem_parameter_argc:=argc;
  603. operatingsystem_parameter_argv:=argv;
  604. operatingsystem_parameter_envp:=envp;
  605. initialstkptr:=stkptr;
  606. end;
  607. {*
  608. * Main program entry point label (function), called by the loader
  609. *
  610. * The document "64-bit PowerPC ELF Application Binary Interface Supplement 1.9"
  611. * pg. 24f specifies the register contents.
  612. *}
  613. procedure _FPC_shared_lib_start(argc: longint; argv, envp: ppchar); cdecl; public name 'FPC_SHARED_LIB_START'; public name '_start'; assembler; nostackframe;
  614. asm
  615. {$if defined(_CALL_ELF) and (_CALL_ELF = 2)}
  616. .L1:
  617. addis r2,r12,(TOCSTART-.L1)@ha
  618. addi r2,r2,(TOCSTART-.L1)@l
  619. .localentry _FPC_shared_lib_start, . - _FPC_shared_lib_start
  620. {$endif}
  621. mflr r0
  622. std r0, 16(r1) { save LR }
  623. stdu r1, -144(r1) { save back chain, make frame }
  624. mr r6, r1
  625. bl save_argc_argv_envp_stkptr_fpcret
  626. nop
  627. {* call library initialization *}
  628. bl PASCALMAIN
  629. nop
  630. { return to the caller }
  631. addi r1,r1,144 { restore stack }
  632. ld r0,16(r1) { prepare for method return }
  633. mtlr r0
  634. blr
  635. end;
  636. label
  637. __data_start,
  638. data_start;
  639. {* this routine is only called when the halt() routine of the RTL embedded in
  640. the shared library is called *}
  641. procedure _haltproc; cdecl; public;
  642. var
  643. localres: longint;
  644. begin
  645. localres:=ExitCode;
  646. asm
  647. lwz r3,localres
  648. li r0, syscall_nr_exit_group
  649. sc
  650. lwz r3,localres
  651. li r0,syscall_nr_exit
  652. sc
  653. { we should not reach here. Crash horribly }
  654. { trap }
  655. .long 0xffe00008
  656. { Define a symbol for the first piece of initialized data. }
  657. .section ".data"
  658. .globl __data_start
  659. __data_start:
  660. data_start:
  661. .text
  662. end;
  663. end;