|
|
|
@ -7,6 +7,7 @@ |
|
|
|
#include "vm.h" |
|
|
|
#include <string.h> |
|
|
|
#include <errno.h> |
|
|
|
//#include <fcntl.h>
|
|
|
|
|
|
|
|
typedef long (*syscall_t)(long, long, long, long, long, long, long); |
|
|
|
|
|
|
|
@ -26,7 +27,7 @@ void sys_exit(int code) |
|
|
|
if (current.t0) |
|
|
|
printk("%ld cycles\n", rdcycle() - current.t0); |
|
|
|
|
|
|
|
frontend_syscall(SYS_exit, code, 0, 0, 0); |
|
|
|
frontend_syscall(SYS_exit, code, 0, 0, 0, 0); |
|
|
|
while (1); |
|
|
|
} |
|
|
|
|
|
|
|
@ -44,6 +45,20 @@ ssize_t sys_read(int fd, char* buf, size_t n) |
|
|
|
return r; |
|
|
|
} |
|
|
|
|
|
|
|
ssize_t sys_pread(int fd, char* buf, size_t n, off_t offset) |
|
|
|
{ |
|
|
|
ssize_t r = -EBADF; |
|
|
|
file_t* f = file_get(fd); |
|
|
|
|
|
|
|
if (f) |
|
|
|
{ |
|
|
|
r = file_pread(f, buf, n, offset); |
|
|
|
file_decref(f); |
|
|
|
} |
|
|
|
|
|
|
|
return r; |
|
|
|
} |
|
|
|
|
|
|
|
ssize_t sys_write(int fd, const char* buf, size_t n) |
|
|
|
{ |
|
|
|
ssize_t r = -EBADF; |
|
|
|
@ -60,6 +75,7 @@ ssize_t sys_write(int fd, const char* buf, size_t n) |
|
|
|
|
|
|
|
int sys_open(const char* name, int flags, int mode) |
|
|
|
{ |
|
|
|
printk("OPEN(%s)\n",name); |
|
|
|
file_t* file = file_open(name, flags, mode); |
|
|
|
if (IS_ERR_VALUE(file)) |
|
|
|
return PTR_ERR(file); |
|
|
|
@ -71,8 +87,30 @@ int sys_open(const char* name, int flags, int mode) |
|
|
|
return fd; |
|
|
|
} |
|
|
|
|
|
|
|
int sys_openat(int dirfd, const char* name, int flags, int mode) |
|
|
|
{ |
|
|
|
if(name[0] == '/'){ |
|
|
|
return sys_open(name, flags, mode); |
|
|
|
} |
|
|
|
file_t* dir = file_get(dirfd); |
|
|
|
if(dir) |
|
|
|
{ |
|
|
|
file_t* file = file_openat(dir->kfd, name, flags, mode); |
|
|
|
if (IS_ERR_VALUE(file)) |
|
|
|
return PTR_ERR(file); |
|
|
|
|
|
|
|
int fd = file_dup(file); |
|
|
|
if (fd < 0) |
|
|
|
return -ENOMEM; |
|
|
|
|
|
|
|
return fd; |
|
|
|
} |
|
|
|
return -EBADF; |
|
|
|
} |
|
|
|
|
|
|
|
int sys_close(int fd) |
|
|
|
{ |
|
|
|
//printk("CLOSE(%ld)\n",fd);
|
|
|
|
int ret = fd_close(fd); |
|
|
|
if (ret < 0) |
|
|
|
return -EBADF; |
|
|
|
@ -81,6 +119,7 @@ int sys_close(int fd) |
|
|
|
|
|
|
|
int sys_fstat(int fd, void* st) |
|
|
|
{ |
|
|
|
printk("FSTAT(%ld)\n",fd); |
|
|
|
int r = -EBADF; |
|
|
|
file_t* f = file_get(fd); |
|
|
|
|
|
|
|
@ -93,6 +132,34 @@ int sys_fstat(int fd, void* st) |
|
|
|
return r; |
|
|
|
} |
|
|
|
|
|
|
|
int sys_fcntl(int fd, int cmd, int arg) |
|
|
|
{ |
|
|
|
int r = -EBADF; |
|
|
|
file_t* f = file_get(fd); |
|
|
|
|
|
|
|
if (f) |
|
|
|
{ |
|
|
|
r = frontend_syscall(SYS_fcntl, f->kfd, cmd, arg, 0, 0); |
|
|
|
file_decref(f); |
|
|
|
} |
|
|
|
|
|
|
|
return r; |
|
|
|
} |
|
|
|
|
|
|
|
int sys_dup(int fd) |
|
|
|
{ |
|
|
|
int r = -EBADF; |
|
|
|
file_t* f = file_get(fd); |
|
|
|
|
|
|
|
if (f) |
|
|
|
{ |
|
|
|
r = file_dup(f); |
|
|
|
file_decref(f); |
|
|
|
} |
|
|
|
|
|
|
|
return r; |
|
|
|
} |
|
|
|
|
|
|
|
ssize_t sys_lseek(int fd, size_t ptr, int dir) |
|
|
|
{ |
|
|
|
ssize_t r = -EBADF; |
|
|
|
@ -111,14 +178,46 @@ long sys_stat(const char* name, void* st) |
|
|
|
{ |
|
|
|
size_t name_size = strlen(name)+1; |
|
|
|
populate_mapping(st, sizeof(struct stat), PROT_WRITE); |
|
|
|
return frontend_syscall(SYS_stat, (uintptr_t)name, name_size, (uintptr_t)st, 0); |
|
|
|
return frontend_syscall(SYS_stat, (uintptr_t)name, name_size, (uintptr_t)st, 0, 0); |
|
|
|
} |
|
|
|
|
|
|
|
long sys_lstat(const char* name, void* st) |
|
|
|
{ |
|
|
|
size_t name_size = strlen(name)+1; |
|
|
|
populate_mapping(st, sizeof(struct stat), PROT_WRITE); |
|
|
|
return frontend_syscall(SYS_lstat, (uintptr_t)name, name_size, (uintptr_t)st, 0); |
|
|
|
return frontend_syscall(SYS_lstat, (uintptr_t)name, name_size, (uintptr_t)st, 0, 0); |
|
|
|
} |
|
|
|
long sys_fstatat(int dirfd, const char* name, void* st, int flags) |
|
|
|
{ |
|
|
|
if(name[0] == '/'){ |
|
|
|
return sys_stat(name, st); |
|
|
|
} |
|
|
|
file_t* dir = file_get(dirfd); |
|
|
|
if(dir) |
|
|
|
{ |
|
|
|
size_t name_size = strlen(name)+1; |
|
|
|
populate_mapping(st, sizeof(struct stat), PROT_WRITE); |
|
|
|
return frontend_syscall(SYS_fstatat, dir->kfd, (uintptr_t)name, name_size, (uintptr_t)st, flags); |
|
|
|
} |
|
|
|
return -EBADF; |
|
|
|
} |
|
|
|
|
|
|
|
int sys_access(const char *name, int mode){ |
|
|
|
size_t name_size = strlen(name)+1; |
|
|
|
return frontend_syscall(SYS_access, (uintptr_t)name, name_size, mode, 0, 0); |
|
|
|
} |
|
|
|
|
|
|
|
int sys_faccessat(int dirfd, const char *name, int mode, int flags){ |
|
|
|
if(name[0] == '/'){ |
|
|
|
return sys_access(name, mode); |
|
|
|
} |
|
|
|
file_t* dir = file_get(dirfd); |
|
|
|
if(dir) |
|
|
|
{ |
|
|
|
size_t name_size = strlen(name)+1; |
|
|
|
return frontend_syscall(SYS_access, dir->kfd, (uintptr_t)name, name_size, mode, flags); |
|
|
|
} |
|
|
|
return -EBADF; |
|
|
|
} |
|
|
|
|
|
|
|
long sys_link(const char* old_name, const char* new_name) |
|
|
|
@ -126,13 +225,25 @@ long sys_link(const char* old_name, const char* new_name) |
|
|
|
size_t old_size = strlen(old_name)+1; |
|
|
|
size_t new_size = strlen(new_name)+1; |
|
|
|
return frontend_syscall(SYS_link, (uintptr_t)old_name, old_size, |
|
|
|
(uintptr_t)new_name, new_size); |
|
|
|
(uintptr_t)new_name, new_size, 0); |
|
|
|
} |
|
|
|
|
|
|
|
long sys_unlink(const char* name, size_t len) |
|
|
|
{ |
|
|
|
size_t name_size = strlen(name)+1; |
|
|
|
return frontend_syscall(SYS_unlink, (uintptr_t)name, name_size, 0, 0); |
|
|
|
return frontend_syscall(SYS_unlink, (uintptr_t)name, name_size, 0, 0, 0); |
|
|
|
} |
|
|
|
|
|
|
|
long sys_mkdir(const char* name, int mode) |
|
|
|
{ |
|
|
|
size_t name_size = strlen(name)+1; |
|
|
|
return frontend_syscall(SYS_mkdir, (uintptr_t)name, name_size, mode, 0, 0); |
|
|
|
} |
|
|
|
|
|
|
|
long sys_getcwd(const char* buf, size_t size) |
|
|
|
{ |
|
|
|
populate_mapping(buf, size, PROT_WRITE); |
|
|
|
return frontend_syscall(SYS_getcwd, (uintptr_t)buf, size, 0, 0, 0); |
|
|
|
} |
|
|
|
|
|
|
|
size_t sys_brk(size_t pos) |
|
|
|
@ -152,6 +263,11 @@ int sys_uname(void* buf) |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
pid_t sys_getpid() |
|
|
|
{ |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
int sys_getuid() |
|
|
|
{ |
|
|
|
return 0; |
|
|
|
@ -159,7 +275,10 @@ int sys_getuid() |
|
|
|
|
|
|
|
uintptr_t sys_mmap(uintptr_t addr, size_t length, int prot, int flags, int fd, off_t offset) |
|
|
|
{ |
|
|
|
return do_mmap(addr, length, prot, flags, fd, offset); |
|
|
|
printk("MMAP(ad:%ld,len:%ld,prot:%ld,flags:%ld,fd:%ld,off:%ld\n",addr,length,prot,flags,fd,offset); |
|
|
|
uintptr_t ret = do_mmap(addr, length, prot, flags, fd, offset); |
|
|
|
//printk("MMAP DONE\n");
|
|
|
|
return ret; |
|
|
|
} |
|
|
|
|
|
|
|
int sys_munmap(uintptr_t addr, size_t length) |
|
|
|
@ -235,23 +354,35 @@ ssize_t sys_writev(int fd, const void* iov, int cnt) |
|
|
|
return ret; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int sys_getdents(int fd, void* dirbuf, int count) |
|
|
|
{ |
|
|
|
return 0; //stub
|
|
|
|
} |
|
|
|
|
|
|
|
long syscall(long a0, long a1, long a2, long a3, long a4, long a5, long n) |
|
|
|
{ |
|
|
|
const static void* syscall_table[] = { |
|
|
|
[SYS_exit] = sys_exit, |
|
|
|
[SYS_exit_group] = sys_exit, |
|
|
|
[SYS_read] = sys_read, |
|
|
|
[SYS_pread] = sys_pread, |
|
|
|
[SYS_write] = sys_write, |
|
|
|
[SYS_open] = sys_open, |
|
|
|
[SYS_openat] = sys_openat, |
|
|
|
[SYS_close] = sys_close, |
|
|
|
[SYS_fstat] = sys_fstat, |
|
|
|
[SYS_lseek] = sys_lseek, |
|
|
|
[SYS_stat] = sys_stat, |
|
|
|
[SYS_lstat] = sys_lstat, |
|
|
|
[SYS_fstatat] = sys_fstatat, |
|
|
|
[SYS_link] = sys_link, |
|
|
|
[SYS_unlink] = sys_unlink, |
|
|
|
[SYS_mkdir] = sys_mkdir, |
|
|
|
[SYS_getcwd] = sys_getcwd, |
|
|
|
[SYS_brk] = sys_brk, |
|
|
|
[SYS_uname] = sys_uname, |
|
|
|
[SYS_getpid] = sys_getpid, |
|
|
|
[SYS_getuid] = sys_getuid, |
|
|
|
[SYS_geteuid] = sys_getuid, |
|
|
|
[SYS_getgid] = sys_getuid, |
|
|
|
@ -264,6 +395,11 @@ long syscall(long a0, long a1, long a2, long a3, long a4, long a5, long n) |
|
|
|
[SYS_gettimeofday] = sys_gettimeofday, |
|
|
|
[SYS_times] = sys_times, |
|
|
|
[SYS_writev] = sys_writev, |
|
|
|
[SYS_access] = sys_access, |
|
|
|
[SYS_faccessat] = sys_faccessat, |
|
|
|
[SYS_fcntl] = sys_fcntl, |
|
|
|
[SYS_getdents] = sys_getdents, |
|
|
|
[SYS_dup] = sys_dup, |
|
|
|
}; |
|
|
|
|
|
|
|
if(n >= ARRAY_SIZE(syscall_table) || !syscall_table[n]) |
|
|
|
|