关于KVM中处理外部中断的处理代码
2016-09-11 08:20
1176 查看
今天读代码发现了一个关于"acknowledge interrupt on exit"特性细节
VM-EIXT外部中断的处理函数为handle_external_interrupt
而该函数中只是增加了统计信息,没有处理,就开始找外部中断的真正处理地方
最后发现原来是在vcpu_enter_guest中调用vmx_handle_external_intr进行了外部中断的真正处理
vmx_handle_external_intr 处理了真正的外部物理中断,后面的exit handler 就只是增加个统计就可以了
VM-EIXT外部中断的处理函数为handle_external_interrupt
static int (*const kvm_vmx_exit_handlers[])(struct kvm_vcpu *vcpu) = { [EXIT_REASON_EXTERNAL_INTERRUPT] = handle_external_interrupt }
而该函数中只是增加了统计信息,没有处理,就开始找外部中断的真正处理地方
static int handle_external_interrupt(struct kvm_vcpu *vcpu) { ++vcpu->stat.irq_exits; return 1; }
最后发现原来是在vcpu_enter_guest中调用vmx_handle_external_intr进行了外部中断的真正处理
vcpu_enter_guest() { kvm_x86_ops->handle_external_intr(vcpu); //也就是vmx_handle_external_intr() } static void vmx_handle_external_intr(struct kvm_vcpu *vcpu) { u32 exit_intr_info = vmcs_read32(VM_EXIT_INTR_INFO); /* * 如果中心的类型是外部中断 */ if ((exit_intr_info & (INTR_INFO_VALID_MASK | INTR_INFO_INTR_TYPE_MASK)) == (INTR_INFO_VALID_MASK | INTR_TYPE_EXT_INTR)) { unsigned int vector; unsigned long entry; gate_desc *desc; struct vcpu_vmx *vmx = to_vmx(vcpu); #ifdef CONFIG_X86_64 unsigned long tmp; #endif /* 取得外部中断的vector值, * (这是因为处理器的"acknowledge interrupt on exit"特性会自动ACK,就自动拿到了vector, * 但是这个特性使能之后,处理器不会再通过IDT调用中断处理函数,而是使用vmx handler * vmx handler在这里构造中断栈帧,然后根据vector的值到IDT中找到真正的处理函数完成中断的处理 * 注意,这里会将中断栈帧中的IF置位,这样中断处理完成的时候,就会自动的开启中断了) */ vector = exit_intr_info & INTR_INFO_VECTOR_MASK; /* * 找到中断描述符,并得到门入口 */ desc = (gate_desc *)vmx->host_idt_base + vector; entry = gate_offset(*desc); asm volatile( #ifdef CONFIG_X86_64 "mov %%" _ASM_SP ", %[sp]\n\t" "and $0xfffffffffffffff0, %%" _ASM_SP "\n\t" "push $%c[ss]\n\t" "push %[sp]\n\t" #endif "pushf\n\t" "or$%c[cs]\n\t" "call *%[entryl $0x200, (%%" _ASM_SP ")\n\t" /*调用真正的中断处理函数*/ __ASM_SIZE(push) " ]\n\t" : #ifdef CONFIG_X86_64 [sp]"=&r"(tmp) #endif : [entry]"r"(entry), [ss]"i"(__KERNEL_DS), [cs]"i"(__KERNEL_CS) ); } else /*如果不是外部中断,直接调用local_irq_enable开启中断*/ local_irq_enable(); }
vmx_handle_external_intr 处理了真正的外部物理中断,后面的exit handler 就只是增加个统计就可以了
相关文章推荐
- 关于STM32外部中断EXTI10-15,EXTI5-9共用一个中断向量处理方法
- kvm对外部中断的处理
- 关于Form KeyDown事件的处理代码执行两次的问题
- 关于LINUX中的中断处理
- 关于在多处理器suse11上中断处理中使用current宏的问题及解决方法
- xen中外部中断处理分析
- 关于外部中断的一些问题,上拉电阻,抗干扰等
- 关于Java异常处理的学习代码
- ARM周立功模板启动代码中断处理文件IRQ.C的中文解释
- 关于J2ME的中断事件处理
- 关于linux内核中断处理和内核抢占的两个说明
- 关于中断处理程序中的关中断函数disable_irq和disable_irq_nosync
- eCos学习笔记之中断处理代码分析
- 关于在vs2005中出现: error LNK2001: 无法解析的外部符号 __security_cookie现象的处理办法
- IA64 Linux 外部中断处理机制(转)
- 关于J2ME的中断事件处理
- 一个关于图片处理的代码
- ARM Linux外部中断处理过程
- 关于JavaScript代码的运行时暂停(:中断:阻塞) 的一些想法
- 关于中断处理程序中的关中断函数disable_irq和disable_irq_nosync