提交 5df8a6fb 创建 作者: Silas Boyd-Wickizer's avatar Silas Boyd-Wickizer

umemcpy and kmemcpy cleanup

上级 af2acbae
...@@ -273,8 +273,8 @@ int argptr(int, char**, int); ...@@ -273,8 +273,8 @@ int argptr(int, char**, int);
int argstr(int, char**); int argstr(int, char**);
int fetchint64(uptr, u64*); int fetchint64(uptr, u64*);
int fetchstr(uptr, char**); int fetchstr(uptr, char**);
int umemcpy(void *, const void *, u64); int umemcpy(void*, void*, u64);
int kmemcpy(void *, const void *, u64); int kmemcpy(void*, void*, u64);
void syscall(void); void syscall(void);
// string.c // string.c
......
...@@ -109,27 +109,40 @@ argstr(int n, char **pp) ...@@ -109,27 +109,40 @@ argstr(int n, char **pp)
return fetchstr(addr, pp); return fetchstr(addr, pp);
} }
int static int
umemcpy(void *dst, const void *umen, u64 size) umemptr(void *umem, void **ret, u64 size)
{ {
uptr src = (uptr)umen; uptr ptr = (uptr) umem;
for(uptr va = PGROUNDDOWN(src); va < src+size; va = va+PGSIZE) for(uptr va = PGROUNDDOWN(ptr); va < ptr+size; va = va + PGSIZE)
if(pagefault(myproc()->vmap, va, 0) < 0) if(pagefault(myproc()->vmap, va, 0) < 0)
return -1; return -1;
memmove(dst, umen, size);
*ret = umem;
return 0; return 0;
} }
int int
kmemcpy(void *umen, const void *src, u64 size) umemcpy(void *dst, void *umem, u64 size)
{ {
uptr dst = (uptr)umen; void *ptr;
for(uptr va = PGROUNDDOWN(dst); va < dst+size; va = va+PGSIZE) if (umemptr(umem, &ptr, size))
if(pagefault(myproc()->vmap, va, 0) < 0) return -1;
return -1;
memmove(umen, src, size); memmove(dst, ptr, size);
return 0;
}
int
kmemcpy(void *umem, void *src, u64 size)
{
void *ptr;
if (umemptr(umem, &ptr, size))
return -1;
memmove(ptr, src, size);
return 0; return 0;
} }
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论