83 lines
1.7 KiB
C
83 lines
1.7 KiB
C
|
// TODO: CHECK/REPLACE/UPDATE OLD CODE (this file is based on xv6)
|
||
|
#include "types.h"
|
||
|
#include "param.h"
|
||
|
#include "memlayout.h"
|
||
|
#include "riscv.h"
|
||
|
#include "sched.h"
|
||
|
#include "proc.h"
|
||
|
#include "syscall.h"
|
||
|
#include "defs.h"
|
||
|
#include "kprintf.h"
|
||
|
|
||
|
// Fetch the uint64 at addr from the current process.
|
||
|
int
|
||
|
fetchaddr(uint64 addr, uint64 *ip)
|
||
|
{
|
||
|
struct proc *p = myproc();
|
||
|
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;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
// Fetch the nul-terminated string at addr from the current process.
|
||
|
// Returns length of string, not including nul, or -1 for error.
|
||
|
int
|
||
|
fetchstr(uint64 addr, char *buf, int max)
|
||
|
{
|
||
|
struct proc *p = myproc();
|
||
|
if(copyinstr(p->pagetable, buf, addr, max) < 0)
|
||
|
return -1;
|
||
|
return strlen(buf);
|
||
|
}
|
||
|
|
||
|
static uint64
|
||
|
argraw(int n)
|
||
|
{
|
||
|
struct proc *p = myproc();
|
||
|
switch (n) {
|
||
|
case 0:
|
||
|
return p->trapframe->a0;
|
||
|
case 1:
|
||
|
return p->trapframe->a1;
|
||
|
case 2:
|
||
|
return p->trapframe->a2;
|
||
|
case 3:
|
||
|
return p->trapframe->a3;
|
||
|
case 4:
|
||
|
return p->trapframe->a4;
|
||
|
case 5:
|
||
|
return p->trapframe->a5;
|
||
|
}
|
||
|
panic("argraw");
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
// Fetch the nth 32-bit system call argument.
|
||
|
void
|
||
|
argint(int n, int *ip)
|
||
|
{
|
||
|
*ip = argraw(n);
|
||
|
}
|
||
|
|
||
|
// Retrieve an argument as a pointer.
|
||
|
// Doesn't check for legality, since
|
||
|
// copyin/copyout will do that.
|
||
|
void
|
||
|
argaddr(int n, uint64 *ip)
|
||
|
{
|
||
|
*ip = argraw(n);
|
||
|
}
|
||
|
|
||
|
// Fetch the nth word-sized system call argument as a null-terminated string.
|
||
|
// Copies into buf, at most max.
|
||
|
// Returns string length if OK (including nul), -1 if error.
|
||
|
int
|
||
|
argstr(int n, char *buf, int max)
|
||
|
{
|
||
|
uint64 addr;
|
||
|
argaddr(n, &addr);
|
||
|
return fetchstr(addr, buf, max);
|
||
|
}
|