在QEMU中启用了MSI,但中断处理程序不调用

问题描述 投票:0回答:0
,但我使用Rust而不是C ++,因此一些细节可能有所不同。)

i首先为USB鼠标和键盘设备实施了XHCI驱动程序,主要例程进入了一个无限循环以检查(民意调查)事件环正面和捕获设备事件TRB。

下一个任务是启用MSI中断PCI接口,以便主循环不再直接对事件戒指进行轮询。为了在QEMU中模仿这一点,我使用了
-device nec-usb-xhci选项(因为-device qemu-xhci

仅支持MSI-X,而不是MSI)。我仔细遵循了本书的说明 - 将适当的数据写入PCI配置空间,添加了一个中断处理程序,该处理程序处理排队的事件,加载了IDT,但中断处理程序将无法执行。

可能有什么可能有区别,我如何激活MSI中断?

我的调试尝试是:

我检查了

-trace "pci_cfg_write"
选项,我的写作是
pci_cfg_write nec-usb-xhci 04:0 @0x70 <- 0x890005
pci_cfg_write nec-usb-xhci 04:0 @0x74 <- 0xfee00000
pci_cfg_write nec-usb-xhci 04:0 @0x78 <- 0x0
pci_cfg_write nec-usb-xhci 04:0 @0x7c <- 0xc040

0x40
是我选择的xhci中断向量,一次只接受一个中断。) 与书中给出的C ++实现相同。这本书实施成功地启用了MSI,但我的实施却没有。

i还尝试在主循环中插入

int 0x40

以手动生成所需的(但不会生成)中断,并且鼠标像以前一样正常移动。这意味着我已经正确设置了IDT,正在生成事件,并且只有在

0x40
中断已经生成的情况下,中断处理程序才能完成其作业。

问题可能是您使用的

0xC0XX

值。我使用
0x40XX

,因为我想要触发模式(15)= 0,for Edge,Level(14)= 1 forLow

	
architecture operating-system interrupt qemu pci
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.