Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запретить компиллятору использовать регистр, Можно ли (и как) запретить GCC некоторы  
V
    Опции темы
svlary
Дата 13.7.2015, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 8.9.2009

Репутация: 4
Всего: 4



Пишу драйвер. При  работе драйвера, иногда (очень редко!) выскаивает "Oops!!!". По распечатке стека знаю, в какой функции это происходит.
Но дальнешая локализация ошибки затруднена, так как:
1) Функция работает внутри обработки прерывания, поэтому вставить туда отладочную печать не могу.
2) Функция очень большая, но разбивать её на куски не хчется (есть на то причины). Так что найти ошибку просто читая код не получается.

Возникла идея - писать в один из общих регистров значения типа 1...N, отмечающие ключевые точки кода. Тогда, по распечатке при "Oops!!!" можно будет опознать участок по значению в этом регистре.  Как записать значение в регистр с помощью встроенного ассемблера, я знаю. 

Но как сделать так, что бы компиллятор этот регистр не тргал ?
PM MAIL   Вверх
xvr
Дата 13.7.2015, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



PM MAIL   Вверх
svlary
Дата 13.7.2015, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 8.9.2009

Репутация: 4
Всего: 4




    Оно... В самую точку ! Вот только автор этого текста мучается той же самой проблемой:
Цитата

Choose a register ..., so that library routines will not clobber it.
 
   А кака его выбрать ?!


Цитата

И еще опция -ffixed-reg (см https://gcc.gnu.org/onlinedocs/gcc/Code-Gen...ode-Gen-Options )

   Вот я тоже долго читал описание этой опции и так ни фига и не понял.... :-(

Спасибо за ответ !
PM MAIL   Вверх
xvr
Дата 14.7.2015, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(svlary @  13.7.2015,  20:23 Найти цитируемый пост)
   А кака его выбрать ?!

Не использовать библиотечные функции. Если у вас это часть ядреного дравера, то проблем с ними не будет - их там просто нет  smile 

Или пересобрать библиотеки с опцией -ffixed-reg и вашим регистром.

По другому похоже никак  smile 

PM MAIL   Вверх
tzirechnoy
Дата 14.7.2015, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 3
Всего: 16



Цитата
Тогда, по распечатке при "Oops!!!" можно будет опознать участок по значению в этом регистре.


Простите, а чем вас для этого регистр EIP не устраивает?
PM MAIL   Вверх
svlary
Дата 14.7.2015, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 8.9.2009

Репутация: 4
Всего: 4



Цитата(tzirechnoy @  14.7.2015,  13:59 Найти цитируемый пост)
Простите, а чем вас для этого регистр EIP не устраивает? 


Тем, что его нет....  smile Драйвер пишу для PowerPC. Попробовал использовать  r28 - вроде бы, получается.

Добавлено через 8 минут и 46 секунд
Цитата(xvr @  14.7.2015,  12:31 Найти цитируемый пост)
их там просто нет

Ну да, таких функций как sin() и printf()  нет, зато у меня полно всякого добра типа pci_enable_device() ... Вот о них я беспокоюсь.
PM MAIL   Вверх
tzirechnoy
Дата 14.7.2015, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 3
Всего: 16



Цитата
Тем, что его нет....


Очень смешно. А по делу есть что ответить  или это всё ужэ неактуально?
PM MAIL   Вверх
xvr
Дата 14.7.2015, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(svlary @  14.7.2015,  14:50 Найти цитируемый пост)
Вот о них я беспокоюсь.

Правильно беспокоитесь. 
Цитата(svlary @  14.7.2015,  14:50 Найти цитируемый пост)
Драйвер пишу для PowerPC

Смотрите ABI на PowerPC и выбирайте регистр из callee saved списка.

PM MAIL   Вверх
svlary
Дата 15.7.2015, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 8.9.2009

Репутация: 4
Всего: 4



Цитата(tzirechnoy @  14.7.2015,  18:30 Найти цитируемый пост)
Очень смешно. А по делу есть что ответить  или это всё ужэ неактуально? 


Правда -нет ! Наиболее близкая мнемоника -  NIP, но это указатель счётчика команд и (разумеется) использовать его нельзя.

По делу - актуально! Вставил запись значений в регистр GPR28, жду, когда произойдёт падение - может и увижу что-то полезное.

Добавлено через 4 минуты и 23 секунды
Цитата(xvr @  14.7.2015,  20:15 Найти цитируемый пост)
Смотрите ABI на PowerPC и выбирайте регистр из callee saved списка.


Здесь я совсем не в курсе :-(
  • Где смотреть про "ABI на PowerPC" ?
  • Что такое "callee saved" ?

PM MAIL   Вверх
tzirechnoy
Дата 15.7.2015, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 3
Всего: 16



Цитата
Наиболее близкая мнемоника -  NIP


Да какая разница, какая у него мненомника? rip, %pc, NIA...

Цитата
и (разумеется) использовать его нельзя.


Использовать его, разумеется, обязательно. Не в смысле -- что-то туда записывать, а в смысле -- прочесть его значение в дампе и выяснить, где конкретно гикнулась программа.

Добавлено через 3 минуты и 6 секунд
Цитата
1) Функция работает внутри обработки прерывания, поэтому вставить туда отладочную печать не могу.


И кстати, если драйвер под линукс -- то вполне можэт вставлять туда отладочную печать. printk() работает.
PM MAIL   Вверх
xvr
Дата 15.7.2015, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(svlary @  15.7.2015,  09:53 Найти цитируемый пост)
Где смотреть про "ABI на PowerPC" ?

http://cache.freescale.com/files/32bit/doc...l/E500ABIUG.pdf (вас интересует страница 29)

Цитата(svlary @  15.7.2015,  09:53 Найти цитируемый пост)
Что такое "callee saved" ?

Это регистры, которые сохраняет вызываемая процедура. В вашем случае это 'Registers used for local variables' - r14-r31. 

Цитата(svlary @  14.7.2015,  14:50 Найти цитируемый пост)
Попробовал использовать  r28 - вроде бы, получается.

Подойдет

PM MAIL   Вверх
bsa
Дата 15.7.2015, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 16
Всего: 196



Я бы разделил большую функцию на несколько. Можно методом деления пополам. И таким бы образом локализовал бы проблему.
PM   Вверх
svlary
Дата 15.7.2015, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 8.9.2009

Репутация: 4
Всего: 4



Цитата(tzirechnoy @  15.7.2015,  10:55 Найти цитируемый пост)
прочесть его значение в дампе и выяснить, где конкретно гикнулась программа.

тут тоже какая-то дурацкая проблема, с которой я не справился - какие бы ключи я не ставил в Makefile в строке CFLAGS +=...  мне так и не удалось получить билистинг, т.е. ассемблерную распечатку с выдачей смещения от начала модуля и исходным текстом в виде комментариев. Пробовал получить её через objdump или gdb, но им нужна для этого отладочная информация. а и этот ключ (-g) передать не удалось. У меня сложилось такоен впечатление, что когда Make начинает просматривать сорцы ядра, он забывает про мой Makefile и работает сам по себе. Этот Makefile  писал сам и не совсем уверен в его адекватности...

Добавлено через 4 минуты и 37 секунд
Цитата(tzirechnoy @  15.7.2015,  10:55 Найти цитируемый пост)
printk() работает


Разумеется - работает! Вопрос в том,  что в обработчике прерываний запрещается использование kmalloc так как выделение виртуальной памяти может занять неопределённое время или даже не завершиться успешно. А я сильно подозреваю, что для организации буфера печати этот вызов используется.

Добавлено через 6 минут и 33 секунды
Цитата(xvr @  15.7.2015,  11:25 Найти цитируемый пост)
(вас интересует страница 29)

За ссылку - большое спасибо ! smile
PM MAIL   Вверх
tzirechnoy
Дата 15.7.2015, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 3
Всего: 16



Цитата
мне так и не удалось получить билистинг, т.е. ассемблерную распечатку с выдачей смещения от начала модуля и исходным текстом в виде комментариев.


По факту, если есть вызовы функцый по телу, и их имена показывает objdump -- то и без билистинга быстро становится понятно, что есть какой оператор. Там всё достаточно линейно в итоге.

Но вообще да, разобраться с -g -- в любом случае важная задача. Кстати, вероятно, там потребуются не только CLAGS, но и LDFLAGS.

И да, кстати, у меня тожэ не получилось для gcc .map-файл с листингом сделать. Только -- отдельно ассэмблерный листинг с соответствием исходнику, отдельно -- .map-файл. Впрочем, мне и не нужно это особенно было, поскольку gdb более-менее всё показывал по debug info.
PM MAIL   Вверх
tzirechnoy
Дата 15.7.2015, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 3
Всего: 16



Цитата
А я сильно подозреваю, что для организации буфера печати этот вызов используется.


Не надо ничего подозревать. Он просто работает. Это его свойство, и Линус довольно много умственных усилий приложыл, чтобы оно таки работало.

Да, форматированный вывод -- работать не будет (ну, наверное, не пробовал). Но printk -- вполне.

Да, на размер есть какие-то ограничения. Ну, там теперь (после эскапады systemdшников) и безо всяких прерываний есть ограничения на количество.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.1652 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.