Building FreeBSD-MIPS

You will need the proper MACHINE_ARCH that encodes ABI and endian information. Please see the following table for which to select. For 32-bit MIPS platforms (or to run a 32-bit kernel on a 64-bit CPU) use mipsel or mips, while 64-bit MIPS platforms will use mips64el or mips64. The 'el' variety is used for machines with little endian byte order, while big endian byte order is implicit otherwise.

Byte ABI
Order o32 n32 n64
Little mipsel mipsn32el mips64el
Big mips mipsn32 mips64

You will set TARGET to 'mips' below and TARGET_ARCH to the entry from the table above.

Here are a few examples of TARGET_ARCH:

System TARGET_ARCH System endianness and ABI
MALTA (gxemul) mipsel o32 little endian
rt305x mipsel o32 little endian
AR71xx/AR93xx mips o32 big endian
Octeon/ERL mips64 n64 big endian

Choose the kernel you want to build and then use something like this script (the omissions are for size or speed of build reasons only):

#!/bin/csh

setenv SRCROOT /home/gonzo/FreeBSD/svn/mips
setenv TARGET mips
setenv TARGET_ARCH mipsel
# not used:
# setenv TARGET_CPUTYPE mips32
setenv KERNCONF MALTA
setenv MAKEOBJDIRPREFIX /home/gonzo/FreeBSD/obj/mips
set NFSROOT=/home/gonzo/FreeBSD/nfsroot
set TFTPBOOT=/tftpboot

# Select some subset: the following used to be good, but now isn't
# set MAKEFLAGS=(-DWITHOUT_CDDL           \
#                -DWITHOUT_GAMES         \
#                -DWITHOUT_DOCS          \
#                -DWITHOUT_ACPI          \
#                -DWITHOUT_KERBEROS      \
#                -DWITHOUT_RESCUE        \
#                -DWITHOUT_MAN           \
#                -DWITHOUT_PROFILE       \
#                -DWITHOUT_BSNMP         \
#                -DWITHOUT_NIS           \
#                -DWITHOUT_IPX           \
#                -DWITHOUT_ATM)

cd ${SRCROOT}
make ${MAKEFLAGS} kernel-toolchain
make ${MAKEFLAGS} buildkernel
make ${MAKEFLAGS} DESTDIR=${TFTPBOOT} installkernel
make ${MAKEFLAGS} buildworld

sudo -E make DESTDIR=${NFSROOT} ${MAKEFLAGS} installworld
sudo -E make DESTDIR=${NFSROOT} ${MAKEFLAGS} distribution

There is no ready-for-use firmware yet so you'll need either netboot your board and mount root over NFS. Or build disk image for emulator (like gxemul).

  • Setup isc-dhcpd and add entry for board (config courtesy of Andrew Thompson)
subnet 192.168.10.0 netmask 255.255.255.0 {
	deny unknown-clients;
	option routers 192.168.10.1;
	option root-path "192.168.10.196:/src/nfsroot";
	# tftp server address and kernel path
	next-server 192.168.10.196;
	filename "kernel";
}

host mips {
	hardware ethernet 00:15:6d:c1:28:2e;	# the mac address of the board
	fixed-address 192.168.10.x;		# pick an unused address
}
  • Enable tftpd in inetd.conf, modify -s parameter to point to directory with MIPS kernels and restart inetd
tftp    dgram   udp     wait    root    /usr/libexec/tftpd      tftpd -l -s /src/FreeBSD/tftpboot
  • Add $DESTDIR entry to /etc/exports
$DESTDIR -maproot=root -network 192.168.10/24
  • Add root fs to $DESTDIR/etc/fstab
192.168.10.196:/src/nfsroot     /       nfs     rw      0       0
  • Enable mountd/nfsd (and optionally rpc.statd/rpc.lockd) in /etc/rc.conf and start them
rpcbind_enable="YES"
rpc_statd_enable="YES"
rpc_lockd_enable="YES"
nfs_server_enable="YES"
mountd_enable="YES"
  • Add line for root fs to $DESTDIR/etc/fstab
  • Build proper image using makefs tool (sysutils/makefs):
makefs mips.img $DESTDIR
  • Boot gxemul (with GXEMUL kernel configuration):
gxemul -E oldtestmips -d i:/path/to/mips.img /path/to/kernel
  • Boot gxemul (with Malta kernel configuration):
gxemul -e malta -d i:/path/to/mips.img -C 4Kc /path/to/kernel
  • buildingmips.txt
  • Last modified: 2026/10/12 10:55
  • (external edit)