diff options
author | Pindar Yang <pindaryang@google.com> | 2023-06-01 18:24:00 +0000 |
---|---|---|
committer | Pindar Yang <pindaryang@google.com> | 2023-06-01 18:24:00 +0000 |
commit | d96424ee3437d12f61d697889b36119e91c00117 (patch) | |
tree | 6b79e00a58708a7b9f199ff293603be1e26e9d7a | |
parent | 1fc584803423b89caaee930d285e11ba9d5856e2 (diff) | |
parent | e2730e1a50e2b8a1d63236ce41effd78027ef81a (diff) | |
download | gs-d96424ee3437d12f61d697889b36119e91c00117.tar.gz |
Merge "Merge android13-5.10-2023-03 into android13-gs-pixel-5.10-udc" into android13-gs-pixel-5.10-udc
-rw-r--r-- | arch/arm64/kvm/hyp/nvhe/mem_protect.c | 20 |
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); |