繁体   English   中英

了解arm64的kvm_vcpu_run_vhe函数

[英]Understanding arm64's kvm_vcpu_run_vhe function

arch/arm64/kvm/hyp/vhe/switch.c 中,我们有以下代码在 arm64 上运行 EL2(虚拟化层)中的 CPU:

/* Switch to the guest for VHE systems running in EL2 */
static int __kvm_vcpu_run_vhe(struct kvm_vcpu *vcpu)
{
    struct kvm_cpu_context *host_ctxt;
    struct kvm_cpu_context *guest_ctxt;
    u64 exit_code;

    host_ctxt = &this_cpu_ptr(&kvm_host_data)->host_ctxt;
    host_ctxt->__hyp_running_vcpu = vcpu;
    guest_ctxt = &vcpu->arch.ctxt;

    sysreg_save_host_state_vhe(host_ctxt);

    /*
     * ARM erratum 1165522 requires us to configure both stage 1 and
     * stage 2 translation for the guest context before we clear
     * HCR_EL2.TGE.
     *
     * We have already configured the guest's stage 1 translation in
     * kvm_vcpu_load_sysregs_vhe above.  We must now call
     * __load_guest_stage2 before __activate_traps, because
     * __load_guest_stage2 configures stage 2 translation, and
     * __activate_traps clear HCR_EL2.TGE (among other things).
     */
    __load_guest_stage2(vcpu->arch.hw_mmu);
    __activate_traps(vcpu);

    __kvm_adjust_pc(vcpu);

    sysreg_restore_guest_state_vhe(guest_ctxt);
    __debug_switch_to_guest(vcpu);

    do {
        /* Jump in the fire! */
        exit_code = __guest_enter(vcpu);

        /* And we're baaack! */
    } while (fixup_guest_exit(vcpu, &exit_code));

    sysreg_save_guest_state_vhe(guest_ctxt);

    __deactivate_traps(vcpu);

    sysreg_restore_host_state_vhe(host_ctxt);

    if (vcpu->arch.flags & KVM_ARM64_FP_ENABLED)
        __fpsimd_save_fpexc32(vcpu);

    __debug_switch_to_host(vcpu);

    return exit_code;
}
NOKPROBE_SYMBOL(__kvm_vcpu_run_vhe);

我认为这里重要的一行是__guest_enter ,它在这里定义。

我试图了解__kvm_vcpu_run_vhe究竟做了什么。 它会阻止呼叫者吗? __guest_enter什么作用? 我查看了代码,它保存并恢复了一些寄存器,但我无法确定它在哪里运行 VM 代码。

是的,它会阻塞主机并开始运行来宾直到下一个中​​断。

__guest_enter被传递一个指向内核结构的指针,该结构描述了来宾的 CPU 状态。 汇编例程将该状态传送到适当的(主机)CPU 寄存器并执行将控制传送到客户机的指令。

该指令名为eret ,它是“异常返回”的缩写。 这是因为从 CPU 的角度来看,来宾触发了异常,内核在处理之后返回给来宾。 但是从内核的角度来看,被调用的是guest,稍后会返回内核! 无论您怎么看,这都是来宾代码开始执行的地方。

在来宾执行期间的某个时刻,将发生中断,需要管理程序进行干预(例如当来宾访问仿真硬件或需要注意的主机硬件时)。 内核中的其他代码确保在发生这种情况时,内核会在__guest_exit_panic__guest_exit处继续执行,具体取决于引发的异常。 前者触发内核恐慌,而后者将退出原因和来宾状态存储回内核结构中,并将执行返回给__guest_enter的调用者。 然后呼叫者可以决定从那时起如何处理客人。 正如我们所看到的,一些出口被立即调度,甚至没有通知__kvm_vcpu_run_vhe的调用者; 其他人返回给调用者,并最终返回到用户空间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM