]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
KVM: arm64: Move pkvm_vcpu_init_traps() to init_pkvm_hyp_vcpu()
authorFuad Tabba <tabba@google.com>
Fri, 18 Oct 2024 07:48:29 +0000 (08:48 +0100)
committerOliver Upton <oliver.upton@linux.dev>
Thu, 31 Oct 2024 18:45:24 +0000 (18:45 +0000)
Move pkvm_vcpu_init_traps() to the initialization of the
hypervisor's vcpu state in init_pkvm_hyp_vcpu(), and remove the
associated hypercall.

In protected mode, traps need to be initialized whenever a VCPU
is initialized anyway, and not only for protected VMs. This also
saves an unnecessary hypercall.

Signed-off-by: Fuad Tabba <tabba@google.com>
Link: https://lore.kernel.org/r/20241018074833.2563674-2-tabba@google.com
Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
arch/arm64/include/asm/kvm_asm.h
arch/arm64/kvm/arm.c
arch/arm64/kvm/hyp/include/nvhe/trap_handler.h
arch/arm64/kvm/hyp/nvhe/hyp-main.c
arch/arm64/kvm/hyp/nvhe/pkvm.c

index b36a3b6cc01169d3e8554382da48e15cba7cbc3f..7f7866d2bfc2bffceb1f69df2af59c408c32669a 100644 (file)
@@ -76,7 +76,6 @@ enum __kvm_host_smccc_func {
        __KVM_HOST_SMCCC_FUNC___kvm_timer_set_cntvoff,
        __KVM_HOST_SMCCC_FUNC___vgic_v3_save_vmcr_aprs,
        __KVM_HOST_SMCCC_FUNC___vgic_v3_restore_vmcr_aprs,
-       __KVM_HOST_SMCCC_FUNC___pkvm_vcpu_init_traps,
        __KVM_HOST_SMCCC_FUNC___pkvm_init_vm,
        __KVM_HOST_SMCCC_FUNC___pkvm_init_vcpu,
        __KVM_HOST_SMCCC_FUNC___pkvm_teardown_vm,
index a0d01c46e40845b8936b82638eb8010e2b23fe68..ece934bb4531991d0494c07c60a35443effda593 100644 (file)
@@ -856,14 +856,6 @@ int kvm_arch_vcpu_run_pid_change(struct kvm_vcpu *vcpu)
                static_branch_inc(&userspace_irqchip_in_use);
        }
 
-       /*
-        * Initialize traps for protected VMs.
-        * NOTE: Move to run in EL2 directly, rather than via a hypercall, once
-        * the code is in place for first run initialization at EL2.
-        */
-       if (kvm_vm_is_protected(kvm))
-               kvm_call_hyp_nvhe(__pkvm_vcpu_init_traps, vcpu);
-
        mutex_lock(&kvm->arch.config_lock);
        set_bit(KVM_ARCH_FLAG_HAS_RAN_ONCE, &kvm->arch.flags);
        mutex_unlock(&kvm->arch.config_lock);
index 45a84f0ade04bd6840bd11e1ee3bf70eabe4ff0b..1e6d995968a1fbd1c93cc80bfe3693da917a4adb 100644 (file)
@@ -15,6 +15,4 @@
 #define DECLARE_REG(type, name, ctxt, reg)     \
                                type name = (type)cpu_reg(ctxt, (reg))
 
-void __pkvm_vcpu_init_traps(struct kvm_vcpu *vcpu);
-
 #endif /* __ARM64_KVM_NVHE_TRAP_HANDLER_H__ */
index fefc89209f9e41c95478f6770881eb314a38b4c2..1a224d5df2075f25678c4cfdd6a12e3eb7990d0e 100644 (file)
@@ -349,13 +349,6 @@ static void handle___pkvm_prot_finalize(struct kvm_cpu_context *host_ctxt)
        cpu_reg(host_ctxt, 1) = __pkvm_prot_finalize();
 }
 
-static void handle___pkvm_vcpu_init_traps(struct kvm_cpu_context *host_ctxt)
-{
-       DECLARE_REG(struct kvm_vcpu *, vcpu, host_ctxt, 1);
-
-       __pkvm_vcpu_init_traps(kern_hyp_va(vcpu));
-}
-
 static void handle___pkvm_init_vm(struct kvm_cpu_context *host_ctxt)
 {
        DECLARE_REG(struct kvm *, host_kvm, host_ctxt, 1);
@@ -411,7 +404,6 @@ static const hcall_t host_hcall[] = {
        HANDLE_FUNC(__kvm_timer_set_cntvoff),
        HANDLE_FUNC(__vgic_v3_save_vmcr_aprs),
        HANDLE_FUNC(__vgic_v3_restore_vmcr_aprs),
-       HANDLE_FUNC(__pkvm_vcpu_init_traps),
        HANDLE_FUNC(__pkvm_init_vm),
        HANDLE_FUNC(__pkvm_init_vcpu),
        HANDLE_FUNC(__pkvm_teardown_vm),
index 077d4098548d2c87abdd3931285d87798d63adb3..869955e551a050d0b2e25b4d3275bef3713ef017 100644 (file)
@@ -204,7 +204,7 @@ static void pvm_init_trap_regs(struct kvm_vcpu *vcpu)
 /*
  * Initialize trap register values in protected mode.
  */
-void __pkvm_vcpu_init_traps(struct kvm_vcpu *vcpu)
+static void pkvm_vcpu_init_traps(struct kvm_vcpu *vcpu)
 {
        pvm_init_trap_regs(vcpu);
        pvm_init_traps_aa64pfr0(vcpu);
@@ -335,6 +335,8 @@ static int init_pkvm_hyp_vcpu(struct pkvm_hyp_vcpu *hyp_vcpu,
 
        hyp_vcpu->vcpu.arch.hw_mmu = &hyp_vm->kvm.arch.mmu;
        hyp_vcpu->vcpu.arch.cflags = READ_ONCE(host_vcpu->arch.cflags);
+
+       pkvm_vcpu_init_traps(&hyp_vcpu->vcpu);
 done:
        if (ret)
                unpin_host_vcpu(host_vcpu);