l.s 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703
  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 4096 /* bytes per page */
  11. #define WD2PG (BY2PG/BY2WD) /* words per page */
  12. #define PGSHIFT 12 /* log(BY2PG) */
  13. #define MAXMACH 4 /* max # cpus system can run */
  14. /*
  15. * Time
  16. */
  17. #define MS2HZ 50 /* millisec per clock tick */
  18. #define TK2SEC(t) ((t)/20) /* ticks to seconds */
  19. #define TK2MS(t) ((t)*MS2HZ) /* ticks to milliseconds */
  20. #define MS2TK(t) ((t)/MS2HZ) /* milliseconds to ticks */
  21. /*
  22. * CP0 registers
  23. */
  24. #define INDEX 0
  25. #define RANDOM 1
  26. #define TLBPHYS 2
  27. #define CONTEXT 4
  28. #define BADVADDR 8
  29. #define TLBVIRT 10
  30. #define STATUS 12
  31. #define CAUSE 13
  32. #define EPC 14
  33. #define PRID 15
  34. /*
  35. * M(STATUS) bits
  36. */
  37. #define IEC 0x00000001
  38. #define KUC 0x00000002
  39. #define IEP 0x00000004
  40. #define KUP 0x00000008
  41. #define INTMASK 0x0000ff00
  42. #define SW0 0x00000100
  43. #define SW1 0x00000200
  44. #define INTR0 0x00000400
  45. #define INTR1 0x00000800
  46. #define INTR2 0x00001000
  47. #define INTR3 0x00002000
  48. #define INTR4 0x00004000
  49. #define INTR5 0x00008000
  50. #define ISC 0x00010000
  51. #define SWC 0x00020000
  52. #define CU1 0x20000000
  53. /*
  54. * Traps
  55. */
  56. #define UTLBMISS (KSEG0+0x00)
  57. #define EXCEPTION (KSEG0+0x80)
  58. /*
  59. * Magic registers
  60. */
  61. #define MACH 25 /* R25 is m-> */
  62. #define USER 24 /* R24 is u-> */
  63. #define MPID 0xBF000000 /* long; low 3 bits identify mp bus slot */
  64. #define WBFLUSH 0xBC000000 /* D-CACHE data; used for write buffer flush */
  65. /*
  66. * Fundamental addresses
  67. */
  68. #define MACHADDR 0x80014000
  69. #define USERADDR 0xC0000000
  70. #define UREGADDR (USERADDR+BY2PG-4-0xA0)
  71. /*
  72. * MMU
  73. */
  74. #define KUSEG 0x00000000
  75. #define KSEG0 0x80000000
  76. #define KSEG1 0xA0000000
  77. #define KSEG2 0xC0000000
  78. #define KSEGM 0xE0000000 /* mask to check which seg */
  79. #define PTEGLOBL (1<<8)
  80. #define PTEVALID (1<<9)
  81. #define PTEWRITE (1<<10)
  82. #define PTEPID(n) ((n)<<6)
  83. #define NTLBPID 64 /* number of pids */
  84. #define NTLB 64 /* number of entries */
  85. #define TLBROFF 8 /* offset of first randomly indexed entry */
  86. /*
  87. * Address spaces
  88. */
  89. #define UZERO KUSEG /* base of user address space */
  90. #define UTZERO (UZERO+BY2PG) /* first address in user text */
  91. #define USTKTOP KZERO /* byte just beyond user stack */
  92. #define TSTKTOP (USERADDR+100*BY2PG) /* top of temporary stack */
  93. #define KZERO KSEG0 /* base of kernel address space */
  94. #define KTZERO (KSEG0+0x20000) /* first address in kernel text */
  95. #define USTACKSIZE (4*1024*1024) /* size of user stack */
  96. /*
  97. * Exception codes
  98. */
  99. #define CINT 0 /* external interrupt */
  100. #define CTLBM 1 /* TLB modification */
  101. #define CTLBL 2 /* TLB miss (load or fetch) */
  102. #define CTLBS 3 /* TLB miss (store) */
  103. #define CADREL 4 /* address error (load or fetch) */
  104. #define CADRES 5 /* address error (store) */
  105. #define CBUSI 6 /* bus error (fetch) */
  106. #define CBUSD 7 /* bus error (data load or store) */
  107. #define CSYS 8 /* system call */
  108. #define CBRK 9 /* breakpoint */
  109. #define CRES 10 /* reserved instruction */
  110. #define CCPU 11 /* coprocessor unusable */
  111. #define COVF 12 /* arithmetic overflow */
  112. #define CUNK13 13 /* undefined 13 */
  113. #define CUNK14 14 /* undefined 14 */
  114. #define CUNK15 15 /* undefined 15 */
  115. #define NSEG 5
  116. #define SP R29
  117. #define PROM (KSEG1+0x1FC00000)
  118. #define NOOP NOR R0,R0
  119. #define WAIT NOOP; NOOP
  120. /*
  121. * Boot first processor
  122. * - why is the processor number loaded from R0 ?????
  123. */
  124. TEXT start(SB), $-4
  125. MOVW $setR30(SB), R30
  126. MOVW $(CU1|INTR5|INTR4|INTR3|INTR2|INTR1|SW1|SW0), R1
  127. MOVW R1, M(STATUS)
  128. WAIT
  129. MOVW $(0x1C<<7), R1
  130. MOVW R1, FCR31 /* permit only inexact and underflow */
  131. NOOP
  132. MOVD $0.5, F26
  133. SUBD F26, F26, F24
  134. ADDD F26, F26, F28
  135. ADDD F28, F28, F30
  136. MOVD F24, F0
  137. MOVD F24, F2
  138. MOVD F24, F4
  139. MOVD F24, F6
  140. MOVD F24, F8
  141. MOVD F24, F10
  142. MOVD F24, F12
  143. MOVD F24, F14
  144. MOVD F24, F16
  145. MOVD F24, F18
  146. MOVD F24, F20
  147. MOVD F24, F22
  148. MOVW $MACHADDR, R(MACH)
  149. ADDU $(BY2PG-4), R(MACH), SP
  150. MOVW $0, R(USER)
  151. MOVW R0, 0(R(MACH))
  152. MOVW $edata(SB), R1
  153. MOVW $end(SB), R2
  154. clrbss:
  155. MOVB $0, (R1)
  156. ADDU $1, R1
  157. BNE R1, R2, clrbss
  158. MOVW R4, _argc(SB)
  159. MOVW R5, _argv(SB)
  160. MOVW R6, _env(SB)
  161. JAL main(SB)
  162. JMP (R0)
  163. /*
  164. * Take first processor into user mode
  165. * - argument is stack pointer to user
  166. */
  167. TEXT touser(SB), $-4
  168. MOVW M(STATUS), R1
  169. OR $(KUP|IEP), R1
  170. MOVW R1, M(STATUS)
  171. NOOP
  172. MOVW 0(FP), SP
  173. MOVW $(UTZERO+32), R26 /* header appears in text */
  174. RFE (R26)
  175. /*
  176. * Bring subsequent processors on line
  177. */
  178. TEXT newstart(SB), $0
  179. MOVW $setR30(SB), R30
  180. MOVW $(INTR5|INTR4|INTR3|INTR2|INTR1|SW1|SW0), R1
  181. MOVW R1, M(STATUS)
  182. NOOP
  183. MOVW $MACHADDR, R(MACH)
  184. MOVB (MPID+3), R1
  185. AND $7, R1
  186. SLL $PGSHIFT, R1, R2
  187. ADDU R2, R(MACH)
  188. ADDU $(BY2PG-4), R(MACH), SP
  189. MOVW $0, R(USER)
  190. MOVW R1, 0(R(MACH))
  191. JAL online(SB)
  192. JMP (R0)
  193. TEXT firmware(SB), $0
  194. MOVW $(PROM+0x18), R1 /**/
  195. /* MOVW $(PROM+0x00), R1 /**/
  196. JMP (R1)
  197. TEXT splhi(SB), $0
  198. MOVW M(STATUS), R1
  199. AND $~IEC, R1, R2
  200. MOVW R2, M(STATUS)
  201. NOOP
  202. RET
  203. TEXT spllo(SB), $0
  204. MOVW M(STATUS), R1
  205. OR $IEC, R1, R2
  206. MOVW R2, M(STATUS)
  207. NOOP
  208. RET
  209. TEXT splx(SB), $0
  210. MOVW 0(FP), R1
  211. MOVW M(STATUS), R2
  212. AND $IEC, R1
  213. AND $~IEC, R2
  214. OR R2, R1
  215. MOVW R1, M(STATUS)
  216. NOOP
  217. RET
  218. TEXT wbflush(SB), $-4
  219. MOVW $WBFLUSH, R1
  220. MOVW 0(R1), R1
  221. RET
  222. TEXT setlabel(SB), $0
  223. MOVW 0(FP), R2
  224. MOVW $0, R1
  225. MOVW R31, 0(R2)
  226. MOVW R29, 4(R2)
  227. RET
  228. TEXT gotolabel(SB), $0
  229. MOVW 0(FP), R2
  230. MOVW $1, R1
  231. MOVW 0(R2), R31
  232. MOVW 4(R2), R29
  233. RET
  234. TEXT gotopc(SB), $8
  235. MOVW 0(FP), R7 /* save arguments for later */
  236. MOVW _argc(SB), R4
  237. MOVW _argv(SB), R5
  238. MOVW _env(SB), R6
  239. MOVW R0, 4(SP)
  240. MOVW $(64*1024), R1
  241. MOVW R1, 8(SP)
  242. JAL icflush(SB)
  243. JMP (R7)
  244. TEXT puttlb(SB), $4
  245. JAL splhi(SB)
  246. MOVW 0(FP), R2
  247. MOVW 4(FP), R3
  248. MOVW R1, 4(SP)
  249. MOVW R2, M(TLBVIRT)
  250. MOVW R3, M(TLBPHYS)
  251. NOOP
  252. TLBP
  253. NOOP
  254. MOVW M(INDEX), R4
  255. BGEZ R4, index
  256. TLBWR
  257. NOOP
  258. JAL splx(SB)
  259. RET
  260. index:
  261. TLBWI
  262. NOOP
  263. JAL splx(SB)
  264. RET
  265. TEXT puttlbx(SB), $0
  266. MOVW 0(FP), R4
  267. MOVW 4(FP), R2
  268. MOVW 8(FP), R3
  269. SLL $8, R4
  270. MOVW R2, M(TLBVIRT)
  271. MOVW R3, M(TLBPHYS)
  272. MOVW R4, M(INDEX)
  273. NOOP
  274. TLBWI
  275. NOOP
  276. RET
  277. TEXT tlbp(SB), $0
  278. TLBP
  279. NOOP
  280. MOVW M(INDEX), R1
  281. RET
  282. TEXT tlbvirt(SB), $0
  283. TLBP
  284. NOOP
  285. MOVW M(TLBVIRT), R1
  286. RET
  287. TEXT gettlb(SB), $0
  288. MOVW 0(FP), R3
  289. MOVW 4(FP), R4
  290. SLL $8, R3
  291. MOVW R3, M(INDEX)
  292. NOOP
  293. TLBR
  294. NOOP
  295. MOVW M(TLBVIRT), R1
  296. MOVW M(TLBPHYS), R2
  297. NOOP
  298. MOVW R1, 0(R4)
  299. MOVW R2, 4(R4)
  300. RET
  301. TEXT gettlbvirt(SB), $0
  302. MOVW 0(FP), R3
  303. SLL $8, R3
  304. MOVW R3, M(INDEX)
  305. NOOP
  306. TLBR
  307. NOOP
  308. MOVW M(TLBVIRT), R1
  309. NOOP
  310. RET
  311. TEXT vector80(SB), $-4
  312. MOVW $exception(SB), R26
  313. JMP (R26)
  314. TEXT exception(SB), $-4
  315. MOVW M(STATUS), R26
  316. AND $KUP, R26
  317. BEQ R26, waskernel
  318. wasuser:
  319. MOVW SP, R26
  320. /*
  321. * set kernel sp: ureg - ureg* - pc
  322. * done in 2 steps because R30 is not set
  323. * and the loader will make a literal
  324. */
  325. MOVW $((UREGADDR-2*BY2WD) & 0xffff0000), SP
  326. OR $((UREGADDR-2*BY2WD) & 0xffff), SP
  327. MOVW R26, 0x10(SP) /* user SP */
  328. MOVW R31, 0x28(SP)
  329. MOVW R30, 0x2C(SP)
  330. MOVW M(CAUSE), R26
  331. MOVW R(MACH), 0x3C(SP)
  332. MOVW R(USER), 0x40(SP)
  333. AND $(0xF<<2), R26
  334. SUB $(CSYS<<2), R26
  335. JAL saveregs(SB)
  336. MOVW $setR30(SB), R30
  337. SUBU $(UREGADDR-2*BY2WD-USERADDR), SP, R(USER)
  338. MOVW $MPID, R1
  339. MOVB 3(R1), R1
  340. MOVW $MACHADDR, R(MACH) /* locn of mach 0 */
  341. AND $7, R1
  342. SLL $PGSHIFT, R1
  343. ADDU R1, R(MACH) /* add offset for mach # */
  344. BNE R26, notsys
  345. JAL syscall(SB)
  346. MOVW 0x28(SP), R31
  347. MOVW 0x08(SP), R26
  348. MOVW 0x2C(SP), R30
  349. MOVW R26, M(STATUS)
  350. NOOP
  351. MOVW 0x0C(SP), R26 /* old pc */
  352. MOVW 0x10(SP), SP
  353. RFE (R26)
  354. notsys:
  355. JAL trap(SB)
  356. restore:
  357. JAL restregs(SB)
  358. MOVW 0x28(SP), R31
  359. MOVW 0x2C(SP), R30
  360. MOVW 0x3C(SP), R(MACH)
  361. MOVW 0x40(SP), R(USER)
  362. MOVW 0x10(SP), SP
  363. RFE (R26)
  364. waskernel:
  365. MOVW $1, R26 /* not sys call */
  366. MOVW SP, -0x90(SP) /* drop this if possible */
  367. SUB $0xA0, SP
  368. MOVW R31, 0x28(SP)
  369. JAL saveregs(SB)
  370. JAL trap(SB)
  371. JAL restregs(SB)
  372. MOVW 0x28(SP), R31
  373. ADD $0xA0, SP
  374. RFE (R26)
  375. TEXT saveregs(SB), $-4
  376. MOVW R1, 0x9C(SP)
  377. MOVW R2, 0x98(SP)
  378. ADDU $8, SP, R1
  379. MOVW R1, 0x04(SP) /* arg to base of regs */
  380. MOVW M(STATUS), R1
  381. MOVW M(EPC), R2
  382. MOVW R1, 0x08(SP)
  383. MOVW R2, 0x0C(SP)
  384. BEQ R26, return /* sys call, don't save */
  385. MOVW M(CAUSE), R1
  386. MOVW M(BADVADDR), R2
  387. MOVW R1, 0x14(SP)
  388. MOVW M(TLBVIRT), R1
  389. MOVW R2, 0x18(SP)
  390. MOVW R1, 0x1C(SP)
  391. MOVW HI, R1
  392. MOVW LO, R2
  393. MOVW R1, 0x20(SP)
  394. MOVW R2, 0x24(SP)
  395. /* LINK,SB,SP missing */
  396. MOVW R28, 0x30(SP)
  397. /* R27, R26 not saved */
  398. /* R25, R24 missing */
  399. MOVW R23, 0x44(SP)
  400. MOVW R22, 0x48(SP)
  401. MOVW R21, 0x4C(SP)
  402. MOVW R20, 0x50(SP)
  403. MOVW R19, 0x54(SP)
  404. MOVW R18, 0x58(SP)
  405. MOVW R17, 0x5C(SP)
  406. MOVW R16, 0x60(SP)
  407. MOVW R15, 0x64(SP)
  408. MOVW R14, 0x68(SP)
  409. MOVW R13, 0x6C(SP)
  410. MOVW R12, 0x70(SP)
  411. MOVW R11, 0x74(SP)
  412. MOVW R10, 0x78(SP)
  413. MOVW R9, 0x7C(SP)
  414. MOVW R8, 0x80(SP)
  415. MOVW R7, 0x84(SP)
  416. MOVW R6, 0x88(SP)
  417. MOVW R5, 0x8C(SP)
  418. MOVW R4, 0x90(SP)
  419. MOVW R3, 0x94(SP)
  420. return:
  421. RET
  422. TEXT restregs(SB), $-4
  423. /* LINK,SB,SP missing */
  424. MOVW 0x30(SP), R28
  425. /* R27, R26 not saved */
  426. /* R25, R24 missing */
  427. MOVW 0x44(SP), R23
  428. MOVW 0x48(SP), R22
  429. MOVW 0x4C(SP), R21
  430. MOVW 0x50(SP), R20
  431. MOVW 0x54(SP), R19
  432. MOVW 0x58(SP), R18
  433. MOVW 0x5C(SP), R17
  434. MOVW 0x60(SP), R16
  435. MOVW 0x64(SP), R15
  436. MOVW 0x68(SP), R14
  437. MOVW 0x6C(SP), R13
  438. MOVW 0x70(SP), R12
  439. MOVW 0x74(SP), R11
  440. MOVW 0x78(SP), R10
  441. MOVW 0x7C(SP), R9
  442. MOVW 0x80(SP), R8
  443. MOVW 0x84(SP), R7
  444. MOVW 0x88(SP), R6
  445. MOVW 0x8C(SP), R5
  446. MOVW 0x90(SP), R4
  447. MOVW 0x94(SP), R3
  448. MOVW 0x24(SP), R2
  449. MOVW 0x20(SP), R1
  450. MOVW R2, LO
  451. MOVW R1, HI
  452. MOVW 0x08(SP), R1
  453. MOVW 0x98(SP), R2
  454. MOVW R1, M(STATUS)
  455. NOOP
  456. MOVW 0x9C(SP), R1
  457. MOVW 0x0C(SP), R26 /* old pc */
  458. RET
  459. TEXT rfnote(SB), $0
  460. MOVW 0(FP), R26 /* 1st arg is &uregpointer */
  461. SUBU $(BY2WD), R26, SP /* pc hole */
  462. BNE R26, restore
  463. TEXT clrfpintr(SB), $0
  464. MOVW FCR31, R1
  465. MOVW R1, R2
  466. AND $~(0x3F<<12), R2
  467. MOVW R2, FCR31
  468. RET
  469. TEXT savefpregs(SB), $0
  470. MOVW M(STATUS), R3
  471. MOVW 0(FP), R1
  472. MOVW FCR31, R2
  473. MOVD F0, 0x00(R1)
  474. MOVD F2, 0x08(R1)
  475. MOVD F4, 0x10(R1)
  476. MOVD F6, 0x18(R1)
  477. MOVD F8, 0x20(R1)
  478. MOVD F10, 0x28(R1)
  479. MOVD F12, 0x30(R1)
  480. MOVD F14, 0x38(R1)
  481. MOVD F16, 0x40(R1)
  482. MOVD F18, 0x48(R1)
  483. MOVD F20, 0x50(R1)
  484. MOVD F22, 0x58(R1)
  485. MOVD F24, 0x60(R1)
  486. MOVD F26, 0x68(R1)
  487. MOVD F28, 0x70(R1)
  488. MOVD F30, 0x78(R1)
  489. MOVW R2, 0x80(R1)
  490. AND $~CU1, R3
  491. MOVW R3, M(STATUS)
  492. RET
  493. TEXT restfpregs(SB), $0
  494. MOVW M(STATUS), R3
  495. MOVW 0(FP), R1
  496. OR $CU1, R3
  497. MOVW R3, M(STATUS)
  498. MOVW 0x80(R1), R2
  499. MOVD 0x00(R1), F0
  500. MOVD 0x08(R1), F2
  501. MOVD 0x10(R1), F4
  502. MOVD 0x18(R1), F6
  503. MOVD 0x20(R1), F8
  504. MOVD 0x28(R1), F10
  505. MOVD 0x30(R1), F12
  506. MOVD 0x38(R1), F14
  507. MOVD 0x40(R1), F16
  508. MOVD 0x48(R1), F18
  509. MOVD 0x50(R1), F20
  510. MOVD 0x58(R1), F22
  511. MOVD 0x60(R1), F24
  512. MOVD 0x68(R1), F26
  513. MOVD 0x70(R1), F28
  514. MOVD 0x78(R1), F30
  515. MOVW R2, FCR31
  516. AND $~CU1, R3
  517. MOVW R3, M(STATUS)
  518. RET
  519. /*
  520. * we avoid using R4, R5, R6, and R7 so gotopc can call us without saving them
  521. */
  522. TEXT icflush(SB), $-4 /* icflush(physaddr, nbytes) */
  523. MOVW M(STATUS), R10
  524. MOVW 0(FP), R8
  525. MOVW 4(FP), R9
  526. MOVW $KSEG0, R3
  527. OR R3, R8
  528. MOVW $0, M(STATUS)
  529. MOVW $WBFLUSH, R1 /* wbflush */
  530. MOVW 0(R1), R1
  531. NOOP
  532. MOVW $KSEG1, R3
  533. MOVW $icflush0(SB), R2 /* make sure PC is in uncached address space */
  534. MOVW $(SWC|ISC), R1
  535. OR R3, R2
  536. JMP (R2)
  537. TEXT icflush0(SB), $-4
  538. MOVW R1, M(STATUS) /* swap and isolate cache, splhi */
  539. MOVW $icflush1(SB), R2
  540. JMP (R2)
  541. TEXT icflush1(SB), $-4
  542. _icflush1:
  543. MOVBU R0, 0x00(R8)
  544. MOVBU R0, 0x04(R8)
  545. MOVBU R0, 0x08(R8)
  546. MOVBU R0, 0x0C(R8)
  547. MOVBU R0, 0x10(R8)
  548. MOVBU R0, 0x14(R8)
  549. MOVBU R0, 0x18(R8)
  550. MOVBU R0, 0x1C(R8)
  551. MOVBU R0, 0x20(R8)
  552. MOVBU R0, 0x24(R8)
  553. MOVBU R0, 0x28(R8)
  554. MOVBU R0, 0x2C(R8)
  555. MOVBU R0, 0x30(R8)
  556. MOVBU R0, 0x34(R8)
  557. MOVBU R0, 0x38(R8)
  558. MOVBU R0, 0x3C(R8)
  559. SUB $0x40, R9
  560. ADD $0x40, R8
  561. BGTZ R9, _icflush1
  562. MOVW $icflush2(SB), R2 /* make sure PC is in uncached address space */
  563. OR R3, R2
  564. JMP (R2)
  565. TEXT icflush2(SB), $-4
  566. MOVW $0, M(STATUS) /* swap back caches, de-isolate them, and stay splhi */
  567. NOOP /* +++ */
  568. MOVW R10, M(STATUS)
  569. RET
  570. TEXT dcflush(SB), $-4 /* dcflush(physaddr, nbytes) */
  571. MOVW M(STATUS), R6
  572. MOVW 0(FP), R4
  573. MOVW 4(FP), R5
  574. MOVW $KSEG0, R3
  575. OR R3, R4
  576. MOVW $0, M(STATUS)
  577. MOVW $WBFLUSH, R1
  578. MOVW 0(R1), R1
  579. NOOP
  580. MOVW $ISC, R1
  581. MOVW R1, M(STATUS)
  582. _dcflush0:
  583. MOVBU R0, 0x00(R4)
  584. MOVBU R0, 0x04(R4)
  585. MOVBU R0, 0x08(R4)
  586. MOVBU R0, 0x0C(R4)
  587. MOVBU R0, 0x10(R4)
  588. MOVBU R0, 0x14(R4)
  589. MOVBU R0, 0x18(R4)
  590. MOVBU R0, 0x1C(R4)
  591. MOVBU R0, 0x20(R4)
  592. MOVBU R0, 0x24(R4)
  593. MOVBU R0, 0x28(R4)
  594. MOVBU R0, 0x2C(R4)
  595. MOVBU R0, 0x30(R4)
  596. MOVBU R0, 0x34(R4)
  597. MOVBU R0, 0x38(R4)
  598. MOVBU R0, 0x3C(R4)
  599. SUB $0x40, R5
  600. ADD $0x40, R4
  601. BGTZ R5, _dcflush0
  602. MOVW $0, M(STATUS)
  603. NOOP /* +++ */
  604. MOVW R6, M(STATUS)
  605. RET