реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Как прочитать стек одного режима ядра в другом режиме, arm7tdmi
xelax
сообщение Feb 11 2009, 15:12
Сообщение #1


Местный
***

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



Возникла потребность написать обработчики исключительных ситуаций, которые помогли бы отыскать причину их возникновения.
Пытаюсь реализовать это для at91sam7x. С data abort примерно всё понятно, почитав регистры Memory Controller и abort link register, получаю точное место ошибки. А prefetch abort поставил меня в тупик. Сам exception возникает довольно часто если случается такая ситуация например: вызов функции по неинициализированному или кем-то затертому указателю. И соответственно ядро пробежав немного по левым адресам спотыкается и улетает в аборт, соответствено контроллер памяти и регистр возврата содержат левые адреса, по которым невозможно вычислить откуда ноги растут.
Возникла идея восстановить режим из теневого регистра статуса, почитать sp и сам стек, восстановить режим обратно, а по считанному стеку найти виноватого. Но это чистой воды хак, так как процессор переходит из режима в режим по исключительным ситуациям, а возвращаться рекоммендуют спец. командами (см. спецификацию). И вот у меня иногда это хак проходит успешно, а иногда при смене режима руками, неожиданно меняется регистр pc и программа улетает по адресам возникшим в pc. Может кто знает какие тайные тропы, как почитать стек одного режима ядра в другом режиме.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 11 2009, 15:53
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(xelax @ Feb 11 2009, 18:12) *
Но это чистой воды хак, так как процессор переходит из режима в режим по исключительным ситуациям, а возвращаться рекоммендуют спец. командами (см. спецификацию).

Это не хак, а вполне нормальный метод.

Цитата(xelax @ Feb 11 2009, 18:12) *
И вот у меня иногда это хак проходит успешно, а иногда при смене режима руками, неожиданно меняется регистр pc и программа улетает по адресам возникшим в pc.

Если Вы не забыли отключить прерывания при переключении режимов, то процессор никуда улететь не может по определению.
Go to the top of the page
 
+Quote Post
amw
сообщение Feb 11 2009, 21:12
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Цитата(xelax @ Feb 11 2009, 17:12) *
Может кто знает какие тайные тропы, как почитать стек одного режима ядра в другом режиме.

Вот пример, пользуюсь все время. Выводит в UART адрес исключения, дамп регистров и дамп стека до аборта. Собственно UART не прилагаю. Там понятно из названия функций.
Поддерживает только ARM режим. Для THUMB не стал заморачиватся, потому как не исползую его.
Прикрепленные файлы
Прикрепленный файл  exception_dump.zip ( 5.47 килобайт ) Кол-во скачиваний: 74
 


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
defunct
сообщение Feb 11 2009, 23:22
Сообщение #4


кекс
******

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



Цитата(amw @ Feb 11 2009, 23:12) *
Для THUMB не стал заморачиватся, потому как не исползую его.

А в чем заключается принципиальное отличие для Тумбы?
На мой взгляд дампы-то одинаковые будут, посему должно работать для обоих режимов. Разница возможна только в адресе по которому произошло исключение - в тумбе может отображаться как +1. Возможно, что в коде Вашем для Тумбы ничего менять и не нужно. ;>
Go to the top of the page
 
+Quote Post
xelax
сообщение Feb 12 2009, 10:46
Сообщение #5


Местный
***

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



Цитата(defunct @ Feb 12 2009, 02:22) *
А в чем заключается принципиальное отличие для Тумбы?
На мой взгляд дампы-то одинаковые будут, посему должно работать для обоих режимов. Разница возможна только в адресе по которому произошло исключение - в тумбе может отображаться как +1. Возможно, что в коде Вашем для Тумбы ничего менять и не нужно. ;>


Под Thumb не заработает. smile3046.gif Как раз мой случай. Когда восстанавливаешь предыдущий режим необходимо флажок Thumb в SPSR подавить иначе дальше вектор исключения начнёт выполнятся через строчку и в итоге улетит по непонятным адресам. Вроде как разлбрался и заработало.

З.Ы.
Спасибо всем ответившим. Особенно за пример кода, много что полезного для себя там увидел.
Go to the top of the page
 
+Quote Post
HARMHARM
сообщение Feb 12 2009, 11:32
Сообщение #6


читатель даташитов
****

Группа: Свой
Сообщений: 853
Регистрация: 5-11-06
Из: Днепропетровск
Пользователь №: 21 999



Цитата(amw @ Feb 11 2009, 23:12) *
Вот пример, пользуюсь все время. Выводит в UART адрес исключения, дамп регистров и дамп стека до аборта. Собственно UART не прилагаю. Там понятно из названия функций.
Поддерживает только ARM режим. Для THUMB не стал заморачиватся, потому как не исползую его.

Спасибо, как раз вчера искал внезапный DABT, очень не хватало, писать времени не было... Нашел мозгом.
Go to the top of the page
 
+Quote Post
amw
сообщение Feb 12 2009, 12:09
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Цитата(xelax @ Feb 12 2009, 12:46) *
Под Thumb не заработает. smile3046.gif Как раз мой случай. Когда восстанавливаешь предыдущий режим необходимо флажок Thumb в SPSR подавить иначе дальше вектор исключения начнёт выполнятся через строчку и в итоге улетит по непонятным адресам. Вроде как разлбрался и заработало.

З.Ы.
Спасибо всем ответившим. Особенно за пример кода, много что полезного для себя там увидел.

Так поделитесь поддержкой THUMB с общественностью.

Цитата(defunct @ Feb 12 2009, 01:22) *
А в чем заключается принципиальное отличие для Тумбы?
На мой взгляд дампы-то одинаковые будут, посему должно работать для обоих режимов. Разница возможна только в адресе по которому произошло исключение - в тумбе может отображаться как +1. Возможно, что в коде Вашем для Тумбы ничего менять и не нужно. ;>

Количество регистров другое, адрессация другая, CPSR чуть другой, для получения дампа нужно определить, что был таки THUMB, переключится в него, снять дамп, вернутся назад в SYS, потом еще назад в ABD.


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
defunct
сообщение Feb 13 2009, 00:01
Сообщение #8


кекс
******

Группа: Свой
Сообщений: 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 если бы было столько отличий сколько Вы написали?! smile.gif
Go to the top of the page
 
+Quote Post
xelax
сообщение Feb 13 2009, 06:52
Сообщение #9


Местный
***

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



Цитата(amw @ Feb 12 2009, 15:09) *
Так поделитесь поддержкой THUMB с общественностью.


Так собственно defunct всё описал уже. Ничего специального для режима thumb я не делал. Добавил только строчку:
Код
bic         r8, r8, #THUMB_BIT

чтобы убирать битик thumb режима. happy.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 21:31
Рейтинг@Mail.ru


Страница сгенерированна за 0.01412 секунд с 7
ELECTRONIX ©2004-2016