Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

KVM: arm64: Fix error checking for FFA_VERSION

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>

authored by

Kornel Dulęba and committed by
Marc Zyngier
582234b0 4b16ad0b

+2 -2
+2 -2
arch/arm64/kvm/hyp/nvhe/ffa.c
··· 792 792 .a0 = FFA_VERSION, 793 793 .a1 = ffa_req_version, 794 794 }, res); 795 - if (res->a0 == FFA_RET_NOT_SUPPORTED) 795 + if ((s32)res->a0 == FFA_RET_NOT_SUPPORTED) 796 796 goto unlock; 797 797 798 798 hyp_ffa_version = ffa_req_version; ··· 943 943 .a0 = FFA_VERSION, 944 944 .a1 = FFA_VERSION_1_2, 945 945 }, &res); 946 - if (res.a0 == FFA_RET_NOT_SUPPORTED) 946 + if ((s32)res.a0 == FFA_RET_NOT_SUPPORTED) 947 947 return 0; 948 948 949 949 /*