Re: Porting to my custom 030 board
Jason Thorpe <[email protected]> Wed, 1 Oct 2025 11:19:32 -0700
| Newsgroups | gmane.os.netbsd.ports.m68k |
|---|---|
| Message-ID | <[email protected]> |
> On Oct 1, 2025, at 10:54=E2=80=AFAM, Izumi Tsutsui = <[email protected]> wrote: >=20 > 680x0 has so flexible MMU settings that it's a bit hard to see how > differences are handled among all ports, but we have to check the > following points: >=20 > - physical memory mappings (especially whether VA=3D=3DPA for RAMs) > - how MMU should be set up (especially when VA !=3D PA) > - how devices (especially serial console device) should be mapped > (PTE via 030 MMU, or TT0/TT1 mappings) >=20 > - mvme68k, news68k, and x68k use PA=3D=3DVA mappings (i.e. RAM starts = at 0x0) Add virt68k to that list. (My homebrew does the same, but it has RAM in = 2 locations -- DRAM at $0000.0000 and a 4MB block of fast SRAM at = $FE00.0000, and the system controller only maps the boot ROM at = $0000.0000 for the first 4 bus cycles after a reset.) > - hp300 has a bit weird PA !=3D VA mappings, so it prepares a special = page > where PA =3D=3D VA to turn MMU on: > https://mail-index.netbsd.org/tech-kern/1999/05/26/0015.html hp300 is very weird in this regard, indeed. The start of physical RAM = varies based on the RAM size, and it always ends at the end of the = physical address space. I guess it was easiest to just leave the boot = ROM always mapped at $0000.0000? > - next68k has RAM from 0x40000000 so it uses temporary TT0/TT1 = mappings > to turn MMU on > - x68k has optional "extended memory" mapped at PA >0x01000000 so > initialization is a bit complicated: > = https://github.com/NetBSD/src/blob/netbsd-11/sys/arch/x68k/x68k/machdep.c#= L1069-L1083 >=20 > - mac68k is a bit difficult to read because it has many hacks > for Apple hardware (and MacOS Booter) >=20 > - cesfic may be a similar port as a simple embeded board, but it has > many leftover lines in various sources taken from hp300 Yes, cesfic could use quite a bit of cleanup, and should probably not be = used as an example. > - luna68k uses TT0/TT1 to map sparse device space = (0x40000000-0xFFFFFFFF): > = https://github.com/NetBSD/src/blob/netbsd-11/sys/arch/luna68k/luna68k/loco= re.s#L255-L261 > = https://github.com/NetBSD/src/blob/netbsd-11/sys/arch/luna68k/include/pmap= .h >=20 > - amiga and atari have a bit different initialization functions due to > historical reasons > (though they use a common "4.4BSD/hp300 derived" pmap: > = https://github.com/NetBSD/src/blob/netbsd-11/sys/arch/amiga/amiga/amiga_in= it.c#L198-L792 > = https://github.com/NetBSD/src/blob/netbsd-11/sys/arch/atari/atari/atari_in= it.c#L197-L691 The Amiga and Atari ports also have their own flavor of some 68040 and = 68060 trap handling. This is because the Amiga port grew its own 68040 = code before the hp300 port got it from Hibler via a 4.4BSDLite update. > - sun68k (sun3 and sun3x) uses completely different MMU settings > - sun3 uses Sun specific MMU, and sun3x uses full 3-level 030 MMU >=20 > - other NetBSD/m68k ports use 2-level MMU: > = https://github.com/NetBSD/src/blob/netbsd-11/sys/arch/m68k/include/pmap_mo= torola.h#L115-L138 > - NetBSD/m68k uses "incomplete (or faked)" 3-level MMU for 040/060 > (use one page for first and second level tables; see = pmap_bootstrap.c) The reason the shared pmap (a.k.a. the "Hibler" pmap) forces the 2-level = system is to accommodate the HP MMU found on the 9000/320 and 9000/350. = It's essentially a crippled 68851 clone and only does 2-level tables and = doesn't support some of the other 68851 features. That said, for 68020 / 68030, the Hibler pmap is fine, and the most = annoying bit is having to craft up a pmap_boostrap() routine. 99.7% of = it will be more-or-less the same as some other port's, but figuring out = that last 0.3% tweak was honestly the single most difficult task of the = virt68k port. > - you also have to prepare kernel config files under > sys/arch/${MACHINE}/conf, but maybe we can copy from the similar port >=20 > Anyway, we should check "start" function in locore.s to see > how early bootstrap initialization should be done: > = https://github.com/NetBSD/src/blob/netbsd-11/sys/arch/news68k/news68k/loco= re.s#L118-L434 I've been trying to harmonize a bunch of that early startup code for the = VA=3D=3DPA platforms, but there's still a little ways to go. > Next, we have to check pmap_bootstrap.c (called during the above = "start") > to set up segment tables and page tables for kernel, RAM, and devices = etc. > = https://github.com/NetBSD/src/blob/netbsd-11/sys/arch/news68k/news68k/pmap= _bootstrap.c >=20 > It's a bit annoying to set up serial console before MMU turned on, > but if your board has debug LEDs mapped somewhere we can use it for = debug: > = https://github.com/NetBSD/src/blob/netbsd-11/sys/arch/news68k/news68k/loco= re.s#L83-L93 >=20 > Note the most important thing is "how to load your custom kernel = binary > into the memory" and "how to jump to the loaded kernel." > Maybe you can use "objcopy -O binary" to get a raw kernel binary, > but it depends on your board firmware features. >=20 > I started porting NetBSD/news68k around 19990506, and got > a linked kernel on 19990530, then "kernel printf(9)" via > serial console worked (using NEWS-OS bootloader) on 19990603. >=20 > Good luck, > --- > Izumi Tsutsui -- thorpej