change copy-out routines

- restrict copy_to_user() to only current process.
- add write_process_vm() to write specified process space.
This commit is contained in:
NAKAMURA Gou
2015-03-03 18:12:55 +09:00
parent 8db54c2637
commit 22d8d169b6
3 changed files with 81 additions and 37 deletions

View File

@@ -2200,9 +2200,9 @@ int read_process_vm(struct process_vm *vm, void *kdst, const void *usrc, size_t
return 0;
} /* read_process_vm() */
int copy_to_user(struct process *proc, void *dst, const void *src, size_t siz)
int copy_to_user(void *dst, const void *src, size_t siz)
{
struct process_vm *vm = proc->vm;
struct process_vm *vm = cpu_local_var(current)->vm;
struct vm_range *range;
size_t pos;
size_t wsiz;
@@ -2229,3 +2229,56 @@ int copy_to_user(struct process *proc, void *dst, const void *src, size_t siz)
memcpy(dst, src, siz);
return 0;
}
int write_process_vm(struct process_vm *vm, void *udst, const void *ksrc, size_t siz)
{
const uintptr_t ustart = (uintptr_t)udst;
const uintptr_t uend = ustart + siz;
uint64_t reason;
uintptr_t addr;
int error;
const void *from;
void *to;
size_t remain;
size_t cpsize;
unsigned long pa;
void *va;
if ((ustart < vm->region.user_start)
|| (vm->region.user_end <= ustart)
|| ((vm->region.user_end - ustart) < siz)) {
return -EFAULT;
}
reason = PF_POPULATE | PF_WRITE | PF_USER;
for (addr = ustart & PAGE_MASK; addr < uend; addr += PAGE_SIZE) {
error = page_fault_process_vm(vm, (void *)addr, reason);
if (error) {
return error;
}
}
from = ksrc;
to = udst;
remain = siz;
while (remain > 0) {
cpsize = PAGE_SIZE - ((uintptr_t)to & (PAGE_SIZE - 1));
if (cpsize > remain) {
cpsize = remain;
}
error = ihk_mc_pt_virt_to_phys(vm->page_table, to, &pa);
if (error) {
return error;
}
va = phys_to_virt(pa);
memcpy(va, from, cpsize);
from += cpsize;
to += cpsize;
remain -= cpsize;
}
return 0;
} /* write_process_vm() */