OSX gettimeofday syscall на x86_64, кажется, не работает
Я звоню gettimeofday через инструкцию syscall с использованием 64-битного кода.
Я не могу получить никаких результатов, и через Dtrace мне сообщают, что вызов работает без ошибок, но регистры, которые я получаю после вызова, являются мусором.
Я делаю следующее:
lea rdi, [rel timeval] ;buffer for 16bytes
mov rsi, 0 ;no need of timezone
mov rax, 0x2000074 ;gettimeofday
syscall
При возврате rax не равен ни 0, ни -1, и буфер никогда не получает никаких данных.
Пожалуйста, можете кто-нибудь проверить это и посмотреть, могут ли они получить рабочий звонок. Я понятия не имею, что происходит.
С уважением
Крис
PS Это пример кода, который я только что попробовал, он не возвращает ничего, кроме 0.
SECTION .text
global _main
_main:
lea rdi, [rel buffer]
mov rsi, 0
mov rax, 0x2000074
syscall
mov rdi, [rel buffer]
mov rax, 0x2000001
syscall
SECTION .data
buffer:
times 16 db 0
1 ответ
В соответствии с API, вам нужно указать:
1) RDI для временной структуры:
_STRUCT_TIMEVAL
{
__darwin_time_t tv_sec; /* seconds */
__darwin_suseconds_t tv_usec; /* and microseconds */
};
DarwinTime - это QWORD, а DarwinSuSeconds - это DWORD.
2) RSI к структуре часового пояса.
Просто укажите это на пустой буфер 2xQWORD, если вам не нравится его вывод.
3) гексоген к mach_absolute_time
состав
Это буфер 1xQWORD
Установка любого из указанных выше RSI, RDX, RDI на 0x0 вместо указателей может быть отклонена, поскольку это может вызвать внутреннее исключение. (Проверьте, если возвращаемое значение -EFAULT
.)
Также обратите внимание, что POSIX устарела gettimeofday
в пользу clock_gettime
(который имеет структуру времени в секундах / наносекундах), так что вы можете использовать это вместо этого.