Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ARMv6 iOS уходит в перезагрузку при делении на 0.0f c dze = 1
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
ShiftZ
Всем привет, товарищ посоветовал данный форум в качестве последней надежды.
Есть 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 уходит в перезагрузку. Почему??? И как это пофиксить?
AlexandrY
Речь наверно об ARM11 от какого нибудь самсунга.
Тогда надо смотреть какой вектор находится по адресу исключения Undefined instruction trap. Похоже там стоит тот же адрес что и в ресете.
ShiftZ
Да, речь именно о ARM11.

А как его посмотреть если он тут же перезагружается? Дебаггер отваливается (XCode GDB).
ShiftZ
Вообще задача стоит отловить деление на 0.0f и просто невалидные операции с плавающей точкой в большой программе.

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

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

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


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

Кстати, только JTAG может показать, было ли вообще чтение-запись в этот вектор и если было то откуда оно производилось.
ShiftZ
Цитата(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 если получится.
DevL
Цитата(AlexandrY @ Apr 8 2011, 11:41) *
...
Я бы подключил JTAG и поставил там брекпойнт. Надежней всего.

...


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

http://www.omnia-repair.com/forum/topic/iphone-jtag
AlexandrY
Цитата(ShiftZ @ Apr 8 2011, 14:08) *
Не понимаю, а чего там делать то по этому адресу? Неужто вот прям по этому адресу лежит дефолтный обработчик исключений?


Читайте описание работы ядра, а либы на которые вы ссылаетесь я уже не понимаю причем здесь.
Поставите точку останова по указанному адресу и 100% перехватите любые исключения от VFP.
ShiftZ
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.
AlexandrY
Цитата(ShiftZ @ Apr 8 2011, 15:57) *
AlexandrY
Установил брейкпоинты на 0x00000004 и 0xFFFF0004. К сожалению никакой реакции. Без флага dze ничего не происходит, с флагом ось перезагружается на делении на 0.


JTAG-ом установили?
ShiftZ
Нет GDB9.

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

Library/Logs/CrashReporter почему то пустой после синхронизации и многократных падений.
ShiftZ
Похоже я не так понял.
По адресу 0x00000004 находится АДРЕС кода обработки исключений, а не сам код.

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


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

0x00000004 защищенная область памяти, не знаю как её прочитать.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.