diff options
| author | Frans Kaashoek <kaashoek@mit.edu> | 2019-07-28 07:43:09 -0400 | 
|---|---|---|
| committer | Frans Kaashoek <kaashoek@mit.edu> | 2019-07-28 07:43:09 -0400 | 
| commit | 33494edad5970586ed61efc967405b07db529b72 (patch) | |
| tree | 848c8b819e8b56bf807b6ded7b6e902173450f2b | |
| parent | fe14bd1113d571ec6abd45f3d99dadabc24fd06e (diff) | |
| parent | 2d89a101c45cb73d2800c74ca3ff5c576933e0b7 (diff) | |
| download | xv6-labs-33494edad5970586ed61efc967405b07db529b72.tar.gz xv6-labs-33494edad5970586ed61efc967405b07db529b72.tar.bz2 xv6-labs-33494edad5970586ed61efc967405b07db529b72.zip | |
Merge branch 'riscv' of g.csail.mit.edu:xv6-dev into riscv
| -rw-r--r-- | kernel/defs.h | 1 | ||||
| -rw-r--r-- | kernel/syscall.c | 28 | ||||
| -rw-r--r-- | kernel/sysfile.c | 8 | 
3 files changed, 11 insertions, 26 deletions
| diff --git a/kernel/defs.h b/kernel/defs.h index 52fca8e..de4acfd 100644 --- a/kernel/defs.h +++ b/kernel/defs.h @@ -130,7 +130,6 @@ char*           strncpy(char*, const char*, int);  // syscall.c  int             argint(int, int*); -int             argptr(int, uint64*, int);  int             argstr(int, char*, int);  int             argaddr(int, uint64 *);  int             fetchstr(uint64, char*, int); diff --git a/kernel/syscall.c b/kernel/syscall.c index 117e78e..197bca1 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -33,7 +33,7 @@ fetchstr(uint64 addr, char *buf, int max)  }  static uint64 -fetcharg(int n) +argraw(int n)  {    struct proc *p = myproc();    switch (n) { @@ -50,7 +50,7 @@ fetcharg(int n)    case 5:      return p->tf->a5;    } -  panic("fetcharg"); +  panic("argraw");    return -1;  } @@ -58,31 +58,17 @@ fetcharg(int n)  int  argint(int n, int *ip)  { -  *ip = fetcharg(n); +  *ip = argraw(n);    return 0;  } +// Retrieve an argument as a pointer. +// Doesn't check for legality, since +// copyin/copyout will do that.  int  argaddr(int n, uint64 *ip)  { -  *ip = fetcharg(n); -  return 0; -} - -// Fetch the nth word-sized system call argument as a pointer -// to a block of memory of size bytes.  Check that the pointer -// lies within the process address space. -int -argptr(int n, uint64 *pp, int size) -{ -  uint64 i; -  struct proc *p = myproc(); -  -  if(argaddr(n, &i) < 0) -    return -1; -  if(size < 0 || (uint)i >= p->sz || (uint)i+size > p->sz) -    return -1; -  *pp = i; +  *ip = argraw(n);    return 0;  } diff --git a/kernel/sysfile.c b/kernel/sysfile.c index 2c787ec..292fa27 100644 --- a/kernel/sysfile.c +++ b/kernel/sysfile.c @@ -73,7 +73,7 @@ sys_read(void)    int n;    uint64 p; -  if(argfd(0, 0, &f) < 0 || argint(2, &n) < 0 || argptr(1, &p, n) < 0) +  if(argfd(0, 0, &f) < 0 || argint(2, &n) < 0 || argaddr(1, &p) < 0)      return -1;    return fileread(f, p, n);  } @@ -85,7 +85,7 @@ sys_write(void)    int n;    uint64 p; -  if(argfd(0, 0, &f) < 0 || argint(2, &n) < 0 || argptr(1, &p, n) < 0) +  if(argfd(0, 0, &f) < 0 || argint(2, &n) < 0 || argaddr(1, &p) < 0)      return -1;    return filewrite(f, p, n); @@ -110,7 +110,7 @@ sys_fstat(void)    struct file *f;    uint64 st; // user pointer to struct stat -  if(argfd(0, 0, &f) < 0 || argptr(1, &st, sizeof(struct stat)) < 0) +  if(argfd(0, 0, &f) < 0 || argaddr(1, &st) < 0)      return -1;    return filestat(f, st);  } @@ -453,7 +453,7 @@ sys_pipe(void)    int fd0, fd1;    struct proc *p = myproc(); -  if(argptr(0, &fdarray, 2*sizeof(int)) < 0) +  if(argaddr(0, &fdarray) < 0)      return -1;    if(pipealloc(&rf, &wf) < 0)      return -1; | 
