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

 
 
> ARMv6 iOS уходит в перезагрузку при делении на 0.0f c dze = 1, Floating point exception trapping
ShiftZ
сообщение Apr 7 2011, 10:34
Сообщение #1





Группа: Новичок
Сообщений: 7
Регистрация: 7-04-11
Пользователь №: 64 183



Всем привет, товарищ посоветовал данный форум в качестве последней надежды.
Есть iPhone с iOS 4.2. Нужно отловить деление на 0.0f в произвольном месте. В исходном состоянии iOS выставляет RunFast mode в регистре fpscr и сбрасывает все флаги floating point exception trapping. Что я делаю -

Код
uint fpscr = 0;
asm volatile("fmrx %0, fpscr" : "=r" (fpscr));  // читаю значение регистра fpscr
fpscr &= ~(3 << 24);   // сбрасываю флаги deafault NaN mode и flush to zero mode (disable RunFust)
fpscr |= (1<<8) | (1<<9) | (1<<10) | (1<<11) | (1<<12) | (1<<15);  // Выставляю fpe trapping на div by zero, invalid op и т.д.
asm volatile("fmxr fpscr, %0" : : "r" (fpscr)); // Записываю значение обратно в регистр


Далее такая строчка.
float a = 0;
float b = 1 / a;

После деления iOS уходит в перезагрузку. Почему??? И как это пофиксить?

Сообщение отредактировал ShiftZ - Apr 7 2011, 10:36
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 13)
AlexandrY
сообщение Apr 7 2011, 11:15
Сообщение #2


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Речь наверно об ARM11 от какого нибудь самсунга.
Тогда надо смотреть какой вектор находится по адресу исключения Undefined instruction trap. Похоже там стоит тот же адрес что и в ресете.
Go to the top of the page
 
+Quote Post
ShiftZ
сообщение Apr 7 2011, 11:40
Сообщение #3





Группа: Новичок
Сообщений: 7
Регистрация: 7-04-11
Пользователь №: 64 183



Да, речь именно о ARM11.

А как его посмотреть если он тут же перезагружается? Дебаггер отваливается (XCode GDB).

Сообщение отредактировал ShiftZ - Apr 7 2011, 11:40
Go to the top of the page
 
+Quote Post
ShiftZ
сообщение Apr 7 2011, 14:26
Сообщение #4





Группа: Новичок
Сообщений: 7
Регистрация: 7-04-11
Пользователь №: 64 183



Вообще задача стоит отловить деление на 0.0f и просто невалидные операции с плавающей точкой в большой программе.

На другом форуме подсказали что дело может быть в iOS. Так как приложения запускаются по дефолту в RunFast mode, то обратотчики исключений не выставляются (адреса хандлеров). Есть ли в ARM11 такие регистры хранящие адреса переходов в случае исключения?

Сообщение отредактировал ShiftZ - Apr 7 2011, 14:26
Go to the top of the page
 
+Quote Post
igorsk
сообщение Apr 7 2011, 21:19
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 22-03-10
Пользователь №: 56 131



signal(SIGFPE, handler) не помогает?
Go to the top of the page
 
+Quote Post
DevL
сообщение Apr 7 2011, 21:21
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 254
Регистрация: 23-10-10
Из: астрал
Пользователь №: 60 371



в симуляторе iOS, который IA, проблем деления на 0 не возникает?

так же советую посмотреть остаются ли crashlog на самом устройстве...
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Apr 8 2011, 09:41
Сообщение #7


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(ShiftZ @ Apr 7 2011, 17:26) *
Вообще задача стоит отловить деление на 0.0f и просто невалидные операции с плавающей точкой в большой программе.

На другом форуме подсказали что дело может быть в iOS. Так как приложения запускаются по дефолту в RunFast mode, то обратотчики исключений не выставляются (адреса хандлеров). Есть ли в ARM11 такие регистры хранящие адреса переходов в случае исключения?


Адрес перехода Undefined instruction trap у всех 11-х ARM-ов в одном и том же месте.
Это адрес 0x00000004 или 0xFFFF0004 (зависит от установки флага в контрольном регистре MMU).
Я бы подключил JTAG и поставил там брекпойнт. Надежней всего.

Кстати, только JTAG может показать, было ли вообще чтение-запись в этот вектор и если было то откуда оно производилось.
Go to the top of the page
 
+Quote Post
ShiftZ
сообщение Apr 8 2011, 11:08
Сообщение #8





Группа: Новичок
Сообщений: 7
Регистрация: 7-04-11
Пользователь №: 64 183



Цитата(igorsk @ Apr 8 2011, 01:19) *
signal(SIGFPE, handler) не помогает?



Нет к сожалению. Это установка хэндлера сигнала, но сигнала как такового нет.


Цитата(DevL)
в симуляторе iOS, который IA, проблем деления на 0 не возникает?

так же советую посмотреть остаются ли crashlog на самом устройстве...


На симуляторе не пробовал честно говоря. Крешлог надо попробовать поискать.


Цитата(AlexandrY)
Адрес перехода Undefined instruction trap у всех 11-х ARM-ов в одном и том же месте.
Это адрес 0x00000004


Не понимаю, а чего там делать то по этому адресу? Неужто вот прям по этому адресу лежит дефолтный обработчик исключений?

Согласно документации http://infocenter.arm.com/help/index.jsp?t...g/BABGHIJJ.html
можно установить обработчик исключений (user handler trap). Более того там сказано что обработчик уже должен быть установлен (где когда кем?)

(asm код, после него) -
This causes an undefined exception that is identified by the support code as the user attempting to install its own exception handler. This requires that the support code undefined exception handler has already been setup to capture the VFP exception, so all VFP initialization must already have taken place.

Сейчас пытаюсь перевести arm asm в gnu asm. посмотреть что будет после установки user trap handler если получится.

Сообщение отредактировал ShiftZ - Apr 8 2011, 11:11
Go to the top of the page
 
+Quote Post
DevL
сообщение Apr 8 2011, 12:02
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 254
Регистрация: 23-10-10
Из: астрал
Пользователь №: 60 371



Цитата(AlexandrY @ Apr 8 2011, 11:41) *
...
Я бы подключил JTAG и поставил там брекпойнт. Надежней всего.

...


кстати - JTAG на iPhone/ipad кто то пробывал?

http://www.omnia-repair.com/forum/topic/iphone-jtag
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Apr 8 2011, 12:05
Сообщение #10


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(ShiftZ @ Apr 8 2011, 14:08) *
Не понимаю, а чего там делать то по этому адресу? Неужто вот прям по этому адресу лежит дефолтный обработчик исключений?


Читайте описание работы ядра, а либы на которые вы ссылаетесь я уже не понимаю причем здесь.
Поставите точку останова по указанному адресу и 100% перехватите любые исключения от VFP.
Go to the top of the page
 
+Quote Post
ShiftZ
сообщение Apr 8 2011, 12:57
Сообщение #11





Группа: Новичок
Сообщений: 7
Регистрация: 7-04-11
Пользователь №: 64 183



AlexandrY
Установил брейкпоинты на 0x00000004 и 0xFFFF0004. К сожалению никакой реакции. Без флага dze ничего не происходит, с флагом ось перезагружается на делении на 0.

Глянул креш лог.

Exception Type: EXC_CRASH (SIGFPE)
Exception Codes: 0x00000000, 0x00000000
Crashed Thread: 0

Стек тред 0:

0 libSystem.B.dylib 0x35de3ad0 __kill + 8
1 libSystem.B.dylib 0x35de3abe kill + 4
2 libSystem.B.dylib 0x35de3ab2 raise + 10
Дальше функция main с делением на 0.


Сообщение отредактировал ShiftZ - Apr 8 2011, 12:52
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Apr 8 2011, 13:01
Сообщение #12


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(ShiftZ @ Apr 8 2011, 15:57) *
AlexandrY
Установил брейкпоинты на 0x00000004 и 0xFFFF0004. К сожалению никакой реакции. Без флага dze ничего не происходит, с флагом ось перезагружается на делении на 0.


JTAG-ом установили?
Go to the top of the page
 
+Quote Post
ShiftZ
сообщение Apr 8 2011, 13:19
Сообщение #13





Группа: Новичок
Сообщений: 7
Регистрация: 7-04-11
Пользователь №: 64 183



Нет GDB9.

Логи кстати не правильные. форум не дает отредактировать сообщение. На самом деле это Application Log Crash. И при перезагрузке ОС последний лог не записывается.

Library/Logs/CrashReporter почему то пустой после синхронизации и многократных падений.

Сообщение отредактировал ShiftZ - Apr 8 2011, 13:07
Go to the top of the page
 
+Quote Post
ShiftZ
сообщение Apr 8 2011, 15:30
Сообщение #14





Группа: Новичок
Сообщений: 7
Регистрация: 7-04-11
Пользователь №: 64 183



Похоже я не так понял.
По адресу 0x00000004 находится АДРЕС кода обработки исключений, а не сам код.

Адрес перехода Undefined instruction trap у всех 11-х ARM-ов в одном и том же месте.
Это адрес 0x00000004


Просто неоднозначно построено предложение, вот я и удивился какой-то такой код может быть по адресу 0x00000004
Сейчас попробую поставить по адресу.

0x00000004 защищенная область памяти, не знаю как её прочитать.

Сообщение отредактировал ShiftZ - Apr 8 2011, 15:03
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 16:49
Рейтинг@Mail.ru


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