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

 
 
> 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
Ответов
igorsk
сообщение Apr 7 2011, 21:19
Сообщение #2


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

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



signal(SIGFPE, handler) не помогает?
Go to the top of the page
 
+Quote Post
ShiftZ
сообщение Apr 8 2011, 11:08
Сообщение #3





Группа: Новичок
Сообщений: 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
AlexandrY
сообщение Apr 8 2011, 12:05
Сообщение #4


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
Сообщение #5





Группа: Новичок
Сообщений: 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
Сообщение #6


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



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

 


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


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