xref: /plan9/sys/src/9/rb/notes/9rb.ms (revision f43f8ee646e2cb29aea7fd7bb5fc7318a3f4921f)
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