l.s 8.9 KB

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