[PATCH 0/2] KVM: arm64: Return -EINVAL for an empty SMCCC filter range at base 0

Karl Mehltretter posted 2 patches 4 weeks ago
arch/arm64/kvm/hypercalls.c                      | 3 ++-
tools/testing/selftests/kvm/arm64/smccc_filter.c | 4 ++++
2 files changed, 6 insertions(+), 1 deletion(-)
[PATCH 0/2] KVM: arm64: Return -EINVAL for an empty SMCCC filter range at base 0
Posted by Karl Mehltretter 4 weeks ago
KVM_ARM_VM_SMCCC_FILTER rejects an empty range (nr_functions == 0) with
-EINVAL for every base except 0. kvm_smccc_set_filter() only rejects a
range if its inclusive end, base + nr_functions - 1, is below base; for
base 0 that end wraps to U32_MAX, and KVM then tries to insert
[0, U32_MAX], which overlaps the reserved Arm Architecture Calls
ranges, so the attribute returns -EEXIST instead of -EINVAL.

The request is rejected either way; only the errno is wrong, so this is
a minor UAPI validation fix.

Patch 1 rejects a zero function count explicitly. Patch 2 adds the base
0 case to test_invalid_nr_functions(), which only covered a nonzero base
and therefore never caught this.

Tested on an arm64 KVM host in VHE mode running under QEMU TCG: a small
userspace reproducer gets EEXIST before patch 1 and EINVAL after it, and
the smccc_filter selftest including the new assertion passes with patch 1
applied and fails at the new assertion with EEXIST without it.

Karl Mehltretter (2):
  KVM: arm64: Return -EINVAL for an empty SMCCC filter range at base 0
  KVM: arm64: selftests: Test empty SMCCC filter range at base 0

 arch/arm64/kvm/hypercalls.c                      | 3 ++-
 tools/testing/selftests/kvm/arm64/smccc_filter.c | 4 ++++
 2 files changed, 6 insertions(+), 1 deletion(-)


base-commit: 548e7bcd0c5460ddcbca9600cea603ebeebf4da7
-- 
2.39.5 (Apple Git-154)
Re: [PATCH 0/2] KVM: arm64: Return -EINVAL for an empty SMCCC filter range at base 0
Posted by Oliver Upton 1 week, 3 days ago
On Sat, 29 Aug 2026 07:48:54 +0200, Karl Mehltretter wrote:
> KVM_ARM_VM_SMCCC_FILTER rejects an empty range (nr_functions == 0) with
> -EINVAL for every base except 0. kvm_smccc_set_filter() only rejects a
> range if its inclusive end, base + nr_functions - 1, is below base; for
> base 0 that end wraps to U32_MAX, and KVM then tries to insert
> [0, U32_MAX], which overlaps the reserved Arm Architecture Calls
> ranges, so the attribute returns -EEXIST instead of -EINVAL.
> 
> [...]

Applied to fixes, thanks!

[1/2] KVM: arm64: Return -EINVAL for an empty SMCCC filter range at base 0
      https://git.kernel.org/kvmarm/kvmarm/c/64dc6f1db7e6
[2/2] KVM: arm64: selftests: Test empty SMCCC filter range at base 0
      https://git.kernel.org/kvmarm/kvmarm/c/0a46eb5719fa

--
Best,
Oliver