Значение, возвращаемое из системных вызовов, сохраняется в регистре eax
.
Как видно из источника :
proc->tf->eax = syscalls[num]();
Это означает, что возвращаемый value всегда будет одним 32-битным значением.
Тип функций для обработчиков системных вызовов также определяется как возвращающие int
и не принимающие аргументов:
static int (*syscalls[])(void)
Правильный способ вернуть структуру в этой ситуации - передать указатель пользовательского пространства в качестве аргумента системного вызова. Убедившись, что он действителен, он сохранит данные структуры по этому указателю. Обратите внимание, что, поскольку сам обработчик системных вызовов не принимает аргументов, вы должны использовать методы получения аргументов, такие как argptr
, которые обрабатывают проверку действительности для вас.