From 0a5d1bf9655ef737831edaba5d0aa3728ac4c81d Mon Sep 17 00:00:00 2001 From: Quentin Perret Date: Mon, 30 Jan 2023 15:45:32 +0000 Subject: [PATCH] ANDROID: KVM: arm64: Pass addr to get_page_state() helper We will soon need to fetch part of the page state outside of invalid PTE entries, so provide the input address to the get_page_state() helper. Bug: 264070847 Change-Id: I02e0c7538a15cad8e63591bfab67c6de125631fe Signed-off-by: Quentin Perret --- arch/arm64/kvm/hyp/nvhe/mem_protect.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/arch/arm64/kvm/hyp/nvhe/mem_protect.c b/arch/arm64/kvm/hyp/nvhe/mem_protect.c index c10074751f51..56ac2519b0e5 100644 --- a/arch/arm64/kvm/hyp/nvhe/mem_protect.c +++ b/arch/arm64/kvm/hyp/nvhe/mem_protect.c @@ -872,7 +872,7 @@ struct pkvm_mem_donation { 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, @@ -886,7 +886,7 @@ static int __check_page_state_visitor(u64 addr, u64 end, u32 level, 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, @@ -901,19 +901,17 @@ 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) { enum pkvm_page_state state = 0; enum kvm_pgtable_prot prot; - phys_addr_t phys; if (!kvm_pte_valid(pte) && pte) return PKVM_NOPAGE; prot = kvm_pgtable_stage2_pte_prot(pte); if (kvm_pte_valid(pte)) { - phys = kvm_pte_to_phys(pte); - if ((prot & KVM_PGTABLE_PROT_RWX) != default_host_prot(addr_is_memory(phys))) + if ((prot & KVM_PGTABLE_PROT_RWX) != default_host_prot(addr_is_memory(addr))) state = PKVM_PAGE_RESTRICTED_PROT; } @@ -1061,7 +1059,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) { enum pkvm_page_state state = 0; enum kvm_pgtable_prot prot; @@ -1180,7 +1178,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) { enum pkvm_page_state state = 0; enum kvm_pgtable_prot prot; @@ -1314,7 +1312,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; @@ -1899,7 +1897,7 @@ int hyp_protect_host_page(u64 pfn, enum kvm_pgtable_prot prot) if (ret) goto unlock; - if (host_get_page_state(pte) != PKVM_PAGE_OWNED) { + if (host_get_page_state(pte, addr) != PKVM_PAGE_OWNED) { ret = -EPERM; goto unlock; } @@ -2112,7 +2110,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);