Я пишу код переключения потоков, в котором ядро выгружает релевантное состояние в память, но фактический переключатель потока происходит полностью в пользовательском режиме.Восстановление состояния Thumb в пользовательском режиме
Это прекрасно работает, за исключением случая, когда точка превенции происходит внутри блока Thumb If-Then (IT). В этом случае я не могу решить, как восстановить ITSTATE (т.е. бит [15:10] и [26:25] CPSR), поскольку эти биты являются пользователями RAZ/WI, и в любом случае это, вероятно, не делает смысл с учетом семантики ITSTATE.
Что (если есть) - это правильный способ восстановить это состояние без попадания в ядро?
Я рассмотрел возможность перематывания и продолжения работы с инструкцией по ИТ, но, не считаясь с тяжелым весом, я не уверен, что это всегда возможно.
EDIT: заинтересованы в ARMv7-A
Помимо памяти, у вас будет отменить любые операции с регистром, поскольку они будут сохранены * mid-IT-блок *. Даже это кажется трудным. Особенно, когда регистр, возможно, был забит * средним IT-блоком *, и вы не знаете, что это было. –
Я не думаю, что сбитые регистры являются проблемой, потому что вам не нужно точно восстанавливать исходное состояние регистра, а скорее любое состояние, которое при применении IT-инструкций создает текущее состояние. – xac
Возможно, в случае доступа к памяти было бы лучше свернуть вперед. В любом случае для этого действительно нужен эмулятор ISA, который не идеален. – xac