在用户模式下恢复Thumb状态

时间:2014-09-26 05:48:54

标签: arm thumb

我正在编写线程切换代码,其中内核将相关状态转储到内存,但实际的线程切换完全在用户模式下发生。

除了在Thumb If-Then(IT)块内部发生抢占点的情况之外,这种方法很好。在那种情况下,我无法弄清楚如何恢复ITSTATE(即CPSR的位[15:10]和[26:25]),因为这些位是用户RAZ / WI,并且在任何情况下它可能都没有。考虑到ITSTATE的语义,这是有意义的。

在没有陷入内核的情况下恢复此状态的正确方法是什么(如果有的话)?

我已经考虑过重新执行并继续执行IT指令,但除了相当沉重之外,我不确定这是否总是可行。

编辑:对ARMv7-A感兴趣

2 个答案:

答案 0 :(得分:1)

在架构上 * ,CPSR中的任何执行状态位都不能以任何模式读取或写入(仅限特权模式下的CPSR.E位除外,甚至不推荐使用)。在正常执行之外修改它们的唯一方法是在异常返回时通过SPSR,它预期直接返回到IT块内的相关指令。

正如您所提到的,重新启动整个IT块既不实用也不安全,主要是由于内存访问 - 而在大多数情况下,您可能会静态分析指令以撤消任何寄存器修改,任何共享内存都可能意味着重复加载会返回不同的值,否则重复的存储可能会破坏其他同时读取和修改原始值的过程。对于内存映射I / O,出于任何原因,意外重复任何访问可能会造成危险。

另一个可能的想法是在SPSR中基于ITSTATE JIT新的IT块和返回地址的其余指令,因为Thumb-2意味着你有LDR PC,...从任何地方回到原始代码寄存器完好无损。但是,如果条件指令进行任何与PC相关的计算,即使这样做仍然会破坏。

*任何具有CPSR且支持Thumb-2的任何事物

答案 1 :(得分:0)

CPSR在异常进入时自动存储在堆栈中,并在异常返回时从堆栈中恢复。我可能看不到您的确切问题,但通常您无需为此上下文切换工作做任何事情 - 假设它在异常中完成,您只需将剩余的寄存器存储在堆栈中,切换堆栈指针,取消堆叠剩余的寄存器并从异常中返回......我也不知道你正在使用的确切架构是什么,但这里有一个非常简单的ARMv7-M上下文切换(Cortex-M3 / M4):https://github.com/DISTORTEC/distortos/blob/master/source/architecture/ARM/ARMv7-M/ARMv7-M-PendSV_Handler.cpp