160 lines
3 KiB
ArmAsm
160 lines
3 KiB
ArmAsm
; Returns:
|
|
; rax - 0
|
|
; Errors (in rax):
|
|
; rax - 0 - EOF
|
|
; rax - -1024 - line too long
|
|
; rax - other negative - from read(2)
|
|
; Arguments:
|
|
; rdi - fd
|
|
; rsi - address of client within clients array
|
|
; rdx - pollfds index
|
|
; Variables:
|
|
; rbx - pollfds index
|
|
; r12 - client buffer
|
|
; r13 - start of line scanning
|
|
; r14 - client buffer end
|
|
client__pollin:
|
|
push rbx
|
|
push r12
|
|
push r13
|
|
push r14
|
|
|
|
mov rbx, rdx
|
|
mov r12, rsi
|
|
add r12, OFFSET_CLIENT_BUFFER
|
|
mov r13, 0
|
|
mov r13b, [rsi + OFFSET_CLIENT_BUFFER_LEN]
|
|
add r13, r12
|
|
mov r14, r12
|
|
add r14, 255
|
|
|
|
mov rax, SYS_READ
|
|
mov rsi, r13
|
|
mov rdx, 255
|
|
sub rdx, [rsi + OFFSET_CLIENT_BUFFER_LEN]
|
|
syscall
|
|
|
|
cmp rax, 0
|
|
jle client__pollin__return ; TODO verify this shit
|
|
|
|
; buffer_len += read(2) length
|
|
add [r12 - OFFSET_CLIENT_BUFFER + OFFSET_CLIENT_BUFFER_LEN], al
|
|
|
|
mov rdi, r13
|
|
mov rsi, rax
|
|
call scanline
|
|
|
|
cmp rax, 0
|
|
je client__pollin__no_line
|
|
|
|
mov rax, 1
|
|
mov word [pollfds + rbx * pollfd_size + 4], POLLOUT
|
|
|
|
client__pollin__return:
|
|
pop r14
|
|
pop r13
|
|
pop r12
|
|
pop rbx
|
|
ret
|
|
|
|
client__pollin__no_line:
|
|
mov r10, r13
|
|
add r10, rax
|
|
cmp r10, r14
|
|
jge client__pollin__line_too_long
|
|
mov rax, 1
|
|
jmp client__pollin__return
|
|
|
|
client__pollin__line_too_long:
|
|
mov rax, -1024
|
|
jmp client__pollin__return
|
|
|
|
|
|
; Returns:
|
|
; rax - non-negative from write(2)
|
|
; Errors:
|
|
; rax - -1024 - no line was buffered
|
|
; rax - other negative - from write(2)
|
|
; Arguments:
|
|
; rdi - fd
|
|
; rsi - address of client within clients array
|
|
; rdx - pollfds index
|
|
; Variables:
|
|
; rbx - pollfds index
|
|
; r12 - address of client within clients array
|
|
; r13 - line length
|
|
; r11 - client buffer end of text after call to write(2)
|
|
client__pollout:
|
|
push rbx
|
|
push r12
|
|
push r13
|
|
|
|
mov rbx, rdx
|
|
mov r12, rsi
|
|
|
|
push rdi
|
|
mov rdi, r12
|
|
add rdi, OFFSET_CLIENT_BUFFER
|
|
mov rsi, 255
|
|
call scanline
|
|
pop rdi
|
|
|
|
; poll(2)'d for POLLOUT but we had no line buffered;
|
|
; should be impossible
|
|
cmp rax, 0
|
|
je client__pollout__no_line
|
|
|
|
mov r13, rax
|
|
|
|
mov rax, SYS_WRITE
|
|
mov rsi, r12
|
|
add rsi, OFFSET_CLIENT_BUFFER
|
|
mov rdx, r13
|
|
syscall
|
|
|
|
; error from write(2)
|
|
cmp rax, 0
|
|
jl client__pollout__return
|
|
|
|
mov r10, r12
|
|
mov r11, 0
|
|
mov r11b, [r12 + OFFSET_CLIENT_BUFFER_LEN]
|
|
add r11, r12
|
|
sub r11, rax
|
|
|
|
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:
|
|
; buffer_len -= rax
|
|
sub [r12 + OFFSET_CLIENT_BUFFER_LEN], al
|
|
cmp rax, r13
|
|
jl client__pollout__return
|
|
mov word [pollfds + rbx * pollfd_size + 4], POLLIN
|
|
|
|
client__pollout__no_line:
|
|
mov rax, -1024
|
|
|
|
client__pollout__return:
|
|
pop r13
|
|
pop r12
|
|
pop rbx
|
|
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
|