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 <qperret@google.com>
This commit is contained in:
@@ -872,7 +872,7 @@ struct pkvm_mem_donation {
|
|||||||
|
|
||||||
struct check_walk_data {
|
struct check_walk_data {
|
||||||
enum pkvm_page_state desired;
|
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,
|
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)))
|
if (kvm_pte_valid(pte) && !addr_is_allowed_memory(kvm_pte_to_phys(pte)))
|
||||||
return -EINVAL;
|
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,
|
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);
|
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 pkvm_page_state state = 0;
|
||||||
enum kvm_pgtable_prot prot;
|
enum kvm_pgtable_prot prot;
|
||||||
phys_addr_t phys;
|
|
||||||
|
|
||||||
if (!kvm_pte_valid(pte) && pte)
|
if (!kvm_pte_valid(pte) && pte)
|
||||||
return PKVM_NOPAGE;
|
return PKVM_NOPAGE;
|
||||||
|
|
||||||
prot = kvm_pgtable_stage2_pte_prot(pte);
|
prot = kvm_pgtable_stage2_pte_prot(pte);
|
||||||
if (kvm_pte_valid(pte)) {
|
if (kvm_pte_valid(pte)) {
|
||||||
phys = kvm_pte_to_phys(pte);
|
if ((prot & KVM_PGTABLE_PROT_RWX) != default_host_prot(addr_is_memory(addr)))
|
||||||
if ((prot & KVM_PGTABLE_PROT_RWX) != default_host_prot(addr_is_memory(phys)))
|
|
||||||
state = PKVM_PAGE_RESTRICTED_PROT;
|
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);
|
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 pkvm_page_state state = 0;
|
||||||
enum kvm_pgtable_prot prot;
|
enum kvm_pgtable_prot prot;
|
||||||
@@ -1180,7 +1178,7 @@ static int hyp_complete_donation(u64 addr,
|
|||||||
return pkvm_create_mappings_locked(start, end, prot);
|
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 pkvm_page_state state = 0;
|
||||||
enum kvm_pgtable_prot prot;
|
enum kvm_pgtable_prot prot;
|
||||||
@@ -1314,7 +1312,7 @@ static int __guest_request_page_transition(u64 *completer_addr,
|
|||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
state = guest_get_page_state(pte);
|
state = guest_get_page_state(pte, tx->initiator.addr);
|
||||||
if (state == PKVM_NOPAGE)
|
if (state == PKVM_NOPAGE)
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
@@ -1899,7 +1897,7 @@ int hyp_protect_host_page(u64 pfn, enum kvm_pgtable_prot prot)
|
|||||||
if (ret)
|
if (ret)
|
||||||
goto unlock;
|
goto unlock;
|
||||||
|
|
||||||
if (host_get_page_state(pte) != PKVM_PAGE_OWNED) {
|
if (host_get_page_state(pte, addr) != PKVM_PAGE_OWNED) {
|
||||||
ret = -EPERM;
|
ret = -EPERM;
|
||||||
goto unlock;
|
goto unlock;
|
||||||
}
|
}
|
||||||
@@ -2112,7 +2110,7 @@ int __pkvm_host_reclaim_page(u64 pfn)
|
|||||||
if (ret)
|
if (ret)
|
||||||
goto unlock;
|
goto unlock;
|
||||||
|
|
||||||
if (host_get_page_state(pte) == PKVM_PAGE_OWNED)
|
if (host_get_page_state(pte, addr) == PKVM_PAGE_OWNED)
|
||||||
goto unlock;
|
goto unlock;
|
||||||
|
|
||||||
page = hyp_phys_to_page(addr);
|
page = hyp_phys_to_page(addr);
|
||||||
|
|||||||
Reference in New Issue
Block a user