few updates to this great works. to run FULL FreeBSD with only kernel in builtin flash things below are useful: 0) add options NBUF=100 or so to kernel config, default buffer allocation scheme are excessive. 1) changes to hints for geom_map: hint.map.0.at="flash/spi0" hint.map.0.start=0x00000000 hint.map.0.end=0x000020000 hint.map.0.name="uboot" hint.map.0.readonly=1 hint.map.1.at="flash/spi0" hint.map.1.start=0x00020000 hint.map.1.end=0x0007F0000 hint.map.1.name="kernel" hint.map.1.readonly=0 hint.map.2.at="flash/spi0" hint.map.2.start=0x007f0000 hint.map.2.end=0x00800000 hint.map.2.name="art" hint.map.2.readonly=1 now kernel can be loaded and updated to flash from within system, while overwriting uboot and radio calibration data is forbidden. 2) simple script to convert kernel to uboot image without any rootfs (based on Adrian Chadd toolset for building images for many routers): #!/bin/sh strip -o /tmp/kernel /boot/kernel/kernel gzip /tmp/kernel echo -n ' ' >/tmp/rootfs mktplinkfw -B TL-WR1043NDv1 -L 0x80050000 -E 0x80050100 -R 0x007EFFFF \ -k /tmp/kernel.gz -N FreeBSD -V FreeBSD-10 -r /tmp/rootfs -o /tmp/kernel.flash rm /tmp/rootfs /tmp/kernel.gz echo /tmp/kernel.flash now is ready to be written to /dev/map/kernel this script can be used both from inside router or when crossbuilding kernel. 3) to write it to flash first time to router use information as on Adrian Chadd webpages. to update kernel from within TPLINK do dd if=/tmp/kernel.flash of=/dev/map/kernel bs=64k and reboot