add shmobj for shared anonymous mappings
This commit is contained in:
@@ -45,6 +45,7 @@
|
||||
#include <mman.h>
|
||||
#include <kmalloc.h>
|
||||
#include <memobj.h>
|
||||
#include <shm.h>
|
||||
|
||||
/* Headers taken from kitten LWK */
|
||||
#include <lwk/stddef.h>
|
||||
@@ -630,12 +631,13 @@ SYSCALL_DECLARE(mmap)
|
||||
const int prot = ihk_mc_syscall_arg2(ctx);
|
||||
const int flags = ihk_mc_syscall_arg3(ctx);
|
||||
const int fd = ihk_mc_syscall_arg4(ctx);
|
||||
const off_t off = ihk_mc_syscall_arg5(ctx);
|
||||
const off_t off0 = ihk_mc_syscall_arg5(ctx);
|
||||
|
||||
struct process *proc = cpu_local_var(current);
|
||||
struct vm_regions *region = &proc->vm->region;
|
||||
intptr_t addr;
|
||||
size_t len;
|
||||
off_t off;
|
||||
int error;
|
||||
intptr_t npages;
|
||||
int p2align;
|
||||
@@ -646,10 +648,11 @@ SYSCALL_DECLARE(mmap)
|
||||
int maxprot;
|
||||
int denied;
|
||||
int ro_vma_mapped = 0;
|
||||
struct shmid_ds ads;
|
||||
|
||||
dkprintf("[%d]sys_mmap(%lx,%lx,%x,%x,%d,%lx)\n",
|
||||
ihk_mc_get_processor_id(),
|
||||
addr0, len0, prot, flags, fd, off);
|
||||
addr0, len0, prot, flags, fd, off0);
|
||||
|
||||
/* check constants for flags */
|
||||
if (1) {
|
||||
@@ -681,9 +684,9 @@ SYSCALL_DECLARE(mmap)
|
||||
|| ((region->user_end - len) < addr)
|
||||
|| !(flags & (MAP_SHARED | MAP_PRIVATE))
|
||||
|| ((flags & MAP_SHARED) && (flags & MAP_PRIVATE))
|
||||
|| (off & (PAGE_SIZE - 1))) {
|
||||
|| (off0 & (PAGE_SIZE - 1))) {
|
||||
ekprintf("sys_mmap(%lx,%lx,%x,%x,%x,%lx):EINVAL\n",
|
||||
addr0, len0, prot, flags, fd, off);
|
||||
addr0, len0, prot, flags, fd, off0);
|
||||
error = -EINVAL;
|
||||
goto out2;
|
||||
}
|
||||
@@ -692,7 +695,7 @@ SYSCALL_DECLARE(mmap)
|
||||
if ((flags & error_flags)
|
||||
|| (flags & ~(supported_flags | ignored_flags))) {
|
||||
ekprintf("sys_mmap(%lx,%lx,%x,%x,%x,%lx):unknown flags %x\n",
|
||||
addr0, len0, prot, flags, fd, off,
|
||||
addr0, len0, prot, flags, fd, off0,
|
||||
(flags & ~(supported_flags | ignored_flags)));
|
||||
error = -EINVAL;
|
||||
goto out2;
|
||||
@@ -754,8 +757,10 @@ SYSCALL_DECLARE(mmap)
|
||||
}
|
||||
|
||||
phys = 0;
|
||||
off = 0;
|
||||
maxprot = PROT_READ | PROT_WRITE | PROT_EXEC;
|
||||
if (!(flags & MAP_ANONYMOUS)) {
|
||||
off = off0;
|
||||
error = fileobj_create(fd, &memobj, &maxprot);
|
||||
if (error) {
|
||||
ekprintf("sys_mmap:fileobj_create failed. %d\n", error);
|
||||
@@ -781,6 +786,15 @@ SYSCALL_DECLARE(mmap)
|
||||
}
|
||||
phys = virt_to_phys(p);
|
||||
}
|
||||
else if (flags & MAP_SHARED) {
|
||||
memset(&ads, 0, sizeof(ads));
|
||||
ads.shm_segsz = len;
|
||||
error = shmobj_create(&ads, &memobj);
|
||||
if (error) {
|
||||
ekprintf("sys_mmap:shmobj_create failed. %d\n", error);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
if ((flags & MAP_PRIVATE) && (maxprot & PROT_READ)) {
|
||||
maxprot |= PROT_WRITE;
|
||||
@@ -844,7 +858,7 @@ out2:
|
||||
}
|
||||
dkprintf("[%d]sys_mmap(%lx,%lx,%x,%x,%d,%lx): %ld %lx\n",
|
||||
ihk_mc_get_processor_id(),
|
||||
addr0, len0, prot, flags, fd, off, error, addr);
|
||||
addr0, len0, prot, flags, fd, off0, error, addr);
|
||||
return (!error)? addr: error;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user