提交 4298ddf2 创建 作者: Nickolai Zeldovich's avatar Nickolai Zeldovich

soft page fault in syscall argument pointers

上级 aad8c084
...@@ -143,8 +143,8 @@ char* strncpy(char*, const char*, int); ...@@ -143,8 +143,8 @@ char* strncpy(char*, const char*, int);
int argint(int, int*); int argint(int, int*);
int argptr(int, char**, int); int argptr(int, char**, int);
int argstr(int, char**); int argstr(int, char**);
int fetchint(struct proc*, uint, int*); int fetchint(uint, int*);
int fetchstr(struct proc*, uint, char**); int fetchstr(uint, char**);
void syscall(void); void syscall(void);
// timer.c // timer.c
......
...@@ -18,12 +18,12 @@ ...@@ -18,12 +18,12 @@
// Fetch the int at addr from process p. // Fetch the int at addr from process p.
int int
fetchint(struct proc *p, uint addr, int *ip) fetchint(uint addr, int *ip)
{ {
#if 0 /* XXX use pagefault() */ if(pagefault(proc->pgdir, proc->vmap, addr) < 0)
if(addr >= p->sz || addr+4 > p->sz) return -1;
if(pagefault(proc->pgdir, proc->vmap, addr+3) < 0)
return -1; return -1;
#endif
*ip = *(int*)(addr); *ip = *(int*)(addr);
return 0; return 0;
} }
...@@ -32,23 +32,19 @@ fetchint(struct proc *p, uint addr, int *ip) ...@@ -32,23 +32,19 @@ fetchint(struct proc *p, uint addr, int *ip)
// Doesn't actually copy the string - just sets *pp to point at it. // Doesn't actually copy the string - just sets *pp to point at it.
// Returns length of string, not including nul. // Returns length of string, not including nul.
int int
fetchstr(struct proc *p, uint addr, char **pp) fetchstr(uint addr, char **pp)
{ {
char *s, *ep; char *s = (char *) addr;
#if 0 /* XXX use pagefault() */ while(1){
if(addr >= p->sz) if(pagefault(proc->pgdir, proc->vmap, (uint) s) < 0)
return -1; return -1;
#endif if(*s == 0){
*pp = (char*)addr; *pp = (char*)addr;
#if 0 /* XXX use pagefault() */
ep = (char*)p->sz;
#else
ep = (char *) 0xffffffff;
#endif
for(s = *pp; s < ep; s++)
if(*s == 0)
return s - *pp; return s - *pp;
}
s++;
}
return -1; return -1;
} }
...@@ -56,7 +52,7 @@ fetchstr(struct proc *p, uint addr, char **pp) ...@@ -56,7 +52,7 @@ fetchstr(struct proc *p, uint addr, char **pp)
int int
argint(int n, int *ip) argint(int n, int *ip)
{ {
return fetchint(proc, proc->tf->esp + 4 + 4*n, ip); return fetchint(proc->tf->esp + 4 + 4*n, ip);
} }
// Fetch the nth word-sized system call argument as a pointer // Fetch the nth word-sized system call argument as a pointer
...@@ -69,10 +65,9 @@ argptr(int n, char **pp, int size) ...@@ -69,10 +65,9 @@ argptr(int n, char **pp, int size)
if(argint(n, &i) < 0) if(argint(n, &i) < 0)
return -1; return -1;
#if 0 /* XXX use pagefault() */ for(uint va = PGROUNDDOWN(i); va < i+size; va = va + PGSIZE)
if((uint)i >= proc->sz || (uint)i+size > proc->sz) if(pagefault(proc->pgdir, proc->vmap, va) < 0)
return -1; return -1;
#endif
*pp = (char*)i; *pp = (char*)i;
return 0; return 0;
} }
...@@ -87,7 +82,7 @@ argstr(int n, char **pp) ...@@ -87,7 +82,7 @@ argstr(int n, char **pp)
int addr; int addr;
if(argint(n, &addr) < 0) if(argint(n, &addr) < 0)
return -1; return -1;
return fetchstr(proc, addr, pp); return fetchstr(addr, pp);
} }
extern int sys_chdir(void); extern int sys_chdir(void);
......
...@@ -358,13 +358,13 @@ sys_exec(void) ...@@ -358,13 +358,13 @@ sys_exec(void)
for(i=0;; i++){ for(i=0;; i++){
if(i >= NELEM(argv)) if(i >= NELEM(argv))
return -1; return -1;
if(fetchint(proc, uargv+4*i, (int*)&uarg) < 0) if(fetchint(uargv+4*i, (int*)&uarg) < 0)
return -1; return -1;
if(uarg == 0){ if(uarg == 0){
argv[i] = 0; argv[i] = 0;
break; break;
} }
if(fetchstr(proc, uarg, &argv[i]) < 0) if(fetchstr(uarg, &argv[i]) < 0)
return -1; return -1;
} }
return exec(path, argv); return exec(path, argv);
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论