gpt4 book ai didi

c - 了解arm64的kvm_vcpu_run_vhe函数

转载 作者:行者123 更新时间:2023-12-04 11:13:28 24 4
gpt4 key购买 nike

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 ,定义为 here .
我试图了解 __kvm_vcpu_run_vhe做。它会阻止调用者吗?什么 __guest_enter做?我查看了代码,它保存并恢复了一些寄存器,但我无法确定它在哪里运行 VM 代码。

最佳答案

是的,它会阻塞主机并开始运行 guest 直到下一个中​​断。__guest_enter传递了一个指向内核结构的指针,该结构描述了 guest 的 CPU 状态。汇编例程将该状态传送到适当的(主机)CPU 寄存器并执行将控制传送到客户机的指令。
该指令名为 eret ,它是“异常返回”的缩写。这是因为从 CPU 的角度来看, guest 触发了异常,内核在处理之后返回给 guest 。但是从内核的角度来看,被调用的是guest,稍后会返回内核!无论您怎么看,这都是 guest 代码开始执行的地方。
在 guest 执行期间的某个时刻,将发生中断,需要管理程序进行干预(例如当 guest 访问仿真硬件或需要注意的主机硬件时)。内核中的其他代码确保在发生这种情况时,内核会在 __guest_exit_panic 处继续执行。或 __guest_exit ,取决于引发的异常。前者触发内核 panic ,而后者将退出原因和 guest 状态存储回内核结构中,并将执行返回给 __guest_enter 的调用者。 .然后调用者可以决定从那时起如何处理客人。正如我们所见,一些导出被立即调度,甚至没有通知 __kvm_vcpu_run_vhe 的调用者。 ;其他人返回给调用者,并最终返回到用户空间。

关于c - 了解arm64的kvm_vcpu_run_vhe函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68417047/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com