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