PCI设备的MSI-X功能对堆栈有什么影响



我有一个用UEFI引导的小爱好操作系统。我设置英特尔的xHC使用MSI-X触发中断,然后重置所有根集线器端口,这会触发2个端口状态更改事件和一个中断。这次中断暂时没有任何作用。它只是尝试在内联程序集中使用iretq返回到正常的执行流。

这是失败的,直到我有了一个想法,看看是什么导致了它的失败。我发现xHC的MSI-X功能似乎在堆栈上推动了一些东西。我只需要做一次弹出操作或将RSP增加8即可使其工作。

我的问题是:

  1. xHC在堆栈上推动的是什么?

  2. 规范中的文件记录在哪里?它是xHCI规范还是PCI规范?(我无法访问后者(。

  3. 它是所有PCI设备都必须推动的传统东西,还是英特尔的xHC特有的?

我发现了罪魁祸首。我只是没有用__attribute__((interrupt))标记我的中断处理程序。G++出于某种原因将ebp作为函数的入口,这扰乱了我的中断堆栈。我只是删除了iretq,让g++完成从中断中正确返回的工作。

此外,我需要使用-mgeneral-regs-only -mno-red-zoneg++选项来避免一些编译器错误。

最新更新