Add socket and IPv4 support for x86_64
This commit is contained in:
104
arch/x86_64.c
104
arch/x86_64.c
@@ -88,4 +88,108 @@ int fsync(unsigned int fd) {
|
||||
return rtn;
|
||||
}
|
||||
|
||||
#define SYS_SOCKET 41
|
||||
int socket(int domain, int type, int protocol) {
|
||||
int32_t fd;
|
||||
asm volatile (
|
||||
"syscall\n"
|
||||
: "=a"(fd)
|
||||
: "a"(SYS_SOCKET), "D"(domain), "S"(type), "d"(protocol)
|
||||
: "rcx", "r11"
|
||||
);
|
||||
return fd;
|
||||
}
|
||||
|
||||
#define SYS_SETSOCKOPT 54
|
||||
int setsockopt(int fd, int level, int optname, const void* optval, uint64_t optlen) {
|
||||
int rtn;
|
||||
asm volatile(
|
||||
"mov %5, %%r10\n"
|
||||
"mov %6, %%r8\n"
|
||||
"syscall\n"
|
||||
: "=a"(rtn)
|
||||
: "a"(SYS_SETSOCKOPT), "D"(fd), "S"(level), "d"(optname), "r"(optval), "r"(optlen)
|
||||
: "rcx", "r11"
|
||||
);
|
||||
return rtn;
|
||||
}
|
||||
|
||||
#define SYS_BIND 49
|
||||
int bind(int fd, const void* sockaddr, uint64_t addrlen) {
|
||||
int rtn;
|
||||
asm volatile(
|
||||
"syscall\n"
|
||||
: "=a"(rtn)
|
||||
: "a"(SYS_BIND), "D"(fd), "S"(sockaddr), "d"(addrlen)
|
||||
: "rcx", "r11"
|
||||
);
|
||||
return rtn;
|
||||
}
|
||||
|
||||
#define SYS_LISTEN 50
|
||||
int listen(int fd, int backlog) {
|
||||
int rtn;
|
||||
asm volatile(
|
||||
"syscall\n"
|
||||
: "=a"(rtn)
|
||||
: "a"(SYS_LISTEN), "D"(fd), "S"(backlog)
|
||||
: "rcx", "r11"
|
||||
);
|
||||
return rtn;
|
||||
}
|
||||
|
||||
#define SYS_ACCEPT 43
|
||||
int accept(int fd, void* addr, uint64_t* addrlen) {
|
||||
int rtn;
|
||||
asm volatile(
|
||||
"syscall\n"
|
||||
: "=a"(rtn)
|
||||
: "a"(SYS_ACCEPT), "D"(fd), "S"(addr), "d"(addrlen)
|
||||
: "rcx", "r11", "memory"
|
||||
);
|
||||
return rtn;
|
||||
}
|
||||
|
||||
#define SYS_CONNECT 42
|
||||
int connect(int fd, void* addr, uint64_t addrlen) {
|
||||
int rtn;
|
||||
asm volatile(
|
||||
"syscall\n"
|
||||
: "=a"(rtn)
|
||||
: "a"(SYS_CONNECT), "D"(fd), "S"(addr), "d"(addrlen)
|
||||
: "rcx", "r11"
|
||||
);
|
||||
return rtn;
|
||||
}
|
||||
|
||||
#define SYS_SENDTO 44
|
||||
int64_t sendto(int fd, const void* buf, uint64_t size, int flags, const void* sockaddr, uint64_t addrlen) {
|
||||
int64_t nsent;
|
||||
asm volatile(
|
||||
"mov %5, %%r10\n"
|
||||
"mov %6, %%r8\n"
|
||||
"mov %7, %%r9\n"
|
||||
"syscall\n"
|
||||
: "=a"(nsent)
|
||||
: "a"(SYS_SENDTO), "D"(fd), "S"(buf), "d"(size), "r"((int64_t)flags), "r"(sockaddr), "r"(addrlen)
|
||||
: "rcx", "r11"
|
||||
);
|
||||
return nsent;
|
||||
}
|
||||
|
||||
#define SYS_RECVFROM 45
|
||||
int64_t recvfrom(int fd, const void* buf, uint64_t size, int flags, const void* sockaddr, uint64_t addrlen) {
|
||||
int64_t nrecv;
|
||||
asm volatile(
|
||||
"mov %5, %%r10\n"
|
||||
"mov %6, %%r8\n"
|
||||
"mov %7, %%r9\n"
|
||||
"syscall\n"
|
||||
: "=a"(nrecv)
|
||||
: "a"(SYS_RECVFROM), "D"(fd), "S"(buf), "d"(size), "r"((int64_t)flags), "r"(sockaddr), "r"(addrlen)
|
||||
: "rcx", "r11", "memory"
|
||||
);
|
||||
return nrecv;
|
||||
}
|
||||
|
||||
#endif /* ifdef __x86_64__ */
|
||||
|
||||
Reference in New Issue
Block a user