l.s 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457
  1. #include "mem.h"
  2. #include "osf1pal.h"
  3. #define SP R30
  4. #define HI_IPL 6 /* use 7 to disable mchecks */
  5. TEXT _main(SB), $-8
  6. MOVQ $setSB(SB), R29
  7. MOVQ R29, R16
  8. CALL_PAL $PALwrkgp
  9. MOVQ $mach0(SB), R(MACH)
  10. MOVQ $(BY2PG-8)(R(MACH)), R30
  11. MOVQ R31, R(USER)
  12. MOVQ R31, 0(R(MACH))
  13. MOVQ $edata(SB), R1
  14. MOVQ $end(SB), R2
  15. clrbss:
  16. MOVQ R31, (R1)
  17. ADDQ $8, R1
  18. CMPUGT R1, R2, R3
  19. BEQ R3, clrbss
  20. MOVL R0, bootconf(SB) /* passed in from boot loader */
  21. _fpinit:
  22. MOVQ $1, R16
  23. CALL_PAL $PALwrfen
  24. MOVQ initfpcr(SB), R1 /* MOVQ $0x2800800000000000, R1 */
  25. MOVQ R1, (R30)
  26. MOVT (R30), F1
  27. MOVT F1, FPCR
  28. MOVT $0.5, F28
  29. ADDT F28, F28, F29
  30. ADDT F29, F29, F30
  31. MOVT F31, F1
  32. MOVT F31, F2
  33. MOVT F31, F3
  34. MOVT F31, F4
  35. MOVT F31, F5
  36. MOVT F31, F6
  37. MOVT F31, F7
  38. MOVT F31, F8
  39. MOVT F31, F9
  40. MOVT F31, F10
  41. MOVT F31, F11
  42. MOVT F31, F12
  43. MOVT F31, F13
  44. MOVT F31, F14
  45. MOVT F31, F15
  46. MOVT F31, F16
  47. MOVT F31, F17
  48. MOVT F31, F18
  49. MOVT F31, F19
  50. MOVT F31, F20
  51. MOVT F31, F21
  52. MOVT F31, F22
  53. MOVT F31, F23
  54. MOVT F31, F24
  55. MOVT F31, F25
  56. MOVT F31, F26
  57. MOVT F31, F27
  58. JSR main(SB)
  59. MOVQ $_divq(SB), R31 /* touch _divq etc.; doesn't need to execute */
  60. MOVQ $_divl(SB), R31 /* touch _divl etc.; doesn't need to execute */
  61. RET
  62. TEXT setpcb(SB), $-8
  63. MOVQ R30, (R0)
  64. AND $0x7FFFFFFF, R0, R16 /* make address physical */
  65. CALL_PAL $PALswpctx
  66. RET
  67. GLOBL mach0(SB), $(MAXMACH*BY2PG)
  68. GLOBL init_ptbr(SB), $8
  69. TEXT firmware(SB), $-8
  70. CALL_PAL $PALhalt
  71. TEXT xxfirmware(SB), $-8
  72. CALL_PAL $PALhalt
  73. TEXT splhi(SB), $0
  74. MOVL R26, 4(R(MACH)) /* save PC in m->splpc */
  75. MOVQ $HI_IPL, R16
  76. CALL_PAL $PALswpipl
  77. RET
  78. TEXT spllo(SB), $0
  79. MOVQ R31, R16
  80. CALL_PAL $PALswpipl
  81. RET
  82. TEXT splx(SB), $0
  83. MOVL R26, 4(R(MACH)) /* save PC in m->splpc */
  84. TEXT splxpc(SB), $0 /* for iunlock */
  85. MOVQ R0, R16
  86. CALL_PAL $PALswpipl
  87. RET
  88. TEXT spldone(SB), $0
  89. RET
  90. TEXT islo(SB), $0
  91. CALL_PAL $PALrdps
  92. AND $IPL, R0
  93. XOR $HI_IPL, R0
  94. RET
  95. TEXT mb(SB), $-8
  96. MB
  97. RET
  98. TEXT icflush(SB), $-8
  99. CALL_PAL $PALimb
  100. RET
  101. TEXT tlbflush(SB), $-8
  102. MOVQ R0, R16
  103. MOVL 4(FP), R17
  104. CALL_PAL $PALtbi
  105. RET
  106. TEXT swpctx(SB), $-8
  107. MOVQ R0, R16
  108. AND $0x7FFFFFFF, R16 /* make address physical */
  109. CALL_PAL $PALswpctx
  110. RET
  111. TEXT wrent(SB), $-8
  112. MOVQ R0, R17
  113. MOVL 4(FP), R16
  114. CALL_PAL $PALwrent
  115. RET
  116. TEXT wrvptptr(SB), $-8
  117. MOVQ R0, R16
  118. CALL_PAL $PALwrvptptr
  119. RET
  120. TEXT cserve(SB), $-8
  121. MOVQ R0, R16
  122. MOVL 4(FP), R17
  123. CALL_PAL $PALcserve
  124. RET
  125. TEXT setlabel(SB), $-8
  126. MOVL R30, 0(R0)
  127. MOVL R26, 4(R0)
  128. MOVQ $0, R0
  129. RET
  130. TEXT gotolabel(SB), $-8
  131. MOVL 0(R0), R30
  132. MOVL 4(R0), R26
  133. MOVQ $1, R0
  134. RET
  135. TEXT tas(SB), $-8
  136. MOVQ R0, R1 /* l */
  137. tas1:
  138. MOVLL (R1), R0 /* l->key */
  139. BNE R0, tas2
  140. MOVQ $1, R2
  141. MOVLC R2, (R1) /* l->key = 1 */
  142. BEQ R2, tas1 /* write failed, try again? */
  143. tas2:
  144. RET
  145. TEXT _xdec(SB), $-8
  146. MOVQ R0, R1 /* p */
  147. dec1:
  148. MOVLL (R1), R0 /* *p */
  149. SUBL $1, R0
  150. MOVQ R0, R2
  151. MOVLC R2, (R1) /* --(*p) */
  152. BEQ R2, dec1 /* write failed, retry */
  153. RET
  154. TEXT _xinc(SB), $-8
  155. MOVQ R0, R1 /* p */
  156. inc1:
  157. MOVLL (R1), R0 /* *p */
  158. ADDL $1, R0
  159. MOVLC R0, (R1) /* (*p)++ */
  160. BEQ R0, inc1 /* write failed, retry */
  161. RET
  162. TEXT cmpswap(SB), $-8
  163. MOVQ R0, R1 /* p */
  164. MOVL old+4(FP), R2
  165. MOVL new+8(FP), R3
  166. MOVLL (R1), R0
  167. CMPEQ R0, R2, R4
  168. BEQ R4, fail /* if R0 != [sic] R2, goto fail */
  169. MOVQ R3, R0
  170. MOVLC R0, (R1)
  171. RET
  172. fail:
  173. MOVL $0, R0
  174. RET
  175. TEXT fpenab(SB), $-8
  176. MOVQ R0, R16
  177. CALL_PAL $PALwrfen
  178. RET
  179. TEXT rpcc(SB), $0
  180. MOVL R0, R1
  181. MOVL $0, R0
  182. WORD $0x6000C000 /* RPCC R0 */
  183. BEQ R1, _ret
  184. MOVQ R0, (R1)
  185. _ret:
  186. RET
  187. /*
  188. * Exception handlers. The stack frame looks like this:
  189. *
  190. * R30+0: (unused) link reg storage (R26) (32 bits)
  191. * R30+4: padding for alignment (32 bits)
  192. * R30+8: trap()'s first arg storage (R0) (32 bits -- type Ureg*)
  193. * R30+12: padding for alignment (32 bits)
  194. * R30+16: first 31 fields of Ureg, saved here (31*64 bits)
  195. * R30+264: other 6 fields of Ureg, saved by PALcode (6*64 bits)
  196. * R30+312: previous value of KSP before trap
  197. */
  198. TEXT arith(SB), $-8
  199. SUBQ $(4*BY2WD+31*BY2V), R30
  200. MOVQ R0, (4*BY2WD+4*BY2V)(R30)
  201. MOVQ $1, R0
  202. JMP trapcommon
  203. TEXT illegal0(SB), $-8
  204. SUBQ $(4*BY2WD+31*BY2V), R30
  205. MOVQ R0, (4*BY2WD+4*BY2V)(R30)
  206. MOVQ $2, R0
  207. JMP trapcommon
  208. TEXT fault0(SB), $-8
  209. SUBQ $(4*BY2WD+31*BY2V), R30
  210. MOVQ R0, (4*BY2WD+4*BY2V)(R30)
  211. MOVQ $4, R0
  212. JMP trapcommon
  213. TEXT unaligned(SB), $-8
  214. SUBQ $(4*BY2WD+31*BY2V), R30
  215. MOVQ R0, (4*BY2WD+4*BY2V)(R30)
  216. MOVQ $6, R0
  217. JMP trapcommon
  218. TEXT intr0(SB), $-8
  219. SUBQ $(4*BY2WD+31*BY2V), R30
  220. MOVQ R0, (4*BY2WD+4*BY2V)(R30)
  221. MOVQ $3, R0
  222. trapcommon:
  223. MOVQ R0, (4*BY2WD+0*BY2V)(R30)
  224. MOVQ R16, (4*BY2WD+1*BY2V)(R30)
  225. MOVQ R17, (4*BY2WD+2*BY2V)(R30)
  226. MOVQ R18, (4*BY2WD+3*BY2V)(R30)
  227. /* R0 already saved, (4*BY2WD+4*BY2V)(R30) */
  228. MOVQ R1, (4*BY2WD+5*BY2V)(R30)
  229. MOVQ R2, (4*BY2WD+6*BY2V)(R30)
  230. MOVQ R3, (4*BY2WD+7*BY2V)(R30)
  231. MOVQ R4, (4*BY2WD+8*BY2V)(R30)
  232. MOVQ R5, (4*BY2WD+9*BY2V)(R30)
  233. MOVQ R6, (4*BY2WD+10*BY2V)(R30)
  234. MOVQ R7, (4*BY2WD+11*BY2V)(R30)
  235. MOVQ R8, (4*BY2WD+12*BY2V)(R30)
  236. MOVQ R9, (4*BY2WD+13*BY2V)(R30)
  237. MOVQ R10, (4*BY2WD+14*BY2V)(R30)
  238. MOVQ R11, (4*BY2WD+15*BY2V)(R30)
  239. MOVQ R12, (4*BY2WD+16*BY2V)(R30)
  240. MOVQ R13, (4*BY2WD+17*BY2V)(R30)
  241. MOVQ R14, (4*BY2WD+18*BY2V)(R30)
  242. MOVQ R15, (4*BY2WD+19*BY2V)(R30)
  243. MOVQ R19, (4*BY2WD+20*BY2V)(R30)
  244. MOVQ R20, (4*BY2WD+21*BY2V)(R30)
  245. MOVQ R21, (4*BY2WD+22*BY2V)(R30)
  246. MOVQ R22, (4*BY2WD+23*BY2V)(R30)
  247. MOVQ R23, (4*BY2WD+24*BY2V)(R30)
  248. MOVQ R24, (4*BY2WD+25*BY2V)(R30)
  249. MOVQ R25, (4*BY2WD+26*BY2V)(R30)
  250. MOVQ R26, (4*BY2WD+27*BY2V)(R30)
  251. MOVQ R27, (4*BY2WD+28*BY2V)(R30)
  252. MOVQ R28, (4*BY2WD+29*BY2V)(R30)
  253. MOVQ $HI_IPL, R16
  254. CALL_PAL $PALswpipl
  255. CALL_PAL $PALrdusp
  256. MOVQ R0, (4*BY2WD+30*BY2V)(R30) /* save USP */
  257. MOVQ $mach0(SB), R(MACH)
  258. MOVQ $(4*BY2WD)(R30), R0
  259. JSR trap(SB)
  260. trapret:
  261. MOVQ (4*BY2WD+30*BY2V)(R30), R16 /* USP */
  262. CALL_PAL $PALwrusp /* ... */
  263. MOVQ (4*BY2WD+4*BY2V)(R30), R0
  264. MOVQ (4*BY2WD+5*BY2V)(R30), R1
  265. MOVQ (4*BY2WD+6*BY2V)(R30), R2
  266. MOVQ (4*BY2WD+7*BY2V)(R30), R3
  267. MOVQ (4*BY2WD+8*BY2V)(R30), R4
  268. MOVQ (4*BY2WD+9*BY2V)(R30), R5
  269. MOVQ (4*BY2WD+10*BY2V)(R30), R6
  270. MOVQ (4*BY2WD+11*BY2V)(R30), R7
  271. MOVQ (4*BY2WD+12*BY2V)(R30), R8
  272. MOVQ (4*BY2WD+13*BY2V)(R30), R9
  273. MOVQ (4*BY2WD+14*BY2V)(R30), R10
  274. MOVQ (4*BY2WD+15*BY2V)(R30), R11
  275. MOVQ (4*BY2WD+16*BY2V)(R30), R12
  276. MOVQ (4*BY2WD+17*BY2V)(R30), R13
  277. MOVQ (4*BY2WD+18*BY2V)(R30), R14
  278. MOVQ (4*BY2WD+19*BY2V)(R30), R15
  279. MOVQ (4*BY2WD+20*BY2V)(R30), R19
  280. MOVQ (4*BY2WD+21*BY2V)(R30), R20
  281. MOVQ (4*BY2WD+22*BY2V)(R30), R21
  282. MOVQ (4*BY2WD+23*BY2V)(R30), R22
  283. MOVQ (4*BY2WD+24*BY2V)(R30), R23
  284. MOVQ (4*BY2WD+25*BY2V)(R30), R24
  285. MOVQ (4*BY2WD+26*BY2V)(R30), R25
  286. MOVQ (4*BY2WD+27*BY2V)(R30), R26
  287. MOVQ (4*BY2WD+28*BY2V)(R30), R27
  288. MOVQ (4*BY2WD+29*BY2V)(R30), R28
  289. /* USP already restored from (4*BY2WD+30*BY2V)(R30) */
  290. ADDQ $(4*BY2WD+31*BY2V), R30
  291. CALL_PAL $PALrti
  292. TEXT forkret(SB), $0
  293. MOVQ R31, R0 /* Fake out system call return */
  294. JMP systrapret
  295. TEXT syscall0(SB), $-8
  296. SUBQ $(4*BY2WD+31*BY2V), R30
  297. MOVQ R0, (4*BY2WD+4*BY2V)(R30) /* save scallnr in R0 */
  298. MOVQ $HI_IPL, R16
  299. CALL_PAL $PALswpipl
  300. MOVQ $mach0(SB), R(MACH)
  301. CALL_PAL $PALrdusp
  302. MOVQ R0, (4*BY2WD+30*BY2V)(R30) /* save USP */
  303. MOVQ R26, (4*BY2WD+27*BY2V)(R30) /* save last return address */
  304. MOVQ $(4*BY2WD)(R30), R0 /* pass address of Ureg */
  305. JSR syscall(SB)
  306. systrapret:
  307. MOVQ (4*BY2WD+30*BY2V)(R30), R16 /* USP */
  308. CALL_PAL $PALwrusp /* consider doing this in execregs... */
  309. MOVQ (4*BY2WD+27*BY2V)(R30), R26 /* restore last return address */
  310. ADDQ $(4*BY2WD+31*BY2V), R30
  311. CALL_PAL $PALretsys
  312. /*
  313. * Take first processor into user mode
  314. * - argument is stack pointer to user
  315. */
  316. TEXT touser(SB), $-8
  317. MOVQ R0, R16
  318. CALL_PAL $PALwrusp /* set USP to value passed */
  319. SUBQ $(6*BY2V), R30 /* create frame for retsys */
  320. MOVQ $(UTZERO+32), R26 /* header appears in text */
  321. MOVQ R26, (1*BY2V)(R30) /* PC -- only reg that matters */
  322. CALL_PAL $PALretsys
  323. TEXT rfnote(SB), $0
  324. SUBL $(2*BY2WD), R0, SP
  325. JMP trapret
  326. TEXT savefpregs(SB), $-8
  327. MOVT F0, 0x00(R0)
  328. MOVT F1, 0x08(R0)
  329. MOVT F2, 0x10(R0)
  330. MOVT F3, 0x18(R0)
  331. MOVT F4, 0x20(R0)
  332. MOVT F5, 0x28(R0)
  333. MOVT F6, 0x30(R0)
  334. MOVT F7, 0x38(R0)
  335. MOVT F8, 0x40(R0)
  336. MOVT F9, 0x48(R0)
  337. MOVT F10, 0x50(R0)
  338. MOVT F11, 0x58(R0)
  339. MOVT F12, 0x60(R0)
  340. MOVT F13, 0x68(R0)
  341. MOVT F14, 0x70(R0)
  342. MOVT F15, 0x78(R0)
  343. MOVT F16, 0x80(R0)
  344. MOVT F17, 0x88(R0)
  345. MOVT F18, 0x90(R0)
  346. MOVT F19, 0x98(R0)
  347. MOVT F20, 0xA0(R0)
  348. MOVT F21, 0xA8(R0)
  349. MOVT F22, 0xB0(R0)
  350. MOVT F23, 0xB8(R0)
  351. MOVT F24, 0xC0(R0)
  352. MOVT F25, 0xC8(R0)
  353. MOVT F26, 0xD0(R0)
  354. MOVT F27, 0xD8(R0)
  355. MOVT F28, 0xE0(R0)
  356. MOVT F29, 0xE8(R0)
  357. MOVT F30, 0xF0(R0)
  358. MOVT F31, 0xF8(R0)
  359. MOVT FPCR, F0
  360. MOVT F0, 0x100(R0)
  361. MOVQ $0, R16
  362. CALL_PAL $PALwrfen /* disable */
  363. RET
  364. TEXT restfpregs(SB), $-8
  365. MOVQ $1, R16
  366. CALL_PAL $PALwrfen /* enable */
  367. MOVT 0x100(R0), F0
  368. MOVT F0, FPCR
  369. MOVT 0x00(R0), F0
  370. MOVT 0x08(R0), F1
  371. MOVT 0x10(R0), F2
  372. MOVT 0x18(R0), F3
  373. MOVT 0x20(R0), F4
  374. MOVT 0x28(R0), F5
  375. MOVT 0x30(R0), F6
  376. MOVT 0x38(R0), F7
  377. MOVT 0x40(R0), F8
  378. MOVT 0x48(R0), F9
  379. MOVT 0x50(R0), F10
  380. MOVT 0x58(R0), F11
  381. MOVT 0x60(R0), F12
  382. MOVT 0x68(R0), F13
  383. MOVT 0x70(R0), F14
  384. MOVT 0x78(R0), F15
  385. MOVT 0x80(R0), F16
  386. MOVT 0x88(R0), F17
  387. MOVT 0x90(R0), F18
  388. MOVT 0x98(R0), F19
  389. MOVT 0xA0(R0), F20
  390. MOVT 0xA8(R0), F21
  391. MOVT 0xB0(R0), F22
  392. MOVT 0xB8(R0), F23
  393. MOVT 0xC0(R0), F24
  394. MOVT 0xC8(R0), F25
  395. MOVT 0xD0(R0), F26
  396. MOVT 0xD8(R0), F27
  397. MOVT 0xE0(R0), F28
  398. MOVT 0xE8(R0), F29
  399. MOVT 0xF0(R0), F30
  400. MOVT 0xF8(R0), F31
  401. RET