Вызов PUSH_AND_CLEAR_REGS
не меняет RAX. Фактически это один из немногих регистров общего назначения, который не очищается (устанавливается в 0) макросом. Поскольку RAX содержит системный вызов вызываемого системного вызова, его значение остается неизменным. Сразу после кода, который вы показали, он передается в качестве первого аргумента do_syscall_64
.
. То, что установлено в -ENOSYS
, - это сохраненное значение RAX в стеке. То есть вместо сохранения фактического значения RAX макрос сохраняет -ENOSYS
. Когда системный вызов возвращает значение в RAX, будет установлено значение -ENOSYS
, если do_syscall_64
не изменит его на что-то другое. Предположительно это сделано, если входящее значение RAX не является допустимым номером системного вызова, do_syscall_64
может просто вернуться, а исходящий RAX будет -ENOSYS
, указывая, что системный вызов недействителен.