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

umemcpy and kmemcpy cleanup

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