All the CPUs that FreeBSD supports have hard floating point in them. We've supported hard float for quite some time in the FreeBSD kernel. However, by default, we still use a soft-float ABI. All the binaries use hardware floating point to do the math, but the calling conventions between routines passes the floating point values in integer registers to remain compatible with the soft-float libraries of the past. A new armv6hf was created, but that caused some issues with some ports, and the meaning of 'soft float' sadly was ambiguous between the soft-float ABI, and the soft-float libraries that implement floating point when there's no hardware FPU.
Over the spring and summer, I fixed ld.so so that it can load both soft ABI and hard ABI libraries on the same system, depending markings in the binaries themselves. Soft float ABI and hard float ABI binaries have different flags in the ELF headers, so it is relatively straight forward to know which is which. Over the summer, I committed changes to the kernel to pass the relevant flags from the header to user land (since for a variety of technical reasons, once you get to user land, it's impossible to open the binary you are executing in the general case). I had planned on committing the ld.so bits as well, but my job got busy and now it's winter.
So, in the coming days, I'll commit the first set of changes to move to armv6 as a hard float ABI by default. The kernel doesn't care: it can execute both. The new ld.so will allow you to transition through this change by allowing old, compat soft ABI libraries to co-exist on the system with new hard ABI libraries. This change alone isn't enough, but it will be good to get it out into circulation.
After that, a number of changes will follow. Similar to the LIB32 stuff for x86, mips and powerpc, there will be a LIBSOFT build that you can enable on armv6. This will create the libraries needed for the transition, and will be used if we need to generate compat binaries for this stuff (the hope is that the number of old binaries that need to run on the new system will be small enough that it can be treated as a special-needs case, not one that's needed by default). The normal armv6 build will switch to hard float ABI by default. armv6hf will remain in the build as a compatibility arch, and will be removed before FreeBSD 11 since it was never in FreeBSD 10 (and could never be in FreeBSD 10 due to compiler choices). TARGET_CPUTYPE will grow a new type or two for those folks with really special needs that need to generate wither soft-float libraries, or soft-float ABI libraries (and this will be the mechanism used to support LIBSOFT builds).
I've been experimenting with NanoBSD enhancements for embedded. Eventually, they will be in the mainline of NanoBSD, but for now I've segregated them in a separate embedded subdir. The goal is to drive creation of build-agnostic tools to help build images for the different systems that FreeBSD supports. I have a mix of embedded boards and qemu configurations. Many don't work, but I hit a milestone tonight. I was able to boot an image on my RPi built without privs using NanoBSD.
To try it out, you'll need to grab FreeBSD-current and from the top of the tree do
sh ../nanobsd.sh -c rpi.cfg
This will create a directory at the same level as your top level FreeBSD source called rpi-b. Under it will be obj/_.disk.image.rpi-b. You can dd this onto a SD card (any size) and boot it on your RPi-B. It will resize the last partition to span the rest of the disk on boot and be a generic system. There's still a few problems, and I'm still working out how to get packages onto the system at build time, but its useful enough that people may want to play with it. Enjoy.
P.S. Here's a dmesg from the boot:
U-Boot 2015.10 (Nov 09 2015 - 02:54:46 +0000) DRAM: 480 MiB RPI Model B rev2 MMC: bcm2835_sdhci: 0 reading uboot.env ** Unable to read "uboot.env" from mmc0:1 ** Using default environment In: serial Out: lcd Err: lcd Net: Net Initialization Skipped No ethernet found. reading uEnv.txt 0 bytes read in 9 ms (0 Bytes/s) Hit any key to stop autoboot: 0 starting USB... USB0: Core Release: 2.80a scanning bus 0 for devices... 3 USB Device(s) found scanning usb for storage devices... 0 Storage Device(s) found scanning usb for ethernet devices... 1 Ethernet Device(s) found Booting from: mmc 0 ubldr.bin reading ubldr.bin 214684 bytes read in 36 ms (5.7 MiB/s) ## No elf image at address 0x00200000 ## Starting application at 0x00200000 ... Consoles: U-Boot console Compatible U-Boot API signature found @1db474d0 FreeBSD/armv6 U-Boot loader, Revision 1.2 (imp@zooty, Wed Dec 23 17:23:10 MST 2015) DRAM: 480MB Number of U-Boot devices: 2 U-Boot env: loaderdev='mmc 0' Found U-Boot device: disk Checking unit=0 slice=
partition= ... good. Booting from disk0s3a: /boot/kernel/kernel text=0x587d2c data=0x54f24+0xe639c syms=[0x4+0xc6460+0x4+0x94335] Hit [Enter] to boot immediately, or any other key for command prompt. Booting [/boot/kernel/kernel]... Using DTB provided by U-Boot at address 0x100. Kernel entry at 0x400180... Kernel args: (null) KDB: debugger backends: ddb KDB: current backend: ddb Copyright (c) 1992-2015 The FreeBSD Project. Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994 The Regents of the University of California. All rights reserved. FreeBSD is a registered trademark of The FreeBSD Foundation. FreeBSD 11.0-CURRENT #0 r292645 0ff2d15e64f9+ qbase/qtip/rpi/tip: Wed Dec 23 17:29:02 MST 2015 imp@zooty:/usr/home/imp/FreeBSD/rpi-b/obj/arm.armv6/usr/home/imp/FreeBSD/head/sys/RPI-B arm FreeBSD clang version 3.7.0 (tags/RELEASE_370/final 246257) 20150906 VT: init without driver. sema_sysinit CPU: ARM1176JZ-S rev 7 (ARM11J core) Supported features: ARM_ISA THUMB2 JAZELLE ARMv4 Security_Ext WB enabled LABT branch prediction enabled 16KB/32B 4-way instruction cache 16KB/32B 4-way write-back-locking-C data cache real memory = 503312384 (479 MB) avail memory = 481800192 (459 MB) random: entropy device external interface kbd0 at kbdmux0 ofwbus0: simplebus0: mem 0x20000000-0x20ffffff on ofwbus0 cpulist0: on ofwbus0 cpu0: on cpulist0 bcm2835_cpufreq0: on cpu0 intc0: mem 0xb200-0xb3ff on simplebus0 systimer0: mem 0x3000-0x3fff irq 8,9,10,11 on simplebus0 Event timer "BCM2835-3" frequency 1000000 Hz quality 1000 Timecounter "BCM2835-3" frequency 1000000 Hz quality 1000 bcmwd0: mem 0x10001c-0x100027 on simplebus0 gpio0: mem 0x200000-0x2000af irq 57,59,58,60 on simplebus0 gpio0: read-only pins: 46-53. gpio0: reserved pins: 48-53. gpiobus0: on gpio0 gpioled0: at pin 16 on gpiobus0 gpioc0: on gpio0 iichb0: mem 0x205000-0x20501f irq 61 on simplebus0 iicbus0: on iichb0 iic0: on iicbus0 iichb1: mem 0x804000-0x80401f irq 61 on simplebus0 iicbus1: on iichb1 iic1: on iicbus1 spi0: mem 0x204000-0x20401f irq 62 on simplebus0 spibus0: on spi0 bcm_dma0: mem 0x7000-0x7fff,0xe05000-0xe05fff irq 24,25,26,27,28,29,30,31,32,33,34,35,36 on simplebus0 mbox0: mem 0xb880-0xb8bf irq 1 on simplebus0 sdhci_bcm0: mem 0x300000-0x3000ff irq 70 on simplebus0 mmc0: on sdhci_bcm0 uart0: mem 0x201000-0x201fff irq 65 on simplebus0 uart0: console (115200,n,8,1) vchiq0: mem 0xb800-0xb84f irq 2 on simplebus0 vchiq: local ver 8 (min 3), remote ver 8. pcm0: on vchiq0 bcm283x_dwcotg0: mem 0x980000-0x99ffff irq 17 on simplebus0 usbus0 on bcm283x_dwcotg0 fb0: on ofwbus0 fbd0 on fb0 VT: initialize with new VT driver "fb". fb0: 656x416(656x416@0,0) 24bpp fb0: fbswap: 0, pitch 1968, base 0x1e08c000, screen_size 818688 cryptosoft0: Timecounters tick every 10.000 msec IPsec: Initialized Security Association Processing. usbus0: 480Mbps High Speed USB v2.0 bcm2835_cpufreq0: ARM 700MHz, Core 250MHz, SDRAM 400MHz, Turbo OFF ugen0.1: at usbus0 uhub0: on usbus0 mmc0: CMD8 failed, RESULT: 1 mmcsd0: 513MB at mmc0 41.6MHz/4bit/65535-block Trying to mount root from ufs:/dev/mmcsd0s3a [ro]... warning: no time-of-day clock registered, system time will not be set accurately uhub0: 1 port with 1 removable, self powered ugen0.2: at usbus0 uhub1: on usbus0 uhub1: MTT enabled uhub1: 3 ports with 2 removable, self powered random: unblocking device. ugen0.3: at usbus0 smsc0: on usbus0 smsc0: chip 0xec00, rev. 0002 miibus0: on smsc0 ukphy0: PHY 1 on miibus0 ukphy0: none, 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto ue0: on smsc0 ue0: Ethernet address: b8:27:eb:f1:62:e6 /etc/rc.conf: 1.freebsd.pool.ntp.org: not found Growing root partition to fill device GEOM_PART: mmcsd0s3 was automatically resized. Use `gpart commit mmcsd0s3` to save changes or `gpart undo mmcsd0s3` to revert them. mmcsd0s3 resized mmcsd0s3a resized super-block backups (for fsck_ffs -b #) at: 556192, 667424, 778656 /etc/rc: WARNING: hostid: unable to figure out a UUID from DMI data, generating a new one Setting hostuuid: 901c1969-a9d5-11e5-996d-b827ebf162e6. Setting hostid: 0x45acda89. No suitable dump device was found. Starting file system checks: /dev/mmcsd0s3a: FILE SYSTEM CLEAN; SKIPPING CHECKS /dev/mmcsd0s3a: clean, 181490 free (26 frags, 22683 blocks, 0.0% fragmentation) /dev/mmcsd0s2: FILE SYSTEM CLEAN; SKIPPING CHECKS /dev/mmcsd0s2: clean, 32726 free (6 frags, 4090 blocks, 0.0% fragmentation) Mounting local file systems:. Setting hostname: nanobsd-rpi-b. Setting up harvesting:[UMA],[FS_ATIME],SWI,INTERRUPT,NET_NG,NET_ETHER,NET_TUN,MOUSE,KEYBOARD,ATTACH,CACHED Feeding entropy:eval: cannot create /boot/entropy: Read-only file system smsc0: chip 0xec00, rev. 0002 ue0: link state changed to DOWN ue0: link state changed to UP Starting Network: lo0 ue0. lo0: flags=8049 metric 0 mtu 16384 options=600003 inet6 ::1 prefixlen 128 inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 inet 127.0.0.1 netmask 0xff000000 groups: lo nd6 options=21 ue0: flags=8843 metric 0 mtu 1500 options=80009 ether b8:27:eb:f1:62:e6 media: Ethernet autoselect (100baseTX ) status: active nd6 options=29 /etc/rc.conf: 1.freebsd.pool.ntp.org: not found ELF ldconfig path: /lib /usr/lib /usr/lib/compat Starting devd. /etc/rc.conf: 1.freebsd.pool.ntp.org: not found /etc/rc.conf: 1.freebsd.pool.ntp.org: not found /etc/rc.conf: 1.freebsd.pool.ntp.org: not found Starting dhclient. DHCPDISCOVER on ue0 to 255.255.255.255 port 67 interval 5 DHCPOFFER from 10.0.0.5 DHCPREQUEST on ue0 to 255.255.255.255 port 67 DHCPACK from 10.0.0.5 bound to 10.0.0.65 -- renewal in 3600 seconds. add net fe80::: gateway ::1 add net ff02::: gateway ::1 add net ::ffff:0.0.0.0: gateway ::1 add net ::0.0.0.0: gateway ::1 Generating host.conf. /etc/rc.conf: 1.freebsd.pool.ntp.org: not found Creating and/or trimming log files. Starting syslogd. Setting date via ntp. 24 Dec 01:06:34 ntpdate: step time server 22.214.171.124 offset 2122.146331 sec Starting casperd. Clearing /tmp (X related). Updating motd:. Mounting late file systems:. Configuring vt: blanktime. Starting cron. /etc/rc.conf: 1.freebsd.pool.ntp.org: not found Starting background file system checks in 60 seconds. override rw-rw-r-- 730/730 for /firstboot? Thu Dec 24 01:06:47 UTC 2015 FreeBSD/arm (nanobsd-rpi-b) (ttyu0) login: root Dec 24 01:06:50 nanobsd-rpi-b login: ROOT LOGIN (root) ON ttyu0 FreeBSD 11.0-CURRENT (RPI-B) #0 r292645 0ff2d15e64f9+ qbase/qtip/rpi/tip: Wed Dec 23 17:29:02 MST 2015 Welcome to FreeBSD! Release Notes, Errata: https://www.FreeBSD.org/releases/ Security Advisories: https://www.FreeBSD.org/security/ FreeBSD Handbook: https://www.FreeBSD.org/handbook/ FreeBSD FAQ: https://www.FreeBSD.org/faq/ Questions List: https://lists.FreeBSD.org/mailman/listinfo/freebsd-questions/ FreeBSD Forums: https://forums.FreeBSD.org/ Documents installed with the system are in the /usr/local/share/doc/freebsd/ directory, or can be installed later with: pkg install en-freebsd-doc For other languages, replace "en" with a language code like de or fr. Show the version of FreeBSD installed: freebsd-version ; uname -a Please include that output and any error messages when posting questions. Introduction to manual pages: man man FreeBSD directory layout: man hier Edit /etc/motd to change this login announcement. root@nanobsd-rpi-b:~ # mount -uw / root@nanobsd-rpi-b:~ # rm /firstboot root@nanobsd-rpi-b:~ # uname -a FreeBSD nanobsd-rpi-b 11.0-CURRENT FreeBSD 11.0-CURRENT #0 r292645 0ff2d15e64f9+ qbase/qtip/rpi/tip: Wed Dec 23 17:29:02 MST 2015 imp@zooty:/usr/home/imp/FreeBSD/rpi-b/obj/arm.armv6/usr/home/imp/FreeBSD/head/sys/RPI-B arm root@nanobsd-rpi-b:~ # uptime 1:07AM up 1 min, 1 users, load averages: 0.87, 0.39, 0.16 root@nanobsd-rpi-b:~ # ifconfig lo0: flags=8049 metric 0 mtu 16384 options=600003 inet6 ::1 prefixlen 128 inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 inet 127.0.0.1 netmask 0xff000000 groups: lo nd6 options=21 ue0: flags=8843 metric 0 mtu 1500 options=80009 ether b8:27:eb:f1:62:e6 inet 10.0.0.65 netmask 0xffffff00 broadcast 10.0.0.255 media: Ethernet autoselect (100baseTX ) status: active nd6 options=29 root@nanobsd-rpi-b:~ # ntpdate 0.freebsd.pool.ntp.org load: 0.48 cmd: ntpdate 671 [select] 8.16r 0.05u 0.04s 0% 3112k 24 Dec 01:07:44 ntpdate: adjust time server 126.96.36.199 offset 0.001943 sec root@nanobsd-rpi-b:~ # exit logout FreeBSD/arm (nanobsd-rpi-b) (ttyu0) login: