Add socket support for mips

This commit is contained in:
2025-04-29 18:53:48 -04:00
parent 37bf95704e
commit 74cfa5f949
3 changed files with 187 additions and 13 deletions

View File

@@ -102,4 +102,144 @@ int fsync(unsigned int fd){
return rtn;
}
int socket(int domain, int type, int protocol){
int sockfd = 0;
asm volatile (
"move $a0, %1\n"
"move $a1, %2\n"
"move $a2, %3\n"
"li $v0, 4183\n"
"syscall\n"
"move %0, $v0\n"
: "=r"(sockfd)
: "r"(domain), "r"(type), "r"(protocol)
: "a0", "a1", "a2", "v0", "memory"
);
return sockfd;
}
int setsockopt(int sockfd, int level, int optname, const void* optval, socklen_t optlen){
int rtn = 0;
asm volatile (
"li $v0, 4181\n"
"move $a0, %1\n"
"move $a1, %2\n"
"move $a2, %3\n"
"move $a3, %4\n"
"addiu $sp, $sp, -32\n"
"sw %5, 16($sp)\n"
"syscall\n"
"addiu $sp, $sp, 32\n"
"move %0, $v0\n"
: "=r"(rtn)
: "r"(sockfd), "r"(level), "r"(optname), "r"(optval), "r"(optlen)
: "a0", "a1", "a2", "a3", "t0", "v0"
);
return rtn;
}
int bind(int sockfd, const void* sockaddr, socklen_t addrlen) {
int rtn = 0;
asm volatile (
"move $a0, %1\n"
"move $a1, %2\n"
"move $a2, %3\n"
"li $v0, 4169\n"
"syscall\n"
"move %0, $v0\n"
: "=r"(rtn)
: "r"(sockfd), "r"(sockaddr), "r"(addrlen)
: "a0", "a1", "a2", "v0"
);
return rtn;
}
int listen(int fd, int backlog) {
int rtn = 0;
asm volatile (
"move $a0, %1\n"
"move $a1, %2\n"
"li $v0, 4174\n"
"syscall\n"
"move %0, $v0\n"
: "=r"(rtn)
: "r"(fd), "r"(backlog)
: "a0", "a1", "v0"
);
return rtn;
}
int accept(int sockfd, void* addr, socklen_t* addrlen) {
int connfd = 0;
asm volatile (
"move $a0, %1\n"
"move $a1, %2\n"
"move $a2, %3\n"
"li $v0, 4168\n"
"syscall\n"
"move %0, $v0\n"
: "=r"(connfd)
: "r"(sockfd), "r"(addr), "r"(addrlen)
: "a0", "a1", "a2", "v0", "memory"
);
return connfd;
}
int connect(int sockfd, void* addr, socklen_t addrlen) {
int connfd = 0;
asm volatile (
"move $a0, %1\n"
"move $a1, %2\n"
"move $a2, %3\n"
"li $v0, 4170\n"
"syscall\n"
"move %0, $v0\n"
: "=r"(connfd)
: "r"(sockfd), "r"(addr), "r"(addrlen)
: "a0", "a1", "a2", "v0"
);
return connfd;
}
ssize_t sendto(int sockfd, const void* buf, size_t size, int flags, const void* sockaddr, socklen_t addrlen){
ssize_t rtn = 0;
asm volatile (
"li $v0, 4180\n"
"move $a0, %1\n"
"move $a1, %2\n"
"move $a2, %3\n"
"move $a3, %4\n"
"addiu $sp, $sp, -32\n"
"sw %5, 16($sp)\n"
"sw %6, 20($sp)\n"
"syscall\n"
"addiu $sp, $sp, 32\n"
"move %0, $v0\n"
: "=r"(rtn)
: "r"(sockfd), "r"(buf), "r"(size), "r"(flags), "r"(sockaddr), "r"(addrlen)
: "a0", "a1", "a2", "a3", "t0", "t1", "v0"
);
return rtn;
}
ssize_t recvfrom(int sockfd, const void* buf, size_t size, int flags, const void* sockaddr, socklen_t addrlen){
ssize_t rtn = 0;
asm volatile (
"li $v0, 4176\n"
"move $a0, %1\n"
"move $a1, %2\n"
"move $a2, %3\n"
"move $a3, %4\n"
"addiu $sp, $sp, -32\n"
"sw %5, 16($sp)\n"
"sw %6, 20($sp)\n"
"syscall\n"
"addiu $sp, $sp, 32\n"
"move %0, $v0\n"
: "=r"(rtn)
: "r"(sockfd), "r"(buf), "r"(size), "r"(flags), "r"(sockaddr), "r"(addrlen)
: "a0", "a1", "a2", "a3", "t0", "t1", "v0", "memory"
);
return rtn;
}
#endif