Assembly 在PowerPC上处理外部异常时使用r1堆栈指针

Assembly 在PowerPC上处理外部异常时使用r1堆栈指针,assembly,exception-handling,embedded,powerpc,Assembly,Exception Handling,Embedded,Powerpc,我正在编写一个汇编程序例程来处理EABI嵌入式PowerPC应用程序中的0x500外部/递减异常 在从0x500向量点调用的汇编程序例程中,我希望在分支到“C”中的处理程序函数之前使用一些内存来保存寄存器的上下文 因为 i) 异常模型保证在异常处理程序运行时,前面的指令已经完成 及 ii)调用约定似乎会在输入新函数时首先更新堆栈指针(r1),然后再使用通过移动释放的新堆栈空间(并将堆栈指针移回函数末尾的最后位置) 在我看来,在异常处理例程中,我可以安全地使用r1在正常堆栈上给自己更多的空间,前提

我正在编写一个汇编程序例程来处理EABI嵌入式PowerPC应用程序中的0x500外部/递减异常

在从0x500向量点调用的汇编程序例程中,我希望在分支到“C”中的处理程序函数之前使用一些内存来保存寄存器的上下文

因为 i) 异常模型保证在异常处理程序运行时,前面的指令已经完成 及 ii)调用约定似乎会在输入新函数时首先更新堆栈指针(r1),然后再使用通过移动释放的新堆栈空间(并将堆栈指针移回函数末尾的最后位置)

在我看来,在异常处理例程中,我可以安全地使用r1在正常堆栈上给自己更多的空间,前提是我遵守调用约定,将堆栈恢复到原来的状态,并确保SRR0和SRR1未被修改

我不允许在处理过程中使用堆栈的异常嵌套(尽管实际上使用这种方法我不确定是否会有问题)


您认为这是一种明智的方法,还是应该使用单独的堆栈来处理异常我认为这可能会带来它自己的问题。

在堆栈上保存寄存器上下文的唯一缺点是,您可能遇到的异常之一是堆栈溢出

嵌入式系统是双向的。如果您完全确信堆栈指针将始终指向有效帧,并且堆栈中会有空间放置新帧,那么请继续使用它。如果堆栈指针可能不总是有效的,则应保存旧的堆栈指针(通常在SPRG中),并设置自己的堆栈指针


如果要处理数据访问异常以检测软件错误,您肯定要设置自己的异常堆栈,因为DACC可能是由堆栈指针损坏引起的。

我已将当前上下文保存到当前堆栈中,没有任何问题

您需要区分要从中返回的异常和没有返回或堆栈不可信的“致命故障”异常。
如果你不打算返回,你有两个选择。重新启动堆栈并放弃所有内容,或者如果您有更多的RAM,请切换到异常堆栈,以便打印常规堆栈,或者…

:-)幸运的是,我有大约98%的RAM用于堆栈。这是一个比董事会设计运行的程序简单得多的程序是的,我复制你所说的不同类型的异常。我计划使用此方法处理的唯一异常是一个外部异常,在我的例子中,它是一个“好”异常