Centos-kernel-stream-9/drivers/firmware/smccc
Steve Dunnagan ea906a1ec8 arm64: smccc: Remove broken support for SMCCCv1.3 SVE discard hint
JIRA: https://issues.redhat.com/browse/RHEL-65607

commit 8c462d56487e3abdbf8a61cedfe7c795a54f4a78
Author: Mark Rutland <mark.rutland@arm.com>
Date:   Wed Nov 6 16:04:48 2024 +0000

    arm64: smccc: Remove broken support for SMCCCv1.3 SVE discard hint

    SMCCCv1.3 added a hint bit which callers can set in an SMCCC function ID
    (AKA "FID") to indicate that it is acceptable for the SMCCC
    implementation to discard SVE and/or SME state over a specific SMCCC
    call. The kernel support for using this hint is broken and SMCCC calls
    may clobber the SVE and/or SME state of arbitrary tasks, though FPSIMD
    state is unaffected.

    The kernel support is intended to use the hint when there is no SVE or
    SME state to save, and to do this it checks whether TIF_FOREIGN_FPSTATE
    is set or TIF_SVE is clear in assembly code:

    |        ldr     <flags>, [<current_task>, #TSK_TI_FLAGS]
    |        tbnz    <flags>, #TIF_FOREIGN_FPSTATE, 1f   // Any live FP state?
    |        tbnz    <flags>, #TIF_SVE, 2f               // Does that state include SVE?
    |
    | 1:     orr     <fid>, <fid>, ARM_SMCCC_1_3_SVE_HINT
    | 2:
    |        << SMCCC call using FID >>

    This is not safe as-is:

    (1) SMCCC calls can be made in a preemptible context and preemption can
        result in TIF_FOREIGN_FPSTATE being set or cleared at arbitrary
        points in time. Thus checking for TIF_FOREIGN_FPSTATE provides no
        guarantee.

    (2) TIF_FOREIGN_FPSTATE only indicates that the live FP/SVE/SME state in
        the CPU does not belong to the current task, and does not indicate
        that clobbering this state is acceptable.

        When the live CPU state is clobbered it is necessary to update
        fpsimd_last_state.st to ensure that a subsequent context switch will
        reload FP/SVE/SME state from memory rather than consuming the
        clobbered state. This and the SMCCC call itself must happen in a
        critical section with preemption disabled to avoid races.

    (3) Live SVE/SME state can exist with TIF_SVE clear (e.g. with only
        TIF_SME set), and checking TIF_SVE alone is insufficient.

    Remove the broken support for the SMCCCv1.3 SVE saving hint. This is
    effectively a revert of commits:

    * cfa7ff959a ("arm64: smccc: Support SMCCC v1.3 SVE register saving hint")
    * a7c3acca53 ("arm64: smccc: Save lr before calling __arm_smccc_sve_check()")

    ... leaving behind the ARM_SMCCC_VERSION_1_3 and ARM_SMCCC_1_3_SVE_HINT
    definitions, since these are simply definitions from the SMCCC
    specification, and the latter is used in KVM via ARM_SMCCC_CALL_HINTS.

    If we want to bring this back in future, we'll probably want to handle
    this logic in C where we can use all the usual FPSIMD/SVE/SME helper
    functions, and that'll likely require some rework of the SMCCC code
    and/or its callers.

    Fixes: cfa7ff959a ("arm64: smccc: Support SMCCC v1.3 SVE register saving hint")
    Signed-off-by: Mark Rutland <mark.rutland@arm.com>
    Cc: Ard Biesheuvel <ardb@kernel.org>
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Cc: Marc Zyngier <maz@kernel.org>
    Cc: Mark Brown <broonie@kernel.org>
    Cc: Will Deacon <will@kernel.org>
    Cc: stable@vger.kernel.org
    Reviewed-by: Mark Brown <broonie@kernel.org>
    Link: https://lore.kernel.org/r/20241106160448.2712997-1-mark.rutland@arm.com
    Signed-off-by: Will Deacon <will@kernel.org>

(cherry picked from commit 8c462d56487e3abdbf8a61cedfe7c795a54f4a78)
Signed-off-by: Steve Dunnagan <sdunnaga@redhat.com>
2025-04-10 08:35:31 -04:00
..
Kconfig
Makefile
kvm_guest.c firmware/smccc: Call arch-specific hook on discovering KVM services 2025-04-10 08:35:23 -04:00
smccc.c arm64: smccc: Remove broken support for SMCCCv1.3 SVE discard hint 2025-04-10 08:35:31 -04:00
soc_id.c firmware: smccc: Fix use of uninitialised results structure 2024-01-20 19:35:42 -05:00