РУКА. Доступ к пользователям R13 и R14 из режима супервизора - PullRequest
6 голосов
/ 28 ноября 2008

Как получить доступ к пользователям R13 и R14, которые сохраняются при входе в режим супервизора? Я использую ARM7TDMI.

т.е. Я не хочу получать доступ к супервизору R14, который теперь содержит адрес возврата в пользовательский режим, вместо этого я хочу получить значение регистра связи пользовательского режима. Это часть отладчика, который я пишу.

Существуют ли специальные псевдонимы для этих регистров?

Спасибо

Ответы [ 2 ]

9 голосов
/ 28 ноября 2008

Я опишу ответ на ваш конкретный вопрос, но тот же подход применим и к другим режимам.

Вам необходимо изменить режим процессора, изменив биты режима в CPSR на системный режим. Это даст вам доступ к SP / LR пользовательского режима (R13 и R14). Помните, что системный режим является привилегированным, но его R13 и R14 совпадают с R13 и R14 пользовательского режима.

Перейдя в системный режим, прочитайте R13 и R14 и поместите их в нужное место. Затем просто переключите биты режима обратно в предыдущий режим (я полагаю, это был режим супервизора в вашем примере), и все готово.

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

Вы можете переключаться между любыми привилегированными режимами по желанию, манипулируя битами режима в CPSR. Я думаю, что они младшие 5 бит? Я нахожусь в дороге и не имею информации в моих руках. В противном случае я бы предоставил вам код сборки для того, что я описал выше. На самом деле, если вы хотите нанести немного волос на грудь, возьмите то, что я вам дал выше, примените его, протестируйте и отправьте сюда. : -D

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

Кстати, я недавно сделал это для одного из моих клиентов ... я думаю, маленький мир.

4 голосов
/ 28 ноября 2008

Я нашел лучший способ: -

При выполнении STM, если r15 не является одним из операндов, то ^ дает доступ к регистрам пользовательского режима. Тем не менее, автоинкремент не работает в инструкции, и после этого требуется nop, если вы хотите получить доступ к банку регистра.

Что-то вроде

stmfd r13, {r13-r14}^ ;store r13 and r14 usermode
nop
sub r13, r13, #8      ;update stack pointer
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...