Documentação syscall de 64 bits para montagem do MacOS

Estou tendo problemas para encontrar a boa documentação para escrever montagem de 64 bits no MacOS.

oABI SysV de 64 bits diz o seguinte na seção A.2.1 eeste post SO cita:

Uma chamada do sistema é feita através da instrução syscall. O kernel destrói os registros% rcx e% r11.

Retornando do syscall, o registro% rax contém o resultado da chamada do sistema. Um valor no intervalo entre -4095 e -1 indica um erro, é -errno.

Essas duas frases estão corretas no Linux, mas estão erradas no macOS Sierra com o seguinte código:

global _start
extern _exit

section .text
_start:

; Align stack to 16 bytes for libc
and rsp, 0xFFFFFFFFFFFFFFF0

; Call write
mov rdx, 12             ; size
mov rsi, hello          ; buf
mov edi, 1              ; fd
mov rax, 0x2000004      ; write ; replace to mov rax, 0x1 on linux
syscall

jc .err                 ; Jumps on error on macOS, but why?
jnc .ok

.err:
mov rdi, -1
call _exit              ; exit(-1)

.ok:
; Expect rdx to be 12, but it isn't on macOS!
mov rdi, rdx
call _exit              ; exit(rdx)

; String for write
section .data
hello:
.str, db `Hello world\n`
.len equ $-hello.str

Compile com NASM:

; MacOS: nasm -f macho64 syscall.asm && ld syscall.o -lc -macosx_version_min 10.12 -e _start -o syscall
; Linux: nasm -f elf64 syscall.asm -o syscall.o && ld syscall.o -lc -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o syscall

Execute no macOS:

./syscall      # Return value 0
./syscall >&-  # Return value 255 (-1)

Eu descobri que:

Um retorno syscallerrno um define o sinalizador de transporte com erro, em vez de retornar-errno noraxrdx registro é derrotado porsyscallNo Linux, tudo funciona como esperado

Porque érdx derrotado? Por que um syscall não retorna-errno? Onde posso encontrar a documentação real?

O único lugar que encontrei onde alguém fala sobre o sinalizador de transporte por erros de syscall éaqui

questionAnswers(1)

yourAnswerToTheQuestion