summaryrefslogtreecommitdiff
path: root/kernel/syscall.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/syscall.c')
-rw-r--r--kernel/syscall.c46
1 files changed, 21 insertions, 25 deletions
diff --git a/kernel/syscall.c b/kernel/syscall.c
index c1b3670..ee94696 100644
--- a/kernel/syscall.c
+++ b/kernel/syscall.c
@@ -12,7 +12,7 @@ int
fetchaddr(uint64 addr, uint64 *ip)
{
struct proc *p = myproc();
- if(addr >= p->sz || addr+sizeof(uint64) > p->sz)
+ if(addr >= p->sz || addr+sizeof(uint64) > p->sz) // both tests needed, in case of overflow
return -1;
if(copyin(p->pagetable, (char *)ip, addr, sizeof(*ip)) != 0)
return -1;
@@ -25,9 +25,8 @@ int
fetchstr(uint64 addr, char *buf, int max)
{
struct proc *p = myproc();
- int err = copyinstr(p->pagetable, buf, addr, max);
- if(err < 0)
- return err;
+ if(copyinstr(p->pagetable, buf, addr, max) < 0)
+ return -1;
return strlen(buf);
}
@@ -54,21 +53,19 @@ argraw(int n)
}
// Fetch the nth 32-bit system call argument.
-int
+void
argint(int n, int *ip)
{
*ip = argraw(n);
- return 0;
}
// Retrieve an argument as a pointer.
// Doesn't check for legality, since
// copyin/copyout will do that.
-int
+void
argaddr(int n, uint64 *ip)
{
*ip = argraw(n);
- return 0;
}
// Fetch the nth word-sized system call argument as a null-terminated string.
@@ -78,32 +75,31 @@ int
argstr(int n, char *buf, int max)
{
uint64 addr;
- if(argaddr(n, &addr) < 0)
- return -1;
+ argaddr(n, &addr);
return fetchstr(addr, buf, max);
}
-extern uint64 sys_chdir(void);
-extern uint64 sys_close(void);
-extern uint64 sys_dup(void);
-extern uint64 sys_exec(void);
-extern uint64 sys_exit(void);
extern uint64 sys_fork(void);
-extern uint64 sys_fstat(void);
-extern uint64 sys_getpid(void);
-extern uint64 sys_kill(void);
-extern uint64 sys_link(void);
-extern uint64 sys_mkdir(void);
-extern uint64 sys_mknod(void);
-extern uint64 sys_open(void);
+extern uint64 sys_exit(void);
+extern uint64 sys_wait(void);
extern uint64 sys_pipe(void);
extern uint64 sys_read(void);
+extern uint64 sys_kill(void);
+extern uint64 sys_exec(void);
+extern uint64 sys_fstat(void);
+extern uint64 sys_chdir(void);
+extern uint64 sys_dup(void);
+extern uint64 sys_getpid(void);
extern uint64 sys_sbrk(void);
extern uint64 sys_sleep(void);
-extern uint64 sys_unlink(void);
-extern uint64 sys_wait(void);
-extern uint64 sys_write(void);
extern uint64 sys_uptime(void);
+extern uint64 sys_open(void);
+extern uint64 sys_write(void);
+extern uint64 sys_mknod(void);
+extern uint64 sys_unlink(void);
+extern uint64 sys_link(void);
+extern uint64 sys_mkdir(void);
+extern uint64 sys_close(void);
static uint64 (*syscalls[])(void) = {
[SYS_fork] sys_fork,