Skip to content

Commit 76f0b18

Browse files
Quentin PerretMarc Zyngier
authored andcommitted
KVM: arm64: Introduce __pkvm_host_mkyoung_guest()
Plumb the kvm_pgtable_stage2_mkyoung() callback into pKVM for non-protected guests. It will be called later from the fault handling path. 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 56ab4de commit 76f0b18

File tree

4 files changed

+41
-0
lines changed

4 files changed

+41
-0
lines changed

arch/arm64/include/asm/kvm_asm.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ enum __kvm_host_smccc_func {
7070
__KVM_HOST_SMCCC_FUNC___pkvm_host_relax_perms_guest,
7171
__KVM_HOST_SMCCC_FUNC___pkvm_host_wrprotect_guest,
7272
__KVM_HOST_SMCCC_FUNC___pkvm_host_test_clear_young_guest,
73+
__KVM_HOST_SMCCC_FUNC___pkvm_host_mkyoung_guest,
7374
__KVM_HOST_SMCCC_FUNC___kvm_adjust_pc,
7475
__KVM_HOST_SMCCC_FUNC___kvm_vcpu_run,
7576
__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
@@ -45,6 +45,7 @@ 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);
4747
int __pkvm_host_test_clear_young_guest(u64 gfn, bool mkold, struct pkvm_hyp_vm *vm);
48+
int __pkvm_host_mkyoung_guest(u64 gfn, struct pkvm_hyp_vcpu *vcpu);
4849

4950
bool addr_is_memory(phys_addr_t phys);
5051
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: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,24 @@ static void handle___pkvm_host_test_clear_young_guest(struct kvm_cpu_context *ho
324324
cpu_reg(host_ctxt, 1) = ret;
325325
}
326326

327+
static void handle___pkvm_host_mkyoung_guest(struct kvm_cpu_context *host_ctxt)
328+
{
329+
DECLARE_REG(u64, gfn, host_ctxt, 1);
330+
struct pkvm_hyp_vcpu *hyp_vcpu;
331+
int ret = -EINVAL;
332+
333+
if (!is_protected_kvm_enabled())
334+
goto out;
335+
336+
hyp_vcpu = pkvm_get_loaded_hyp_vcpu();
337+
if (!hyp_vcpu || pkvm_hyp_vcpu_is_protected(hyp_vcpu))
338+
goto out;
339+
340+
ret = __pkvm_host_mkyoung_guest(gfn, hyp_vcpu);
341+
out:
342+
cpu_reg(host_ctxt, 1) = ret;
343+
}
344+
327345
static void handle___kvm_adjust_pc(struct kvm_cpu_context *host_ctxt)
328346
{
329347
DECLARE_REG(struct kvm_vcpu *, vcpu, host_ctxt, 1);
@@ -538,6 +556,7 @@ static const hcall_t host_hcall[] = {
538556
HANDLE_FUNC(__pkvm_host_relax_perms_guest),
539557
HANDLE_FUNC(__pkvm_host_wrprotect_guest),
540558
HANDLE_FUNC(__pkvm_host_test_clear_young_guest),
559+
HANDLE_FUNC(__pkvm_host_mkyoung_guest),
541560
HANDLE_FUNC(__kvm_adjust_pc),
542561
HANDLE_FUNC(__kvm_vcpu_run),
543562
HANDLE_FUNC(__kvm_flush_vm_context),

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1549,3 +1549,23 @@ int __pkvm_host_test_clear_young_guest(u64 gfn, bool mkold, struct pkvm_hyp_vm *
15491549

15501550
return ret;
15511551
}
1552+
1553+
int __pkvm_host_mkyoung_guest(u64 gfn, struct pkvm_hyp_vcpu *vcpu)
1554+
{
1555+
struct pkvm_hyp_vm *vm = pkvm_hyp_vcpu_to_hyp_vm(vcpu);
1556+
u64 ipa = hyp_pfn_to_phys(gfn);
1557+
u64 phys;
1558+
int ret;
1559+
1560+
host_lock_component();
1561+
guest_lock_component(vm);
1562+
1563+
ret = __check_host_shared_guest(vm, &phys, ipa);
1564+
if (!ret)
1565+
kvm_pgtable_stage2_mkyoung(&vm->pgt, ipa, 0);
1566+
1567+
guest_unlock_component(vm);
1568+
host_unlock_component();
1569+
1570+
return ret;
1571+
}

0 commit comments

Comments
 (0)