Commit feae58b6 authored by Will Deacon's avatar Will Deacon Committed by Marc Zyngier
Browse files

KVM: arm64: Extend pKVM page ownership selftests to cover guest hvcs



Now that the guest can share and unshare memory with the host using
hypercalls, extend the pKVM page ownership selftest to exercise these
new transitions.

Tested-by: default avatarFuad Tabba <tabba@google.com>
Tested-by: default avatarMostafa Saleh <smostafa@google.com>
Signed-off-by: default avatarWill Deacon <will@kernel.org>
Link: https://patch.msgid.link/20260330144841.26181-37-will@kernel.org


Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
parent f4a5a677
Loading
Loading
Loading
Loading
+30 −0
Original line number Diff line number Diff line
@@ -1814,11 +1814,41 @@ void pkvm_ownership_selftest(void *base)
	assert_transition_res(-EPERM,	__pkvm_host_unshare_hyp, pfn);
	assert_transition_res(-EPERM,	__pkvm_hyp_donate_host, pfn, 1);

	selftest_state.host = PKVM_PAGE_SHARED_BORROWED;
	selftest_state.guest[0] = PKVM_PAGE_SHARED_OWNED;
	assert_transition_res(0,	__pkvm_guest_share_host, vcpu, gfn);
	assert_transition_res(-EPERM,	__pkvm_guest_share_host, vcpu, gfn);
	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_NOPAGE;
	selftest_state.guest[0] = PKVM_PAGE_OWNED;
	assert_transition_res(0,	__pkvm_guest_unshare_host, vcpu, gfn);
	assert_transition_res(-EPERM,	__pkvm_guest_unshare_host, vcpu, gfn);
	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_POISON;
	assert_transition_res(0,	__pkvm_host_force_reclaim_page_guest, phys);
	assert_transition_res(-EPERM,	__pkvm_host_donate_guest, pfn, gfn, vcpu);
	assert_transition_res(-EPERM,	__pkvm_host_share_guest, pfn, gfn, 1, vcpu, prot);
	assert_transition_res(-EHWPOISON, __pkvm_guest_share_host, vcpu, gfn);
	assert_transition_res(-EHWPOISON, __pkvm_guest_unshare_host, vcpu, gfn);

	selftest_state.host = PKVM_NOPAGE;
	selftest_state.guest[1] = PKVM_PAGE_OWNED;