问题描述
我有一个使用 UEFI 启动的小型业余操作系统。我设置了 Intel 的 xHC 以使用 MSI-X 触发中断,然后我重置所有触发 2 个端口状态更改事件和一个中断的根集线器端口。这个中断现在什么都不做。它只是尝试在内联汇编中使用 iretq
返回正常的执行流程。
这一直失败,直到我有想法查看堆栈是什么导致它失败。我发现 xHC 的 MSI-X 功能似乎将某些东西推送到堆栈上。我只需要执行一次弹出操作或将 RSP 增加 8 即可使其工作。
我的问题是:
-
xHC 推入堆栈的是什么?
-
它在规范中的何处记录?它是在 xHCI 规范中还是在 PCI 规范中? (我无权访问后者)。
-
它是必须由所有 PCI 设备推送的传统事物还是特定于 Intel 的 xHC?
解决方法
我发现了罪魁祸首。我只是没有用 __attribute__((interrupt))
标记我的中断处理程序。 G++ 出于某种原因将 ebp 作为函数的入口,它搞乱了我的中断堆栈。我只是删除了 iretq
并让 g++ 完成从中断中正确返回的工作。
此外,我需要使用 -mgeneral-regs-only -mno-red-zone
g++ 选项来避免一些编译器错误。