]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: arm64: Extend pKVM page ownership selftests to cover guest donation
authorWill Deacon <will@kernel.org>
Mon, 30 Mar 2026 14:48:34 +0000 (15:48 +0100)
committerMarc Zyngier <maz@kernel.org>
Mon, 30 Mar 2026 15:58:09 +0000 (16:58 +0100)
Extend the pKVM page ownership selftests to donate and reclaim a page
to/from a guest.

Tested-by: Fuad Tabba <tabba@google.com>
Tested-by: Mostafa Saleh <smostafa@google.com>
Signed-off-by: Will Deacon <will@kernel.org>
Link: https://patch.msgid.link/20260330144841.26181-34-will@kernel.org
Signed-off-by: Marc Zyngier <maz@kernel.org>
arch/arm64/kvm/hyp/nvhe/mem_protect.c

index db94323b430c2c33ee4256ae5bb257f5357036c6..13d2cb2f5fab0367ae71bee97dbf52a1b3a76bc8 100644 (file)
@@ -1751,6 +1751,7 @@ void pkvm_ownership_selftest(void *base)
        assert_transition_res(-EPERM,   hyp_pin_shared_mem, virt, virt + size);
        assert_transition_res(-EPERM,   __pkvm_host_share_guest, pfn, gfn, 1, vcpu, prot);
        assert_transition_res(-ENOENT,  __pkvm_host_unshare_guest, gfn, 1, vm);
+       assert_transition_res(-EPERM,   __pkvm_host_donate_guest, pfn, gfn, vcpu);
 
        selftest_state.host = PKVM_PAGE_OWNED;
        selftest_state.hyp = PKVM_NOPAGE;
@@ -1770,6 +1771,7 @@ void pkvm_ownership_selftest(void *base)
        assert_transition_res(-EPERM,   __pkvm_hyp_donate_host, pfn, 1);
        assert_transition_res(-EPERM,   __pkvm_host_share_guest, pfn, gfn, 1, vcpu, prot);
        assert_transition_res(-ENOENT,  __pkvm_host_unshare_guest, gfn, 1, vm);
+       assert_transition_res(-EPERM,   __pkvm_host_donate_guest, pfn, gfn, vcpu);
 
        assert_transition_res(0,        hyp_pin_shared_mem, virt, virt + size);
        assert_transition_res(0,        hyp_pin_shared_mem, virt, virt + size);
@@ -1782,6 +1784,7 @@ void pkvm_ownership_selftest(void *base)
        assert_transition_res(-EPERM,   __pkvm_hyp_donate_host, pfn, 1);
        assert_transition_res(-EPERM,   __pkvm_host_share_guest, pfn, gfn, 1, vcpu, prot);
        assert_transition_res(-ENOENT,  __pkvm_host_unshare_guest, gfn, 1, vm);
+       assert_transition_res(-EPERM,   __pkvm_host_donate_guest, pfn, gfn, vcpu);
 
        hyp_unpin_shared_mem(virt, virt + size);
        assert_page_state();
@@ -1801,6 +1804,7 @@ void pkvm_ownership_selftest(void *base)
        assert_transition_res(-EPERM,   __pkvm_hyp_donate_host, pfn, 1);
        assert_transition_res(-EPERM,   __pkvm_host_share_guest, pfn, gfn, 1, vcpu, prot);
        assert_transition_res(-ENOENT,  __pkvm_host_unshare_guest, gfn, 1, vm);
+       assert_transition_res(-EPERM,   __pkvm_host_donate_guest, pfn, gfn, vcpu);
        assert_transition_res(-EPERM,   hyp_pin_shared_mem, virt, virt + size);
 
        selftest_state.host = PKVM_PAGE_OWNED;
@@ -1817,6 +1821,7 @@ void pkvm_ownership_selftest(void *base)
        assert_transition_res(-EPERM,   __pkvm_host_share_hyp, pfn);
        assert_transition_res(-EPERM,   __pkvm_host_unshare_hyp, pfn);
        assert_transition_res(-EPERM,   __pkvm_hyp_donate_host, pfn, 1);
+       assert_transition_res(-EPERM,   __pkvm_host_donate_guest, pfn, gfn, vcpu);
        assert_transition_res(-EPERM,   hyp_pin_shared_mem, virt, virt + size);
 
        selftest_state.guest[1] = PKVM_PAGE_SHARED_BORROWED;
@@ -1830,6 +1835,23 @@ void pkvm_ownership_selftest(void *base)
        selftest_state.host = PKVM_PAGE_OWNED;
        assert_transition_res(0,        __pkvm_host_unshare_guest, gfn + 1, 1, vm);
 
+       selftest_state.host = PKVM_NOPAGE;
+       selftest_state.guest[0] = PKVM_PAGE_OWNED;
+       assert_transition_res(0,        __pkvm_host_donate_guest, pfn, gfn, vcpu);
+       assert_transition_res(-EPERM,   __pkvm_host_donate_guest, pfn, gfn, vcpu);
+       assert_transition_res(-EPERM,   __pkvm_host_donate_guest, pfn, gfn + 1, vcpu);
+       assert_transition_res(-EPERM,   __pkvm_host_share_guest, pfn, gfn, 1, vcpu, prot);
+       assert_transition_res(-EPERM,   __pkvm_host_share_guest, pfn, gfn + 1, 1, vcpu, prot);
+       assert_transition_res(-EPERM,   __pkvm_host_share_ffa, pfn, 1);
+       assert_transition_res(-EPERM,   __pkvm_host_donate_hyp, pfn, 1);
+       assert_transition_res(-EPERM,   __pkvm_host_share_hyp, pfn);
+       assert_transition_res(-EPERM,   __pkvm_host_unshare_hyp, pfn);
+       assert_transition_res(-EPERM,   __pkvm_hyp_donate_host, pfn, 1);
+
+       selftest_state.host = PKVM_PAGE_OWNED;
+       selftest_state.guest[0] = PKVM_NOPAGE;
+       assert_transition_res(0,        __pkvm_host_reclaim_page_guest, gfn, vm);
+
        selftest_state.host = PKVM_NOPAGE;
        selftest_state.hyp = PKVM_PAGE_OWNED;
        assert_transition_res(0,        __pkvm_host_donate_hyp, pfn, 1);