Какие регистры хранятся в jmp_buf в среде Apple Silicon Arm64?

Я хочу написать встроенную сопрограмму в своем Apple Silicon Macbook. Поскольку встроенной сопрограмме нужен jmp_buf в setjmp.h, я попытался выяснить, какие регистры хранятся в jmp_buf.

Когда я захожу в файл setjmp.h в /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.3.sdk/usr/include/setjmp.h, я только что узнал код, но он кажется немного странным.

Код:

/*
 * _JBLEN is the number of ints required to save the following:
 * r21-r29, sp, fp, lr == 12 registers, 8 bytes each. d8-d15
 * are another 8 registers, each 8 bytes long. (aapcs64 specifies
 * that only 64-bit versions of FP registers need to be saved).
 * Finally, two 8-byte fields for signal handling purposes.
 */
#define _JBLEN      ((14 + 8 + 2) * 2)

typedef int jmp_buf[_JBLEN];
typedef int sigjmp_buf[_JBLEN + 1];

#else
#   error Undefined platform for setjmp
#endif

Кажется, что _JBLEN определено как 14 + 8 регистров, но в комментарии указано 12 + 8. Как говорится в другом сообщении, в арке Arm64 x19-x28 — это сохраненные регистры вызываемого абонента, которые следует сохранить, а также x29(fp), x30(lr), x31(sp ), компьютер также следует сохранить. В этом случае 14 регистров имеют смысл. Комментарий неправильный или мои расчеты неверны?

Как мне выяснить, какие именно регистры сохранены в jmp_buf, и если комментарий MacOSX sdk неверен, как я могу его исправить?

Мне кажется, что ответ на этот вопрос должен полностью зависеть от компилятора. Страницы руководства — полезное чтение, но в основном они сводятся к тому, что «некоторые регистры сохранены».

Dúthomhas 03.08.2024 08:38

Когда в комментарии написано «12», а в коде — «14», разве не очевидно, что не так?

tofro 03.08.2024 08:47

Но я хочу знать, как именно эти регистры хранятся в jmp_buf, потому что для реализации собственной сопрограммы мне нужно изменить значения sp и pc в jmp_buf. Мне недостаточно знать, что комментарий неправильный, мне также нужно знать, что правильно.

Edenlia 03.08.2024 09:56
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Комментарий явно неправильный, так как в нем отсутствуют x19 и x20, но упоминаются x29 и fp, которые являются одним и тем же.

Вот что ABI объявляет как сохраненное вызываемым абонентом:

  • от x19 до x30 (включает x29 = fp и x0 = lr)1
  • Младшие 64 бита от q8 до q15, т. е. d8-d15
  • sp

Сохранять pc нет смысла, так как вы знаете, откуда сейчас выполняете. Так что очень нужно 13 + 8.

Дампы исходного кода Apple действительно включают реализацию setjmp, но этот дамп исходного кода является ложью, поскольку фактическая реализация, используемая в производстве, использует аутентификацию указателя и до сих пор является закрытым исходным кодом. Я мог бы поручить вам эту разборку, но думаю, что это будет плохая идея. Вся причина, по которой jmp_buf объявлен как непрозрачный большой двоичный объект, заключается в том, что его макет является частным, а реализации setjmp и longjmp разрешены для изменения.

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


1x30 сохраняется в вызываемом объекте в том смысле, что ожидается, что функция вернется туда. Но в контексте setjmp его нужно сохранить.

Спасибо, что объяснили мне это, в таком случае, я думаю, мне следует найти другой способ реализовать свою работу, а не модифицировать ее jmp_buf

Edenlia 04.08.2024 11:23

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