kernel: Export sys_ functions so they appear in symbol table

This commit is contained in:
K. Lange 2021-10-28 07:51:20 +09:00
parent a83d641d2c
commit d6fc131912

View File

@ -38,7 +38,7 @@ int ptr_validate(void * ptr, const char * syscall) {
#define PTRCHECK(addr,size,flags) do { if (!mmu_validate_user_pointer(addr,size,flags)) return -EFAULT; } while (0) #define PTRCHECK(addr,size,flags) do { if (!mmu_validate_user_pointer(addr,size,flags)) return -EFAULT; } while (0)
static long sys_sbrk(ssize_t size) { long sys_sbrk(ssize_t size) {
if (size & 0xFFF) return -EINVAL; if (size & 0xFFF) return -EINVAL;
volatile process_t * volatile proc = this_core->current_process; volatile process_t * volatile proc = this_core->current_process;
if (proc->group != 0) { if (proc->group != 0) {
@ -60,7 +60,7 @@ static long sys_sbrk(ssize_t size) {
extern int elf_module(char ** args); extern int elf_module(char ** args);
static long sys_sysfunc(long fn, char ** args) { long sys_sysfunc(long fn, char ** args) {
/* FIXME: Most of these should be top-level, many are hacks/broken in Misaka */ /* FIXME: Most of these should be top-level, many are hacks/broken in Misaka */
switch (fn) { switch (fn) {
case TOARU_SYS_FUNC_SYNC: case TOARU_SYS_FUNC_SYNC:
@ -176,12 +176,12 @@ static long sys_sysfunc(long fn, char ** args) {
} }
__attribute__((noreturn)) __attribute__((noreturn))
static long sys_exit(long exitcode) { long sys_exit(long exitcode) {
task_exit((exitcode & 0xFF) << 8); task_exit((exitcode & 0xFF) << 8);
__builtin_unreachable(); __builtin_unreachable();
} }
static long sys_write(int fd, char * ptr, unsigned long len) { long sys_write(int fd, char * ptr, unsigned long len) {
if (FD_CHECK(fd)) { if (FD_CHECK(fd)) {
PTRCHECK(ptr,len,MMU_PTR_NULL); PTRCHECK(ptr,len,MMU_PTR_NULL);
fs_node_t * node = FD_ENTRY(fd); fs_node_t * node = FD_ENTRY(fd);
@ -237,7 +237,7 @@ static long stat_node(fs_node_t * fn, uintptr_t st) {
return 0; return 0;
} }
static long sys_stat(int fd, uintptr_t st) { long sys_stat(int fd, uintptr_t st) {
PTR_VALIDATE(st); PTR_VALIDATE(st);
if (!st) return -EFAULT; if (!st) return -EFAULT;
if (FD_CHECK(fd)) { if (FD_CHECK(fd)) {
@ -246,7 +246,7 @@ static long sys_stat(int fd, uintptr_t st) {
return -EBADF; return -EBADF;
} }
static long sys_statf(char * file, uintptr_t st) { long sys_statf(char * file, uintptr_t st) {
int result; int result;
PTR_VALIDATE(file); PTR_VALIDATE(file);
PTR_VALIDATE(st); PTR_VALIDATE(st);
@ -261,14 +261,14 @@ static long sys_statf(char * file, uintptr_t st) {
return result; return result;
} }
static long sys_symlink(char * target, char * name) { long sys_symlink(char * target, char * name) {
PTR_VALIDATE(target); PTR_VALIDATE(target);
PTR_VALIDATE(name); PTR_VALIDATE(name);
if (!target || !name) return -EFAULT; if (!target || !name) return -EFAULT;
return symlink_fs(target, name); return symlink_fs(target, name);
} }
static long sys_readlink(const char * file, char * ptr, long len) { long sys_readlink(const char * file, char * ptr, long len) {
PTR_VALIDATE(file); PTR_VALIDATE(file);
if (!file) return -EFAULT; if (!file) return -EFAULT;
fs_node_t * node = kopen((char *) file, O_PATH | O_NOFOLLOW); fs_node_t * node = kopen((char *) file, O_PATH | O_NOFOLLOW);
@ -280,7 +280,7 @@ static long sys_readlink(const char * file, char * ptr, long len) {
return rv; return rv;
} }
static long sys_lstat(char * file, uintptr_t st) { long sys_lstat(char * file, uintptr_t st) {
PTR_VALIDATE(file); PTR_VALIDATE(file);
PTR_VALIDATE(st); PTR_VALIDATE(st);
if (!file || !st) return -EFAULT; if (!file || !st) return -EFAULT;
@ -292,7 +292,7 @@ static long sys_lstat(char * file, uintptr_t st) {
return result; return result;
} }
static long sys_open(const char * file, long flags, long mode) { long sys_open(const char * file, long flags, long mode) {
PTR_VALIDATE(file); PTR_VALIDATE(file);
if (!file) return -EFAULT; if (!file) return -EFAULT;
fs_node_t * node = kopen((char *)file, flags); fs_node_t * node = kopen((char *)file, flags);
@ -368,7 +368,7 @@ static long sys_open(const char * file, long flags, long mode) {
return fd; return fd;
} }
static long sys_close(int fd) { long sys_close(int fd) {
if (FD_CHECK(fd)) { if (FD_CHECK(fd)) {
close_fs(FD_ENTRY(fd)); close_fs(FD_ENTRY(fd));
FD_ENTRY(fd) = NULL; FD_ENTRY(fd) = NULL;
@ -377,7 +377,7 @@ static long sys_close(int fd) {
return -EBADF; return -EBADF;
} }
static long sys_seek(int fd, long offset, long whence) { long sys_seek(int fd, long offset, long whence) {
if (FD_CHECK(fd)) { if (FD_CHECK(fd)) {
if ((FD_ENTRY(fd)->flags & FS_PIPE) || (FD_ENTRY(fd)->flags & FS_CHARDEVICE)) return -ESPIPE; if ((FD_ENTRY(fd)->flags & FS_PIPE) || (FD_ENTRY(fd)->flags & FS_CHARDEVICE)) return -ESPIPE;
switch (whence) { switch (whence) {
@ -398,7 +398,7 @@ static long sys_seek(int fd, long offset, long whence) {
return -EBADF; return -EBADF;
} }
static long sys_read(int fd, char * ptr, unsigned long len) { long sys_read(int fd, char * ptr, unsigned long len) {
if (FD_CHECK(fd)) { if (FD_CHECK(fd)) {
PTRCHECK(ptr,len,MMU_PTR_NULL|MMU_PTR_WRITE); PTRCHECK(ptr,len,MMU_PTR_NULL|MMU_PTR_WRITE);
if (len && !ptr) { if (len && !ptr) {
@ -416,7 +416,7 @@ static long sys_read(int fd, char * ptr, unsigned long len) {
return -EBADF; return -EBADF;
} }
static long sys_ioctl(int fd, int request, void * argp) { long sys_ioctl(int fd, int request, void * argp) {
if (FD_CHECK(fd)) { if (FD_CHECK(fd)) {
PTR_VALIDATE(argp); PTR_VALIDATE(argp);
return ioctl_fs(FD_ENTRY(fd), request, argp); return ioctl_fs(FD_ENTRY(fd), request, argp);
@ -424,7 +424,7 @@ static long sys_ioctl(int fd, int request, void * argp) {
return -EBADF; return -EBADF;
} }
static long sys_readdir(int fd, long index, struct dirent * entry) { long sys_readdir(int fd, long index, struct dirent * entry) {
if (FD_CHECK(fd)) { if (FD_CHECK(fd)) {
PTR_VALIDATE(entry); PTR_VALIDATE(entry);
if (!entry) return -EFAULT; if (!entry) return -EFAULT;
@ -440,13 +440,13 @@ static long sys_readdir(int fd, long index, struct dirent * entry) {
return -EBADF; return -EBADF;
} }
static long sys_mkdir(char * path, uint64_t mode) { long sys_mkdir(char * path, uint64_t mode) {
PTR_VALIDATE(path); PTR_VALIDATE(path);
if (!path) return -EFAULT; if (!path) return -EFAULT;
return mkdir_fs(path, mode); return mkdir_fs(path, mode);
} }
static long sys_access(const char * file, long flags) { long sys_access(const char * file, long flags) {
PTR_VALIDATE(file); PTR_VALIDATE(file);
if (!file) return -EFAULT; if (!file) return -EFAULT;
fs_node_t * node = kopen((char *)file, 0); fs_node_t * node = kopen((char *)file, 0);
@ -455,7 +455,7 @@ static long sys_access(const char * file, long flags) {
return 0; return 0;
} }
static long sys_chmod(char * file, long mode) { long sys_chmod(char * file, long mode) {
PTR_VALIDATE(file); PTR_VALIDATE(file);
if (!file) return -EFAULT; if (!file) return -EFAULT;
fs_node_t * fn = kopen(file, 0); fs_node_t * fn = kopen(file, 0);
@ -481,7 +481,7 @@ static int current_group_matches(gid_t gid) {
return 0; return 0;
} }
static long sys_chown(char * file, uid_t uid, uid_t gid) { long sys_chown(char * file, uid_t uid, uid_t gid) {
PTR_VALIDATE(file); PTR_VALIDATE(file);
if (!file) return -EFAULT; if (!file) return -EFAULT;
fs_node_t * fn = kopen(file, 0); fs_node_t * fn = kopen(file, 0);
@ -522,22 +522,22 @@ _access:
return -EACCES; return -EACCES;
} }
static long sys_gettimeofday(struct timeval * tv, void * tz) { long sys_gettimeofday(struct timeval * tv, void * tz) {
PTR_VALIDATE(tv); PTR_VALIDATE(tv);
PTR_VALIDATE(tz); PTR_VALIDATE(tz);
if (!tv) return -EFAULT; if (!tv) return -EFAULT;
return gettimeofday(tv, tz); return gettimeofday(tv, tz);
} }
static long sys_getuid(void) { long sys_getuid(void) {
return (long)this_core->current_process->real_user; return (long)this_core->current_process->real_user;
} }
static long sys_geteuid(void) { long sys_geteuid(void) {
return (long)this_core->current_process->user; return (long)this_core->current_process->user;
} }
static long sys_setuid(uid_t new_uid) { long sys_setuid(uid_t new_uid) {
if (this_core->current_process->user == USER_ROOT_UID) { if (this_core->current_process->user == USER_ROOT_UID) {
this_core->current_process->user = new_uid; this_core->current_process->user = new_uid;
this_core->current_process->real_user = new_uid; this_core->current_process->real_user = new_uid;
@ -546,15 +546,15 @@ static long sys_setuid(uid_t new_uid) {
return -EPERM; return -EPERM;
} }
static long sys_getgid(void) { long sys_getgid(void) {
return (long)this_core->current_process->real_user_group; return (long)this_core->current_process->real_user_group;
} }
static long sys_getegid(void) { long sys_getegid(void) {
return (long)this_core->current_process->user_group; return (long)this_core->current_process->user_group;
} }
static long sys_setgid(gid_t new_gid) { long sys_setgid(gid_t new_gid) {
if (this_core->current_process->user == USER_ROOT_UID) { if (this_core->current_process->user == USER_ROOT_UID) {
this_core->current_process->user_group = new_gid; this_core->current_process->user_group = new_gid;
this_core->current_process->real_user_group = new_gid; this_core->current_process->real_user_group = new_gid;
@ -563,7 +563,7 @@ static long sys_setgid(gid_t new_gid) {
return -EPERM; return -EPERM;
} }
static long sys_getgroups(int size, gid_t list[]) { long sys_getgroups(int size, gid_t list[]) {
if (size == 0) { if (size == 0) {
return this_core->current_process->supplementary_group_count; return this_core->current_process->supplementary_group_count;
} else if (size < this_core->current_process->supplementary_group_count) { } else if (size < this_core->current_process->supplementary_group_count) {
@ -579,7 +579,7 @@ static long sys_getgroups(int size, gid_t list[]) {
} }
} }
static long sys_setgroups(int size, const gid_t list[]) { long sys_setgroups(int size, const gid_t list[]) {
if (this_core->current_process->user != USER_ROOT_UID) return -EPERM; if (this_core->current_process->user != USER_ROOT_UID) return -EPERM;
if (size < 0) return -EINVAL; if (size < 0) return -EINVAL;
if (size > 32) return -EINVAL; /* Arbitrary decision */ if (size > 32) return -EINVAL; /* Arbitrary decision */
@ -607,16 +607,16 @@ static long sys_setgroups(int size, const gid_t list[]) {
} }
static long sys_getpid(void) { long sys_getpid(void) {
/* The user actually wants the pid of the originating thread (which can be us). */ /* The user actually wants the pid of the originating thread (which can be us). */
return this_core->current_process->group ? (long)this_core->current_process->group : (long)this_core->current_process->id; return this_core->current_process->group ? (long)this_core->current_process->group : (long)this_core->current_process->id;
} }
static long sys_gettid(void) { long sys_gettid(void) {
return (long)this_core->current_process->id; return (long)this_core->current_process->id;
} }
static long sys_setsid(void) { long sys_setsid(void) {
if (this_core->current_process->job == this_core->current_process->group) { if (this_core->current_process->job == this_core->current_process->group) {
return -EPERM; return -EPERM;
} }
@ -625,7 +625,7 @@ static long sys_setsid(void) {
return this_core->current_process->session; return this_core->current_process->session;
} }
static long sys_setpgid(pid_t pid, pid_t pgid) { long sys_setpgid(pid_t pid, pid_t pgid) {
if (pgid < 0) { if (pgid < 0) {
return -EINVAL; return -EINVAL;
} }
@ -657,7 +657,7 @@ static long sys_setpgid(pid_t pid, pid_t pgid) {
return 0; return 0;
} }
static long sys_getpgid(pid_t pid) { long sys_getpgid(pid_t pid) {
process_t * proc; process_t * proc;
if (pid == 0) { if (pid == 0) {
proc = (process_t*)this_core->current_process; proc = (process_t*)this_core->current_process;
@ -672,7 +672,7 @@ static long sys_getpgid(pid_t pid) {
return proc->job; return proc->job;
} }
static long sys_uname(struct utsname * name) { long sys_uname(struct utsname * name) {
PTR_VALIDATE(name); PTR_VALIDATE(name);
if (!name) return -EFAULT; if (!name) return -EFAULT;
char version_number[256]; char version_number[256];
@ -695,7 +695,7 @@ static long sys_uname(struct utsname * name) {
return 0; return 0;
} }
static long sys_chdir(char * newdir) { long sys_chdir(char * newdir) {
PTR_VALIDATE(newdir); PTR_VALIDATE(newdir);
if (!newdir) return -EFAULT; if (!newdir) return -EFAULT;
char * path = canonicalize_path(this_core->current_process->wd_name, newdir); char * path = canonicalize_path(this_core->current_process->wd_name, newdir);
@ -719,7 +719,7 @@ static long sys_chdir(char * newdir) {
} }
} }
static long sys_getcwd(char * buf, size_t size) { long sys_getcwd(char * buf, size_t size) {
if (buf) { if (buf) {
PTR_VALIDATE(buf); PTR_VALIDATE(buf);
size_t len = strlen(this_core->current_process->wd_name) + 1; size_t len = strlen(this_core->current_process->wd_name) + 1;
@ -728,11 +728,11 @@ static long sys_getcwd(char * buf, size_t size) {
return 0; return 0;
} }
static long sys_dup2(int old, int new) { long sys_dup2(int old, int new) {
return process_move_fd((process_t *)this_core->current_process, old, new); return process_move_fd((process_t *)this_core->current_process, old, new);
} }
static long sys_sethostname(char * new_hostname) { long sys_sethostname(char * new_hostname) {
if (this_core->current_process->user == USER_ROOT_UID) { if (this_core->current_process->user == USER_ROOT_UID) {
PTR_VALIDATE(new_hostname); PTR_VALIDATE(new_hostname);
if (!new_hostname) return -EFAULT; if (!new_hostname) return -EFAULT;
@ -748,14 +748,14 @@ static long sys_sethostname(char * new_hostname) {
} }
} }
static long sys_gethostname(char * buffer) { long sys_gethostname(char * buffer) {
PTR_VALIDATE(buffer); PTR_VALIDATE(buffer);
if (!buffer) return -EFAULT; if (!buffer) return -EFAULT;
memcpy(buffer, hostname, hostname_len); memcpy(buffer, hostname, hostname_len);
return hostname_len; return hostname_len;
} }
static long sys_mount(char * arg, char * mountpoint, char * type, unsigned long flags, void * data) { long sys_mount(char * arg, char * mountpoint, char * type, unsigned long flags, void * data) {
/* TODO: Make use of flags and data from mount command. */ /* TODO: Make use of flags and data from mount command. */
(void)flags; (void)flags;
(void)data; (void)data;
@ -771,18 +771,18 @@ static long sys_mount(char * arg, char * mountpoint, char * type, unsigned long
return -EFAULT; return -EFAULT;
} }
static long sys_umask(long mode) { long sys_umask(long mode) {
this_core->current_process->mask = mode & 0777; this_core->current_process->mask = mode & 0777;
return 0; return 0;
} }
static long sys_unlink(char * file) { long sys_unlink(char * file) {
PTR_VALIDATE(file); PTR_VALIDATE(file);
if (!file) return -EFAULT; if (!file) return -EFAULT;
return unlink_fs(file); return unlink_fs(file);
} }
static long sys_execve(const char * filename, char *const argv[], char *const envp[]) { long sys_execve(const char * filename, char *const argv[], char *const envp[]) {
PTR_VALIDATE(filename); PTR_VALIDATE(filename);
PTR_VALIDATE(argv); PTR_VALIDATE(argv);
PTR_VALIDATE(envp); PTR_VALIDATE(envp);
@ -839,27 +839,27 @@ static long sys_execve(const char * filename, char *const argv[], char *const en
return exec(filename, argc, argv_, envp_, 0); return exec(filename, argc, argv_, envp_, 0);
} }
static long sys_fork(void) { long sys_fork(void) {
return fork(); return fork();
} }
static long sys_clone(uintptr_t new_stack, uintptr_t thread_func, uintptr_t arg) { long sys_clone(uintptr_t new_stack, uintptr_t thread_func, uintptr_t arg) {
if (!new_stack || !PTR_INRANGE(new_stack)) return -EINVAL; if (!new_stack || !PTR_INRANGE(new_stack)) return -EINVAL;
if (!thread_func || !PTR_INRANGE(thread_func)) return -EINVAL; if (!thread_func || !PTR_INRANGE(thread_func)) return -EINVAL;
return (int)clone(new_stack, thread_func, arg); return (int)clone(new_stack, thread_func, arg);
} }
static long sys_waitpid(int pid, int * status, int options) { long sys_waitpid(int pid, int * status, int options) {
if (status && !PTR_INRANGE(status)) return -EINVAL; if (status && !PTR_INRANGE(status)) return -EINVAL;
return waitpid(pid, status, options); return waitpid(pid, status, options);
} }
static long sys_yield(void) { long sys_yield(void) {
switch_task(1); switch_task(1);
return 1; return 1;
} }
static long sys_sleepabs(unsigned long seconds, unsigned long subseconds) { long sys_sleepabs(unsigned long seconds, unsigned long subseconds) {
/* Mark us as asleep until <some time period> */ /* Mark us as asleep until <some time period> */
sleep_until((process_t *)this_core->current_process, seconds, subseconds); sleep_until((process_t *)this_core->current_process, seconds, subseconds);
@ -878,13 +878,13 @@ static long sys_sleepabs(unsigned long seconds, unsigned long subseconds) {
} }
} }
static long sys_sleep(unsigned long seconds, unsigned long subseconds) { long sys_sleep(unsigned long seconds, unsigned long subseconds) {
unsigned long s, ss; unsigned long s, ss;
relative_time(seconds, subseconds * 10000, &s, &ss); relative_time(seconds, subseconds * 10000, &s, &ss);
return sys_sleepabs(s, ss); return sys_sleepabs(s, ss);
} }
static long sys_pipe(int pipes[2]) { long sys_pipe(int pipes[2]) {
if (!pipes || !PTR_INRANGE(pipes)) { if (!pipes || !PTR_INRANGE(pipes)) {
return -EFAULT; return -EFAULT;
} }
@ -903,7 +903,7 @@ static long sys_pipe(int pipes[2]) {
return 0; return 0;
} }
static long sys_signal(long signum, uintptr_t handler) { long sys_signal(long signum, uintptr_t handler) {
if (signum > NUMSIGNALS) { if (signum > NUMSIGNALS) {
return -EINVAL; return -EINVAL;
} }
@ -912,7 +912,7 @@ static long sys_signal(long signum, uintptr_t handler) {
return old; return old;
} }
static long sys_fswait(int c, int fds[]) { long sys_fswait(int c, int fds[]) {
PTR_VALIDATE(fds); PTR_VALIDATE(fds);
if (!fds) return -EFAULT; if (!fds) return -EFAULT;
for (int i = 0; i < c; ++i) { for (int i = 0; i < c; ++i) {
@ -929,7 +929,7 @@ static long sys_fswait(int c, int fds[]) {
return result; return result;
} }
static long sys_fswait_timeout(int c, int fds[], int timeout) { long sys_fswait_timeout(int c, int fds[], int timeout) {
PTR_VALIDATE(fds); PTR_VALIDATE(fds);
if (!fds) return -EFAULT; if (!fds) return -EFAULT;
for (int i = 0; i < c; ++i) { for (int i = 0; i < c; ++i) {
@ -946,7 +946,7 @@ static long sys_fswait_timeout(int c, int fds[], int timeout) {
return result; return result;
} }
static long sys_fswait_multi(int c, int fds[], int timeout, int out[]) { long sys_fswait_multi(int c, int fds[], int timeout, int out[]) {
PTR_VALIDATE(fds); PTR_VALIDATE(fds);
PTR_VALIDATE(out); PTR_VALIDATE(out);
if (!fds || !out) return -EFAULT; if (!fds || !out) return -EFAULT;
@ -971,20 +971,20 @@ static long sys_fswait_multi(int c, int fds[], int timeout, int out[]) {
return result; return result;
} }
static long sys_shm_obtain(char * path, size_t * size) { long sys_shm_obtain(char * path, size_t * size) {
PTR_VALIDATE(path); PTR_VALIDATE(path);
PTR_VALIDATE(size); PTR_VALIDATE(size);
if (!path || !size) return -EFAULT; if (!path || !size) return -EFAULT;
return (long)shm_obtain(path, size); return (long)shm_obtain(path, size);
} }
static long sys_shm_release(char * path) { long sys_shm_release(char * path) {
PTR_VALIDATE(path); PTR_VALIDATE(path);
if (!path) return -EFAULT; if (!path) return -EFAULT;
return shm_release(path); return shm_release(path);
} }
static long sys_openpty(int * master, int * slave, char * name, void * _ign0, void * size) { long sys_openpty(int * master, int * slave, char * name, void * _ign0, void * size) {
/* We require a place to put these when we are done. */ /* We require a place to put these when we are done. */
if (!master || !slave) return -EINVAL; if (!master || !slave) return -EINVAL;
if (master && !PTR_INRANGE(master)) return -EINVAL; if (master && !PTR_INRANGE(master)) return -EINVAL;
@ -1011,7 +1011,7 @@ static long sys_openpty(int * master, int * slave, char * name, void * _ign0, vo
return 0; return 0;
} }
static long sys_kill(pid_t process, int signal) { long sys_kill(pid_t process, int signal) {
if (process < -1) { if (process < -1) {
return group_send_signal(-process, signal, 0); return group_send_signal(-process, signal, 0);
} else if (process == 0) { } else if (process == 0) {
@ -1021,7 +1021,7 @@ static long sys_kill(pid_t process, int signal) {
} }
} }
static long sys_reboot(void) { long sys_reboot(void) {
if (this_core->current_process->user != USER_ROOT_UID) { if (this_core->current_process->user != USER_ROOT_UID) {
return -EPERM; return -EPERM;
} }
@ -1029,7 +1029,7 @@ static long sys_reboot(void) {
return arch_reboot(); return arch_reboot();
} }
static long sys_times(struct tms *buf) { long sys_times(struct tms *buf) {
if (buf) { if (buf) {
PTR_VALIDATE(buf); PTR_VALIDATE(buf);