Регистры, модифицированные systemcall, вызванные через расширенный asm gcc

Я использую расширенный ассемблер GCC для вызова системного вызова. Я работаю над собственной ОСРВ на PowerPC (Freescale MPC5200B).

В соответствии с документацией gcc, я должен добавить все регистры, которые использует код сборки - и которые не являются ни входными, ни выходными - в список clobbers, потому что gcc не анализирует код сборки и, следовательно, не знает, какие регистры изменяются.

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

Как мне справиться с этой ситуацией?

1 ответ

Решение

Для будущих читателей:

Общий ответ состоит в том, что вы можете найти регистры, измененные системным вызовом, в документации системного ABI.

Для моей системы (Freescale MPC5200B) я обнаружил, что ответом является IBM Application Note "Разработка программ, совместимых со встроенным двоичным интерфейсом (EABI) PowerPC".

Поэтому я добавил регистры с пометкой volatile (а именно, R3..R12, F0..F13 и регистр флагов) в список клобберов.

Другие вопросы по тегам