Commit 582234b0 authored by Kornel Dulęba's avatar Kornel Dulęba Committed by Marc Zyngier
Browse files

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: default avatarKornel Dulęba <korneld@google.com>
Acked-by: default avatarWill Deacon <will@kernel.org>
Link: https://patch.msgid.link/20251114-pkvm_init_noffa-v1-1-87a82e87c345@google.com


Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
parent 4b16ad0b
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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;

	/*