通过 gcc 的扩展 asm 调用的系统调用修改的寄存器

Registers modified by systemcall invoked through gcc's extended asm

我正在使用 gcc 的扩展 asm 来调用系统调用。我正在 PowerPC(飞思卡尔 MPC5200B)上开发专有 RTOS。

根据 gcc 的 documentation 我应该将汇编代码使用的所有寄存器——既不是输入也不是输出——添加到 clobbers 列表中,因为 gcc 不分析汇编代码,因此不知道哪些寄存器正在被更改。

问题是我不知道系统调用改变了哪个寄存器。事实上,我正在观察系统调用更改保存指针的寄存器的情况。系统调用返回后,正在使用寄存器中的指针,导致内存访问无效。

遇到这种情况应该怎么处理?

对于未来的读者:

一般的答案是,您可以在系统 ABI 的文档中找到被系统调用更改的寄存器。

对于我的系统 (Freescale MPC5200B),我发现答案是 IBM Application Note 'Developing PowerPC Embedded Application Binary Interface (EABI) Compliant Programs'。

所以我将标记为 volatile 的寄存器(即 R3..R12、F0..F13 和标志寄存器)添加到 clobbers 列表中。