KVM如何处理NMI中断


handle_exception:
vmx-exit handler函数在处理NMI时,直接忽略掉。注释中指出,NMI在此之前由vmx_vcpu_run 函数处理掉。

   
  4222 static int handle_exception(struct kvm_vcpu *vcpu)
  
....
4246
4247 if ((intr_info & INTR_INFO_INTR_TYPE_MASK) == INTR_TYPE_NMI_INTR)
4248 return 1; /* already handled by vmx_vcpu_run() */

vmx_vcpu_run:
本函数在实现虚拟机的启动,同时后半部分代码作为vmx_exit返回时在host中的hander处理部分。NMI的处理就在后面的vmx_complete_atomic_exit中。

   
  6133 static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu)
  
...
vmx_complete_atomic_exit(vmx);
6303 vmx_recover_nmi_blocking(vmx);
6304 vmx_complete_interrupts(vmx);
6305 }

vmx_complete_atomic_exit:
在这个函数里面,遇到NMI时,直接调用

   
  int $2
 

触发host中的NMI中断处理。请教各位
1、为什么要这么处理,而不直接将NMI注入到guest中进行处理呢?
2、代码没有找出host中 int $2对应的中断处理例程。哪位能帮忙指出下。

   
  5963 static void vmx_complete_atomic_exit(struct vcpu_vmx *vmx)
  
....
5967 if (!(vmx->exit_reason == EXIT_REASON_MCE_DURING_VMENTRY
5968 || vmx->exit_reason == EXIT_REASON_EXCEPTION_NMI))
5969 return;
5970
5971 vmx->exit_intr_info = vmcs_read32(VM_EXIT_INTR_INFO);
5972 exit_intr_info = vmx->exit_intr_info;
...
5977
5978 /* We need to handle NMIs before interrupts are enabled */
5979 if ((exit_intr_info & INTR_INFO_INTR_TYPE_MASK) == INTR_TYPE_NMI_INTR &&
5980 (exit_intr_info & INTR_INFO_VALID_MASK)) {
5981 kvm_before_handle_nmi(&vmx->vcpu);
5982 asm("int $2");
5983 kvm_after_handle_nmi(&vmx->vcpu);
5984 }
5985 }

Linux 内核

四月一日君尋 11 years, 11 months ago

Your Answer