x64-httpd/client.s

104 lines
1.8 KiB
ArmAsm

; Errors (in rax):
; 0 - EOF
; -1024 - line too long
; other negative - from read(2)
; Arguments:
; rdi - fd
; rsi - address of client within clients array
; rdx - pollfds index
client__pollin:
push rdi
push rsi
push rdx
mov r10, 0
mov r10b, [rsi + 4 + 2] ; buffer_len
mov rdx, 0
mov dl, 255
sub dl, r10b ; rdx = 255 - buffer_len
add rsi, 8
add rsi, r10
call readline
mov r10, rdi
pop rdx
pop rsi
pop rdi
cmp rax, 0
jle return
add [rsi + 4 + 2], al ; buffer_len += rax
cmp r10, 0
jg client__pollin__complete_line
add [rsi + 4 + 1], al ; line_len += rax
ret
client__pollin__complete_line:
add [rsi + 4 + 1], r10b ; line_len += r10
mov word [pollfds + rdx * pollfd_size + 4], POLLOUT
ret
; rdi - fd
; rsi - address of client within clients array
; rdx - pollfds index
client__pollout:
push rdi
push rsi
push rdx
mov rax, SYS_WRITE
mov rdx, 0
mov dl, [rsi + 4 + 1]
add rsi, 8
syscall
pop rdx
pop rsi
pop rdi
cmp rax, 0
jl return
mov r10, rsi
add r10, 8
mov r11, 0
mov r11b, [rsi + 4 + 2]
sub r11, rax
add r11, r10
client__pollout__shunt:
cmp r10, r11
jge client__pollout__shunt__finished
mov r8b, [r10 + rax]
mov [r10], r8b
add r10, 1
jmp client__pollout__shunt
client__pollout__shunt__finished:
sub [rsi + 4 + 2], al ; buffer_len -= rax
sub [rsi + 4 + 1], al ; line_len -= rax
cmp byte [rsi + 4 + 1], 0
je client__pollout__wrote_line
ret
client__pollout__wrote_line:
mov word [pollfds + rdx * pollfd_size + 4], POLLIN
ret
; rdi - fd
client__shutdown_close:
mov rax, SYS_SHUTDOWN
push rdi
mov rsi, SHUT_RDWR
syscall
mov rax, SYS_CLOSE
pop rdi
syscall
ret