307 lines
6.4 KiB
C
307 lines
6.4 KiB
C
#if defined(__mips__)
|
|
#include "../int.h"
|
|
|
|
#include "generic.h"
|
|
|
|
void exit(int8_t status){
|
|
asm (
|
|
"move $a0, %0\n"
|
|
"li $v0, 4001\n"
|
|
"syscall\n"
|
|
:
|
|
: "r" (status)
|
|
: "a0", "v0"
|
|
);
|
|
for(;;);
|
|
}
|
|
|
|
intptr_t write(int32_t fd, const void* buf, intptr_t size){
|
|
intptr_t n_written = 0;
|
|
asm volatile (
|
|
"move $a0, %1\n"
|
|
"move $a1, %2\n"
|
|
"move $a2, %3\n"
|
|
"li $v0, 4004\n"
|
|
"syscall\n"
|
|
"move %0, $v0\n"
|
|
: "=r"(n_written)
|
|
: "r"(fd), "r"(buf), "r"(size)
|
|
: "a0", "a1", "a2", "v0" //TODO: temp registers clobbered by syscall should probably also be listed but this fn returns right away so it should be fine?
|
|
);
|
|
return n_written;
|
|
}
|
|
intptr_t read(int32_t fd, const void* buf, intptr_t size){
|
|
intptr_t n_read = 0;
|
|
asm volatile (
|
|
"move $a0, %1\n"
|
|
"move $a1, %2\n"
|
|
"move $a2, %3\n"
|
|
"li $v0, 4003\n"
|
|
"syscall\n"
|
|
"move %0, $v0\n"
|
|
: "=r"(n_read)
|
|
: "r"(fd), "r"(buf), "r"(size)
|
|
: "a0", "a1", "a2", "v0", "memory" //TODO: temp registers clobbered by syscall should probably also be listed but this fn returns right away so it should be fine?
|
|
);
|
|
return n_read;
|
|
}
|
|
|
|
uint32_t fork(){
|
|
int rtn;
|
|
asm (
|
|
"li $v0, 4002\n"
|
|
"syscall\n"
|
|
"move %0, $v0"
|
|
:"=r" (rtn)
|
|
:
|
|
: "a0", "v0"
|
|
);
|
|
return (uint32_t)rtn;
|
|
}
|
|
|
|
int32_t openat(int32_t fd, const char* filename, uint32_t flags, uint32_t mode) {
|
|
int32_t file = 0;
|
|
asm volatile (
|
|
"move $a0, %1\n"
|
|
"move $a1, %2\n"
|
|
"move $a2, %3\n"
|
|
"move $a3, %4\n"
|
|
"li $v0, 4288\n"
|
|
"syscall\n"
|
|
"move %0, $v0\n"
|
|
: "=r"(file)
|
|
: "r"(fd), "r"(filename), "r"(flags), "r"(mode)
|
|
: "a0", "a1", "a2", "a3", "v0"
|
|
);
|
|
return file;
|
|
}
|
|
|
|
int close(unsigned int fd){
|
|
int rtn = 0;
|
|
asm (
|
|
"move $a0, %1\n"
|
|
"li $v0, 4006\n"
|
|
"syscall\n"
|
|
"move %0, $v0\n"
|
|
: "=r"(rtn)
|
|
: "r" (fd)
|
|
: "a0", "v0"
|
|
);
|
|
return rtn;
|
|
}
|
|
|
|
int fsync(unsigned int fd){
|
|
int rtn = 0;
|
|
asm (
|
|
"move $a0, %1\n"
|
|
"li $v0, 4118\n"
|
|
"syscall\n"
|
|
"move %0, $v0\n"
|
|
: "=r"(rtn)
|
|
: "r" (fd)
|
|
: "a0", "v0"
|
|
);
|
|
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;
|
|
}
|
|
|
|
int clock_settime(clockid_t clockid, const struct timespec *tp){
|
|
int rtn = 0;
|
|
asm volatile (
|
|
"move $a0, %1\n"
|
|
"move $a1, %2\n"
|
|
"li $v0, 4262\n"
|
|
"syscall\n"
|
|
"move %0, $v0\n"
|
|
: "=r"(rtn)
|
|
: "r"(clockid), "r"(tp)
|
|
: "a0", "a1", "v0"
|
|
);
|
|
return rtn;
|
|
}
|
|
int clock_gettime(clockid_t clockid, struct timespec *tp){
|
|
int rtn = 0;
|
|
asm volatile (
|
|
"move $a0, %1\n"
|
|
"move $a1, %2\n"
|
|
"li $v0, 4263\n"
|
|
"syscall\n"
|
|
"move %0, $v0\n"
|
|
: "=r"(rtn)
|
|
: "r"(clockid), "r"(tp)
|
|
: "a0", "a1", "v0", "memory"
|
|
);
|
|
return rtn;
|
|
}
|
|
int clock_getres(clockid_t clockid, struct timespec *res){
|
|
int rtn = 0;
|
|
asm volatile (
|
|
"move $a0, %1\n"
|
|
"move $a1, %2\n"
|
|
"li $v0, 4264\n"
|
|
"syscall\n"
|
|
"move %0, $v0\n"
|
|
: "=r"(rtn)
|
|
: "r"(clockid), "r"(res)
|
|
: "a0", "a1", "v0", "memory"
|
|
);
|
|
return rtn;
|
|
}
|
|
int clock_nanosleep(clockid_t clockid, int flags, const struct timespec *t, struct timespec* remain){
|
|
int rtn = 0;
|
|
asm volatile (
|
|
"move $a0, %1\n"
|
|
"move $a1, %2\n"
|
|
"move $a2, %3\n"
|
|
"move $a3, %4\n"
|
|
"li $v0, 4265\n"
|
|
"syscall\n"
|
|
"move %0, $v0\n"
|
|
: "=r"(rtn)
|
|
: "r"(clockid), "r"(flags), "r"(t), "r"(remain)
|
|
: "a0", "a1", "a2", "a3", "v0", "memory"
|
|
);
|
|
return rtn;
|
|
}
|
|
|
|
#endif
|