PCI 设备的 MSI-X 功能将什么推入堆栈?

What does the MSI-X capability of PCI devices push on the stack?

我有个小爱好OS我用UEFI启动。我将 Intel 的 xHC 设置为使用 MSI-X 触发中断,然后重置所有根集线器端口,这会触发 2 个端口状态更改事件和一个中断。这个中断现在什么都不做。它只是尝试在内联汇编中使用 iretq 返回到正常的执行流程。

在我想到查看堆栈以找出导致它失败的原因之前,这是失败的。我发现 xHC 的 MSI-X 功能似乎将某些东西推入了堆栈。我只需要执行一次弹出操作或将 RSP 增加 8 即可使其工作。

我的问题是:

  1. xHC压栈的是什么?

  2. 它在规范中的什么地方有记载?它是在 xHCI 规范中还是在 PCI 规范中? (我无法访问后者)。

  3. 它是所有PCI设备必须推的常规东西还是Intel的xHC特有的?

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

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