我们正在开发一个玩具操作系统作为课堂作业。我在编写内核恐慌函数时遇到了一些麻烦。
它应该保存所有寄存器,调用一些类似 printf 的函数,然后打印保存的寄存器并停止 cpu。现在它被定义为一个宏:
#define panic(...) \
do{ \
asm volatile("SAVE_REGISTERS %1\n\t" : "m="(_panic_context)); \
_panic_printk(&_panic_context, __VA_ARGS__); \
while(0)
_panic_context
是一个全局变量,包含线程的已保存寄存器和更多内容。问题出在SAVE_REGISTERS
. 它是在汇编头文件中某处定义的宏,但我不知道如何包含它。文件中的简单#include 显然不起作用。我试过用谷歌搜索和写有趣和绝望的东西(比如汇编字符串中的#include :-))但没有任何帮助。你有什么想法如何解决这个问题吗?
我们正在使用 GCC 并为 MIPS 编译(在模拟器中运行 :-))
编辑:
SAVE_REGISTERS
用.macro SAVE_REGISTERS
... 定义。它不能在 C 宏中,因为它在其他汇编模块中使用。我不能用它制作 .S 文件,因为恐慌必须是可变的。或者至少我想不出任何其他方法来做到这一点。