|
|
  |
Как прочитать стек одного режима ядра в другом режиме, arm7tdmi |
|
|
|
Feb 11 2009, 15:12
|

Местный
  
Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035

|
Возникла потребность написать обработчики исключительных ситуаций, которые помогли бы отыскать причину их возникновения. Пытаюсь реализовать это для at91sam7x. С data abort примерно всё понятно, почитав регистры Memory Controller и abort link register, получаю точное место ошибки. А prefetch abort поставил меня в тупик. Сам exception возникает довольно часто если случается такая ситуация например: вызов функции по неинициализированному или кем-то затертому указателю. И соответственно ядро пробежав немного по левым адресам спотыкается и улетает в аборт, соответствено контроллер памяти и регистр возврата содержат левые адреса, по которым невозможно вычислить откуда ноги растут. Возникла идея восстановить режим из теневого регистра статуса, почитать sp и сам стек, восстановить режим обратно, а по считанному стеку найти виноватого. Но это чистой воды хак, так как процессор переходит из режима в режим по исключительным ситуациям, а возвращаться рекоммендуют спец. командами (см. спецификацию). И вот у меня иногда это хак проходит успешно, а иногда при смене режима руками, неожиданно меняется регистр pc и программа улетает по адресам возникшим в pc. Может кто знает какие тайные тропы, как почитать стек одного режима ядра в другом режиме.
|
|
|
|
|
Feb 11 2009, 15:53
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(xelax @ Feb 11 2009, 18:12)  Но это чистой воды хак, так как процессор переходит из режима в режим по исключительным ситуациям, а возвращаться рекоммендуют спец. командами (см. спецификацию). Это не хак, а вполне нормальный метод. Цитата(xelax @ Feb 11 2009, 18:12)  И вот у меня иногда это хак проходит успешно, а иногда при смене режима руками, неожиданно меняется регистр pc и программа улетает по адресам возникшим в pc. Если Вы не забыли отключить прерывания при переключении режимов, то процессор никуда улететь не может по определению.
|
|
|
|
|
Feb 11 2009, 21:12
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Цитата(xelax @ Feb 11 2009, 17:12)  Может кто знает какие тайные тропы, как почитать стек одного режима ядра в другом режиме. Вот пример, пользуюсь все время. Выводит в UART адрес исключения, дамп регистров и дамп стека до аборта. Собственно UART не прилагаю. Там понятно из названия функций. Поддерживает только ARM режим. Для THUMB не стал заморачиватся, потому как не исползую его.
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
Feb 12 2009, 10:46
|

Местный
  
Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035

|
Цитата(defunct @ Feb 12 2009, 02:22)  А в чем заключается принципиальное отличие для Тумбы? На мой взгляд дампы-то одинаковые будут, посему должно работать для обоих режимов. Разница возможна только в адресе по которому произошло исключение - в тумбе может отображаться как +1. Возможно, что в коде Вашем для Тумбы ничего менять и не нужно. ;> Под Thumb не заработает.  Как раз мой случай. Когда восстанавливаешь предыдущий режим необходимо флажок Thumb в SPSR подавить иначе дальше вектор исключения начнёт выполнятся через строчку и в итоге улетит по непонятным адресам. Вроде как разлбрался и заработало. З.Ы. Спасибо всем ответившим. Особенно за пример кода, много что полезного для себя там увидел.
|
|
|
|
|
Feb 12 2009, 12:09
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Цитата(xelax @ Feb 12 2009, 12:46)  Под Thumb не заработает.  Как раз мой случай. Когда восстанавливаешь предыдущий режим необходимо флажок Thumb в SPSR подавить иначе дальше вектор исключения начнёт выполнятся через строчку и в итоге улетит по непонятным адресам. Вроде как разлбрался и заработало. З.Ы. Спасибо всем ответившим. Особенно за пример кода, много что полезного для себя там увидел. Так поделитесь поддержкой THUMB с общественностью. Цитата(defunct @ Feb 12 2009, 01:22)  А в чем заключается принципиальное отличие для Тумбы? На мой взгляд дампы-то одинаковые будут, посему должно работать для обоих режимов. Разница возможна только в адресе по которому произошло исключение - в тумбе может отображаться как +1. Возможно, что в коде Вашем для Тумбы ничего менять и не нужно. ;> Количество регистров другое, адрессация другая, CPSR чуть другой, для получения дампа нужно определить, что был таки THUMB, переключится в него, снять дамп, вернутся назад в SYS, потом еще назад в ABD.
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
Feb 13 2009, 00:01
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(amw @ Feb 12 2009, 14:09)  Количество регистров другое, адрессация другая, CPSR чуть другой, для получения дампа нужно определить, что был таки THUMB, переключится в него, снять дамп, вернутся назад в SYS, потом еще назад в ABD. Все не так. 1. Количество регистров то же. 2. Адресация - та же. 3. CPSR тот же. (собсно откуда взяться новым или куда пропасть регистрам, как им видоизмениться если ядро одно и то же). 4. для получения дампа определить был или не был Thumb - не нужно. (Thumb это фантазия системы команд, на содержимое памяти/регистров она никак влияет) 5. переключаться в Thumb - не нужно. В ARM режиме есть доступ к той же памяти и к тем же регистрам. 6. вернуться в SYS? из Thumb?! не нужно (т.к. мы и так в SYS) ARM/Thumb и ABT/SVSR/USR/IRQ/FIQ - это абсолютно разные параллели не надо их смешивать... 7. Вернуться в ABT? зачем? произошел краш, чего еще ждать от системы? После снятия дампа самое время делать рестарт (по WDT или другим путём). Единственная проблема, которую уже отметили, это то - чтобы проц неожиданно не переключился в Thumb исполняя ARM инструкции. Т.е. надо гасить флаг T в SPSR. PS: Интересно как Вы себе представляете ARM/Thumb interwork если бы было столько отличий сколько Вы написали?!
|
|
|
|
|
Feb 13 2009, 06:52
|

Местный
  
Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035

|
Цитата(amw @ Feb 12 2009, 15:09)  Так поделитесь поддержкой THUMB с общественностью. Так собственно defunct всё описал уже. Ничего специального для режима thumb я не делал. Добавил только строчку: Код bic r8, r8, #THUMB_BIT чтобы убирать битик thumb режима.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|