l.s 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479
  1. /*
  2. * Memory and machine-specific definitions. Used in C and assembler.
  3. */
  4. /*
  5. * Sizes
  6. */
  7. #define BI2BY 8 /* bits per byte */
  8. #define BI2WD 32 /* bits per word */
  9. #define BY2WD 4 /* bytes per word */
  10. #define BY2PG 8192 /* bytes per page */
  11. #define WD2PG (BY2PG/BY2WD) /* words per page */
  12. #define PGSHIFT 13 /* log(BY2PG) */
  13. #define PGROUND(s) (((s)+(BY2PG-1))&~(BY2PG-1))
  14. #define ICACHESIZE 0
  15. #define MB4 (4*1024*1024) /* Lots of things are 4Mb in size */
  16. #define MAXMACH 1 /* max # cpus system can run */
  17. /*
  18. * Time
  19. */
  20. #define HZ (60) /* clock frequency */
  21. #define MS2HZ (1000/HZ) /* millisec per clock tick */
  22. #define TK2SEC(t) ((t)/HZ) /* ticks to seconds */
  23. #define TK2MS(t) ((((ulong)(t))*1000)/HZ) /* ticks to milliseconds */
  24. #define MS2TK(t) ((((ulong)(t))*HZ)/1000) /* milliseconds to ticks */
  25. /*
  26. * SR bits
  27. */
  28. #define SUPER 0x2000
  29. #define SPL(n) (n<<8)
  30. /*
  31. * CACR
  32. */
  33. #define CCLEAR 0x08
  34. #define CENABLE 0x01
  35. /*
  36. * Magic registers (unused in current system)
  37. */
  38. #define MACH A5 /* A5 is m-> */
  39. #define USER A4 /* A4 is u-> */
  40. /*
  41. * Fundamental addresses
  42. */
  43. #define USERADDR 0x80000000
  44. /* assuming we're in a syscall, this is the address of the Ureg structure */
  45. #define UREGVARSZ (23*BY2WD) /* size of variable part of Ureg */
  46. #define UREGADDR (USERADDR+BY2PG-(UREGVARSZ+2+4+2+(8+8+1+1)*BY2WD))
  47. /*
  48. * Devices poked during bootstrap
  49. */
  50. #define TACADDR 0x40600000
  51. #define MOUSE 0x40200000
  52. /*
  53. * MMU
  54. */
  55. #define VAMASK 0xCFFFFFFF /* clear balu bits in address */
  56. #define KUSEG 0x00000000
  57. #define KSEG 0x80000000
  58. /*
  59. * MMU entries
  60. */
  61. #define PTEVALID (1<<13)
  62. #define PTEWRITE 0
  63. #define PTERONLY (1<<14)
  64. #define PTEKERNEL (1<<15)
  65. #define PTEUNCACHED 0
  66. #define INVALIDPTE 0
  67. #define PTEMAPMEM (1024*1024)
  68. #define PTEPERTAB (PTEMAPMEM/BY2PG)
  69. #define SEGMAPSIZE 16
  70. #define PPN(pa) ((pa>>13)&0x1FFF)
  71. #define KMAP ((unsigned long *)0xD0000000)
  72. #define UMAP ((unsigned long *)0x50000000)
  73. /*
  74. * Virtual addresses
  75. */
  76. #define VTAG(va) ((va>>22)&0x03F)
  77. #define VPN(va) ((va>>13)&0x1FF)
  78. #define PARAM ((char*)0x40500000)
  79. #define TLBFLUSH_ 0x01
  80. /*
  81. * Address spaces
  82. */
  83. #define UZERO KUSEG /* base of user address space */
  84. #define UTZERO (UZERO+BY2PG) /* first address in user text */
  85. #define TSTKTOP 0x10000000 /* end of new stack in sysexec */
  86. #define TSTKSIZ 100
  87. #define USTKTOP (TSTKTOP-TSTKSIZ*BY2PG) /* byte just beyond user stack */
  88. #define KZERO KSEG /* base of kernel address space */
  89. #define KTZERO (KZERO+BY2PG) /* first address in kernel text */
  90. #define USTKSIZE (4*1024*1024) /* size of user stack */
  91. #define MACHSIZE 4096
  92. #define isphys(p) ((((ulong)(p))&0xF0000000) == KSEG)
  93. #define DBMAGIC 0xBADC0C0A
  94. /*
  95. * Boot first processor
  96. */
  97. TEXT start(SB), $-4
  98. MOVW $(SUPER|SPL(7)), SR
  99. MOVL $a6base(SB), A6
  100. MOVL $0, R0
  101. MOVL R0, CACR
  102. MOVL R0, TACADDR /* zero tac counter (cause an intr?) */
  103. MOVL $mach0(SB), A0
  104. MOVL A0, m(SB)
  105. MOVL $0, 0(A0)
  106. MOVL A0, A7
  107. ADDL $(MACHSIZE-4), A7 /* start stack under machine struct */
  108. MOVL $0, u(SB)
  109. MOVL $vectors(SB), A0
  110. MOVL A0, VBR
  111. BSR main(SB)
  112. /* never returns */
  113. dead:
  114. BRA dead
  115. /*
  116. * Take first processor into user mode. Leave enough room on the stack
  117. * for a full-sized Ureg (including long bus error format) to fit
  118. */
  119. TEXT touser(SB), $-4
  120. MOVL $(USERADDR+BY2PG-UREGVARSZ), A7
  121. MOVW $0, -(A7)
  122. MOVL $(UTZERO+32), -(A7) /* header is in text */
  123. MOVW $0, -(A7)
  124. MOVL $(USTKTOP-6*BY2WD), A0 /* MAXSYSARG=6 */
  125. MOVL A0, USP
  126. MOVW $(SUPER|SPL(0)), SR
  127. MOVL $8, R0
  128. MOVL R0, CACR
  129. RTE
  130. TEXT firmware(SB), $0
  131. MOVL $0x40000090, A0
  132. JMP (A0)
  133. TEXT splhi(SB), $0
  134. MOVL m(SB), A0
  135. MOVL (A7), 4(A0)
  136. MOVL $0, R0
  137. MOVW SR, R0
  138. MOVW $(SUPER|SPL(7)), SR
  139. RTS
  140. TEXT splduart(SB), $0
  141. MOVL $0, R0
  142. MOVW SR, R0
  143. MOVW $(SUPER|SPL(5)), SR
  144. RTS
  145. TEXT spllo(SB), $0
  146. MOVL $0, R0
  147. MOVW SR, R0
  148. MOVW $(SUPER|SPL(0)), SR
  149. RTS
  150. TEXT splx(SB), $0
  151. MOVL sr+0(FP), R0
  152. MOVW R0, SR
  153. RTS
  154. TEXT spldone(SB), $0
  155. RTS
  156. TEXT spl1(SB), $0
  157. MOVL $0, R0
  158. MOVW SR, R0
  159. MOVW $(SUPER|SPL(1)), SR
  160. RTS
  161. TEXT flushcpucache(SB), $0
  162. MOVL $(CCLEAR|CENABLE), R0
  163. MOVL R0, CACR
  164. RTS
  165. TEXT cacrtrap(SB), $0 /* user entry point to control cache, e.g. flush */
  166. MOVL R0, CACR
  167. RTE
  168. TEXT setlabel(SB), $0
  169. MOVL sr+0(FP), A0
  170. MOVL A7, (A0)+ /* stack pointer */
  171. MOVL (A7), (A0)+ /* pc of caller */
  172. MOVW SR, (A0)+ /* status register */
  173. CLRL R0 /* ret 0 => not returning */
  174. RTS
  175. TEXT gotolabel(SB), $0
  176. MOVL p+0(FP), A0
  177. MOVW $(SUPER|SPL(7)), SR
  178. MOVL (A0)+, A7 /* stack pointer */
  179. MOVL (A0)+, (A7) /* pc; stuff into stack frame */
  180. MOVW (A0)+, R0 /* status register */
  181. MOVW R0, SR
  182. MOVL $1, R0 /* ret 1 => returning */
  183. RTS
  184. /*
  185. * Test and set, as a subroutine
  186. */
  187. TEXT tas(SB), $0
  188. MOVL $0, R0
  189. MOVL a+0(FP), A0
  190. TAS (A0)
  191. BEQ tas_1
  192. MOVL $1, R0
  193. tas_1:
  194. RTS
  195. /*
  196. * Floating point
  197. */
  198. TEXT fpsave(SB), $0
  199. FSAVE (fp+0(FP))
  200. RTS
  201. TEXT fprestore(SB), $0
  202. FRESTORE (fp+0(FP))
  203. RTS
  204. TEXT fpregsave(SB), $0
  205. FMOVEM $0xFF, (3*4)(fr+0(FP))
  206. FMOVEMC $0x7, (fr+0(FP))
  207. RTS
  208. TEXT fpregrestore(SB), $0
  209. FMOVEMC (fr+0(FP)), $0x7
  210. FMOVEM (3*4)(fr+0(FP)), $0xFF
  211. RTS
  212. TEXT fpcr(SB), $0
  213. MOVL new+0(FP), R1
  214. MOVL FPCR, R0
  215. MOVL R1, FPCR
  216. RTS
  217. TEXT rfnote(SB), $0
  218. MOVL uregp+0(FP), A7
  219. MOVL ((8+8)*BY2WD)(A7), A0
  220. MOVL A0, USP
  221. MOVEM (A7), $0x7FFF
  222. ADDL $((8+8+1+1)*BY2WD), A7
  223. RTE
  224. TEXT illegal(SB), $0
  225. MOVL $DBMAGIC, -(A7)
  226. SUBL $((8+8+1)*BY2WD), A7
  227. MOVEM $0x7FFF, (A7)
  228. MOVL $a6base(SB), A6
  229. MOVL USP, A0
  230. MOVL A0, ((8+8)*BY2WD)(A7)
  231. MOVL A7, -(A7)
  232. BSR trap(SB)
  233. ADDL $4, A7
  234. MOVL ((8+8)*BY2WD)(A7), A0
  235. MOVL A0, USP
  236. MOVEM (A7), $0x7FFF
  237. ADDL $((8+8+1)*BY2WD+BY2WD), A7
  238. RTE
  239. TEXT systrap(SB), $0
  240. MOVL $DBMAGIC, -(A7)
  241. SUBL $((8+8+1)*BY2WD), A7
  242. MOVL A6, ((8+6)*BY2WD)(A7)
  243. MOVL R0, (A7)
  244. MOVL $a6base(SB), A6
  245. MOVL USP, A0
  246. MOVL A0, ((8+8)*BY2WD)(A7)
  247. MOVL A7, -(A7)
  248. BSR syscall(SB)
  249. MOVL ((1+8+8)*BY2WD)(A7), A0
  250. MOVL A0, USP
  251. MOVL ((1+8+6)*BY2WD)(A7), A6
  252. ADDL $((1+8+8+1)*BY2WD+BY2WD), A7
  253. RTE
  254. TEXT buserror(SB), $0
  255. MOVL $DBMAGIC, -(A7)
  256. SUBL $((8+8+1)*BY2WD), A7
  257. MOVEM $0x7FFF, (A7)
  258. MOVL $a6base(SB), A6
  259. MOVL USP, A0
  260. MOVL A0, ((8+8)*BY2WD)(A7)
  261. PEA ((8+8+1+3)*BY2WD)(A7)
  262. PEA 4(A7)
  263. BSR fault68020(SB)
  264. ADDL $8, A7
  265. MOVL ((8+8)*BY2WD)(A7), A0
  266. MOVL A0, USP
  267. MOVEM (A7), $0x7FFF
  268. ADDL $((8+8+1)*BY2WD+BY2WD), A7
  269. RTE
  270. TEXT tacintr(SB), $0 /* level 1 */
  271. MOVL R0, -(A7)
  272. MOVL TACADDR, R0
  273. MOVL (A7)+, R0
  274. RTE
  275. TEXT portintr(SB), $0 /* level 2 */
  276. MOVL $DBMAGIC, -(A7)
  277. SUBL $((8+8+1)*BY2WD), A7
  278. MOVEM $0x7FFF, (A7)
  279. MOVL $a6base(SB), A6
  280. MOVL USP, A0
  281. MOVL A0, ((8+8)*BY2WD)(A7)
  282. MOVL A7, -(A7)
  283. BSR devportintr(SB)
  284. BRA retintr
  285. TEXT dkintr(SB), $0 /* level 3 */
  286. MOVL $DBMAGIC, -(A7)
  287. SUBL $((8+8+1)*BY2WD), A7
  288. MOVEM $0x7FFF, (A7)
  289. MOVL $a6base(SB), A6
  290. MOVL USP, A0
  291. MOVL A0, ((8+8)*BY2WD)(A7)
  292. MOVL A7, -(A7)
  293. BSR inconintr(SB)
  294. BRA retintr
  295. TEXT mouseintr(SB), $0 /* level 4 */
  296. MOVEM $0x80C2, -(A7) /* D0, A0, A1, A6 */
  297. MOVL $a6base(SB), A6
  298. MOVL $15, R0 /* mask off hex switch */
  299. ANDB MOUSE,R0 /* clears quadrature interrupt */
  300. LEA mousetab(SB)(R0.W*8), A0
  301. LEA mouse(SB), A1
  302. MOVL (A0)+, R0
  303. ADDL R0, (A1)+ /* dx */
  304. MOVL (A0), R0
  305. ADDL R0, (A1)+ /* dy */
  306. ADDL $1, (A1) /* track */
  307. MOVEM (A7)+, $0x4301
  308. RTE
  309. TEXT uartintr(SB), $0 /* level 5 */
  310. MOVL $DBMAGIC, -(A7)
  311. SUBL $((8+8+1)*BY2WD), A7
  312. MOVEM $0x7FFF, (A7)
  313. MOVL $a6base(SB), A6
  314. MOVL USP, A0
  315. MOVL A0, ((8+8)*BY2WD)(A7)
  316. MOVL A7, -(A7)
  317. BSR duartintr(SB)
  318. BRA retintr
  319. TEXT syncintr(SB), $0 /* level 6 */
  320. MOVL $DBMAGIC, -(A7)
  321. SUBL $((8+8+1)*BY2WD), A7
  322. MOVEM $0x7FFF, (A7)
  323. MOVL $a6base(SB), A6
  324. MOVL USP, A0
  325. MOVL A0, ((8+8)*BY2WD)(A7)
  326. MOVL A7, -(A7)
  327. BSR clock(SB)
  328. /* fall through */
  329. retintr:
  330. BSR mousetry(SB)
  331. ADDL $4, A7
  332. MOVL ((8+8)*BY2WD)(A7), A0
  333. MOVL A0, USP
  334. MOVEM (A7), $0x7FFF
  335. ADDL $((8+8+1)*BY2WD+BY2WD), A7
  336. RTE
  337. GLOBL duarttimer+0(SB),$4
  338. TEXT duartreadtimer+0(SB), $0
  339. MOVW SR, R1 /* spl7() */
  340. MOVW $0x2700, SR
  341. MOVL $0x40100000, A0
  342. CLRL R0
  343. TSTB 15(A0) /* stop timer */
  344. MOVW 6(A0), R0 /* read hi,lo */
  345. TSTB 14(A0) /* restart timer */
  346. NOTW R0 /* timer counts down from 0xffff */
  347. ADDL duarttimer(SB), R0
  348. MOVL R0, duarttimer(SB)
  349. MOVW R1, SR
  350. RTS
  351. GLOBL mousetab(SB), $128
  352. DATA mousetab+ 0(SB)/4, -1 /* x down, */
  353. DATA mousetab+ 4(SB)/4, 1 /* y up */
  354. DATA mousetab+ 8(SB)/4, 0 /* x - */
  355. DATA mousetab+ 12(SB)/4, 1 /* y up */
  356. DATA mousetab+ 16(SB)/4, 1 /* x up */
  357. DATA mousetab+ 20(SB)/4, 1 /* y up */
  358. DATA mousetab+ 24(SB)/4, 0 /* x - */
  359. DATA mousetab+ 28(SB)/4, 1 /* y up */
  360. DATA mousetab+ 32(SB)/4, -1 /* x down */
  361. DATA mousetab+ 36(SB)/4, 0 /* y - */
  362. DATA mousetab+ 40(SB)/4, 0 /* x - */
  363. DATA mousetab+ 44(SB)/4, 0 /* y - */
  364. DATA mousetab+ 48(SB)/4, 1 /* x up, */
  365. DATA mousetab+ 52(SB)/4, 0 /* y - */
  366. DATA mousetab+ 56(SB)/4, 0 /* x - */
  367. DATA mousetab+ 60(SB)/4, 0 /* y - */
  368. DATA mousetab+ 64(SB)/4, -1 /* x down */
  369. DATA mousetab+ 68(SB)/4, -1 /* y down */
  370. DATA mousetab+ 72(SB)/4, 0 /* x - */
  371. DATA mousetab+ 76(SB)/4, -1 /* y down */
  372. DATA mousetab+ 80(SB)/4, 1 /* x up */
  373. DATA mousetab+ 84(SB)/4, -1 /* y down */
  374. DATA mousetab+ 88(SB)/4, 0 /* x - */
  375. DATA mousetab+ 92(SB)/4, -1 /* y down */
  376. DATA mousetab+ 96(SB)/4, -1 /* x down */
  377. DATA mousetab+100(SB)/4, 0 /* y - */
  378. DATA mousetab+104(SB)/4, 0 /* x - */
  379. DATA mousetab+108(SB)/4, 0 /* y - */
  380. DATA mousetab+112(SB)/4, 1 /* x up */
  381. DATA mousetab+116(SB)/4, 0 /* y - */
  382. DATA mousetab+120(SB)/4, 0 /* x - */
  383. DATA mousetab+124(SB)/4, 0 /* y - */
  384. GLOBL mach0+0(SB), $MACHSIZE
  385. GLOBL u(SB), $4
  386. GLOBL m(SB), $4