[PATCH v3 0/7] arm64: Fix support for no FP/SIMD

Ard Biesheuvel ard.biesheuvel at linaro.org
Tue Jan 14 00:30:05 PST 2020


On Tue, 14 Jan 2020 at 00:30, Suzuki K Poulose <suzuki.poulose at arm.com> wrote:
>
> This series fixes the support for systems without FP/SIMD unit.
>
> We detect the absence of FP/SIMD after the SMP cpus are brought
> online (i.e, SYSTEM scope). This means, we allow a hotplugged
> CPU to boot successfully even if it doesn't have the FP/SIMD
> when we have decided otherwise at boot and have now advertised
> the ELF HWCAP for the userspace. Fix this by turning this to a
> BOOT_RESTRICTED_CPU_LOCAL feature to allow the detection of the
> feature the very moment a CPU turns up without FP/SIMD and also
> prevent a conflict after SMP boot.
>
> The COMPAT ELF_HWCAPs were statically set to indicate the
> availability of VFP. Make it dynamic to set the appropriate
> bits.
>
> Also, some of the early kernel threads (including init) could run
> with their TIF_FOREIGN_FPSTATE flag set which might be inherited
> by applications forked by them (e.g, modprobe from initramfs).
> Now, if we detect the absence of FP/SIMD we stop clearing the
> TIF flag in fpsimd_restore_current_state(). This could cause
> the applications stuck in do_notify_resume() looping forever
> to clear the flag. Fix this by clearing the TIF flag in
> fpsimd_restore_current_state() for the tasks that may
> have it set.
>
> This series also categorises the functions dealing with fpsimd
> into two :
>
>  - Call permitted with missing FP/SIMD support. But we bail
>    out early in the function. This is for functions exposed
>    to the generic kernel code.
>
>  - Calls not permitted with missing FP/SIMD support. These
>    are functions which deal with the CPU/Task FP/SIMD registers
>    and/or meta-data. The callers must check for the support
>    before invoking them.
>
> See the last patch in the series for details.
>
> Also make sure that the SVE is initialised where supported,
> before the FP/SIMD is used by the kernel.
>
> Tested with debian armel initramfs and rootfs. The arm64 doesn't
> have a soft-float ABI, thus haven't tested it with 64bit userspace.
>
> Applies on linux-aarch64 for-next/core
>
> Changes since v2:
>  - Rebase on to for-next/core, resolved conflict with the E0PD
>    handling changes
>  - Address comments from Catalin
>      - Remove warnings from static functions
>      - Add WARN_ON in may_use_simd() if called before initializing
>        capabilities.
>  - Add "active" hook for FP regset
>  - Remove dangerous WARN_ON from KVM, replaced with an additional
>    check to make sure that the FP/SIMD is always trapped.
>  - Added tags from Catalin, Marc
>
> Suzuki K Poulose (7):
>   arm64: Introduce system_capabilities_finalized() marker
>   arm64: fpsimd: Make sure SVE setup is complete before SIMD is used
>   arm64: cpufeature: Fix the type of no FP/SIMD capability
>   arm64: cpufeature: Set the FP/SIMD compat HWCAP bits properly
>   arm64: ptrace: nofpsimd: Fail FP/SIMD regset operations
>   arm64: signal: nofpsimd: Handle fp/simd context for signal frames
>   arm64: nofpsmid: Handle TIF_FOREIGN_FPSTATE flag cleanly
>

For the series,

Reviewed-by: Ard Biesheuvel <ardb at kernel.org>


>  arch/arm64/include/asm/cpufeature.h |  5 +++
>  arch/arm64/include/asm/kvm_host.h   |  2 +-
>  arch/arm64/include/asm/simd.h       |  8 +++-
>  arch/arm64/kernel/cpufeature.c      | 67 +++++++++++++++++++----------
>  arch/arm64/kernel/fpsimd.c          | 30 +++++++++++--
>  arch/arm64/kernel/process.c         |  2 +-
>  arch/arm64/kernel/ptrace.c          | 21 +++++++++
>  arch/arm64/kernel/signal.c          |  6 ++-
>  arch/arm64/kernel/signal32.c        |  4 +-
>  arch/arm64/kvm/hyp/switch.c         | 10 ++++-
>  10 files changed, 121 insertions(+), 34 deletions(-)
>
> --
> 2.24.1
>



More information about the linux-arm-kernel mailing list