QEMU-旧版中断卡住了

时间:2019-03-05 11:50:16

标签: qemu legacy irq

我正在尝试开发PCI设备,并且需要实现旧式中断(不是MSI或MSIX)。我遵循了edu.c的示例,但是加载驱动程序时,IRQ仍然升高。

我尝试查看其他设备,但没有运气。这是我的代码:

static void xxx_pci_realize(...)
{
      // ....

    pci_config_set_interrupt_pin(pci_conf, 1);
    pci_set_irq(pdev, 0);

    // ....
}

有人知道不正确的地方吗? 谢谢!

2 个答案:

答案 0 :(得分:1)

您完全不应该在实现方法中弄乱PCI线的状态。该方法是创建设备的地方,并且在仿真开始时仅发生一次。为了响应系统运行时发生的事情,应该升高和降低中断线-通常,来宾写入寄存器,这会使您执行某些操作,这意味着您随后将引发中断。然后,来宾获得该中断,并告诉设备“确定,我现在已经处理了”,然后设备降低了中断。您可以在提到的“ edu.c”设备中看到此模式。

答案 1 :(得分:0)

似乎不是从我的设备发出该中断:我读到某个地方,在旧版IRQ上,设备链接在IRQ引脚10和11上。因此,CPU /内核无法说出是哪个发出的IRQ。

如果我理解得很好,当发出IRQ时,每个具有传统中断的设备都必须说出中断是否源于他。这是通过设置寄存器来完成的,该寄存器将由能够处理IRQ的驱动程序读取。然后列表中跟随他的设备将执行相同的操作。

由于我已经使我的QEMU PCI设备适应于返回0的寄存器,该寄存器指示该设备是否已发出IRQ,因此IRQ通过并在此之后被禁用。因此,我认为这是因为IRQ是由其他设备发出的。

如果有人认为这不是真正的原因,那么我很高兴知道是否还有另一种可能性:)

再次感谢@ peter-maydell的帮助!