120 lines
1.7 KiB
ArmAsm
120 lines
1.7 KiB
ArmAsm
.code64
|
|
#include <asm/unistd.h>
|
|
#include <asm/socket.h>
|
|
|
|
#define STDIN 0
|
|
#define STDOUT 1
|
|
#define STDERR 2
|
|
|
|
#define PF_INET 2
|
|
#define AF_INET PF_INET
|
|
#define SOCK_STREAM 1
|
|
|
|
#define PORT 20335
|
|
|
|
.data
|
|
greeting: .ascii "Socket test!\n"
|
|
.set greeting_len, .-greeting
|
|
|
|
bye: .ascii "Sockets tested!\n"
|
|
.set bye_len, .-bye
|
|
|
|
errstr: .ascii "Error happened\n"
|
|
.set errstr_len, .-errstr
|
|
|
|
s: .quad 0
|
|
|
|
true_val: .quad 1
|
|
.set true_val_len, .-true_val
|
|
|
|
myaddr:
|
|
.hword AF_INET
|
|
port: .byte (PORT >> 8) & 0xFF, (PORT & 0xFF)
|
|
addr: .byte 0, 0, 0, 0
|
|
.set myaddr_len, 16
|
|
|
|
.extern passthru
|
|
.extern write_buf
|
|
|
|
.text
|
|
.global _start
|
|
_start:
|
|
movq $STDERR, %rdi
|
|
movq $greeting, %rsi
|
|
movq $greeting_len, %rdx
|
|
call write_buf
|
|
|
|
movq $__NR_socket, %rax
|
|
movq $PF_INET, %rdi
|
|
movq $SOCK_STREAM, %rsi
|
|
movq $0, %rdx
|
|
syscall
|
|
cmp $-1, %rax
|
|
jz error
|
|
movq %rax, s
|
|
|
|
movq $__NR_setsockopt, %rax
|
|
movq s, %rdi
|
|
movq $SOL_SOCKET, %rsi
|
|
movq $SO_REUSEADDR, %rdx
|
|
movq $true_val, %r10
|
|
movq $true_val_len, %r8
|
|
syscall
|
|
test %rax, %rax
|
|
jnz error
|
|
|
|
movq $__NR_bind, %rax
|
|
movq s, %rdi
|
|
movq $myaddr, %rsi
|
|
movq $myaddr_len, %rdx
|
|
syscall
|
|
test %rax, %rax
|
|
jnz error
|
|
|
|
movq $__NR_listen, %rax
|
|
movq s, %rdi
|
|
movq $8, %rsi
|
|
syscall
|
|
test %rax, %rax
|
|
jnz error
|
|
|
|
movq $__NR_accept, %rax
|
|
movq s, %rdi
|
|
movq $0, %rsi
|
|
movq $0, %rdx
|
|
movq $0, %r10
|
|
syscall
|
|
cmp $-1, %rax
|
|
jz error
|
|
|
|
test %rax, %rax
|
|
jz error
|
|
|
|
movq %rax, %rdi
|
|
movq $STDOUT, %rsi
|
|
call passthru
|
|
|
|
movq $STDERR, %rdi
|
|
movq $bye, %rsi
|
|
movq $bye_len, %rdx
|
|
call write_buf
|
|
|
|
exit:
|
|
movq $__NR_close, %rax
|
|
movq s, %rdi
|
|
syscall
|
|
|
|
_exit:
|
|
movq $__NR_exit, %rax
|
|
movq $0, %rdi
|
|
syscall
|
|
movq $0, 0
|
|
|
|
error:
|
|
movq $__NR_write, %rax
|
|
movq $STDERR, %rdi
|
|
movq $errstr, %rsi
|
|
movq $errstr_len, %rdx
|
|
syscall
|
|
jmp _exit
|