Armv7: возврат из исключения в Thumb Code

так как мне не повезло с моим вопросом на арм-сообществе (см. здесь), я также прошу вас следующий вопрос.

Я пишу ОС, ориентированную на процессоры ARM v7, и загружаю исполняемый файл в формате ELF32. Если установлен младший бит адреса точки входа, это означает, что точка входа должна выполняться в режиме Thumb. Мой вопрос состоит в том, чтобы узнать, будет ли movs pc, lr обновлять бит CPSR.T, если установлен младший бит lr, или мне следует сначала установить бит SPSR.T вручную, прежде чем выполнять возврат из исключения с использованием movs pc, lr.

РЕДАКТИРОВАТЬ: чтобы быть на 100% ясным, мой вопрос касается самого первого планирования приложения, точка входа которого находится в Thumb. Нет прежнего состояния, в которое можно было бы вернуться.


person Vinz    schedule 05.12.2016    source источник
comment
Подумайте об этом: SPSR — это сохраненная копия того, чем был CPSR в момент возникновения исключения, так почему же его восстановление не вернет все в точно такое же состояние? Также подумайте, как общий обработчик исключений, если он должен был сам установить SPSR.T, мог узнать, было ли его исключение взято из состояния Thumb или ARM, и, таким образом, на что его установить...   -  person Notlikethat    schedule 05.12.2016
comment
Я полностью согласен, но я говорю о самом первом запланированном процессе: нет старого состояния, поэтому мне нужно подделать SPSR. Мой инстинкт подсказывает мне, что я должен установить бит T, если точка входа находится в Thumb, но я не могу найти никакой информации об этой конкретной точке. Вот почему мне интересно, может ли специальный movs pc, lr сделать это для меня, если установлен lr lsb   -  person Vinz    schedule 05.12.2016
comment
Ах да, каким-то образом мне удалось пробежаться по важной детали точки входа. Спасибо за разъяснения.   -  person Notlikethat    schedule 05.12.2016


Ответы (1)


Суть начального входа в более низкий уровень исключения заключается в том, что на самом деле он ничем не отличается от обычного случая — конечно, вы на самом деле не выбрали исключение, но для того, чтобы «вернуться», вы просто делаете все выглядит точно так, как если бы у вас было.

LR при записи исключения является прямой копией ПК в то время (за вычетом любого предпочтительного смещения адреса возврата), поэтому младший бит никогда не будет установлен - взаимодействие применяется только к ветвям, а запись/возврат исключения не является ветвью. Если бы вы взяли исключение во время выполнения кода Thumb, значение LR было бы реальным адресом инструкции, выровненным по полуслову, и SPSR.T был бы установлен, так что это состояние, которое вам нужно построить.

person Notlikethat    schedule 05.12.2016
comment
Как вы думаете, мне нужно очистить бит [0] адреса возврата? Из псевдокода ARM ARM (см. BranchWritePC) кажется, что бит [0] на самом деле никогда не читается и всегда устанавливается в 0 в этих инструкциях. - person Vinz; 05.12.2016
comment
Я бы очистил его, чтобы быть в безопасности. Смещенный ПК, как правило, непредсказуем, поэтому полагаться на неясный угол архитектуры v7 (который принципиально не применим к более старым версиям) ради сохранения одной инструкции просто излишне неясно, IMO. Кроме того, если сохранение одной инструкции было настолько важным, вы могли бы так же легко выполнить сам возврат с помощью bics pc, lr, #1. Только не делай этого, потому что это безумие. И устарело в v7. Не говори никому, что я даже думал об этом... - person Notlikethat; 06.12.2016