Skip to content

Commit 56ab4de

Browse files
Quentin PerretMarc Zyngier
authored andcommitted
KVM: arm64: Introduce __pkvm_host_test_clear_young_guest()
Plumb the kvm_stage2_test_clear_young() callback into pKVM for non-protected guest. It will be later be called from MMU notifiers. Tested-by: Fuad Tabba <[email protected]> Reviewed-by: Fuad Tabba <[email protected]> Signed-off-by: Quentin Perret <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Marc Zyngier <[email protected]>
1 parent 26117e4 commit 56ab4de

File tree

4 files changed

+43
-0
lines changed

4 files changed

+43
-0
lines changed

arch/arm64/include/asm/kvm_asm.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ enum __kvm_host_smccc_func {
6969
__KVM_HOST_SMCCC_FUNC___pkvm_host_unshare_guest,
7070
__KVM_HOST_SMCCC_FUNC___pkvm_host_relax_perms_guest,
7171
__KVM_HOST_SMCCC_FUNC___pkvm_host_wrprotect_guest,
72+
__KVM_HOST_SMCCC_FUNC___pkvm_host_test_clear_young_guest,
7273
__KVM_HOST_SMCCC_FUNC___kvm_adjust_pc,
7374
__KVM_HOST_SMCCC_FUNC___kvm_vcpu_run,
7475
__KVM_HOST_SMCCC_FUNC___kvm_flush_vm_context,

arch/arm64/kvm/hyp/include/nvhe/mem_protect.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ int __pkvm_host_share_guest(u64 pfn, u64 gfn, struct pkvm_hyp_vcpu *vcpu,
4444
int __pkvm_host_unshare_guest(u64 gfn, struct pkvm_hyp_vm *hyp_vm);
4545
int __pkvm_host_relax_perms_guest(u64 gfn, struct pkvm_hyp_vcpu *vcpu, enum kvm_pgtable_prot prot);
4646
int __pkvm_host_wrprotect_guest(u64 gfn, struct pkvm_hyp_vm *hyp_vm);
47+
int __pkvm_host_test_clear_young_guest(u64 gfn, bool mkold, struct pkvm_hyp_vm *vm);
4748

4849
bool addr_is_memory(phys_addr_t phys);
4950
int host_stage2_idmap_locked(phys_addr_t addr, u64 size, enum kvm_pgtable_prot prot);

arch/arm64/kvm/hyp/nvhe/hyp-main.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,27 @@ static void handle___pkvm_host_wrprotect_guest(struct kvm_cpu_context *host_ctxt
303303
cpu_reg(host_ctxt, 1) = ret;
304304
}
305305

306+
static void handle___pkvm_host_test_clear_young_guest(struct kvm_cpu_context *host_ctxt)
307+
{
308+
DECLARE_REG(pkvm_handle_t, handle, host_ctxt, 1);
309+
DECLARE_REG(u64, gfn, host_ctxt, 2);
310+
DECLARE_REG(bool, mkold, host_ctxt, 3);
311+
struct pkvm_hyp_vm *hyp_vm;
312+
int ret = -EINVAL;
313+
314+
if (!is_protected_kvm_enabled())
315+
goto out;
316+
317+
hyp_vm = get_np_pkvm_hyp_vm(handle);
318+
if (!hyp_vm)
319+
goto out;
320+
321+
ret = __pkvm_host_test_clear_young_guest(gfn, mkold, hyp_vm);
322+
put_pkvm_hyp_vm(hyp_vm);
323+
out:
324+
cpu_reg(host_ctxt, 1) = ret;
325+
}
326+
306327
static void handle___kvm_adjust_pc(struct kvm_cpu_context *host_ctxt)
307328
{
308329
DECLARE_REG(struct kvm_vcpu *, vcpu, host_ctxt, 1);
@@ -516,6 +537,7 @@ static const hcall_t host_hcall[] = {
516537
HANDLE_FUNC(__pkvm_host_unshare_guest),
517538
HANDLE_FUNC(__pkvm_host_relax_perms_guest),
518539
HANDLE_FUNC(__pkvm_host_wrprotect_guest),
540+
HANDLE_FUNC(__pkvm_host_test_clear_young_guest),
519541
HANDLE_FUNC(__kvm_adjust_pc),
520542
HANDLE_FUNC(__kvm_vcpu_run),
521543
HANDLE_FUNC(__kvm_flush_vm_context),

arch/arm64/kvm/hyp/nvhe/mem_protect.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1530,3 +1530,22 @@ int __pkvm_host_wrprotect_guest(u64 gfn, struct pkvm_hyp_vm *vm)
15301530

15311531
return ret;
15321532
}
1533+
1534+
int __pkvm_host_test_clear_young_guest(u64 gfn, bool mkold, struct pkvm_hyp_vm *vm)
1535+
{
1536+
u64 ipa = hyp_pfn_to_phys(gfn);
1537+
u64 phys;
1538+
int ret;
1539+
1540+
host_lock_component();
1541+
guest_lock_component(vm);
1542+
1543+
ret = __check_host_shared_guest(vm, &phys, ipa);
1544+
if (!ret)
1545+
ret = kvm_pgtable_stage2_test_clear_young(&vm->pgt, ipa, PAGE_SIZE, mkold);
1546+
1547+
guest_unlock_component(vm);
1548+
host_unlock_component();
1549+
1550+
return ret;
1551+
}

0 commit comments

Comments
 (0)