QEMU - 旧版中断卡住了

问题描述 投票:0回答:2

我正在尝试开发PCI设备,我需要实现遗留中断(不是MSI或MSIX)。我按照edu.c的例子,但是当我加载我的驱动程序时仍然会引发IRQ。

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

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

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

    // ....
}

有没有人知道什么是不正确的?谢谢 !

qemu legacy irq
2个回答
1
投票

你根本不应该试图在你的实现方法中弄乱PCI线的状态。该方法是创建设备的地方,并且在模拟开始时仅发生一次。应该提升和降低中断线以响应系统运行时发生的事情 - 通常客户端写入一个寄存器,这会导致您执行某些操作,然后再引发中断。然后客人得到那个中断,并告诉设备“好的,我现在已经处理过了”,然后设备降低了中断。你可以在你提到的'edu.c'设备中看到这种模式。


0
投票

似乎中断不是从我的设备发出的:我已经读过某些地方,在传统的IRQ上,设备被连接在IRQ引脚10和11上。所以CPU /内核无法说出哪一个发出了IRQ。

如果我理解得很清楚,当发出IRQ时,每个具有遗留中断的设备都必须说明中断是否来自他。它是通过设置将由能够处理IRQ的驱动程序读取的寄存器来完成的。然后列表中跟随他的设备也会这样做。

由于我已经调整了我的QEMU PCI设备以返回0表示设备是否已发出IRQ的寄存器,因此IRQ通过并在此之后被禁用。所以我认为这是因为IRQ是由其他设备发布的。

如果有人认为这不是真正的原因,我会很高兴知道是否还有其他可能性:)

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

© www.soinside.com 2019 - 2024. All rights reserved.