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 (который имеет структуру времени в секундах / наносекундах), так что вы можете использовать это вместо этого.

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