如何更改信号处理程序中的 FPU 上下文 (C++/Linux)
我编写了一个信号处理程序来捕获 FPE 错误。即使发生这种情况我也需要继续执行。我收到一个 ucontext_t 作为参数,我可以将错误的操作数从 0 更改为另一个值,但 FPU 上下文仍然错误并且我遇到了无限循环?
有人已经在 Linux 上操纵了 ucontext_t 结构吗?
我最终找到了一种方法来处理这些情况,通过清除 ucontext_t 的状态标志,如下所示:
...
const long int cFPUStatusFlag = 0x3F;
aContext->uc_mcontext.fpregs->sw &= ~cFPUStatusFlag;
...
0x3F 被取反,将 0 放入 FPU (x87) 状态寄存器的 6 位中。这样做意味着在计算后检查 FPE 异常。
I wrote a signal handler to catch FPE errors. I need to continue execution even if this happens. I receive a ucontext_t as parameter, I can change the bad operand from 0 to another value but the FPU context is still bad and I run into an infinite loop ?
Does someone already manupulate the ucontext_t structure on Linux ?
I finally found a way to handle these situations by clearing the status flag of ucontext_t like this:
...
const long int cFPUStatusFlag = 0x3F;
aContext->uc_mcontext.fpregs->sw &= ~cFPUStatusFlag;
...
0x3F is negated to put 0 in the 6 bits of the status register of the FPU (x87). Doing this implies to check for FPE exceptions after calculation.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
在 64 位 Linux 内核上,我没有找到任何方法来实现同样的事情。
On 64 bits linux kernel, I did not find any way to achieve the same thing.