KVM: arm64: nVHE: Fix pointers during SMCCC convertion
authorAndrew Scull <ascull@google.com>
Tue, 15 Sep 2020 10:46:43 +0000 (11:46 +0100)
committerMarc Zyngier <maz@kernel.org>
Tue, 15 Sep 2020 17:39:04 +0000 (18:39 +0100)
The host need not concern itself with the pointer differences for the
hyp interfaces that are shared between VHE and nVHE so leave it to the
hyp to handle.

As the SMCCC function IDs are converted into function calls, it is a
suitable place to also convert any pointer arguments into hyp pointers.
This, additionally, eases the reuse of the handlers in different
contexts.

Signed-off-by: Andrew Scull <ascull@google.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20200915104643.2543892-20-ascull@google.com
arch/arm64/kvm/hyp/nvhe/hyp-main.c
arch/arm64/kvm/hyp/nvhe/switch.c
arch/arm64/kvm/hyp/nvhe/tlb.c
arch/arm64/kvm/vgic/vgic-v3.c

index 41aaf038599ac352294ab8f5c134eb8a89717c9d..e2eafe2c93affc542ff3a92ef7ec15a3c15a059d 100644 (file)
@@ -24,7 +24,7 @@ static void handle_host_hcall(unsigned long func_id,
                unsigned long r1 = host_ctxt->regs.regs[1];
                struct kvm_vcpu *vcpu = (struct kvm_vcpu *)r1;
 
-               ret = __kvm_vcpu_run(vcpu);
+               ret = __kvm_vcpu_run(kern_hyp_va(vcpu));
                break;
        }
        case KVM_HOST_SMCCC_FUNC(__kvm_flush_vm_context):
@@ -36,21 +36,21 @@ static void handle_host_hcall(unsigned long func_id,
                phys_addr_t ipa = host_ctxt->regs.regs[2];
                int level = host_ctxt->regs.regs[3];
 
-               __kvm_tlb_flush_vmid_ipa(mmu, ipa, level);
+               __kvm_tlb_flush_vmid_ipa(kern_hyp_va(mmu), ipa, level);
                break;
        }
        case KVM_HOST_SMCCC_FUNC(__kvm_tlb_flush_vmid): {
                unsigned long r1 = host_ctxt->regs.regs[1];
                struct kvm_s2_mmu *mmu = (struct kvm_s2_mmu *)r1;
 
-               __kvm_tlb_flush_vmid(mmu);
+               __kvm_tlb_flush_vmid(kern_hyp_va(mmu));
                break;
        }
        case KVM_HOST_SMCCC_FUNC(__kvm_tlb_flush_local_vmid): {
                unsigned long r1 = host_ctxt->regs.regs[1];
                struct kvm_s2_mmu *mmu = (struct kvm_s2_mmu *)r1;
 
-               __kvm_tlb_flush_local_vmid(mmu);
+               __kvm_tlb_flush_local_vmid(kern_hyp_va(mmu));
                break;
        }
        case KVM_HOST_SMCCC_FUNC(__kvm_timer_set_cntvoff): {
@@ -84,14 +84,14 @@ static void handle_host_hcall(unsigned long func_id,
                unsigned long r1 = host_ctxt->regs.regs[1];
                struct vgic_v3_cpu_if *cpu_if = (struct vgic_v3_cpu_if *)r1;
 
-               __vgic_v3_save_aprs(cpu_if);
+               __vgic_v3_save_aprs(kern_hyp_va(cpu_if));
                break;
        }
        case KVM_HOST_SMCCC_FUNC(__vgic_v3_restore_aprs): {
                unsigned long r1 = host_ctxt->regs.regs[1];
                struct vgic_v3_cpu_if *cpu_if = (struct vgic_v3_cpu_if *)r1;
 
-               __vgic_v3_restore_aprs(cpu_if);
+               __vgic_v3_restore_aprs(kern_hyp_va(cpu_if));
                break;
        }
        default:
index 29febf9a93f23b4f76510808fae56db39b8a9c6e..a29f247f35e3a395babdaa77b32374eca180cc4d 100644 (file)
@@ -176,8 +176,6 @@ int __kvm_vcpu_run(struct kvm_vcpu *vcpu)
                pmr_sync();
        }
 
-       vcpu = kern_hyp_va(vcpu);
-
        host_ctxt = &__hyp_this_cpu_ptr(kvm_host_data)->host_ctxt;
        host_ctxt->__hyp_running_vcpu = vcpu;
        guest_ctxt = &vcpu->arch.ctxt;
index 69eae608d6708194c4879c63928e0343dc521c3c..544bca3072b72ecdce4c3cf87071d6b75dcc6612 100644 (file)
@@ -54,7 +54,6 @@ void __kvm_tlb_flush_vmid_ipa(struct kvm_s2_mmu *mmu,
        dsb(ishst);
 
        /* Switch to requested VMID */
-       mmu = kern_hyp_va(mmu);
        __tlb_switch_to_guest(mmu, &cxt);
 
        /*
@@ -108,7 +107,6 @@ void __kvm_tlb_flush_vmid(struct kvm_s2_mmu *mmu)
        dsb(ishst);
 
        /* Switch to requested VMID */
-       mmu = kern_hyp_va(mmu);
        __tlb_switch_to_guest(mmu, &cxt);
 
        __tlbi(vmalls12e1is);
index 76e2d85789ed4fd8348e5a41080fa25018528589..9cdf39a94a635697257f15b727e8b2886547f15c 100644 (file)
@@ -662,7 +662,7 @@ void vgic_v3_load(struct kvm_vcpu *vcpu)
        if (likely(cpu_if->vgic_sre))
                kvm_call_hyp(__vgic_v3_write_vmcr, cpu_if->vgic_vmcr);
 
-       kvm_call_hyp(__vgic_v3_restore_aprs, kern_hyp_va(cpu_if));
+       kvm_call_hyp(__vgic_v3_restore_aprs, cpu_if);
 
        if (has_vhe())
                __vgic_v3_activate_traps(cpu_if);
@@ -686,7 +686,7 @@ void vgic_v3_put(struct kvm_vcpu *vcpu)
 
        vgic_v3_vmcr_sync(vcpu);
 
-       kvm_call_hyp(__vgic_v3_save_aprs, kern_hyp_va(cpu_if));
+       kvm_call_hyp(__vgic_v3_save_aprs, cpu_if);
 
        if (has_vhe())
                __vgic_v3_deactivate_traps(cpu_if);