上面的ioctl对应内核中的kvm_vm_ioctl,内核首先case到KVM_IRQ_LINE。然后解析 static long kvm_vm_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg) { … #ifdef __KVM_HAVE_IRQ_LINE case KVM_IRQ_LINE_STATUS: case KVM_IRQ_LINE: { struct kvm_irq_level irq_event; r = -EFAULT;...
r = kvm_vm_ioctl_irq_line(kvm, &irq_event, ioctl == KVM_IRQ_LINE_STATUS); if (r) goto out; r = -EFAULT; if (ioctl == KVM_IRQ_LINE_STATUS) { if (copy_to_user(argp, &irq_event, sizeof(irq_event))) goto out; } r = 0; break; } #endif #ifdef CONFIG_HAVE_KVM_IRQ_R...
r = kvm_vm_ioctl_irq_line(kvm, &irq_event, ioctl == KVM_IRQ_LINE_STATUS); break; } #endif #ifdef CONFIG_HAVE_KVM_IRQ_ROUTING case KVM_SET_GSI_ROUTING: { r = kvm_set_irq_routing(kvm, entries, routing.nr, routing.flags); } #endif /* CONFIG_HAVE_KVM_IRQ_ROUTING */ case KVM...
kvm提供了set irq line这ioctl给user-mode调用,也提供了kvm_vm_ioctl_irq_line这样的函数在kernel-mode使用。 以键盘i8042 kbd为例,如果模拟一个键盘中断,即set irq 1。 虚拟触发了irq 1,那么需要经过irq routing: irq 1在0-7的范围内,所以会路由到i8259 master,随后i8259 master会向vCPU注入中断。 同时,i...
ret =kvm_vm_ioctl(kvm_state, KVM_GET_PIT2, &kpit);if(ret <0) {fprintf(stderr,"KVM_GET_PIT2 failed: %s\n", strerror(ret));abort(); } pit->channels[0].irq_disabled = kpit.flags & KVM_PIT_FLAGS_HPET_LEGACY; }else{/* ...
|-->kvm_vm_ioctl(...,KVM_IOEVENTFD,...) KVM_IRQFD staticintkvm_irqchip_assign_irqfd(KVMState *s, EventNotifier *event, EventNotifier*resample,intvirq,boolassign) {intfd = event_notifier_get_fd(event);intrfd = resample ? event_notifier_get_fd(resample) : -1;structkvm_irqfd irqfd ...
I8042 mouse,产生的irq是12,所以是i8259 slave产生的。 vda是virtio-blk,它是一个pci设备,它的中断是msi信号。 net0也是pci设备,中断也是msi信号。 2,irq routing 物理环境上,irq是由硬件产生的。在虚拟化下,却是由虚拟出来的。 kvm提供了set irq line这ioctl给user-mode调用,也提供了kvm_vm_ioctl_irq_lin...
中断注入在KVM内部流程起始于一个函数kvm_set_irq int kvm_set_irq(struct kvm *kvm, int irq_source_id, u32 irq, int level, bool line_status) { struct kvm_kernel_irq_routing_entry *e, irq_set[KVM_NR_IRQCHIPS]; int ret = -1, i = 0; ...
3.TAP设备会进行判断这个请求是发给谁的,如果是发给Host的,则直接调用Host的中断处理函数;如果是发给VM的,那么就会TAP就会调用一系列函数,比如select,知道调用到kvm_vm_ioctl(, KVM_IRQ_LINE_STATUS,)。到此为止,QEMU模拟结束,开始进入KVM执行。 4.kvm_set_irq() (irqchip.c)函数说明 ...
Centos5 kernel v2.6.18环境下Libkvm通过ioctl创建虚拟机VM Entry Error: 0x80000022,VM entry: failure due to MSR loading,VMentry Msr加载失败。分析VMCS-VM Entry_Setup入手,读取了IA32_VMX_ENTRY_CTLS(0x484)寄存器的数据,运算后写入VM_ENTRY_CONTROLS(0x4012)。