Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 8 Oct 2020 22:19:21 -0600
From:      Warner Losh <imp@bsdimp.com>
To:        Marcin Wojtas <mw@semihalf.com>
Cc:        freebsd-arm <freebsd-arm@freebsd.org>
Subject:   Re: ARMv7 without VFP
Message-ID:  <CANCZdfob9yjFdB3VkjgWRUpVMCqPWURRQGHCTLYiv-KoZ7E-UQ@mail.gmail.com>
In-Reply-To: <CAPv3WKeJH8CCa9U8r6mXXmCunqdJAYzxZb77F1dq23pqSUnb1A@mail.gmail.com>
References:  <CAPv3WKeJH8CCa9U8r6mXXmCunqdJAYzxZb77F1dq23pqSUnb1A@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, Oct 8, 2020 at 5:57 PM Marcin Wojtas <mw@semihalf.com> wrote:

> 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.
>

I last built this several clang generations ago. I fear that you'll need to
chase down what might be a bug in clang. I'd give it a shot with an
external toolchain based on gcc.

There's been talk from time to time of adding a armv7sf target. If you make
progress on the underlying problem, I'd be open to that.

Warner


> Best regards,
> Marcin (mw@)
> _______________________________________________
> freebsd-arm@freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/freebsd-arm
> To unsubscribe, send any mail to "freebsd-arm-unsubscribe@freebsd.org"
>



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