]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: arm64: Fix error checking for FFA_VERSION
authorKornel Dulęba <korneld@google.com>
Fri, 14 Nov 2025 11:11:53 +0000 (11:11 +0000)
committerMarc Zyngier <maz@kernel.org>
Fri, 16 Jan 2026 09:46:26 +0000 (09:46 +0000)
According to section 13.2 of the DEN0077 FF-A specification, when
firmware does not support the requested version, it should reply with
FFA_RET_NOT_SUPPORTED(-1). Table 13.6 specifies the type of the error
code as int32.
Currently, the error checking logic compares the unsigned long return
value it got from the SMC layer, against a "-1" literal. This fails due
to a type mismatch: the literal is extended to 64 bits, whereas the
register contains only 32 bits of ones(0x00000000ffffffff).
Consequently, hyp_ffa_init misinterprets the "-1" return value as an
invalid FF-A version. This prevents pKVM initialization on devices where
FF-A is not supported in firmware.
Fix this by explicitly casting res.a0 to s32.

Signed-off-by: Kornel Dulęba <korneld@google.com>
Acked-by: Will Deacon <will@kernel.org>
Link: https://patch.msgid.link/20251114-pkvm_init_noffa-v1-1-87a82e87c345@google.com
Signed-off-by: Marc Zyngier <maz@kernel.org>
arch/arm64/kvm/hyp/nvhe/ffa.c

index f731cc4c3f280a32acccca0de92b9ac6c8e05602..94161ea1cd60bf5068ab18c5c5fbb25298355231 100644 (file)
@@ -792,7 +792,7 @@ static void do_ffa_version(struct arm_smccc_1_2_regs *res,
                        .a0 = FFA_VERSION,
                        .a1 = ffa_req_version,
                }, res);
-               if (res->a0 == FFA_RET_NOT_SUPPORTED)
+               if ((s32)res->a0 == FFA_RET_NOT_SUPPORTED)
                        goto unlock;
 
                hyp_ffa_version = ffa_req_version;
@@ -943,7 +943,7 @@ int hyp_ffa_init(void *pages)
                .a0 = FFA_VERSION,
                .a1 = FFA_VERSION_1_2,
        }, &res);
-       if (res.a0 == FFA_RET_NOT_SUPPORTED)
+       if ((s32)res.a0 == FFA_RET_NOT_SUPPORTED)
                return 0;
 
        /*