diff --git a/arch/arm64/kvm/hyp/include/nvhe/pkvm.h b/arch/arm64/kvm/hyp/include/nvhe/pkvm.h index 65861da8b460..644dce2f9256 100644 --- a/arch/arm64/kvm/hyp/include/nvhe/pkvm.h +++ b/arch/arm64/kvm/hyp/include/nvhe/pkvm.h @@ -121,14 +121,16 @@ static inline bool pkvm_hyp_vm_has_pvmfw(struct pkvm_hyp_vm *vm) return vm->kvm.arch.pkvm.pvmfw_load_addr != PVMFW_INVALID_LOAD_ADDR; } -static inline bool pkvm_ipa_in_pvmfw_region(struct pkvm_hyp_vm *vm, u64 ipa) +static inline bool pkvm_ipa_range_has_pvmfw(struct pkvm_hyp_vm *vm, + u64 ipa_start, u64 ipa_end) { struct kvm_protected_vm *pkvm = &vm->kvm.arch.pkvm; + u64 pvmfw_load_end = pkvm->pvmfw_load_addr + pvmfw_size; if (!pkvm_hyp_vm_has_pvmfw(vm)) return false; - return ipa - pkvm->pvmfw_load_addr < pvmfw_size; + return ipa_end > pkvm->pvmfw_load_addr && ipa_start < pvmfw_load_end; } int pkvm_load_pvmfw_pages(struct pkvm_hyp_vm *vm, u64 ipa, phys_addr_t phys, diff --git a/arch/arm64/kvm/hyp/nvhe/mem_protect.c b/arch/arm64/kvm/hyp/nvhe/mem_protect.c index ba7f7564adb8..abed3fd9e0a2 100644 --- a/arch/arm64/kvm/hyp/nvhe/mem_protect.c +++ b/arch/arm64/kvm/hyp/nvhe/mem_protect.c @@ -1078,11 +1078,11 @@ static int guest_complete_donation(u64 addr, const struct pkvm_mem_transition *t u64 size = tx->nr_pages * PAGE_SIZE; int err; - if (tx->initiator.id == PKVM_ID_HOST && - pkvm_ipa_in_pvmfw_region(vm, addr)) { + if (pkvm_ipa_range_has_pvmfw(vm, addr, addr + size)) { if (WARN_ON(!pkvm_hyp_vcpu_is_protected(vcpu))) return -EPERM; + WARN_ON(tx->initiator.id != PKVM_ID_HOST); err = pkvm_load_pvmfw_pages(vm, addr, phys, size); if (err) return err;