Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 9 Oct 2020 01:57:22 +0200
From:      Marcin Wojtas <mw@semihalf.com>
To:        freebsd-arm <freebsd-arm@freebsd.org>
Subject:   ARMv7 without VFP
Message-ID:  <CAPv3WKeJH8CCa9U8r6mXXmCunqdJAYzxZb77F1dq23pqSUnb1A@mail.gmail.com>

next in thread | raw e-mail | index | archive | help
Hi,

We have a CA9-based SoC that for some reason does not support the VFP
and would like to run the OS on stable/12. Disabling the VFP in the
kernel options (or adding the detection of the feature in runtime)
seems to work fine, but it turned out the biggest obstacle is trying
to force the userspace to use the softfloat libc callbacks (in theory
soft-/hard- float usage should be resolved dynamically by linking the
proper functions in libc - so far we found no way to compile it
successfully though with the standard toolchain). Other approaches to
hardcode the softfloat userspace have failed so far. Details can be
found below.

Is there any known way to compile the userspace that may work with the
soft-float on armv7?

Details:
When booting without VFP there is a problem with almost every process
receiving SIGILL signals. Core dumps and disassembly proved that the illegal
instructions are associated with hardware FPU. The kernel seems to run
fine otherwise.

1. When building world with option CPUTYPE=soft, libc cannot be linked properly
due to lack of _aeabi*

--- all_subdir_sbin ---
ld: error: /usr/home/dgr/src/freebsd-src-obj/usr/home/dgr/src/src/stable12/arm.armv7/tmp/lib/libc.so.7:
undefined reference to __aeabi_f2iz_vfp
ld: error: /usr/home/dgr/src/freebsd-src-obj/usr/home/dgr/src/src/stable12/arm.armv7/tmp/lib/libc.so.7:
undefined reference to __aeabi_fadd_vfp
ld: error: /usr/home/dgr/src/freebsd-src-obj/usr/home/dgr/src/src/stable12/arm.armv7/tmp/lib/libc.so.7:
undefined reference to __aeabi_fcmpeq_vfp
ld: error: /usr/home/dgr/src/freebsd-src-obj/usr/home/dgr/src/src/stable12/arm.armv7/tmp/lib/libc.so.7:
undefined reference to __aeabi_fcmpge_vfp
ld: error: /usr/home/dgr/src/freebsd-src-obj/usr/home/dgr/src/src/stable12/arm.armv7/tmp/lib/libc.so.7:
undefined reference to __aeabi_fcmpgt_vfp
ld: error: /usr/home/dgr/src/freebsd-src-obj/usr/home/dgr/src/src/stable12/arm.armv7/tmp/lib/libc.so.7:
undefined reference to __aeabi_fcmple_vfp
ld: error: /usr/home/dgr/src/freebsd-src-obj/usr/home/dgr/src/src/stable12/arm.armv7/tmp/lib/libc.so.7:
undefined reference to __aeabi_fcmplt_vfp
ld: error: /usr/home/dgr/src/freebsd-src-obj/usr/home/dgr/src/src/stable12/arm.armv7/tmp/lib/libc.so.7:
undefined reference to __aeabi_fcmpun_vfp
ld: error: /usr/home/dgr/src/freebsd-src-obj/usr/home/dgr/src/src/stable12/arm.armv7/tmp/lib/libc.so.7:
undefined reference to __aeabi_fdiv_vfp
ld: error: /usr/home/dgr/src/freebsd-src-obj/usr/home/dgr/src/src/stable12/arm.armv7/tmp/lib/libc.so.7:
undefined reference to __aeabi_fmul_vfp
ld: error: /usr/home/dgr/src/freebsd-src-obj/usr/home/dgr/src/src/stable12/arm.armv7/tmp/lib/libc.so.7:
undefined reference to __aeabi_fsub_vfp
ld: error: /usr/home/dgr/src/freebsd-src-obj/usr/home/dgr/src/src/stable12/arm.armv7/tmp/lib/libc.so.7:
undefined reference to __aeabi_i2f_vfp
ld: error: /usr/home/dgr/src/freebsd-src-obj/usr/home/dgr/src/src/stable12/arm.armv7/tmp/lib/libc.so.7:
undefined reference to __aeabi_d2f_vfp
ld: error: /usr/home/dgr/src/freebsd-src-obj/usr/home/dgr/src/src/stable12/arm.armv7/tmp/lib/libc.so.7:
undefined reference to __aeabi_d2iz_vfp
ld: error: /usr/home/dgr/src/freebsd-src-obj/usr/home/dgr/src/src/stable12/arm.armv7/tmp/lib/libc.so.7:
undefined reference to __aeabi_dadd_vfp
ld: error: /usr/home/dgr/src/freebsd-src-obj/usr/home/dgr/src/src/stable12/arm.armv7/tmp/lib/libc.so.7:
undefined reference to __aeabi_dcmpeq_vfp
ld: error: /usr/home/dgr/src/freebsd-src-obj/usr/home/dgr/src/src/stable12/arm.armv7/tmp/lib/libc.so.7:
undefined reference to __aeabi_dcmpge_vfp
ld: error: /usr/home/dgr/src/freebsd-src-obj/usr/home/dgr/src/src/stable12/arm.armv7/tmp/lib/libc.so.7:
undefined reference to __aeabi_dcmpgt_vfp
ld: error: /usr/home/dgr/src/freebsd-src-obj/usr/home/dgr/src/src/stable12/arm.armv7/tmp/lib/libc.so.7:
undefined reference to __aeabi_dcmple_vfp

2. According to imp@, the softfloat system can still be built, however it is not
officially supported anymore
(https://lists.freebsd.org/pipermail/freebsd-arch/2017-September/018329.html).
It is assumed that armv6/armv7 CPUs always have VFP unit.

3. FreeBSD stable/12 world with CPUTYPE=soft is built automatically with
-mfloat-abi=softfp, which emulates the soft float ABI, however still
uses hard float instructions.

4. When trying to pass -mfloat-abi=soft, everything is built with
three flags: -mfloat-abi=soft -mfloat-abi=softfp -mfloat-abi=softfp.

5. Additional problem encountered when trying to use additional flag
-mfloat-abi=soft:

--- clang.full ---
/home/mindal/obj/arm.armv6/usr/home/mindal/git/freebsd-src/lib/clang/libclang/libclang.a:
could not read symbols: File format not recognized
c++: error: linker command failed with exit code 1 (use -v to see invocation)

6. Problems above seen on both stable/11 and stable/12. In case of stable/12
it is visible with both TARGET_ARCH=armv6 and TARGET_ARCH=armv7

I'd appreciate any feedback.

Best regards,
Marcin (mw@)



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAPv3WKeJH8CCa9U8r6mXXmCunqdJAYzxZb77F1dq23pqSUnb1A>