l.s 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443
  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 fpenab(SB), $-8
  163. MOVQ R0, R16
  164. CALL_PAL $PALwrfen
  165. RET
  166. TEXT rpcc(SB), $0
  167. MOVL R0, R1
  168. MOVL $0, R0
  169. WORD $0x6000C000 /* RPCC R0 */
  170. BEQ R1, _ret
  171. MOVQ R0, (R1)
  172. _ret:
  173. RET
  174. /*
  175. * Exception handlers. The stack frame looks like this:
  176. *
  177. * R30+0: (unused) link reg storage (R26) (32 bits)
  178. * R30+4: padding for alignment (32 bits)
  179. * R30+8: trap()'s first arg storage (R0) (32 bits -- type Ureg*)
  180. * R30+12: padding for alignment (32 bits)
  181. * R30+16: first 31 fields of Ureg, saved here (31*64 bits)
  182. * R30+264: other 6 fields of Ureg, saved by PALcode (6*64 bits)
  183. * R30+312: previous value of KSP before trap
  184. */
  185. TEXT arith(SB), $-8
  186. SUBQ $(4*BY2WD+31*BY2V), R30
  187. MOVQ R0, (4*BY2WD+4*BY2V)(R30)
  188. MOVQ $1, R0
  189. JMP trapcommon
  190. TEXT illegal0(SB), $-8
  191. SUBQ $(4*BY2WD+31*BY2V), R30
  192. MOVQ R0, (4*BY2WD+4*BY2V)(R30)
  193. MOVQ $2, R0
  194. JMP trapcommon
  195. TEXT fault0(SB), $-8
  196. SUBQ $(4*BY2WD+31*BY2V), R30
  197. MOVQ R0, (4*BY2WD+4*BY2V)(R30)
  198. MOVQ $4, R0
  199. JMP trapcommon
  200. TEXT unaligned(SB), $-8
  201. SUBQ $(4*BY2WD+31*BY2V), R30
  202. MOVQ R0, (4*BY2WD+4*BY2V)(R30)
  203. MOVQ $6, R0
  204. JMP trapcommon
  205. TEXT intr0(SB), $-8
  206. SUBQ $(4*BY2WD+31*BY2V), R30
  207. MOVQ R0, (4*BY2WD+4*BY2V)(R30)
  208. MOVQ $3, R0
  209. trapcommon:
  210. MOVQ R0, (4*BY2WD+0*BY2V)(R30)
  211. MOVQ R16, (4*BY2WD+1*BY2V)(R30)
  212. MOVQ R17, (4*BY2WD+2*BY2V)(R30)
  213. MOVQ R18, (4*BY2WD+3*BY2V)(R30)
  214. /* R0 already saved, (4*BY2WD+4*BY2V)(R30) */
  215. MOVQ R1, (4*BY2WD+5*BY2V)(R30)
  216. MOVQ R2, (4*BY2WD+6*BY2V)(R30)
  217. MOVQ R3, (4*BY2WD+7*BY2V)(R30)
  218. MOVQ R4, (4*BY2WD+8*BY2V)(R30)
  219. MOVQ R5, (4*BY2WD+9*BY2V)(R30)
  220. MOVQ R6, (4*BY2WD+10*BY2V)(R30)
  221. MOVQ R7, (4*BY2WD+11*BY2V)(R30)
  222. MOVQ R8, (4*BY2WD+12*BY2V)(R30)
  223. MOVQ R9, (4*BY2WD+13*BY2V)(R30)
  224. MOVQ R10, (4*BY2WD+14*BY2V)(R30)
  225. MOVQ R11, (4*BY2WD+15*BY2V)(R30)
  226. MOVQ R12, (4*BY2WD+16*BY2V)(R30)
  227. MOVQ R13, (4*BY2WD+17*BY2V)(R30)
  228. MOVQ R14, (4*BY2WD+18*BY2V)(R30)
  229. MOVQ R15, (4*BY2WD+19*BY2V)(R30)
  230. MOVQ R19, (4*BY2WD+20*BY2V)(R30)
  231. MOVQ R20, (4*BY2WD+21*BY2V)(R30)
  232. MOVQ R21, (4*BY2WD+22*BY2V)(R30)
  233. MOVQ R22, (4*BY2WD+23*BY2V)(R30)
  234. MOVQ R23, (4*BY2WD+24*BY2V)(R30)
  235. MOVQ R24, (4*BY2WD+25*BY2V)(R30)
  236. MOVQ R25, (4*BY2WD+26*BY2V)(R30)
  237. MOVQ R26, (4*BY2WD+27*BY2V)(R30)
  238. MOVQ R27, (4*BY2WD+28*BY2V)(R30)
  239. MOVQ R28, (4*BY2WD+29*BY2V)(R30)
  240. MOVQ $HI_IPL, R16
  241. CALL_PAL $PALswpipl
  242. CALL_PAL $PALrdusp
  243. MOVQ R0, (4*BY2WD+30*BY2V)(R30) /* save USP */
  244. MOVQ $mach0(SB), R(MACH)
  245. MOVQ $(4*BY2WD)(R30), R0
  246. JSR trap(SB)
  247. trapret:
  248. MOVQ (4*BY2WD+30*BY2V)(R30), R16 /* USP */
  249. CALL_PAL $PALwrusp /* ... */
  250. MOVQ (4*BY2WD+4*BY2V)(R30), R0
  251. MOVQ (4*BY2WD+5*BY2V)(R30), R1
  252. MOVQ (4*BY2WD+6*BY2V)(R30), R2
  253. MOVQ (4*BY2WD+7*BY2V)(R30), R3
  254. MOVQ (4*BY2WD+8*BY2V)(R30), R4
  255. MOVQ (4*BY2WD+9*BY2V)(R30), R5
  256. MOVQ (4*BY2WD+10*BY2V)(R30), R6
  257. MOVQ (4*BY2WD+11*BY2V)(R30), R7
  258. MOVQ (4*BY2WD+12*BY2V)(R30), R8
  259. MOVQ (4*BY2WD+13*BY2V)(R30), R9
  260. MOVQ (4*BY2WD+14*BY2V)(R30), R10
  261. MOVQ (4*BY2WD+15*BY2V)(R30), R11
  262. MOVQ (4*BY2WD+16*BY2V)(R30), R12
  263. MOVQ (4*BY2WD+17*BY2V)(R30), R13
  264. MOVQ (4*BY2WD+18*BY2V)(R30), R14
  265. MOVQ (4*BY2WD+19*BY2V)(R30), R15
  266. MOVQ (4*BY2WD+20*BY2V)(R30), R19
  267. MOVQ (4*BY2WD+21*BY2V)(R30), R20
  268. MOVQ (4*BY2WD+22*BY2V)(R30), R21
  269. MOVQ (4*BY2WD+23*BY2V)(R30), R22
  270. MOVQ (4*BY2WD+24*BY2V)(R30), R23
  271. MOVQ (4*BY2WD+25*BY2V)(R30), R24
  272. MOVQ (4*BY2WD+26*BY2V)(R30), R25
  273. MOVQ (4*BY2WD+27*BY2V)(R30), R26
  274. MOVQ (4*BY2WD+28*BY2V)(R30), R27
  275. MOVQ (4*BY2WD+29*BY2V)(R30), R28
  276. /* USP already restored from (4*BY2WD+30*BY2V)(R30) */
  277. ADDQ $(4*BY2WD+31*BY2V), R30
  278. CALL_PAL $PALrti
  279. TEXT forkret(SB), $0
  280. MOVQ R31, R0 /* Fake out system call return */
  281. JMP systrapret
  282. TEXT syscall0(SB), $-8
  283. SUBQ $(4*BY2WD+31*BY2V), R30
  284. MOVQ R0, (4*BY2WD+4*BY2V)(R30) /* save scallnr in R0 */
  285. MOVQ $HI_IPL, R16
  286. CALL_PAL $PALswpipl
  287. MOVQ $mach0(SB), R(MACH)
  288. CALL_PAL $PALrdusp
  289. MOVQ R0, (4*BY2WD+30*BY2V)(R30) /* save USP */
  290. MOVQ R26, (4*BY2WD+27*BY2V)(R30) /* save last return address */
  291. MOVQ $(4*BY2WD)(R30), R0 /* pass address of Ureg */
  292. JSR syscall(SB)
  293. systrapret:
  294. MOVQ (4*BY2WD+30*BY2V)(R30), R16 /* USP */
  295. CALL_PAL $PALwrusp /* consider doing this in execregs... */
  296. MOVQ (4*BY2WD+27*BY2V)(R30), R26 /* restore last return address */
  297. ADDQ $(4*BY2WD+31*BY2V), R30
  298. CALL_PAL $PALretsys
  299. /*
  300. * Take first processor into user mode
  301. * - argument is stack pointer to user
  302. */
  303. TEXT touser(SB), $-8
  304. MOVQ R0, R16
  305. CALL_PAL $PALwrusp /* set USP to value passed */
  306. SUBQ $(6*BY2V), R30 /* create frame for retsys */
  307. MOVQ $(UTZERO+32), R26 /* header appears in text */
  308. MOVQ R26, (1*BY2V)(R30) /* PC -- only reg that matters */
  309. CALL_PAL $PALretsys
  310. TEXT rfnote(SB), $0
  311. SUBL $(2*BY2WD), R0, SP
  312. JMP trapret
  313. TEXT savefpregs(SB), $-8
  314. MOVT F0, 0x00(R0)
  315. MOVT F1, 0x08(R0)
  316. MOVT F2, 0x10(R0)
  317. MOVT F3, 0x18(R0)
  318. MOVT F4, 0x20(R0)
  319. MOVT F5, 0x28(R0)
  320. MOVT F6, 0x30(R0)
  321. MOVT F7, 0x38(R0)
  322. MOVT F8, 0x40(R0)
  323. MOVT F9, 0x48(R0)
  324. MOVT F10, 0x50(R0)
  325. MOVT F11, 0x58(R0)
  326. MOVT F12, 0x60(R0)
  327. MOVT F13, 0x68(R0)
  328. MOVT F14, 0x70(R0)
  329. MOVT F15, 0x78(R0)
  330. MOVT F16, 0x80(R0)
  331. MOVT F17, 0x88(R0)
  332. MOVT F18, 0x90(R0)
  333. MOVT F19, 0x98(R0)
  334. MOVT F20, 0xA0(R0)
  335. MOVT F21, 0xA8(R0)
  336. MOVT F22, 0xB0(R0)
  337. MOVT F23, 0xB8(R0)
  338. MOVT F24, 0xC0(R0)
  339. MOVT F25, 0xC8(R0)
  340. MOVT F26, 0xD0(R0)
  341. MOVT F27, 0xD8(R0)
  342. MOVT F28, 0xE0(R0)
  343. MOVT F29, 0xE8(R0)
  344. MOVT F30, 0xF0(R0)
  345. MOVT F31, 0xF8(R0)
  346. MOVT FPCR, F0
  347. MOVT F0, 0x100(R0)
  348. MOVQ $0, R16
  349. CALL_PAL $PALwrfen /* disable */
  350. RET
  351. TEXT restfpregs(SB), $-8
  352. MOVQ $1, R16
  353. CALL_PAL $PALwrfen /* enable */
  354. MOVT 0x100(R0), F0
  355. MOVT F0, FPCR
  356. MOVT 0x00(R0), F0
  357. MOVT 0x08(R0), F1
  358. MOVT 0x10(R0), F2
  359. MOVT 0x18(R0), F3
  360. MOVT 0x20(R0), F4
  361. MOVT 0x28(R0), F5
  362. MOVT 0x30(R0), F6
  363. MOVT 0x38(R0), F7
  364. MOVT 0x40(R0), F8
  365. MOVT 0x48(R0), F9
  366. MOVT 0x50(R0), F10
  367. MOVT 0x58(R0), F11
  368. MOVT 0x60(R0), F12
  369. MOVT 0x68(R0), F13
  370. MOVT 0x70(R0), F14
  371. MOVT 0x78(R0), F15
  372. MOVT 0x80(R0), F16
  373. MOVT 0x88(R0), F17
  374. MOVT 0x90(R0), F18
  375. MOVT 0x98(R0), F19
  376. MOVT 0xA0(R0), F20
  377. MOVT 0xA8(R0), F21
  378. MOVT 0xB0(R0), F22
  379. MOVT 0xB8(R0), F23
  380. MOVT 0xC0(R0), F24
  381. MOVT 0xC8(R0), F25
  382. MOVT 0xD0(R0), F26
  383. MOVT 0xD8(R0), F27
  384. MOVT 0xE0(R0), F28
  385. MOVT 0xE8(R0), F29
  386. MOVT 0xF0(R0), F30
  387. MOVT 0xF8(R0), F31
  388. RET