2009-09-28 2 views
3

Я пишу процедуру ассемблера для обработки исключения внешнего/декремента 0x500 в приложении PowerPC, включенном EABI.Использование указателя стека r1 при обработке внешних исключений в PowerPC

В моей процедуре ассемблера, вызванной из векторной точки 0x500, я хочу использовать некоторую память для регистров сохранения контекста до перехода к функции обработчика в 'C'.

Поскольку я) модель исключение гарантирует предыдущие инструкции закончили к тому времени обработчик исключений работает И II) соглашение о вызове появляется обновить указатель стека (r1) первого при входе в новую функцию, перед тем используя новое пространство стека, освобожденное, перемещая его (и переместите указатель стека назад туда, где он был последним в конце функции)

Мне кажется, что я могу безопасно использовать r1, чтобы дать себе больше места на нормальный стек в процедурах обработки исключений, при условии, что я придерживаюсь соглашения о вызове и вернул стек, как я его нашел, и убедитесь, что SRR0 и SRR1 не изменены.

Я не буду допускать исключений, которые используют стек в их обработке для гнезда (хотя на самом деле с использованием этого метода я не уверен, что возникнет проблема).

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

ответ

5

Встраиваемые системы делают это в обоих направлениях. Если вы полностью уверены, что указатель стека всегда будет указывать на действительный фрейм, и в вашем стеке будет место для вашего нового фрейма, тогда идите и используйте его. Если есть вероятность того, что указатель стека не всегда будет действительным, вы должны сохранить старый указатель стека (как правило, в SPRG) и настроить свой собственный.

Если вы собираетесь обрабатывать исключения доступа к данным для обнаружения ошибок программного обеспечения, вы обязательно захотите настроить свой собственный стек исключений, поскольку DACC может быть вызван сломанным указателем стека.

1

Единственный недостаток, который я вижу в сохранении контекста регистров в стеке, заключается в том, что одним из исключений, с которыми вы можете столкнуться, является переполнение стека!

+0

:-) К счастью, у меня есть около 98% моей памяти для стека. Это гораздо более простая программа, чем плата была разработана для запуска – sparklewhiskers

1

Я сохранил текущий контекст в текущем стеке без каких-либо проблем.

Вам нужно провести различие между исключениями, из которых вы хотели бы вернуться, и исключениями, которые являются «Fatal Failures», из которых нет возврата или что стек не может быть доверен. Если вы не собираетесь возвращаться, у вас есть два варианта. Перезагрузите стек и отбросьте все, или если у вас больше переключателя RAM в стек исключений, поэтому обычный стек можно распечатать или ...

+0

да, я копирую, что вы говорите о разных типах исключений. Единственное исключение, которое я планирую обработать с помощью этого метода, - это внешнее исключение, которое в моем случае является «хорошим» исключением – sparklewhiskers