summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPindar Yang <pindaryang@google.com>2023-05-30 07:12:04 +0000
committerPindar Yang <pindaryang@google.com>2023-05-30 07:12:06 +0000
commit6e771b230c5221f0fc15d2d88d7b3772c1a529aa (patch)
treeeb43a6d606ea178f1235e3bb1f5a4aa8dbbf6ce0
parentda8d387a8ddd0a2a445f98fccc6b8441b129faa3 (diff)
parent776d0a76f6aa7c5a92c60afbe886a8e786953199 (diff)
downloadgs-android-gs-pantah-5.10-android13-qpr3.tar.gz
Merge SHA: 776d0a76f6aa ANDROID: KVM: arm64: Move addr_is_allowed_memory() check into host callback Bug: 279739439 Bug: 264070847 (ACK) Bug: 279739439 (ACK) Bug: 284271521 (ACK) Change-Id: Ic744dccd2a19bdcc41e0710ff5b484689055826c Signed-off-by: Pindar Yang <pindaryang@google.com>
-rw-r--r--arch/arm64/kvm/hyp/nvhe/mem_protect.c20
1 files changed, 10 insertions, 10 deletions
diff --git a/arch/arm64/kvm/hyp/nvhe/mem_protect.c b/arch/arm64/kvm/hyp/nvhe/mem_protect.c
index 5d2ce6e14405..1c902f6254ef 100644
--- a/arch/arm64/kvm/hyp/nvhe/mem_protect.c
+++ b/arch/arm64/kvm/hyp/nvhe/mem_protect.c
@@ -781,7 +781,7 @@ static pkvm_id completer_owner_id(const struct pkvm_mem_transition *tx)
struct check_walk_data {
enum pkvm_page_state desired;
- enum pkvm_page_state (*get_page_state)(kvm_pte_t pte);
+ enum pkvm_page_state (*get_page_state)(kvm_pte_t pte, u64 addr);
};
static int __check_page_state_visitor(u64 addr, u64 end, u32 level,
@@ -792,10 +792,7 @@ static int __check_page_state_visitor(u64 addr, u64 end, u32 level,
struct check_walk_data *d = arg;
kvm_pte_t pte = *ptep;
- if (kvm_pte_valid(pte) && !addr_is_allowed_memory(kvm_pte_to_phys(pte)))
- return -EINVAL;
-
- return d->get_page_state(pte) == d->desired ? 0 : -EPERM;
+ return d->get_page_state(pte, addr) == d->desired ? 0 : -EPERM;
}
static int check_page_state_range(struct kvm_pgtable *pgt, u64 addr, u64 size,
@@ -810,8 +807,11 @@ static int check_page_state_range(struct kvm_pgtable *pgt, u64 addr, u64 size,
return kvm_pgtable_walk(pgt, addr, size, &walker);
}
-static enum pkvm_page_state host_get_page_state(kvm_pte_t pte)
+static enum pkvm_page_state host_get_page_state(kvm_pte_t pte, u64 addr)
{
+ if (!addr_is_allowed_memory(addr))
+ return PKVM_NOPAGE;
+
if (!kvm_pte_valid(pte) && pte)
return PKVM_NOPAGE;
@@ -954,7 +954,7 @@ static int host_complete_donation(u64 addr, const struct pkvm_mem_transition *tx
return host_stage2_set_owner_locked(addr, size, host_id);
}
-static enum pkvm_page_state hyp_get_page_state(kvm_pte_t pte)
+static enum pkvm_page_state hyp_get_page_state(kvm_pte_t pte, u64 addr)
{
if (!kvm_pte_valid(pte))
return PKVM_NOPAGE;
@@ -1066,7 +1066,7 @@ static int hyp_complete_donation(u64 addr,
return pkvm_create_mappings_locked(start, end, prot);
}
-static enum pkvm_page_state guest_get_page_state(kvm_pte_t pte)
+static enum pkvm_page_state guest_get_page_state(kvm_pte_t pte, u64 addr)
{
if (!kvm_pte_valid(pte))
return PKVM_NOPAGE;
@@ -1180,7 +1180,7 @@ static int __guest_request_page_transition(u64 *completer_addr,
if (ret)
return ret;
- state = guest_get_page_state(pte);
+ state = guest_get_page_state(pte, tx->initiator.addr);
if (state == PKVM_NOPAGE)
return -EFAULT;
@@ -1946,7 +1946,7 @@ int __pkvm_host_reclaim_page(u64 pfn)
if (ret)
goto unlock;
- if (host_get_page_state(pte) == PKVM_PAGE_OWNED)
+ if (host_get_page_state(pte, addr) == PKVM_PAGE_OWNED)
goto unlock;
page = hyp_phys_to_page(addr);