Регистры, модифицированные systemcall, вызванные через расширенный asm gcc
Я использую расширенный ассемблер GCC для вызова системного вызова. Я работаю над собственной ОСРВ на PowerPC (Freescale MPC5200B).
В соответствии с документацией gcc, я должен добавить все регистры, которые использует код сборки - и которые не являются ни входными, ни выходными - в список clobbers, потому что gcc не анализирует код сборки и, следовательно, не знает, какие регистры изменяются.
Проблема в том, что я не знаю, какие регистры изменяет системный вызов. На самом деле я наблюдаю случай, когда системный вызов изменяет регистр, содержащий указатель. После возвращения системного вызова указатель в регистре используется, что приводит к недопустимому доступу к памяти.
Как мне справиться с этой ситуацией?
1 ответ
Для будущих читателей:
Общий ответ состоит в том, что вы можете найти регистры, измененные системным вызовом, в документации системного ABI.
Для моей системы (Freescale MPC5200B) я обнаружил, что ответом является IBM Application Note "Разработка программ, совместимых со встроенным двоичным интерфейсом (EABI) PowerPC".
Поэтому я добавил регистры с пометкой volatile (а именно, R3..R12, F0..F13 и регистр флагов) в список клобберов.