ANDROID: KVM: arm64: Support pVM memory sharing with Trustzone(FF-A)

Store an annotation inside the guest stage-2 pagetables to mark the
memory as shared with FF-A. The memory transitions from the OWNED state
to
SHARED_OWNED. Return the PA corresponding to the page that
we want to share to prevent additional walks.

Bug: 269285339
Bug: 278749606
Change-Id: I5bdd51824ceffb4a891f2e97b62cc5af4460e542
Signed-off-by: Sebastian Ene <sebastianene@google.com>
This commit is contained in:
Sebastian Ene
2025-01-29 16:42:41 +00:00
parent 6909d18e99
commit d9eeae6046
2 changed files with 46 additions and 0 deletions
@@ -47,6 +47,8 @@ int __pkvm_host_donate_hyp_locked(u64 pfn, u64 nr_pages, enum kvm_pgtable_prot p
int __pkvm_hyp_donate_host(u64 pfn, u64 nr_pages);
int __pkvm_guest_share_hyp_page(struct pkvm_hyp_vcpu *vcpu, u64 ipa, u64 *hyp_va);
int __pkvm_guest_unshare_hyp_page(struct pkvm_hyp_vcpu *vcpu, u64 ipa);
int __pkvm_guest_share_ffa_page(struct pkvm_hyp_vcpu *vcpu, u64 ipa, phys_addr_t *phys);
int __pkvm_guest_unshare_ffa_page(struct pkvm_hyp_vcpu *vcpu, u64 ipa);
int __pkvm_host_share_ffa(u64 pfn, u64 nr_pages);
int __pkvm_host_unshare_ffa(u64 pfn, u64 nr_pages);
int __pkvm_host_donate_guest(u64 pfn, u64 gfn, struct pkvm_hyp_vcpu *vcpu, u64 nr_pages);
+44
View File
@@ -1457,6 +1457,50 @@ unlock:
return ret;
}
int __pkvm_guest_share_ffa_page(struct pkvm_hyp_vcpu *vcpu, u64 ipa, phys_addr_t *phys)
{
int ret;
struct pkvm_hyp_vm *vm = pkvm_hyp_vcpu_to_hyp_vm(vcpu);
kvm_pte_t pte;
u64 nr_pages = 1;
guest_lock_component(vm);
ret = __guest_request_page_transition(ipa, &pte, &nr_pages, vcpu, PKVM_PAGE_OWNED);
if (ret)
goto unlock;
ret = __guest_initiate_page_transition(ipa, pte, nr_pages, vcpu, PKVM_PAGE_SHARED_OWNED);
if (!ret)
*phys = kvm_pte_to_phys(pte);
unlock:
guest_unlock_component(vm);
return ret;
}
/*
* The caller is responsible for tracking the FFA state and this function
* should only be called for IPAs that have previously been shared with FFA.
*/
int __pkvm_guest_unshare_ffa_page(struct pkvm_hyp_vcpu *vcpu, u64 ipa)
{
int ret;
struct pkvm_hyp_vm *vm = pkvm_hyp_vcpu_to_hyp_vm(vcpu);
kvm_pte_t pte;
u64 nr_pages = 1;
guest_lock_component(vm);
ret = __guest_request_page_transition(ipa, &pte, &nr_pages, vcpu, PKVM_PAGE_SHARED_OWNED);
if (ret)
goto unlock;
ret = __guest_initiate_page_transition(ipa, pte, nr_pages, vcpu, PKVM_PAGE_OWNED);
unlock:
guest_unlock_component(vm);
return ret;
}
int __pkvm_host_donate_hyp(u64 pfn, u64 nr_pages)
{
return ___pkvm_host_donate_hyp(pfn, nr_pages, false);