1*f43f8ee6SDavid du Colombier.FP palatino 2*f43f8ee6SDavid du Colombier.TM 3*f43f8ee6SDavid du Colombier.TL 4*f43f8ee6SDavid du ColombierPlan 9 on the Mikrotik RB450G Routerboard 5*f43f8ee6SDavid du Colombier.AU 6*f43f8ee6SDavid du ColombierGeoff Collyer 7*f43f8ee6SDavid du Colombier.AI 8*f43f8ee6SDavid du Colombier.MH 9*f43f8ee6SDavid du Colombier.NH 1 10*f43f8ee6SDavid du ColombierMotivation 11*f43f8ee6SDavid du Colombier.LP 12*f43f8ee6SDavid du ColombierI ported Plan 9 to the Routerboard mainly to verify 13*f43f8ee6SDavid du Colombierthat Plan 9's MIPS-related code 14*f43f8ee6SDavid du Colombier(compiler, assembler, loader, 15*f43f8ee6SDavid du Colombier.CW libmach , 16*f43f8ee6SDavid du Colombieretc.) was still in working order and would 17*f43f8ee6SDavid du Colombierwork on newer machines than the 1993-era ones that we last owned 18*f43f8ee6SDavid du Colombier(MIPS Magnum, SGI Challenge, Carrera and the like). 19*f43f8ee6SDavid du ColombierThe verdict is that, 20*f43f8ee6SDavid du Colombierwith a few surprising exceptions, the code still works on newish machines 21*f43f8ee6SDavid du Colombier(the MIPS 24K CPU in the Routerboard dates to about 2003 originally; 22*f43f8ee6SDavid du Colombierthis revision is from about 2005). 23*f43f8ee6SDavid du ColombierSo we now have a 24*f43f8ee6SDavid du Colombiermachine on which to test MIPS executables. 25*f43f8ee6SDavid du Colombier.LP 26*f43f8ee6SDavid du ColombierThe other reason I did the port was 27*f43f8ee6SDavid du Colombieras an incremental step toward 28*f43f8ee6SDavid du Colombierrunning Plan 9 on a MIPS64 machine (e.g., the dual-core, dual-issue 29*f43f8ee6SDavid du ColombierCavium CN5020 in the Ubiquiti Edgerouter Lite 3). 30*f43f8ee6SDavid du Colombier.NH 1 31*f43f8ee6SDavid du ColombierThe new MIPS world 32*f43f8ee6SDavid du Colombier.LP 33*f43f8ee6SDavid du ColombierThese newer MIPS systems are aimed at embedded applications, so they 34*f43f8ee6SDavid du Colombiertypically lack FPUs and may also lack L2 caches or have small TLBs; 35*f43f8ee6SDavid du Colombierthe MIPS 24K in the Atheros 7161 SoC lacks FPU and L2 cache, and has a 36*f43f8ee6SDavid du Colombier16-entry TLB. 37*f43f8ee6SDavid du ColombierIt is a MIPS32R2 architecture system and lacks the 64-bit instructions 38*f43f8ee6SDavid du Colombierof the R4000. 39*f43f8ee6SDavid du ColombierThese new MIPS systems are still big-endian, 40*f43f8ee6SDavid du Colombierso provide a useful test case to expose byte-ordering bugs. 41*f43f8ee6SDavid du Colombier.NH 1 42*f43f8ee6SDavid du ColombierPlan 9 changes and additions 43*f43f8ee6SDavid du Colombier.NH 2 44*f43f8ee6SDavid du ColombierCPU Bug Workarounds 45*f43f8ee6SDavid du Colombier.LP 46*f43f8ee6SDavid du ColombierThe Linux MIPS people cite MIPS 24K erratum 48: 47*f43f8ee6SDavid du Colombier3 consecutive stores lose data. 48*f43f8ee6SDavid du ColombierMIPS only distribute their errata lists under NDA and to their 49*f43f8ee6SDavid du Colombiercorporate partners, so we have only the Linux report to go on. 50*f43f8ee6SDavid du ColombierThe fix requires 51*f43f8ee6SDavid du Colombier.I both 52*f43f8ee6SDavid du Colombierwrite-through data cache and 53*f43f8ee6SDavid du Colombierno more than two consecutive single-word stores in all executables. 54*f43f8ee6SDavid du ColombierI have made a crude optional change to 55*f43f8ee6SDavid du Colombier.I vl 56*f43f8ee6SDavid du Colombierto generate a NOP before every third consecutive store. 57*f43f8ee6SDavid du ColombierThe fix could be better, in particular the technique for 58*f43f8ee6SDavid du Colombierkeeping stores out of branch delay slots. 59*f43f8ee6SDavid du Colombier.NH 2 60*f43f8ee6SDavid du ColombierDriver for Undocumented Ethernet Controller 61*f43f8ee6SDavid du Colombier.LP 62*f43f8ee6SDavid du ColombierThe FreeBSD Atheros 63*f43f8ee6SDavid du Colombier.I arge 64*f43f8ee6SDavid du Colombierdriver 65*f43f8ee6SDavid du Colombier(in 66*f43f8ee6SDavid du Colombier.CW /usr/src/sys/mips/atheros ) 67*f43f8ee6SDavid du Colombierprovided inspiration for our Gigabit Ethernet driver, since the 68*f43f8ee6SDavid du Colombierhardware is otherwise largely undocumented. 69*f43f8ee6SDavid du ColombierI haven't got the second 70*f43f8ee6SDavid du ColombierEthernet controller entirely working yet; 71*f43f8ee6SDavid du Colombierit's perhaps complicated by having a switch attached to it (the Atheros 8316). 72*f43f8ee6SDavid du ColombierAt minimum, it probably needs MII or PHY initialisation. 73*f43f8ee6SDavid du Colombier.NH 2 74*f43f8ee6SDavid du ColombierFloating-point Emulation 75*f43f8ee6SDavid du Colombier.LP 76*f43f8ee6SDavid du ColombierFloating-point emulation works but is 77*f43f8ee6SDavid du Colombier.I very 78*f43f8ee6SDavid du Colombierslow: 79*f43f8ee6SDavid du Colombier.I astro 80*f43f8ee6SDavid du Colombiertakes about 8 seconds. 81*f43f8ee6SDavid du ColombierI added an 82*f43f8ee6SDavid du Colombier.CW fpemudebug 83*f43f8ee6SDavid du Colombiercommand to 84*f43f8ee6SDavid du Colombier.CW /dev/archctl ; 85*f43f8ee6SDavid du Colombierit 86*f43f8ee6SDavid du Colombiertakes a number as argument corresponding to the 87*f43f8ee6SDavid du Colombier.CW Dbg* 88*f43f8ee6SDavid du Colombierbits in 89*f43f8ee6SDavid du Colombier.CW fpimips.c , 90*f43f8ee6SDavid du Colombierbut requires the kernel to be compiled with 91*f43f8ee6SDavid du Colombier.CW FPEMUDEBUG 92*f43f8ee6SDavid du Colombierdefined. 93*f43f8ee6SDavid du Colombier.NH 3 94*f43f8ee6SDavid du Colombier\&... in Locking Code 95*f43f8ee6SDavid du Colombier.LP 96*f43f8ee6SDavid du ColombierThe big surprises included that 97*f43f8ee6SDavid du Colombier.CW /sys/src/libc/mips/lock.c 98*f43f8ee6SDavid du Colombierread 99*f43f8ee6SDavid du Colombier.CW FCR0 100*f43f8ee6SDavid du Colombierto 101*f43f8ee6SDavid du Colombierchoose the locking style. 102*f43f8ee6SDavid du ColombierThat's been broken out into 103*f43f8ee6SDavid du Colombier.CW c_fcr0.s 104*f43f8ee6SDavid du Colombierso that we can change it, but the kernel also emulates the 105*f43f8ee6SDavid du Colombier.CW MOVW 106*f43f8ee6SDavid du Colombier.CW FCR0,R1 107*f43f8ee6SDavid du Colombier(and via a fast code path), to keep alive the possibility of running 108*f43f8ee6SDavid du Colombierold binaries from the dump. 109*f43f8ee6SDavid du Colombier.NH 2 110*f43f8ee6SDavid du ColombierNo 64-bit Instructions 111*f43f8ee6SDavid du Colombier.LP 112*f43f8ee6SDavid du ColombierThe other big surprise was that 113*f43f8ee6SDavid du Colombier.CW /sys/src/libmp/mips/mpdigdiv.s 114*f43f8ee6SDavid du Colombierused 64-bit instructions (SLLV, SRLV, ADDVU, DIVVU). 115*f43f8ee6SDavid du ColombierFor now I've resolved the problem by pushing it into a 116*f43f8ee6SDavid du Colombiersubdirectory (\c 117*f43f8ee6SDavid du Colombier.CW r4k ) 118*f43f8ee6SDavid du Colombierand editing the 119*f43f8ee6SDavid du Colombier.CW mkfile s 120*f43f8ee6SDavid du Colombierto use the 121*f43f8ee6SDavid du Colombier.CW port 122*f43f8ee6SDavid du Colombierversion 123*f43f8ee6SDavid du Colombier(and similarly in APE). 124*f43f8ee6SDavid du Colombier.br 125*f43f8ee6SDavid du Colombier.ne 8 126*f43f8ee6SDavid du Colombier.NH 2 127*f43f8ee6SDavid du ColombierPage Size vs TLB Faults 128*f43f8ee6SDavid du Colombier.LP 129*f43f8ee6SDavid du ColombierI started out with a 4K page size and reduced the number of TLB 130*f43f8ee6SDavid du Colombierentries reserved for the kernel to 2, leaving 14 for user programs, 131*f43f8ee6SDavid du Colombierbut 132*f43f8ee6SDavid du Colombier.CW /dev/sysstat 133*f43f8ee6SDavid du Colombierwas reporting 6 times as many TLB faults as page 134*f43f8ee6SDavid du Colombierfaults, and the number increased at a furious rate. 135*f43f8ee6SDavid du Colombier.LP 136*f43f8ee6SDavid du ColombierSo I switched to 137*f43f8ee6SDavid du Colombiera 16K page size, adjusted 138*f43f8ee6SDavid du Colombier.CW vl 139*f43f8ee6SDavid du Colombier.CW -H2 140*f43f8ee6SDavid du Colombieraccordingly and recompiled the 141*f43f8ee6SDavid du Colombier.CW /mips 142*f43f8ee6SDavid du Colombierworld. 143*f43f8ee6SDavid du ColombierThis reduced the TLB faults to just 10% more than the number of page faults. 144*f43f8ee6SDavid du Colombier(That number is now around 15% more, due to a better soft-TLB hash function 145*f43f8ee6SDavid du Colombierthat makes the soft TLB more effective.) 146*f43f8ee6SDavid du Colombier16K pages also produce consecutive (even recursive) page faults 147*f43f8ee6SDavid du Colombierfor the same address at the same PC 148*f43f8ee6SDavid du Colombierand the system runs at about 10% of its normal speed, 149*f43f8ee6SDavid du Colombierso 4K pages are currently the only sensible choice; 150*f43f8ee6SDavid du Colombierwe'll just live with the absurdly-high number of TLB faults 151*f43f8ee6SDavid du Colombier(around 20k–30k per second). 152*f43f8ee6SDavid du ColombierIt probably doesn't help that one 16K page is half of the L1 data cache 153*f43f8ee6SDavid du Colombierand one quarter of the L1 instruction cache. 154*f43f8ee6SDavid du Colombier.LP 155*f43f8ee6SDavid du ColombierPage size is controlled by 156*f43f8ee6SDavid du Colombier.CW BIGPAGES 157*f43f8ee6SDavid du Colombierin 158*f43f8ee6SDavid du Colombier.CW mem.h . 159*f43f8ee6SDavid du Colombier.NH 3 160*f43f8ee6SDavid du ColombierCombined TLB Pool 161*f43f8ee6SDavid du Colombier.LP 162*f43f8ee6SDavid du ColombierI also changed 163*f43f8ee6SDavid du Colombier.CW mmu.c 164*f43f8ee6SDavid du Colombierto collapse the separate kernel and user TLB pools into one, 165*f43f8ee6SDavid du Colombieronce user processes start running, 166*f43f8ee6SDavid du Colombierbut that only helps to reduce TLB faults a little. 167*f43f8ee6SDavid du Colombier. 168*f43f8ee6SDavid du Colombier.br 169*f43f8ee6SDavid du Colombier.ne 8 170*f43f8ee6SDavid du Colombier. 171*f43f8ee6SDavid du Colombier.NH 1 172*f43f8ee6SDavid du ColombierRemaining Problems 173*f43f8ee6SDavid du Colombier.LP 174*f43f8ee6SDavid du ColombierInterrupt-driven UART output isn't quite right. 175*f43f8ee6SDavid du ColombierIt can get stuck and then input makes it resume. 176*f43f8ee6SDavid du ColombierThe UART is apparently connected via the APB and requires 177*f43f8ee6SDavid du Colombierinterrupt unmasking in the APB (which we now do). 178*f43f8ee6SDavid du ColombierThere's some kludgey stuff in 179*f43f8ee6SDavid du Colombier.CW uarti8250.c 180*f43f8ee6SDavid du Colombierthat makes output work most of the time 181*f43f8ee6SDavid du Colombier(characters do sometimes get dropped). 182*f43f8ee6SDavid du Colombier.LP 183*f43f8ee6SDavid du ColombierThe Ethernet driver currently does not 184*f43f8ee6SDavid du Colombierdig out the MAC addresses from the hardware, 185*f43f8ee6SDavid du Colombierso you'll need to edit the 186*f43f8ee6SDavid du Colombier.CW rb 187*f43f8ee6SDavid du Colombierconfiguration file for each Routerboard; the format should be obvious. 188*f43f8ee6SDavid du ColombierI don't have the stomach to dig the MAC address out of the hardware 189*f43f8ee6SDavid du Colombiervia SPI or whatever vile interface it requires. 190