device file mappings: communicate map flags and fault missing translations

This commit is contained in:
Balazs Gerofi
2016-06-24 12:42:47 -07:00
parent dd37443fc7
commit 648bacc90f
7 changed files with 84 additions and 24 deletions

View File

@ -79,7 +79,7 @@ static struct memobj *to_memobj(struct devobj *devobj)
* devobj
*/
int devobj_create(int fd, size_t len, off_t off, struct memobj **objp, int *maxprotp,
int prot)
int prot, int populate_flags)
{
ihk_mc_user_context_t ctx;
struct pager_map_result result; // XXX: assumes contiguous physical
@ -116,7 +116,7 @@ int devobj_create(int fd, size_t len, off_t off, struct memobj **objp, int *maxp
ihk_mc_syscall_arg2(&ctx) = len;
ihk_mc_syscall_arg3(&ctx) = off;
ihk_mc_syscall_arg4(&ctx) = virt_to_phys(&result);
ihk_mc_syscall_arg5(&ctx) = prot;
ihk_mc_syscall_arg5(&ctx) = prot | populate_flags;
error = syscall_generic_forwarding(__NR_mmap, &ctx);
if (error) {
@ -206,7 +206,7 @@ static void devobj_release(struct memobj *memobj)
static int devobj_get_page(struct memobj *memobj, off_t off, int p2align, uintptr_t *physp, unsigned long *flag)
{
const off_t pgoff = off >> PAGE_SHIFT;
const off_t pgoff = off / PAGE_SIZE;
struct devobj *obj = to_devobj(memobj);
int error;
uintptr_t pfn;
@ -218,7 +218,7 @@ static int devobj_get_page(struct memobj *memobj, off_t off, int p2align, uintpt
if ((pgoff < obj->pfn_pgoff) || ((obj->pfn_pgoff + obj->npages) <= pgoff)) {
error = -EFBIG;
kprintf("devobj_get_page(%p %lx,%lx,%d): out of range. %d\n", memobj, obj->handle, off, p2align, error);
kprintf("%s: error: out of range: off: %lu, page off: %lu obj->npages: %d\n", __FUNCTION__, off, pgoff, obj->npages);
goto out;
}
ix = pgoff - obj->pfn_pgoff;

View File

@ -182,7 +182,7 @@ int fileobj_create(int fd, struct memobj **objp, int *maxprotp)
error = syscall_generic_forwarding(__NR_mmap, &ctx);
if (error) {
kprintf("fileobj_create(%d):create failed. %d\n", fd, error);
dkprintf("fileobj_create(%d):create failed. %d\n", fd, error);
goto out;
}

View File

@ -142,6 +142,6 @@ struct shmid_ds;
int shmobj_create(struct shmid_ds *ds, struct memobj **objp);
int zeroobj_create(struct memobj **objp);
int devobj_create(int fd, size_t len, off_t off, struct memobj **objp, int *maxprotp,
int prot);
int prot, int populate_flags);
#endif /* HEADER_MEMOBJ_H */

View File

@ -1641,6 +1641,18 @@ static int do_page_fault_process_vm(struct process_vm *vm, void *fault_addr0, ui
"access denied. %d\n",
ihk_mc_get_processor_id(), vm,
fault_addr0, reason, error);
kprintf("%s: reason: %s%s%s%s%s%s%s%s\n", __FUNCTION__,
(reason & PF_PROT) ? "PF_PROT " : "",
(reason & PF_WRITE) ? "PF_WRITE " : "",
(reason & PF_USER) ? "PF_USER " : "",
(reason & PF_RSVD) ? "PF_RSVD " : "",
(reason & PF_INSTR) ? "PF_INSTR " : "",
(reason & PF_PATCH) ? "PF_PATCH " : "",
(reason & PF_POPULATE) ? "PF_POPULATE " : "");
kprintf("%s: range->flag & (%s%s%s)\n", __FUNCTION__,
(range->flag & VR_PROT_READ) ? "VR_PROT_READ " : "",
(range->flag & VR_PROT_WRITE) ? "VR_PROT_WRITE " : "",
(range->flag & VR_PROT_EXEC) ? "VR_PROT_EXEC " : "");
if (((range->flag & VR_PROT_MASK) == VR_PROT_NONE))
kprintf("if (((range->flag & VR_PROT_MASK) == VR_PROT_NONE))\n");
if (((reason & PF_WRITE) && !(reason & PF_PATCH)))

View File

@ -1097,7 +1097,7 @@ do_mmap(const intptr_t addr0, const size_t len0, const int prot,
}
#endif
if (error == -ESRCH) {
kprintf("do_mmap:hit non VREG\n");
dkprintf("do_mmap:hit non VREG\n");
/*
* XXX: temporary:
*
@ -1108,10 +1108,17 @@ do_mmap(const intptr_t addr0, const size_t len0, const int prot,
vrflags &= ~VR_MEMTYPE_MASK;
vrflags |= VR_MEMTYPE_UC;
}
error = devobj_create(fd, len, off, &memobj, &maxprot, prot);
error = devobj_create(fd, len, off, &memobj, &maxprot,
prot, (flags & (MAP_POPULATE | MAP_LOCKED)));
if (!error) {
dkprintf("%s: device fd: %d off: %lu mapping at %p - %p\n",
__FUNCTION__, fd, off, addr, addr + len);
}
}
if (error) {
ekprintf("do_mmap:fileobj_create failed. %d\n", error);
kprintf("%s: error: file mapping failed, fd: %d, error: %d\n",
__FUNCTION__, error);
goto out;
}
}
@ -1181,9 +1188,12 @@ out:
if (!error && populated_mapping) {
error = populate_process_memory(thread->vm, (void *)addr, len);
if (error) {
ekprintf("do_mmap:populate_process_memory"
"(%p,%p,%lx) failed %d\n",
thread->vm, (void *)addr, len, error);
ekprintf("%s: error :populate_process_memory"
"vm: %p, addr: %p, len: %d (flags: %s%s) failed %d\n", __FUNCTION__,
thread->vm, (void *)addr, len,
(flags & MAP_POPULATE) ? "MAP_POPULATE " : "",
(flags & MAP_LOCKED) ? "MAP_LOCKED ": "",
error);
/*
* In this case,
* the mapping established by this call should be unmapped
@ -5574,7 +5584,7 @@ SYSCALL_DECLARE(sched_setaffinity)
len = MIN2(len, sizeof(k_cpu_set));
if (copy_from_user(&k_cpu_set, u_cpu_set, len)) {
kprintf("%s:%d copy_from_user failed.\n", __FILE__, __LINE__);
kprintf("%s: error: copy_from_user failed for %p:%d\n", __FUNCTION__, u_cpu_set, len);
return -EFAULT;
}